summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'openvz-sources/022.070/5106_linux-2.6.8.1-r8169-2.2.patch')
-rw-r--r--openvz-sources/022.070/5106_linux-2.6.8.1-r8169-2.2.patch3176
1 files changed, 0 insertions, 3176 deletions
diff --git a/openvz-sources/022.070/5106_linux-2.6.8.1-r8169-2.2.patch b/openvz-sources/022.070/5106_linux-2.6.8.1-r8169-2.2.patch
deleted file mode 100644
index e7fac34..0000000
--- a/openvz-sources/022.070/5106_linux-2.6.8.1-r8169-2.2.patch
+++ /dev/null
@@ -1,3176 +0,0 @@
---- ./drivers/net/r8169.c 2005-09-26 13:32:54.000000000 +0400
-+++ ./drivers/net/r8169.c 2005-10-21 11:09:29.755805000 +0400
-@@ -1,72 +1,104 @@
- /*
- =========================================================================
-- r8169.c: A RealTek RTL-8169 Gigabit Ethernet driver for Linux kernel 2.4.x.
-+ r8169.c: A RealTek RTL8169s/8110s Gigabit Ethernet driver for Linux kernel 2.4.x.
- --------------------------------------------------------------------
-
- History:
- Feb 4 2002 - created initially by ShuChen <shuchen@realtek.com.tw>.
- May 20 2002 - Add link status force-mode and TBI mode support.
- =========================================================================
-- 1. The media can be forced in 5 modes.
-- Command: 'insmod r8169 media = SET_MEDIA'
-- Ex: 'insmod r8169 media = 0x04' will force PHY to operate in 100Mpbs Half-duplex.
--
-- SET_MEDIA can be:
-- _10_Half = 0x01
-- _10_Full = 0x02
-- _100_Half = 0x04
-- _100_Full = 0x08
-- _1000_Full = 0x10
--
-- 2. Support TBI mode.
--=========================================================================
--VERSION 1.1 <2002/10/4>
-+
-+RTL8169_VERSION "1.1" <2002/10/4>
-
- The bit4:0 of MII register 4 is called "selector field", and have to be
- 00001b to indicate support of IEEE std 802.3 during NWay process of
-- exchanging Link Code Word (FLP).
--
--VERSION 1.2 <2002/11/30>
--
-- - Large style cleanup
-- - Use ether_crc in stock kernel (linux/crc32.h)
-- - Copy mc_filter setup code from 8139cp
-- (includes an optimization, and avoids set_bit use)
-+ exchanging Link Code Word (FLP).
-
-+RTL8169_VERSION "1.2" <2003/6/17>
-+ Update driver module name.
-+ Modify ISR.
-+ Add chip mcfg.
-+
-+RTL8169_VERSION "1.3" <2003/6/20>
-+ Add chip pcfg.
-+ Add priv->phy_timer_t, rtl8169_phy_timer_t_handler()
-+ Add rtl8169_hw_PHY_config()
-+ Add rtl8169_hw_PHY_reset()
-+
-+RTL8169_VERSION "1.4" <2003/7/14>
-+ Add tx_bytes, rx_bytes.
-+
-+RTL8169_VERSION "1.5" <2003/7/18>
-+ Set 0x0000 to PHY at offset 0x0b.
-+ Modify chip mcfg, pcfg
-+ Force media for multiple card.
-+RTL8169_VERSION "1.6" <2003/8/25>
-+ Modify receive data buffer.
-+
-+RTL8169_VERSION "1.7" <2003/9/18>
-+ Add Jumbo Frame support.
-+
-+RTL8169_VERSION "1.8" <2003/10/21>
-+ Performance and CPU Utilizaion Enhancement.
-+
-+RTL8169_VERSION "1.9" <2003/12/29>
-+ Enable Tx/Rx flow control.
-+
-+RTL8169_VERSION "2.0" <2004/03/26>
-+ Beta version.
-+ Support for linux 2.6.x
-+
-+RTL8169_VERSION "2.1" <2004/07/05>
-+ Modify parameters.
-+
-+RTL8169_VERSION "2.2" <2004/08/09>
-+ Add.pci_dma_sync_single.
-+ Add pci_alloc_consistent()/pci_free_consistent().
-+ Revise parameters.
-+ Recognize our interrupt for linux 2.6.x.
- */
-
-+
- #include <linux/module.h>
- #include <linux/pci.h>
- #include <linux/netdevice.h>
- #include <linux/etherdevice.h>
- #include <linux/delay.h>
--#include <linux/ethtool.h>
--#include <linux/crc32.h>
-+#include <linux/version.h>
-+
-+#include <linux/timer.h>
- #include <linux/init.h>
--#include <linux/dma-mapping.h>
-
--#include <asm/io.h>
-
--#define RTL8169_VERSION "1.2"
--#define MODULENAME "r8169"
-+#define RTL8169_VERSION "2.2"
-+#define MODULENAME "RTL8169s/8110s"
- #define RTL8169_DRIVER_NAME MODULENAME " Gigabit Ethernet driver " RTL8169_VERSION
- #define PFX MODULENAME ": "
-
-+
-+#undef RTL8169_DEBUG
-+#undef RTL8169_JUMBO_FRAME_SUPPORT
-+#undef RTL8169_HW_FLOW_CONTROL_SUPPORT
-+
-+
-+#undef RTL8169_IOCTL_SUPPORT
-+#undef RTL8169_DYNAMIC_CONTROL
-+#define RTL8169_USE_IO
-+
-+
- #ifdef RTL8169_DEBUG
--#define assert(expr) \
-- if(!(expr)) { \
-- printk( "Assertion failed! %s,%s,%s,line=%d\n", \
-- #expr,__FILE__,__FUNCTION__,__LINE__); \
-- }
--#define dprintk(fmt, args...) do { printk(PFX fmt, ## args) } while (0)
-+ #define assert(expr) \
-+ if(!(expr)) { printk( "Assertion failed! %s,%s,%s,line=%d\n", #expr,__FILE__,__FUNCTION__,__LINE__); }
-+ #define DBG_PRINT( fmt, args...) printk("r8169: " fmt, ## args);
- #else
--#define assert(expr) do {} while (0)
--#define dprintk(fmt, args...) do {} while (0)
--#endif /* RTL8169_DEBUG */
-+ #define assert(expr) do {} while (0)
-+ #define DBG_PRINT( fmt, args...) ;
-+#endif // end of #ifdef RTL8169_DEBUG
-+
-
- /* media options */
- #define MAX_UNITS 8
--static int media[MAX_UNITS] = { -1, -1, -1, -1, -1, -1, -1, -1 };
-+static int media[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
-
- /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
- static int max_interrupt_work = 20;
-@@ -76,148 +108,158 @@ static int max_interrupt_work = 20;
- static int multicast_filter_limit = 32;
-
- /* MAC address length*/
--#define MAC_ADDR_LEN 6
-+#define MAC_ADDR_LEN 6
-+
-+#define RX_FIFO_THRESH 7 /* 7 means NO threshold, Rx buffer level before first PCI xfer. */
-+#define RX_DMA_BURST 7 /* Maximum PCI burst, '6' is 1024 */
-+#define TX_DMA_BURST 7 /* Maximum PCI burst, '6' is 1024 */
-+#define ETTh 0x3F /* 0x3F means NO threshold */
-+
-+#define ETH_HDR_LEN 14
-+#define DEFAULT_MTU 1500
-+#define DEFAULT_RX_BUF_LEN 1536
-
--/* max supported gigabit ethernet frame size -- must be at least (dev->mtu+14+4).*/
--#define MAX_ETH_FRAME_SIZE 1536
-
--#define TX_FIFO_THRESH 256 /* In bytes */
-+#ifdef RTL8169_JUMBO_FRAME_SUPPORT
-+#define MAX_JUMBO_FRAME_MTU ( 10000 )
-+#define MAX_RX_SKBDATA_SIZE ( MAX_JUMBO_FRAME_MTU + ETH_HDR_LEN )
-+#else
-+#define MAX_RX_SKBDATA_SIZE 1600
-+#endif //end #ifdef RTL8169_JUMBO_FRAME_SUPPORT
-+
-+
-+#define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */
-+
-+//#define NUM_TX_DESC 64 /* Number of Tx descriptor registers*/
-+//#define NUM_RX_DESC 64 /* Number of Rx descriptor registers*/
-+#define NUM_TX_DESC 1024 /* Number of Tx descriptor registers*/
-+#define NUM_RX_DESC 1024 /* Number of Rx descriptor registers*/
-
--#define RX_FIFO_THRESH 7 /* 7 means NO threshold, Rx buffer level before first PCI xfer. */
--#define RX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */
--#define TX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */
--#define EarlyTxThld 0x3F /* 0x3F means NO early transmit */
--#define RxPacketMaxSize 0x0800 /* Maximum size supported is 16K-1 */
--#define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */
--
--#define NUM_TX_DESC 64 /* Number of Tx descriptor registers */
--#define NUM_RX_DESC 64 /* Number of Rx descriptor registers */
--#define RX_BUF_SIZE 1536 /* Rx Buffer size */
--#define R8169_TX_RING_BYTES (NUM_TX_DESC * sizeof(struct TxDesc))
--#define R8169_RX_RING_BYTES (NUM_RX_DESC * sizeof(struct RxDesc))
--
--#define RTL_MIN_IO_SIZE 0x80
--#define RTL8169_TX_TIMEOUT (6*HZ)
--#define RTL8169_PHY_TIMEOUT (HZ)
-+#define RTL_MIN_IO_SIZE 0x80
-+#define TX_TIMEOUT (6*HZ)
-+#define RTL8169_TIMER_EXPIRE_TIME 100 //100
-
-+
-+#ifdef RTL8169_USE_IO
-+#define RTL_W8(reg, val8) outb ((val8), ioaddr + (reg))
-+#define RTL_W16(reg, val16) outw ((val16), ioaddr + (reg))
-+#define RTL_W32(reg, val32) outl ((val32), ioaddr + (reg))
-+#define RTL_R8(reg) inb (ioaddr + (reg))
-+#define RTL_R16(reg) inw (ioaddr + (reg))
-+#define RTL_R32(reg) ((unsigned long) inl (ioaddr + (reg)))
-+#else
- /* write/read MMIO register */
--#define RTL_W8(reg, val8) writeb ((val8), ioaddr + (reg))
--#define RTL_W16(reg, val16) writew ((val16), ioaddr + (reg))
--#define RTL_W32(reg, val32) writel ((val32), ioaddr + (reg))
--#define RTL_R8(reg) readb (ioaddr + (reg))
--#define RTL_R16(reg) readw (ioaddr + (reg))
--#define RTL_R32(reg) ((unsigned long) readl (ioaddr + (reg)))
--
--enum mac_version {
-- RTL_GIGA_MAC_VER_B = 0x00,
-- /* RTL_GIGA_MAC_VER_C = 0x03, */
-- RTL_GIGA_MAC_VER_D = 0x01,
-- RTL_GIGA_MAC_VER_E = 0x02
--};
-+#define RTL_W8(reg, val8) writeb ((val8), ioaddr + (reg))
-+#define RTL_W16(reg, val16) writew ((val16), ioaddr + (reg))
-+#define RTL_W32(reg, val32) writel ((val32), ioaddr + (reg))
-+#define RTL_R8(reg) readb (ioaddr + (reg))
-+#define RTL_R16(reg) readw (ioaddr + (reg))
-+#define RTL_R32(reg) ((unsigned long) readl (ioaddr + (reg)))
-+#endif
-+
-+#define MCFG_METHOD_1 0x01
-+#define MCFG_METHOD_2 0x02
-+#define MCFG_METHOD_3 0x03
-+#define MCFG_METHOD_4 0x04
-+
-+#define PCFG_METHOD_1 0x01 //PHY Reg 0x03 bit0-3 == 0x0000
-+#define PCFG_METHOD_2 0x02 //PHY Reg 0x03 bit0-3 == 0x0001
-+#define PCFG_METHOD_3 0x03 //PHY Reg 0x03 bit0-3 == 0x0002
-
--enum phy_version {
-- RTL_GIGA_PHY_VER_C = 0x03, /* PHY Reg 0x03 bit0-3 == 0x0000 */
-- RTL_GIGA_PHY_VER_D = 0x04, /* PHY Reg 0x03 bit0-3 == 0x0000 */
-- RTL_GIGA_PHY_VER_E = 0x05, /* PHY Reg 0x03 bit0-3 == 0x0000 */
-- RTL_GIGA_PHY_VER_F = 0x06, /* PHY Reg 0x03 bit0-3 == 0x0001 */
-- RTL_GIGA_PHY_VER_G = 0x07, /* PHY Reg 0x03 bit0-3 == 0x0002 */
--};
-
-+#ifdef RTL8169_DYNAMIC_CONTROL
-+#include "r8169_callback.h"
-+#endif //end #ifdef RTL8169_DYNAMIC_CONTROL
-
--#define _R(NAME,MAC,MASK) \
-- { .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
-
- const static struct {
- const char *name;
-- u8 mac_version;
-- u32 RxConfigMask; /* Clears the bits supported by this chip */
-+ u8 mcfg; /* depend on RTL8169 docs */
-+ u32 RxConfigMask; /* should clear the bits supported by this chip */
- } rtl_chip_info[] = {
-- _R("RTL8169", RTL_GIGA_MAC_VER_B, 0xff7e1880),
-- _R("RTL8169s/8110s", RTL_GIGA_MAC_VER_D, 0xff7e1880),
-- _R("RTL8169s/8110s", RTL_GIGA_MAC_VER_E, 0xff7e1880)
-+ { "RTL8169", MCFG_METHOD_1, 0xff7e1880 },
-+ { "RTL8169s/8110s", MCFG_METHOD_2, 0xff7e1880 },
-+ { "RTL8169s/8110s", MCFG_METHOD_3, 0xff7e1880 },
- };
--#undef _R
-
--static struct pci_device_id rtl8169_pci_tbl[] = {
-- {0x10ec, 0x8169, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-+
-+static struct pci_device_id rtl8169_pci_tbl[] __devinitdata = {
-+ { 0x10ec, 0x8169, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
- {0,},
- };
-
--MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
-
--static int rx_copybreak = 200;
-+MODULE_DEVICE_TABLE (pci, rtl8169_pci_tbl);
-+
-
- enum RTL8169_registers {
-- MAC0 = 0, /* Ethernet hardware address. */
-- MAR0 = 8, /* Multicast filter. */
-- TxDescStartAddrLow = 0x20,
-- TxDescStartAddrHigh = 0x24,
-- TxHDescStartAddrLow = 0x28,
-- TxHDescStartAddrHigh = 0x2c,
-- FLASH = 0x30,
-- ERSR = 0x36,
-- ChipCmd = 0x37,
-- TxPoll = 0x38,
-+ MAC0 = 0x0,
-+ MAR0 = 0x8,
-+ TxDescStartAddr = 0x20,
-+ TxHDescStartAddr= 0x28,
-+ FLASH = 0x30,
-+ ERSR = 0x36,
-+ ChipCmd = 0x37,
-+ TxPoll = 0x38,
- IntrMask = 0x3C,
- IntrStatus = 0x3E,
- TxConfig = 0x40,
- RxConfig = 0x44,
- RxMissed = 0x4C,
- Cfg9346 = 0x50,
-- Config0 = 0x51,
-- Config1 = 0x52,
-- Config2 = 0x53,
-- Config3 = 0x54,
-- Config4 = 0x55,
-- Config5 = 0x56,
-+ Config0 = 0x51,
-+ Config1 = 0x52,
-+ Config2 = 0x53,
-+ Config3 = 0x54,
-+ Config4 = 0x55,
-+ Config5 = 0x56,
- MultiIntr = 0x5C,
-- PHYAR = 0x60,
-- TBICSR = 0x64,
-+ PHYAR = 0x60,
-+ TBICSR = 0x64,
- TBI_ANAR = 0x68,
- TBI_LPAR = 0x6A,
- PHYstatus = 0x6C,
- RxMaxSize = 0xDA,
- CPlusCmd = 0xE0,
-- RxDescAddrLow = 0xE4,
-- RxDescAddrHigh = 0xE8,
-- EarlyTxThres = 0xEC,
-- FuncEvent = 0xF0,
-- FuncEventMask = 0xF4,
-- FuncPresetState = 0xF8,
-- FuncForceEvent = 0xFC,
-+ RxDescStartAddr = 0xE4,
-+ ETThReg = 0xEC,
-+ FuncEvent = 0xF0,
-+ FuncEventMask = 0xF4,
-+ FuncPresetState = 0xF8,
-+ FuncForceEvent = 0xFC,
- };
-
- enum RTL8169_register_content {
-- /*InterruptStatusBits */
-- SYSErr = 0x8000,
-- PCSTimeout = 0x4000,
-- SWInt = 0x0100,
-- TxDescUnavail = 0x80,
-- RxFIFOOver = 0x40,
-- RxUnderrun = 0x20,
-- RxOverflow = 0x10,
-- TxErr = 0x08,
-- TxOK = 0x04,
-- RxErr = 0x02,
-- RxOK = 0x01,
-+ /*InterruptStatusBits*/
-+ SYSErr = 0x8000,
-+ PCSTimeout = 0x4000,
-+ SWInt = 0x0100,
-+ TxDescUnavail = 0x80,
-+ RxFIFOOver = 0x40,
-+ LinkChg = 0x20,
-+ RxOverflow = 0x10,
-+ TxErr = 0x08,
-+ TxOK = 0x04,
-+ RxErr = 0x02,
-+ RxOK = 0x01,
-
-- /*RxStatusDesc */
-+ /*RxStatusDesc*/
- RxRES = 0x00200000,
- RxCRC = 0x00080000,
-- RxRUNT = 0x00100000,
-+ RxRUNT= 0x00100000,
- RxRWT = 0x00400000,
-
-- /*ChipCmdBits */
-+ /*ChipCmdBits*/
- CmdReset = 0x10,
- CmdRxEnb = 0x08,
- CmdTxEnb = 0x04,
- RxBufEmpty = 0x01,
-
-- /*Cfg9346Bits */
-+ /*Cfg9346Bits*/
- Cfg9346_Lock = 0x00,
- Cfg9346_Unlock = 0xC0,
-
-- /*rx_mode_bits */
-+ /*rx_mode_bits*/
- AcceptErr = 0x20,
- AcceptRunt = 0x10,
- AcceptBroadcast = 0x08,
-@@ -225,1492 +267,1689 @@ enum RTL8169_register_content {
- AcceptMyPhys = 0x02,
- AcceptAllPhys = 0x01,
-
-- /*RxConfigBits */
-+ /*RxConfigBits*/
- RxCfgFIFOShift = 13,
- RxCfgDMAShift = 8,
-
-- /*TxConfigBits */
-+ /*TxConfigBits*/
- TxInterFrameGapShift = 24,
-- TxDMAShift = 8, /* DMA burst value (0-7) is shift this many bits */
-+ TxDMAShift = 8,
-
-- /* CPlusCmd p.31 */
-- RxVlan = (1 << 6),
-- RxChkSum = (1 << 5),
-- PCIDAC = (1 << 4),
-- PCIMulRW = (1 << 3),
--
-- /*rtl8169_PHYstatus */
-- TBI_Enable = 0x80,
-- TxFlowCtrl = 0x40,
-- RxFlowCtrl = 0x20,
-- _1000bpsF = 0x10,
-- _100bps = 0x08,
-- _10bps = 0x04,
-- LinkStatus = 0x02,
-- FullDup = 0x01,
-+ /*rtl8169_PHYstatus*/
-+ TBI_Enable = 0x80,
-+ TxFlowCtrl = 0x40,
-+ RxFlowCtrl = 0x20,
-+ _1000bpsF = 0x10,
-+ _100bps = 0x08,
-+ _10bps = 0x04,
-+ LinkStatus = 0x02,
-+ FullDup = 0x01,
-
-- /*GIGABIT_PHY_registers */
-+ /*GIGABIT_PHY_registers*/
- PHY_CTRL_REG = 0,
- PHY_STAT_REG = 1,
- PHY_AUTO_NEGO_REG = 4,
- PHY_1000_CTRL_REG = 9,
-
-- /*GIGABIT_PHY_REG_BIT */
-- PHY_Restart_Auto_Nego = 0x0200,
-- PHY_Enable_Auto_Nego = 0x1000,
-+ /*GIGABIT_PHY_REG_BIT*/
-+ PHY_Restart_Auto_Nego = 0x0200,
-+ PHY_Enable_Auto_Nego = 0x1000,
-
- //PHY_STAT_REG = 1;
-- PHY_Auto_Neco_Comp = 0x0020,
-+ PHY_Auto_Neco_Comp = 0x0020,
-
- //PHY_AUTO_NEGO_REG = 4;
-- PHY_Cap_10_Half = 0x0020,
-- PHY_Cap_10_Full = 0x0040,
-- PHY_Cap_100_Half = 0x0080,
-- PHY_Cap_100_Full = 0x0100,
-+ PHY_Cap_10_Half = 0x0020,
-+ PHY_Cap_10_Full = 0x0040,
-+ PHY_Cap_100_Half = 0x0080,
-+ PHY_Cap_100_Full = 0x0100,
-
- //PHY_1000_CTRL_REG = 9;
-- PHY_Cap_1000_Full = 0x0200,
-+ PHY_Cap_1000_Full = 0x0200,
-+ PHY_Cap_1000_Half = 0x0100,
-
-- PHY_Cap_Null = 0x0,
-+ PHY_Cap_PAUSE = 0x0400,
-+ PHY_Cap_ASYM_PAUSE = 0x0800,
-+
-+ PHY_Cap_Null = 0x0,
-
- /*_MediaType*/
-- _10_Half = 0x01,
-- _10_Full = 0x02,
-- _100_Half = 0x04,
-- _100_Full = 0x08,
-- _1000_Full = 0x10,
-+ _10_Half = 0x01,
-+ _10_Full = 0x02,
-+ _100_Half = 0x04,
-+ _100_Full = 0x08,
-+ _1000_Full = 0x10,
-
- /*_TBICSRBit*/
-- TBILinkOK = 0x02000000,
-+ TBILinkOK = 0x02000000,
- };
-
-+
-+
- enum _DescStatusBit {
-- OWNbit = 0x80000000,
-- EORbit = 0x40000000,
-- FSbit = 0x20000000,
-- LSbit = 0x10000000,
-+ OWNbit = 0x80000000,
-+ EORbit = 0x40000000,
-+ FSbit = 0x20000000,
-+ LSbit = 0x10000000,
- };
-
--#define RsvdMask 0x3fffc000
-
- struct TxDesc {
-- u32 status;
-- u32 vlan_tag;
-- u64 addr;
-+ u32 status;
-+ u32 vlan_tag;
-+ u32 buf_addr;
-+ u32 buf_Haddr;
- };
-
- struct RxDesc {
-- u32 status;
-- u32 vlan_tag;
-- u64 addr;
-+ u32 status;
-+ u32 vlan_tag;
-+ u32 buf_addr;
-+ u32 buf_Haddr;
- };
-
-+
-+typedef struct timer_list rt_timer_t;
-+
-+
- struct rtl8169_private {
-- void *mmio_addr; /* memory map physical address */
-- struct pci_dev *pci_dev; /* Index of PCI device */
-- struct net_device_stats stats; /* statistics of net device */
-- spinlock_t lock; /* spin lock flag */
-+ unsigned long ioaddr; /* memory map physical address*/
-+ struct pci_dev *pci_dev; /* Index of PCI device */
-+ struct net_device_stats stats; /* statistics of net device */
-+ spinlock_t lock; /* spin lock flag */
- int chipset;
-- int mac_version;
-- int phy_version;
-- u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
-- u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
-- u32 dirty_rx;
-- u32 dirty_tx;
-- struct TxDesc *TxDescArray; /* Index of 256-alignment Tx Descriptor buffer */
-- struct RxDesc *RxDescArray; /* Index of 256-alignment Rx Descriptor buffer */
-- dma_addr_t TxPhyAddr;
-- dma_addr_t RxPhyAddr;
-- struct sk_buff *Rx_skbuff[NUM_RX_DESC]; /* Rx data buffers */
-- struct sk_buff *Tx_skbuff[NUM_TX_DESC]; /* Index of Transmit data buffer */
-- struct timer_list timer;
-+ int mcfg;
-+ int pcfg;
-+ rt_timer_t r8169_timer;
-+ unsigned long expire_time;
-+
- unsigned long phy_link_down_cnt;
-- u16 cp_cmd;
-+ unsigned long cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
-+ unsigned long cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
-+ unsigned long dirty_tx;
-+ struct TxDesc *TxDescArray; /* Index of 256-alignment Tx Descriptor buffer */
-+ struct RxDesc *RxDescArray; /* Index of 256-alignment Rx Descriptor buffer */
-+ struct sk_buff *Tx_skbuff[NUM_TX_DESC];/* Index of Transmit data buffer */
-+ struct sk_buff *Rx_skbuff[NUM_RX_DESC];/* Receive data buffer */
-+ unsigned char drvinit_fail;
-+
-+ dma_addr_t txdesc_array_dma_addr[NUM_TX_DESC];
-+ dma_addr_t rxdesc_array_dma_addr[NUM_RX_DESC];
-+ dma_addr_t rx_skbuff_dma_addr[NUM_RX_DESC];
-+
-+ void *txdesc_space;
-+ dma_addr_t txdesc_phy_dma_addr;
-+ int sizeof_txdesc_space;
-+
-+ void *rxdesc_space;
-+ dma_addr_t rxdesc_phy_dma_addr;
-+ int sizeof_rxdesc_space;
-+
-+ int curr_mtu_size;
-+ int tx_pkt_len;
-+ int rx_pkt_len;
-+
-+ int hw_rx_pkt_len;
-+
-+#ifdef RTL8169_DYNAMIC_CONTROL
-+ struct r8169_cb_t rt;
-+#endif //end #ifdef RTL8169_DYNAMIC_CONTROL
-+
-+ unsigned char linkstatus;
- };
-
--MODULE_AUTHOR("Realtek");
--MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
--MODULE_PARM(media, "1-" __MODULE_STRING(MAX_UNITS) "i");
--MODULE_PARM(rx_copybreak, "i");
-+
-+MODULE_AUTHOR ("Realtek");
-+MODULE_DESCRIPTION ("RealTek RTL-8169 Gigabit Ethernet driver");
-+MODULE_PARM (media, "1-" __MODULE_STRING(MAX_UNITS) "i");
- MODULE_LICENSE("GPL");
-
--static int rtl8169_open(struct net_device *dev);
--static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev);
--static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance,
-- struct pt_regs *regs);
--static int rtl8169_init_ring(struct net_device *dev);
--static void rtl8169_hw_start(struct net_device *dev);
--static int rtl8169_close(struct net_device *dev);
--static void rtl8169_set_rx_mode(struct net_device *dev);
--static void rtl8169_tx_timeout(struct net_device *dev);
-+
-+static int rtl8169_open (struct net_device *dev);
-+static int rtl8169_start_xmit (struct sk_buff *skb, struct net_device *dev);
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+typedef int irqreturn_t;
-+#define IRQ_NONE 0
-+#define IRQ_HANDLED 1
-+static void rtl8169_interrupt (int irq, void *dev_instance, struct pt_regs *regs);
-+#else
-+static irqreturn_t rtl8169_interrupt (int irq, void *dev_instance, struct pt_regs *regs);
-+#endif
-+
-+static void rtl8169_init_ring (struct net_device *dev);
-+static void rtl8169_hw_start (struct net_device *dev);
-+static int rtl8169_close (struct net_device *dev);
-+static inline u32 ether_crc (int length, unsigned char *data);
-+static void rtl8169_set_rx_mode (struct net_device *dev);
-+static void rtl8169_tx_timeout (struct net_device *dev);
- static struct net_device_stats *rtl8169_get_stats(struct net_device *netdev);
-
--static const u16 rtl8169_intr_mask =
-- RxUnderrun | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK;
--static const unsigned int rtl8169_rx_config =
-- (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
--
--#define PHY_Cap_10_Half_Or_Less PHY_Cap_10_Half
--#define PHY_Cap_10_Full_Or_Less PHY_Cap_10_Full | PHY_Cap_10_Half_Or_Less
--#define PHY_Cap_100_Half_Or_Less PHY_Cap_100_Half | PHY_Cap_10_Full_Or_Less
--#define PHY_Cap_100_Full_Or_Less PHY_Cap_100_Full | PHY_Cap_100_Half_Or_Less
-+#ifdef RTL8169_JUMBO_FRAME_SUPPORT
-+static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
-+#endif //end #ifdef RTL8169_JUMBO_FRAME_SUPPORT
-+
-+static void rtl8169_hw_PHY_config (struct net_device *dev);
-+static void rtl8169_hw_PHY_reset(struct net_device *dev);
-+static const u16 rtl8169_intr_mask = LinkChg | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK ;
-+static const unsigned int rtl8169_rx_config = (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift) | 0x0000000E;
-+
-+
-+#define RTL8169_WRITE_GMII_REG_BIT( ioaddr, reg, bitnum, bitval )\
-+{ \
-+ int val; \
-+ if( bitval == 1 ){ val = ( RTL8169_READ_GMII_REG( ioaddr, reg ) | (bitval<<bitnum) ) & 0xffff ; } \
-+ else{ val = ( RTL8169_READ_GMII_REG( ioaddr, reg ) & (~(0x0001<<bitnum)) ) & 0xffff ; } \
-+ RTL8169_WRITE_GMII_REG( ioaddr, reg, val ); \
-+}
-+
-+
-+
-+#ifdef RTL8169_DEBUG
-+unsigned alloc_rxskb_cnt = 0;
-+#define RTL8169_ALLOC_RXSKB(bufsize) dev_alloc_skb(bufsize); alloc_rxskb_cnt ++ ;
-+#define RTL8169_FREE_RXSKB(skb) kfree_skb(skb); alloc_rxskb_cnt -- ;
-+#define RTL8169_NETIF_RX(skb) netif_rx(skb); alloc_rxskb_cnt -- ;
-+#else
-+#define RTL8169_ALLOC_RXSKB(bufsize) dev_alloc_skb(bufsize);
-+#define RTL8169_FREE_RXSKB(skb) kfree_skb(skb);
-+#define RTL8169_NETIF_RX(skb) netif_rx(skb);
-+#endif //end #ifdef RTL8169_DEBUG
-+
-+
-
--static void mdio_write(void *ioaddr, int RegAddr, int value)
-+
-+
-+
-+//=================================================================
-+// PHYAR
-+// bit Symbol
-+// 31 Flag
-+// 30-21 reserved
-+// 20-16 5-bit GMII/MII register address
-+// 15-0 16-bit GMII/MII register data
-+//=================================================================
-+void RTL8169_WRITE_GMII_REG( unsigned long ioaddr, int RegAddr, int value )
- {
-- int i;
-+ int i;
-
-- RTL_W32(PHYAR, 0x80000000 | (RegAddr & 0xFF) << 16 | value);
-+ RTL_W32 ( PHYAR, 0x80000000 | (RegAddr&0xFF)<<16 | value);
- udelay(1000);
-
-- for (i = 2000; i > 0; i--) {
-+ for( i = 2000; i > 0 ; i -- ){
- // Check if the RTL8169 has completed writing to the specified MII register
-- if (!(RTL_R32(PHYAR) & 0x80000000)) {
-+ if( ! (RTL_R32(PHYAR)&0x80000000) ){
- break;
-- } else {
-- udelay(100);
- }
-- }
-+ else{
-+ udelay(100);
-+ }// end of if( ! (RTL_R32(PHYAR)&0x80000000) )
-+ }// end of for() loop
- }
--
--static int mdio_read(void *ioaddr, int RegAddr)
-+//=================================================================
-+int RTL8169_READ_GMII_REG( unsigned long ioaddr, int RegAddr )
- {
- int i, value = -1;
-
-- RTL_W32(PHYAR, 0x0 | (RegAddr & 0xFF) << 16);
-+ RTL_W32 ( PHYAR, 0x0 | (RegAddr&0xFF)<<16 );
- udelay(1000);
-
-- for (i = 2000; i > 0; i--) {
-+ for( i = 2000; i > 0 ; i -- ){
- // Check if the RTL8169 has completed retrieving data from the specified MII register
-- if (RTL_R32(PHYAR) & 0x80000000) {
-- value = (int) (RTL_R32(PHYAR) & 0xFFFF);
-+ if( RTL_R32(PHYAR) & 0x80000000 ){
-+ value = (int)( RTL_R32(PHYAR)&0xFFFF );
- break;
- }
-- udelay(100);
-- }
-+ else{
-+ udelay(100);
-+ }// end of if( RTL_R32(PHYAR) & 0x80000000 )
-+ }// end of for() loop
- return value;
- }
-
--static void rtl8169_get_drvinfo(struct net_device *dev,
-- struct ethtool_drvinfo *info)
--{
-- struct rtl8169_private *tp = dev->priv;
--
-- strcpy(info->driver, RTL8169_DRIVER_NAME);
-- strcpy(info->version, RTL8169_VERSION );
-- strcpy(info->bus_info, pci_name(tp->pci_dev));
--}
--
--static struct ethtool_ops rtl8169_ethtool_ops = {
-- .get_drvinfo = rtl8169_get_drvinfo,
--};
-
--static void rtl8169_write_gmii_reg_bit(void *ioaddr, int reg, int bitnum,
-- int bitval)
--{
-- int val;
-+#ifdef RTL8169_IOCTL_SUPPORT
-+#include "r8169_ioctl.c"
-+#endif //end #ifdef RTL8169_IOCTL_SUPPORT
-
-- val = mdio_read(ioaddr, reg);
-- val = (bitval == 1) ?
-- val | (bitval << bitnum) : val & ~(0x0001 << bitnum);
-- mdio_write(ioaddr, reg, val & 0xffff);
--}
--
--static void rtl8169_get_mac_version(struct rtl8169_private *tp, void *ioaddr)
--{
-- const struct {
-- u32 mask;
-- int mac_version;
-- } mac_info[] = {
-- { 0x1 << 26, RTL_GIGA_MAC_VER_E },
-- { 0x1 << 23, RTL_GIGA_MAC_VER_D },
-- { 0x00000000, RTL_GIGA_MAC_VER_B } /* Catch-all */
-- }, *p = mac_info;
-- u32 reg;
--
-- reg = RTL_R32(TxConfig) & 0x7c800000;
-- while ((reg & p->mask) != p->mask)
-- p++;
-- tp->mac_version = p->mac_version;
--}
--
--static void rtl8169_print_mac_version(struct rtl8169_private *tp)
--{
-- struct {
-- int version;
-- char *msg;
-- } mac_print[] = {
-- { RTL_GIGA_MAC_VER_E, "RTL_GIGA_MAC_VER_E" },
-- { RTL_GIGA_MAC_VER_D, "RTL_GIGA_MAC_VER_D" },
-- { RTL_GIGA_MAC_VER_B, "RTL_GIGA_MAC_VER_B" },
-- { 0, NULL }
-- }, *p;
--
-- for (p = mac_print; p->msg; p++) {
-- if (tp->mac_version == p->version) {
-- dprintk("mac_version == %s (%04d)\n", p->msg,
-- p->version);
-- return;
-- }
-- }
-- dprintk("mac_version == Unknown\n");
--}
--
--static void rtl8169_get_phy_version(struct rtl8169_private *tp, void *ioaddr)
--{
-- const struct {
-- u16 mask;
-- u16 set;
-- int phy_version;
-- } phy_info[] = {
-- { 0x000f, 0x0002, RTL_GIGA_PHY_VER_G },
-- { 0x000f, 0x0001, RTL_GIGA_PHY_VER_F },
-- { 0x000f, 0x0000, RTL_GIGA_PHY_VER_E },
-- { 0x0000, 0x0000, RTL_GIGA_PHY_VER_D } /* Catch-all */
-- }, *p = phy_info;
-- u16 reg;
--
-- reg = mdio_read(ioaddr, 3) & 0xffff;
-- while ((reg & p->mask) != p->set)
-- p++;
-- tp->phy_version = p->phy_version;
--}
--
--static void rtl8169_print_phy_version(struct rtl8169_private *tp)
--{
-- struct {
-- int version;
-- char *msg;
-- u32 reg;
-- } phy_print[] = {
-- { RTL_GIGA_PHY_VER_G, "RTL_GIGA_PHY_VER_G", 0x0002 },
-- { RTL_GIGA_PHY_VER_F, "RTL_GIGA_PHY_VER_F", 0x0001 },
-- { RTL_GIGA_PHY_VER_E, "RTL_GIGA_PHY_VER_E", 0x0000 },
-- { RTL_GIGA_PHY_VER_D, "RTL_GIGA_PHY_VER_D", 0x0000 },
-- { 0, NULL, 0x0000 }
-- }, *p;
--
-- for (p = phy_print; p->msg; p++) {
-- if (tp->phy_version == p->version) {
-- dprintk("phy_version == %s (%04x)\n", p->msg, p->reg);
-- return;
-- }
-- }
-- dprintk("phy_version == Unknown\n");
--}
--
--static void rtl8169_hw_phy_config(struct net_device *dev)
--{
-- struct rtl8169_private *tp = dev->priv;
-- void *ioaddr = tp->mmio_addr;
-- struct {
-- u16 regs[5]; /* Beware of bit-sign propagation */
-- } phy_magic[5] = { {
-- { 0x0000, //w 4 15 12 0
-- 0x00a1, //w 3 15 0 00a1
-- 0x0008, //w 2 15 0 0008
-- 0x1020, //w 1 15 0 1020
-- 0x1000 } },{ //w 0 15 0 1000
-- { 0x7000, //w 4 15 12 7
-- 0xff41, //w 3 15 0 ff41
-- 0xde60, //w 2 15 0 de60
-- 0x0140, //w 1 15 0 0140
-- 0x0077 } },{ //w 0 15 0 0077
-- { 0xa000, //w 4 15 12 a
-- 0xdf01, //w 3 15 0 df01
-- 0xdf20, //w 2 15 0 df20
-- 0xff95, //w 1 15 0 ff95
-- 0xfa00 } },{ //w 0 15 0 fa00
-- { 0xb000, //w 4 15 12 b
-- 0xff41, //w 3 15 0 ff41
-- 0xde20, //w 2 15 0 de20
-- 0x0140, //w 1 15 0 0140
-- 0x00bb } },{ //w 0 15 0 00bb
-- { 0xf000, //w 4 15 12 f
-- 0xdf01, //w 3 15 0 df01
-- 0xdf20, //w 2 15 0 df20
-- 0xff95, //w 1 15 0 ff95
-- 0xbf00 } //w 0 15 0 bf00
-- }
-- }, *p = phy_magic;
-- int i;
-
-- rtl8169_print_mac_version(tp);
-- rtl8169_print_phy_version(tp);
--
-- if (tp->mac_version <= RTL_GIGA_MAC_VER_B)
-- return;
-- if (tp->phy_version >= RTL_GIGA_PHY_VER_F)
-- return;
--
-- dprintk("MAC version != 0 && PHY version == 0 or 1\n");
-- dprintk("Do final_reg2.cfg\n");
--
-- /* Shazam ! */
-+#ifdef RTL8169_DYNAMIC_CONTROL
-+#include "r8169_callback.c"
-+#endif
-
-- // phy config for RTL8169s mac_version C chip
-- mdio_write(ioaddr, 31, 0x0001); //w 31 2 0 1
-- mdio_write(ioaddr, 21, 0x1000); //w 21 15 0 1000
-- mdio_write(ioaddr, 24, 0x65c7); //w 24 15 0 65c7
-- rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0); //w 4 11 11 0
-
-- for (i = 0; i < ARRAY_SIZE(phy_magic); i++, p++) {
-- int val, pos = 4;
-
-- val = (mdio_read(ioaddr, pos) & 0x0fff) | (p->regs[0] & 0xffff);
-- mdio_write(ioaddr, pos, val);
-- while (--pos >= 0)
-- mdio_write(ioaddr, pos, p->regs[4 - pos] & 0xffff);
-- rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 1); //w 4 11 11 1
-- rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0); //w 4 11 11 0
-- }
-- mdio_write(ioaddr, 31, 0x0000); //w 31 2 0 0
-+#define rtl8169_request_timer( timer, timer_expires, timer_func, timer_data ) \
-+{ \
-+ init_timer(timer); \
-+ timer->expires = (unsigned long)(jiffies + timer_expires); \
-+ timer->data = (unsigned long)(timer_data); \
-+ timer->function = (void *)(timer_func); \
-+ add_timer(timer); \
-+ DBG_PRINT("request_timer at 0x%08lx\n", (unsigned long)timer); \
- }
-
--static void rtl8169_hw_phy_reset(struct net_device *dev)
--{
-- struct rtl8169_private *tp = dev->priv;
-- void *ioaddr = tp->mmio_addr;
-- int i, val;
-+#define rtl8169_delete_timer( del_timer_t ) \
-+{ \
-+ del_timer(del_timer_t); \
-+ DBG_PRINT("delete_timer at 0x%08lx\n", (unsigned long)del_timer_t); \
-+}
-
-- printk(KERN_WARNING PFX "%s: Reset RTL8169s PHY\n", dev->name);
-+#define rtl8169_mod_timer( timer, timer_expires ) \
-+{ \
-+ mod_timer( timer, jiffies + timer_expires ); \
-+}
-
-- val = (mdio_read(ioaddr, 0) | 0x8000) & 0xffff;
-- mdio_write(ioaddr, 0, val);
-
-- for (i = 50; i >= 0; i--) {
-- if (!(mdio_read(ioaddr, 0) & 0x8000))
-- break;
-- udelay(100); /* Gross */
-- }
-
-- if (i < 0) {
-- printk(KERN_WARNING PFX "%s: no PHY Reset ack. Giving up.\n",
-- dev->name);
-- }
--}
-
--static void rtl8169_phy_timer(unsigned long __opaque)
-+//======================================================================================================
-+//======================================================================================================
-+void rtl8169_phy_timer_t_handler( void *timer_data )
- {
-- struct net_device *dev = (struct net_device *)__opaque;
-- struct rtl8169_private *tp = dev->priv;
-- struct timer_list *timer = &tp->timer;
-- void *ioaddr = tp->mmio_addr;
-+ struct net_device *dev = (struct net_device *)timer_data;
-+ struct rtl8169_private *priv = (struct rtl8169_private *) (dev->priv);
-+ unsigned long ioaddr = priv->ioaddr;
-
-- assert(tp->mac_version > RTL_GIGA_MAC_VER_B);
-- assert(tp->phy_version < RTL_GIGA_PHY_VER_G);
--
-- if (RTL_R8(PHYstatus) & LinkStatus)
-- tp->phy_link_down_cnt = 0;
-- else {
-- tp->phy_link_down_cnt++;
-- if (tp->phy_link_down_cnt >= 12) {
-- int reg;
-+ assert( priv->mcfg > MCFG_METHOD_1 );
-+ assert( priv->pcfg < PCFG_METHOD_3 );
-
-+ if( RTL_R8(PHYstatus) & LinkStatus ){
-+ priv->phy_link_down_cnt = 0 ;
-+ }
-+ else{
-+ priv->phy_link_down_cnt ++ ;
-+ if( priv->phy_link_down_cnt >= 12 ){
- // If link on 1000, perform phy reset.
-- reg = mdio_read(ioaddr, PHY_1000_CTRL_REG);
-- if (reg & PHY_Cap_1000_Full)
-- rtl8169_hw_phy_reset(dev);
-+ if( RTL8169_READ_GMII_REG( ioaddr, PHY_1000_CTRL_REG ) & PHY_Cap_1000_Full )
-+ {
-+ DBG_PRINT("rtl8169_hw_PHY_reset\n");
-+ rtl8169_hw_PHY_reset( dev );
-+ }
-
-- tp->phy_link_down_cnt = 0;
-+ priv->phy_link_down_cnt = 0 ;
- }
- }
-
-- mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
-+ //---------------------------------------------------------------------------
-+ //mod_timer is a more efficient way to update the expire field of an active timer.
-+ //---------------------------------------------------------------------------
-+// rtl8169_mod_timer( (&priv->phy_timer_t), 100 );
- }
-
--static inline void rtl8169_delete_timer(struct net_device *dev)
--{
-- struct rtl8169_private *tp = dev->priv;
-- struct timer_list *timer = &tp->timer;
-
-- if ((tp->mac_version <= RTL_GIGA_MAC_VER_B) ||
-- (tp->phy_version >= RTL_GIGA_PHY_VER_G))
-- return;
-
-- del_timer_sync(timer);
-+//======================================================================================================
-+//======================================================================================================
-+void rtl8169_timer_handler( void *timer_data )
-+{
-+ struct net_device *dev = (struct net_device *)timer_data;
-+ struct rtl8169_private *priv = (struct rtl8169_private *) (dev->priv);
-
-- tp->phy_link_down_cnt = 0;
--}
-+ if( (priv->mcfg > MCFG_METHOD_1) && (priv->pcfg < PCFG_METHOD_3) ){
-+ DBG_PRINT("FIX PCS -> rtl8169_phy_timer_t_handler\n");
-+ priv->phy_link_down_cnt = 0;
-+ rtl8169_phy_timer_t_handler( timer_data );
-+ }
-
--static inline void rtl8169_request_timer(struct net_device *dev)
--{
-- struct rtl8169_private *tp = dev->priv;
-- struct timer_list *timer = &tp->timer;
-
-- if ((tp->mac_version <= RTL_GIGA_MAC_VER_B) ||
-- (tp->phy_version >= RTL_GIGA_PHY_VER_G))
-- return;
-+#ifdef RTL8169_DYNAMIC_CONTROL
-+ {
-+ struct r8169_cb_t *rt = &(priv->rt);
-+ if( priv->linkstatus == _1000_Full ){
-+ r8169_callback(rt);
-+ }
-+ }
-+#endif //end #ifdef RTL8169_DYNAMIC_CONTROL
-
-- tp->phy_link_down_cnt = 0;
-
-- init_timer(timer);
-- timer->expires = jiffies + RTL8169_PHY_TIMEOUT;
-- timer->data = (unsigned long)(dev);
-- timer->function = rtl8169_phy_timer;
-- add_timer(timer);
-+ rtl8169_mod_timer( (&priv->r8169_timer), priv->expire_time );
- }
-
--static int __devinit
--rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out,
-- void **ioaddr_out)
-+
-+
-+//======================================================================================================
-+//======================================================================================================
-+static int __devinit rtl8169_init_board ( struct pci_dev *pdev, struct net_device **dev_out, unsigned long *ioaddr_out)
- {
-- void *ioaddr = NULL;
-+ unsigned long ioaddr = 0;
- struct net_device *dev;
-- struct rtl8169_private *tp;
-+ struct rtl8169_private *priv;
-+ int rc, i;
- unsigned long mmio_start, mmio_end, mmio_flags, mmio_len;
-- int rc, i, acpi_idle_state = 0, pm_cap;
-
-
-- assert(pdev != NULL);
-- assert(ioaddr_out != NULL);
-+ assert (pdev != NULL);
-+ assert (ioaddr_out != NULL);
-
-- *ioaddr_out = NULL;
-+ *ioaddr_out = 0;
- *dev_out = NULL;
-
-- // dev zeroed in alloc_etherdev
-- dev = alloc_etherdev(sizeof (*tp));
-+ // dev zeroed in init_etherdev
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+ dev = init_etherdev (NULL, sizeof (*priv));
-+#else
-+ dev = alloc_etherdev (sizeof (*priv));
-+#endif
-+
- if (dev == NULL) {
-- printk(KERN_ERR PFX "unable to alloc new ethernet\n");
-+ printk (KERN_ERR PFX "unable to alloc new ethernet\n");
- return -ENOMEM;
- }
-
- SET_MODULE_OWNER(dev);
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
- SET_NETDEV_DEV(dev, &pdev->dev);
-- tp = dev->priv;
-+#endif
-+
-+ priv = dev->priv;
-
- // enable device (incl. PCI PM wakeup and hotplug setup)
-- rc = pci_enable_device(pdev);
-- if (rc) {
-- printk(KERN_ERR PFX "%s: unable to enable device\n", pdev->slot_name);
-+ rc = pci_enable_device (pdev);
-+ if (rc)
- goto err_out;
-- }
--
-- /* save power state before pci_enable_device overwrites it */
-- pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
-- if (pm_cap) {
-- u16 pwr_command;
-
-- pci_read_config_word(pdev, pm_cap + PCI_PM_CTRL, &pwr_command);
-- acpi_idle_state = pwr_command & PCI_PM_CTRL_STATE_MASK;
-- } else {
-- printk(KERN_ERR PFX "Cannot find PowerManagement capability, aborting.\n");
-- goto err_out_free_res;
-- }
--
-- mmio_start = pci_resource_start(pdev, 1);
-- mmio_end = pci_resource_end(pdev, 1);
-- mmio_flags = pci_resource_flags(pdev, 1);
-- mmio_len = pci_resource_len(pdev, 1);
-+ mmio_start = pci_resource_start (pdev, 1);
-+ mmio_end = pci_resource_end (pdev, 1);
-+ mmio_flags = pci_resource_flags (pdev, 1);
-+ mmio_len = pci_resource_len (pdev, 1);
-
- // make sure PCI base addr 1 is MMIO
- if (!(mmio_flags & IORESOURCE_MEM)) {
-- printk(KERN_ERR PFX
-- "region #1 not an MMIO resource, aborting\n");
-+ printk (KERN_ERR PFX "region #1 not an MMIO resource, aborting\n");
- rc = -ENODEV;
-- goto err_out_disable;
-+ goto err_out;
- }
-+
- // check for weird/broken PCI region reporting
-- if (mmio_len < RTL_MIN_IO_SIZE) {
-- printk(KERN_ERR PFX "Invalid PCI region size(s), aborting\n");
-+ if ( mmio_len < RTL_MIN_IO_SIZE ) {
-+ printk (KERN_ERR PFX "Invalid PCI region size(s), aborting\n");
- rc = -ENODEV;
-- goto err_out_disable;
-- }
--
-- rc = pci_request_regions(pdev, MODULENAME);
-- if (rc) {
-- printk(KERN_ERR PFX "%s: Could not request regions.\n", pdev->slot_name);
-- goto err_out_disable;
-+ goto err_out;
- }
-
-- tp->cp_cmd = PCIMulRW | RxChkSum;
--
-- if ((sizeof(dma_addr_t) > 32) &&
-- !pci_set_dma_mask(pdev, DMA_64BIT_MASK))
-- tp->cp_cmd |= PCIDAC;
-- else {
-- rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
-- if (rc < 0) {
-- printk(KERN_ERR PFX "DMA configuration failed.\n");
-- goto err_out_free_res;
-- }
-- }
-
-+ rc = pci_request_regions (pdev, dev->name);
-+ if (rc)
-+ goto err_out;
-
- // enable PCI bus-mastering
-- pci_set_master(pdev);
-+ pci_set_master (pdev);
-
-- // ioremap MMIO region
-- ioaddr = ioremap(mmio_start, mmio_len);
-- if (ioaddr == NULL) {
-- printk(KERN_ERR PFX "cannot remap MMIO, aborting\n");
-+#ifdef RTL8169_USE_IO
-+ ioaddr = pci_resource_start(pdev, 0);
-+#else
-+ // ioremap MMIO region
-+ ioaddr = (unsigned long)ioremap (mmio_start, mmio_len);
-+ if (ioaddr == 0) {
-+ printk (KERN_ERR PFX "cannot remap MMIO, aborting\n");
- rc = -EIO;
- goto err_out_free_res;
- }
-+#endif
-
-- // Soft reset the chip.
-- RTL_W8(ChipCmd, CmdReset);
-+ // Soft reset the chip.
-+ RTL_W8 ( ChipCmd, CmdReset);
-
- // Check that the chip has finished the reset.
-- for (i = 1000; i > 0; i--) {
-- if ((RTL_R8(ChipCmd) & CmdReset) == 0)
-+ for (i = 1000; i > 0; i--){
-+ if ( (RTL_R8(ChipCmd) & CmdReset) == 0){
- break;
-- udelay(10);
-+ }
-+ else{
-+ udelay (10);
-+ }
- }
-
-- // Identify chip attached to board
-- rtl8169_get_mac_version(tp, ioaddr);
-- rtl8169_get_phy_version(tp, ioaddr);
--
-- rtl8169_print_mac_version(tp);
-- rtl8169_print_phy_version(tp);
-+ // identify config method
-+ {
-+ unsigned long val32 = (RTL_R32(TxConfig)&0x7c800000);
-
-- for (i = ARRAY_SIZE(rtl_chip_info) - 1; i >= 0; i--) {
-- if (tp->mac_version == rtl_chip_info[i].mac_version)
-- break;
-+ if( val32 == (0x1<<28) ){
-+ priv->mcfg = MCFG_METHOD_4;
-+ }
-+ else if( val32 == (0x1<<26) ){
-+ priv->mcfg = MCFG_METHOD_3;
-+ }
-+ else if( val32 == (0x1<<23) ){
-+ priv->mcfg = MCFG_METHOD_2;
-+ }
-+ else if( val32 == 0x00000000 ){
-+ priv->mcfg = MCFG_METHOD_1;
-+ }
-+ else{
-+ priv->mcfg = MCFG_METHOD_1;
-+ }
- }
-- if (i < 0) {
-- /* Unknown chip: assume array element #0, original RTL-8169 */
-- printk(KERN_DEBUG PFX
-- "PCI device %s: unknown chip version, assuming %s\n",
-- pci_name(pdev), rtl_chip_info[0].name);
-- i++;
-+ {
-+ unsigned char val8 = (unsigned char)(RTL8169_READ_GMII_REG(ioaddr,3)&0x000f);
-+ if( val8 == 0x00 ){
-+ priv->pcfg = PCFG_METHOD_1;
-+ }
-+ else if( val8 == 0x01 ){
-+ priv->pcfg = PCFG_METHOD_2;
-+ }
-+ else if( val8 == 0x02 ){
-+ priv->pcfg = PCFG_METHOD_3;
-+ }
-+ else{
-+ priv->pcfg = PCFG_METHOD_3;
-+ }
-+ }
-+
-+
-+ for (i = ARRAY_SIZE (rtl_chip_info) - 1; i >= 0; i--){
-+ if (priv->mcfg == rtl_chip_info[i].mcfg) {
-+ priv->chipset = i;
-+ goto match;
-+ }
- }
-- tp->chipset = i;
-
-+ //if unknown chip, assume array element #0, original RTL-8169 in this case
-+ printk (KERN_DEBUG PFX "PCI device %s: unknown chip version, assuming RTL-8169\n", pdev->slot_name);
-+ priv->chipset = 0;
-+
-+match:
- *ioaddr_out = ioaddr;
- *dev_out = dev;
- return 0;
-
-+#ifndef RTL8169_USE_IO
- err_out_free_res:
-- pci_release_regions(pdev);
--
--err_out_disable:
-- pci_disable_device(pdev);
-+ pci_release_regions (pdev);
-+#endif
-
- err_out:
-- free_netdev(dev);
-+ unregister_netdev (dev);
-+ kfree (dev);
- return rc;
- }
-
--static int __devinit
--rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
-+
-+
-+
-+
-+
-+
-+//======================================================================================================
-+static int __devinit rtl8169_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
- {
- struct net_device *dev = NULL;
-- struct rtl8169_private *tp = NULL;
-- void *ioaddr = NULL;
-+ struct rtl8169_private *priv = NULL;
-+ unsigned long ioaddr = 0;
- static int board_idx = -1;
-- static int printed_version = 0;
-- int i, rc;
-+ int i;
- int option = -1, Cap10_100 = 0, Cap1000 = 0;
-
-- assert(pdev != NULL);
-- assert(ent != NULL);
-+
-+ assert (pdev != NULL);
-+ assert (ent != NULL);
-
- board_idx++;
-
-- if (!printed_version) {
-- printk(KERN_INFO RTL8169_DRIVER_NAME " loaded\n");
-- printed_version = 1;
-+
-+ i = rtl8169_init_board (pdev, &dev, &ioaddr);
-+ if (i < 0) {
-+ return i;
- }
-
-- rc = rtl8169_init_board(pdev, &dev, &ioaddr);
-- if (rc)
-- return rc;
-+ priv = dev->priv;
-+
-+ assert (ioaddr != NULL);
-+ assert (dev != NULL);
-+ assert (priv != NULL);
-+
-+ // Get MAC address //
-+ for (i = 0; i < MAC_ADDR_LEN ; i++){
-+ dev->dev_addr[i] = RTL_R8( MAC0 + i );
-+ }
-
-- tp = dev->priv;
-- assert(ioaddr != NULL);
-- assert(dev != NULL);
-- assert(tp != NULL);
--
-- // Get MAC address. FIXME: read EEPROM
-- for (i = 0; i < MAC_ADDR_LEN; i++)
-- dev->dev_addr[i] = RTL_R8(MAC0 + i);
--
-- dev->open = rtl8169_open;
-- dev->hard_start_xmit = rtl8169_start_xmit;
-- dev->get_stats = rtl8169_get_stats;
-- dev->ethtool_ops = &rtl8169_ethtool_ops;
-- dev->stop = rtl8169_close;
-- dev->tx_timeout = rtl8169_tx_timeout;
-+ dev->open = rtl8169_open;
-+ dev->hard_start_xmit = rtl8169_start_xmit;
-+ dev->get_stats = rtl8169_get_stats;
-+ dev->stop = rtl8169_close;
-+ dev->tx_timeout = rtl8169_tx_timeout;
- dev->set_multicast_list = rtl8169_set_rx_mode;
-- dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
-- dev->irq = pdev->irq;
-- dev->base_addr = (unsigned long) ioaddr;
--// dev->do_ioctl = mii_ioctl;
--
-- tp = dev->priv; // private data //
-- tp->pci_dev = pdev;
-- tp->mmio_addr = ioaddr;
--
-- spin_lock_init(&tp->lock);
--
-- rc = register_netdev(dev);
-- if (rc) {
-- iounmap(ioaddr);
-- pci_release_regions(pdev);
-- pci_disable_device(pdev);
-- free_netdev(dev);
-- return rc;
-- }
--
-- printk(KERN_DEBUG "%s: Identified chip type is '%s'.\n", dev->name,
-- rtl_chip_info[tp->chipset].name);
--
-- pci_set_drvdata(pdev, dev);
--
-- printk(KERN_INFO "%s: %s at 0x%lx, "
-- "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "
-- "IRQ %d\n",
-- dev->name,
-- rtl_chip_info[ent->driver_data].name,
-- dev->base_addr,
-- dev->dev_addr[0], dev->dev_addr[1],
-- dev->dev_addr[2], dev->dev_addr[3],
-- dev->dev_addr[4], dev->dev_addr[5], dev->irq);
-+ dev->watchdog_timeo = TX_TIMEOUT;
-+ dev->irq = pdev->irq;
-+ dev->base_addr = (unsigned long) ioaddr;
-+
-+#ifdef RTL8169_JUMBO_FRAME_SUPPORT
-+ dev->change_mtu = rtl8169_change_mtu;
-+#endif //end #ifdef RTL8169_JUMBO_FRAME_SUPPORT
-+
-+#ifdef RTL8169_IOCTL_SUPPORT
-+ dev->do_ioctl = rtl8169_ioctl;
-+#endif //end #ifdef RTL8169_IOCTL_SUPPORT
-+
-+#ifdef RTL8169_DYNAMIC_CONTROL
-+ priv->rt.dev = dev;
-+#endif //end #ifdef RTL8169_DYNAMIC_CONTROL
-+
-+ priv = dev->priv; // private data //
-+ priv->pci_dev = pdev;
-+ priv->ioaddr = ioaddr;
-+
-+//#ifdef RTL8169_JUMBO_FRAME_SUPPORT
-+ priv->curr_mtu_size = dev->mtu;
-+ priv->tx_pkt_len = dev->mtu + ETH_HDR_LEN;
-+ priv->rx_pkt_len = dev->mtu + ETH_HDR_LEN;
-+ priv->hw_rx_pkt_len = priv->rx_pkt_len + 8;
-+//#endif //end #ifdef RTL8169_JUMBO_FRAME_SUPPORT
-+
-+ DBG_PRINT("-------------------------- \n");
-+ DBG_PRINT("dev->mtu = %d \n", dev->mtu);
-+ DBG_PRINT("priv->curr_mtu_size = %d \n", priv->curr_mtu_size);
-+ DBG_PRINT("priv->tx_pkt_len = %d \n", priv->tx_pkt_len);
-+ DBG_PRINT("priv->rx_pkt_len = %d \n", priv->rx_pkt_len);
-+ DBG_PRINT("priv->hw_rx_pkt_len = %d \n", priv->hw_rx_pkt_len);
-+ DBG_PRINT("-------------------------- \n");
-+
-+ spin_lock_init (&priv->lock);
-+
-+ register_netdev (dev);
-+
-+ pci_set_drvdata(pdev, dev); // pdev->driver_data = data;
-+
-+
-+ printk (KERN_DEBUG "%s: Identified chip type is '%s'.\n",dev->name,rtl_chip_info[priv->chipset].name);
-+ printk (KERN_INFO "%s: %s at 0x%lx, "
-+ "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "
-+ "IRQ %d\n",
-+ dev->name,
-+ RTL8169_DRIVER_NAME,
-+ dev->base_addr,
-+ dev->dev_addr[0], dev->dev_addr[1],
-+ dev->dev_addr[2], dev->dev_addr[3],
-+ dev->dev_addr[4], dev->dev_addr[5],
-+ dev->irq);
-+
-
-- rtl8169_hw_phy_config(dev);
-+ // Config PHY
-+ rtl8169_hw_PHY_config(dev);
-
-- dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
-- RTL_W8(0x82, 0x01);
-+ DBG_PRINT("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
-+ RTL_W8( 0x82, 0x01 );
-
-- if (tp->mac_version < RTL_GIGA_MAC_VER_E) {
-- dprintk("Set PCI Latency=0x40\n");
-+ if( priv->mcfg < MCFG_METHOD_3 ){
-+ DBG_PRINT("Set PCI Latency=0x40\n");
- pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x40);
- }
-
-- if (tp->mac_version == RTL_GIGA_MAC_VER_D) {
-- dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
-- RTL_W8(0x82, 0x01);
-- dprintk("Set PHY Reg 0x0bh = 0x00h\n");
-- mdio_write(ioaddr, 0x0b, 0x0000); //w 0x0b 15 0 0
-+ if( priv->mcfg == MCFG_METHOD_2 ){
-+ DBG_PRINT("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
-+ RTL_W8( 0x82, 0x01 );
-+ DBG_PRINT("Set PHY Reg 0x0bh = 0x00h\n");
-+ RTL8169_WRITE_GMII_REG( ioaddr, 0x0b, 0x0000 ); //w 0x0b 15 0 0
- }
-
- // if TBI is not endbled
-- if (!(RTL_R8(PHYstatus) & TBI_Enable)) {
-- int val = mdio_read(ioaddr, PHY_AUTO_NEGO_REG);
-+ if( !(RTL_R8(PHYstatus) & TBI_Enable) ){
-+ int val = RTL8169_READ_GMII_REG( ioaddr, PHY_AUTO_NEGO_REG );
-+
-+#ifdef RTL8169_HW_FLOW_CONTROL_SUPPORT
-+ val |= PHY_Cap_PAUSE | PHY_Cap_ASYM_PAUSE ;
-+#endif //end #define RTL8169_HW_FLOW_CONTROL_SUPPORT
-
- option = (board_idx >= MAX_UNITS) ? 0 : media[board_idx];
- // Force RTL8169 in 10/100/1000 Full/Half mode.
-- if (option > 0) {
-- printk(KERN_INFO "%s: Force-mode Enabled.\n",
-- dev->name);
-- Cap10_100 = 0, Cap1000 = 0;
-- switch (option) {
-- case _10_Half:
-- Cap10_100 = PHY_Cap_10_Half_Or_Less;
-- Cap1000 = PHY_Cap_Null;
-- break;
-- case _10_Full:
-- Cap10_100 = PHY_Cap_10_Full_Or_Less;
-- Cap1000 = PHY_Cap_Null;
-- break;
-- case _100_Half:
-- Cap10_100 = PHY_Cap_100_Half_Or_Less;
-- Cap1000 = PHY_Cap_Null;
-- break;
-- case _100_Full:
-- Cap10_100 = PHY_Cap_100_Full_Or_Less;
-- Cap1000 = PHY_Cap_Null;
-- break;
-- case _1000_Full:
-- Cap10_100 = PHY_Cap_100_Full_Or_Less;
-- Cap1000 = PHY_Cap_1000_Full;
-- break;
-- default:
-- break;
-+ if( option > 0 ){
-+ printk(KERN_INFO "%s: Force-mode Enabled. \n", dev->name);
-+ Cap10_100 = 0;
-+ Cap1000 = 0;
-+ switch( option ){
-+ case _10_Half:
-+ Cap10_100 = PHY_Cap_10_Half;
-+ Cap1000 = PHY_Cap_Null;
-+ break;
-+ case _10_Full:
-+ Cap10_100 = PHY_Cap_10_Full | PHY_Cap_10_Half;
-+ Cap1000 = PHY_Cap_Null;
-+ break;
-+ case _100_Half:
-+ Cap10_100 = PHY_Cap_100_Half | PHY_Cap_10_Full | PHY_Cap_10_Half;
-+ Cap1000 = PHY_Cap_Null;
-+ break;
-+ case _100_Full:
-+ Cap10_100 = PHY_Cap_100_Full | PHY_Cap_100_Half | PHY_Cap_10_Full | PHY_Cap_10_Half;
-+ Cap1000 = PHY_Cap_Null;
-+ break;
-+ case _1000_Full:
-+ Cap10_100 = PHY_Cap_100_Full | PHY_Cap_100_Half | PHY_Cap_10_Full | PHY_Cap_10_Half;
-+ Cap1000 = PHY_Cap_1000_Full;
-+ break;
-+ default:
-+ break;
- }
-- mdio_write(ioaddr, PHY_AUTO_NEGO_REG, Cap10_100 | (val & 0x1F)); //leave PHY_AUTO_NEGO_REG bit4:0 unchanged
-- mdio_write(ioaddr, PHY_1000_CTRL_REG, Cap1000);
-- } else {
-- printk(KERN_INFO "%s: Auto-negotiation Enabled.\n",
-- dev->name);
-+ RTL8169_WRITE_GMII_REG( ioaddr, PHY_AUTO_NEGO_REG, Cap10_100 | ( val&0xC1F ) ); //leave PHY_AUTO_NEGO_REG bit4:0 unchanged
-+ RTL8169_WRITE_GMII_REG( ioaddr, PHY_1000_CTRL_REG, Cap1000 );
-+ }
-+ else{
-+ printk(KERN_INFO "%s: Auto-negotiation Enabled.\n", dev->name);
-
- // enable 10/100 Full/Half Mode, leave PHY_AUTO_NEGO_REG bit4:0 unchanged
-- mdio_write(ioaddr, PHY_AUTO_NEGO_REG,
-- PHY_Cap_100_Full_Or_Less | (val & 0x1f));
-+ RTL8169_WRITE_GMII_REG( ioaddr, PHY_AUTO_NEGO_REG,
-+ PHY_Cap_10_Half | PHY_Cap_10_Full | PHY_Cap_100_Half | PHY_Cap_100_Full | ( val&0xC1F ) );
-
- // enable 1000 Full Mode
-- mdio_write(ioaddr, PHY_1000_CTRL_REG,
-- PHY_Cap_1000_Full);
--
-- }
-+// RTL8169_WRITE_GMII_REG( ioaddr, PHY_1000_CTRL_REG, PHY_Cap_1000_Full );
-+ RTL8169_WRITE_GMII_REG( ioaddr, PHY_1000_CTRL_REG, PHY_Cap_1000_Full | PHY_Cap_1000_Half); //rtl8168
-+
-+ }// end of if( option > 0 )
-
- // Enable auto-negotiation and restart auto-nigotiation
-- mdio_write(ioaddr, PHY_CTRL_REG,
-- PHY_Enable_Auto_Nego | PHY_Restart_Auto_Nego);
-+ RTL8169_WRITE_GMII_REG( ioaddr, PHY_CTRL_REG, PHY_Enable_Auto_Nego | PHY_Restart_Auto_Nego );
- udelay(100);
-
- // wait for auto-negotiation process
-- for (i = 10000; i > 0; i--) {
-+ for( i = 10000; i > 0; i-- ){
- //check if auto-negotiation complete
-- if (mdio_read(ioaddr, PHY_STAT_REG) &
-- PHY_Auto_Neco_Comp) {
-+ if( RTL8169_READ_GMII_REG(ioaddr, PHY_STAT_REG) & PHY_Auto_Neco_Comp ){
- udelay(100);
- option = RTL_R8(PHYstatus);
-- if (option & _1000bpsF) {
-- printk(KERN_INFO
-- "%s: 1000Mbps Full-duplex operation.\n",
-- dev->name);
-- } else {
-- printk(KERN_INFO
-- "%s: %sMbps %s-duplex operation.\n",
-- dev->name,
-- (option & _100bps) ? "100" :
-- "10",
-- (option & FullDup) ? "Full" :
-- "Half");
-+ if( option & _1000bpsF ){
-+ printk(KERN_INFO "%s: 1000Mbps Full-duplex operation.\n", dev->name);
-+ }
-+ else{
-+ printk(KERN_INFO "%s: %sMbps %s-duplex operation.\n", dev->name,
-+ (option & _100bps) ? "100" : "10", (option & FullDup) ? "Full" : "Half" );
- }
- break;
-- } else {
-+ }
-+ else{
- udelay(100);
-+ }// end of if( RTL8169_READ_GMII_REG(ioaddr, 1) & 0x20 )
-+ }// end for-loop to wait for auto-negotiation process
-+
-+ option = RTL_R8(PHYstatus);
-+ if( option & _1000bpsF ){
-+ priv->linkstatus = _1000_Full;
-+ }
-+ else{
-+ if(option & _100bps){
-+ priv->linkstatus = (option & FullDup) ? _100_Full : _100_Half;
-+ }
-+ else{
-+ priv->linkstatus = (option & FullDup) ? _10_Full : _10_Half;
- }
-- } // end for-loop to wait for auto-negotiation process
-+ }
-+ DBG_PRINT("priv->linkstatus = 0x%02x\n", priv->linkstatus);
-
-- } else {
-+ }// end of TBI is not enabled
-+ else{
- udelay(100);
-- printk(KERN_INFO
-- "%s: 1000Mbps Full-duplex operation, TBI Link %s!\n",
-- dev->name,
-- (RTL_R32(TBICSR) & TBILinkOK) ? "OK" : "Failed");
-+ DBG_PRINT("1000Mbps Full-duplex operation, TBI Link %s!\n",(RTL_R32(TBICSR) & TBILinkOK) ? "OK" : "Failed" );
-
-- }
-+ }// end of TBI is not enabled
-
- return 0;
- }
-
--static void __devexit
--rtl8169_remove_one(struct pci_dev *pdev)
-+
-+
-+
-+
-+
-+
-+//======================================================================================================
-+static void __devexit rtl8169_remove_one (struct pci_dev *pdev)
- {
- struct net_device *dev = pci_get_drvdata(pdev);
-- struct rtl8169_private *tp = dev->priv;
-
-- assert(dev != NULL);
-- assert(tp != NULL);
-+ assert (dev != NULL);
-+ assert (priv != NULL);
-
-- unregister_netdev(dev);
-- iounmap(tp->mmio_addr);
-- pci_release_regions(pdev);
-+ unregister_netdev (dev);
-+
-+#ifdef RTL8169_USE_IO
-+#else
-+ iounmap ((void *)(dev->base_addr));
-+#endif
-+ pci_release_regions (pdev);
-
-- pci_disable_device(pdev);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+ kfree (dev);
-+#else
- free_netdev(dev);
-- pci_set_drvdata(pdev, NULL);
-+#endif
-+
-+ pci_set_drvdata (pdev, NULL);
- }
-
--#ifdef CONFIG_PM
-
--static int rtl8169_suspend(struct pci_dev *pdev, u32 state)
-+
-+
-+
-+
-+
-+//======================================================================================================
-+static int rtl8169_open (struct net_device *dev)
- {
-- struct net_device *dev = pci_get_drvdata(pdev);
-- struct rtl8169_private *tp = dev->priv;
-- void *ioaddr = tp->mmio_addr;
-- unsigned long flags;
-+ struct rtl8169_private *priv = dev->priv;
-+ struct pci_dev *pdev = priv->pci_dev;
-+ int retval;
-+// u8 diff;
-+// u32 TxPhyAddr, RxPhyAddr;
-+
-+
-+ if( priv->drvinit_fail == 1 ){
-+ printk("%s: Gigabit driver open failed.\n", dev->name );
-+ return -ENOMEM;
-+ }
-+
-+ retval = request_irq (dev->irq, rtl8169_interrupt, SA_SHIRQ, dev->name, dev);
-+ if (retval) {
-+ return retval;
-+ }
-+
-+ //2004-05-11
-+ // Allocate tx/rx descriptor space
-+ priv->sizeof_txdesc_space = NUM_TX_DESC * sizeof(struct TxDesc)+256;
-+ priv->txdesc_space = pci_alloc_consistent( pdev, priv->sizeof_txdesc_space, &priv->txdesc_phy_dma_addr );
-+ if( priv->txdesc_space == NULL ){
-+ printk("%s: Gigabit driver alloc txdesc_space failed.\n", dev->name );
-+ return -ENOMEM;
-+ }
-+ priv->sizeof_rxdesc_space = NUM_RX_DESC * sizeof(struct RxDesc)+256;
-+ priv->rxdesc_space = pci_alloc_consistent( pdev, priv->sizeof_rxdesc_space, &priv->rxdesc_phy_dma_addr );
-+ if( priv->rxdesc_space == NULL ){
-+ printk("%s: Gigabit driver alloc rxdesc_space failed.\n", dev->name );
-+ return -ENOMEM;
-+ }
-+
-+ if(priv->txdesc_phy_dma_addr & 0xff){
-+ printk("%s: Gigabit driver txdesc_phy_dma_addr is not 256-bytes-aligned.\n", dev->name );
-+ }
-+ if(priv->rxdesc_phy_dma_addr & 0xff){
-+ printk("%s: Gigabit driver rxdesc_phy_dma_addr is not 256-bytes-aligned.\n", dev->name );
-+ }
-+ // Set tx/rx descriptor space
-+ priv->TxDescArray = (struct TxDesc *)priv->txdesc_space;
-+ priv->RxDescArray = (struct RxDesc *)priv->rxdesc_space;
-+
-+ {
-+ int i;
-+ struct sk_buff *skb = NULL;
-+
-+ for(i=0;i<NUM_RX_DESC;i++){
-+ skb = RTL8169_ALLOC_RXSKB(MAX_RX_SKBDATA_SIZE);
-+ if( skb != NULL ) {
-+ skb_reserve (skb, 2); // 16 byte align the IP fields. //
-+ priv->Rx_skbuff[i] = skb;
-+ }
-+ else{
-+ printk("%s: Gigabit driver failed to allocate skbuff.\n", dev->name);
-+ priv->drvinit_fail = 1;
-+ }
-+ }
-+ }
-+
-+
-+ //////////////////////////////////////////////////////////////////////////////
-+ rtl8169_init_ring (dev);
-+ rtl8169_hw_start (dev);
-+
-+
-+ // ------------------------------------------------------
-+ DBG_PRINT("FIX PCS -> rtl8169_request_timer\n");
-+ priv->expire_time = RTL8169_TIMER_EXPIRE_TIME;
-+ rtl8169_request_timer( (&priv->r8169_timer), priv->expire_time, rtl8169_timer_handler, ((void *)dev) ); //in open()
-+
-+
-+ DBG_PRINT("%s: %s() alloc_rxskb_cnt = %d\n", dev->name, __FUNCTION__, alloc_rxskb_cnt );
-
-- if (!netif_running(dev))
-- return 0;
--
-- netif_device_detach(dev);
-- netif_stop_queue(dev);
-- spin_lock_irqsave(&tp->lock, flags);
--
-- /* Disable interrupts, stop Rx and Tx */
-- RTL_W16(IntrMask, 0);
-- RTL_W8(ChipCmd, 0);
--
-- /* Update the error counts. */
-- tp->stats.rx_missed_errors += RTL_R32(RxMissed);
-- RTL_W32(RxMissed, 0);
-- spin_unlock_irqrestore(&tp->lock, flags);
--
- return 0;
--}
-
--static int rtl8169_resume(struct pci_dev *pdev)
-+}//end of rtl8169_open (struct net_device *dev)
-+
-+
-+
-+
-+
-+
-+
-+
-+//======================================================================================================
-+static void rtl8169_hw_PHY_reset(struct net_device *dev)
- {
-- struct net_device *dev = pci_get_drvdata(pdev);
-+ int val, phy_reset_expiretime = 50;
-+ struct rtl8169_private *priv = dev->priv;
-+ unsigned long ioaddr = priv->ioaddr;
-
-- if (!netif_running(dev))
-- return 0;
-+ DBG_PRINT("%s: Reset RTL8169s PHY\n", dev->name);
-
-- netif_device_attach(dev);
-- rtl8169_hw_start(dev);
-+ val = ( RTL8169_READ_GMII_REG( ioaddr, 0 ) | 0x8000 ) & 0xffff;
-+ RTL8169_WRITE_GMII_REG( ioaddr, 0, val );
-
-- return 0;
-+ do //waiting for phy reset
-+ {
-+ if( RTL8169_READ_GMII_REG( ioaddr, 0 ) & 0x8000 ){
-+ phy_reset_expiretime --;
-+ udelay(100);
-+ }
-+ else{
-+ break;
-+ }
-+ }while( phy_reset_expiretime >= 0 );
-+
-+ assert( phy_reset_expiretime > 0 );
- }
--
--#endif /* CONFIG_PM */
-
--static int
--rtl8169_open(struct net_device *dev)
-+
-+
-+
-+//======================================================================================================
-+static void rtl8169_hw_PHY_config (struct net_device *dev)
- {
-- struct rtl8169_private *tp = dev->priv;
-- struct pci_dev *pdev = tp->pci_dev;
-- int retval;
-+ struct rtl8169_private *priv = dev->priv;
-+ void *ioaddr = (void*)priv->ioaddr;
-+
-+ DBG_PRINT("priv->mcfg=%d, priv->pcfg=%d\n",priv->mcfg,priv->pcfg);
-
-- retval =
-- request_irq(dev->irq, rtl8169_interrupt, SA_SHIRQ, dev->name, dev);
-- if (retval < 0)
-- goto out;
--
-- retval = -ENOMEM;
--
-- /*
-- * Rx and Tx desscriptors needs 256 bytes alignment.
-- * pci_alloc_consistent provides more.
-- */
-- tp->TxDescArray = pci_alloc_consistent(pdev, R8169_TX_RING_BYTES,
-- &tp->TxPhyAddr);
-- if (!tp->TxDescArray)
-- goto err_free_irq;
--
-- tp->RxDescArray = pci_alloc_consistent(pdev, R8169_RX_RING_BYTES,
-- &tp->RxPhyAddr);
-- if (!tp->RxDescArray)
-- goto err_free_tx;
--
-- retval = rtl8169_init_ring(dev);
-- if (retval < 0)
-- goto err_free_rx;
--
-- rtl8169_hw_start(dev);
--
-- rtl8169_request_timer(dev);
--out:
-- return retval;
--
--err_free_rx:
-- pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
-- tp->RxPhyAddr);
--err_free_tx:
-- pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
-- tp->TxPhyAddr);
--err_free_irq:
-- free_irq(dev->irq, dev);
-- goto out;
-+ if( priv->mcfg == MCFG_METHOD_4 ){
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1F, 0x0001 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1b, 0x841e );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x0e, 0x7bfb );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x09, 0x273a );
-+
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1F, 0x0002 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0x90D0 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1F, 0x0000 );
-+ }else if((priv->mcfg == MCFG_METHOD_2)||(priv->mcfg == MCFG_METHOD_3)){
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1F, 0x0001 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x15, 0x1000 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x18, 0x65C7 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x0000 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0x00A1 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0x0008 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0x1020 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0x1000 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x0800 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x0000 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x7000 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0xFF41 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0xDE60 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0x0140 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0x0077 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x7800 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x7000 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xA000 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0xDF01 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0xDF20 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0xFF95 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0xFA00 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xA800 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xA000 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xB000 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0xFF41 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0xDE20 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0x0140 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0x00BB );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xB800 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xB000 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xF000 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0xDF01 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0xDF20 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0xFF95 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0xBF00 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xF800 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xF000 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x0000 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1F, 0x0000 );
-+ RTL8169_WRITE_GMII_REG( (unsigned long)ioaddr, 0x0B, 0x0000 );
-+ }
-+ else{
-+ DBG_PRINT("priv->mcfg=%d. Discard hw PHY config.\n",priv->mcfg);
-+ }
- }
-
--static void
--rtl8169_hw_start(struct net_device *dev)
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+//======================================================================================================
-+static void rtl8169_hw_start (struct net_device *dev)
- {
-- struct rtl8169_private *tp = dev->priv;
-- void *ioaddr = tp->mmio_addr;
-+ struct rtl8169_private *priv = dev->priv;
-+ unsigned long ioaddr = priv->ioaddr;
- u32 i;
-
-+
- /* Soft reset the chip. */
-- RTL_W8(ChipCmd, CmdReset);
-+ RTL_W8 ( ChipCmd, CmdReset);
-
- /* Check that the chip has finished the reset. */
-- for (i = 1000; i > 0; i--) {
-- if ((RTL_R8(ChipCmd) & CmdReset) == 0)
-- break;
-- else
-- udelay(10);
-+ for (i = 1000; i > 0; i--){
-+ if ((RTL_R8( ChipCmd ) & CmdReset) == 0) break;
-+ else udelay (10);
- }
-
-- RTL_W8(Cfg9346, Cfg9346_Unlock);
-- RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
-- RTL_W8(EarlyTxThres, EarlyTxThld);
-+ RTL_W8 ( Cfg9346, Cfg9346_Unlock);
-+ RTL_W8 ( ChipCmd, CmdTxEnb | CmdRxEnb);
-+ RTL_W8 ( ETThReg, ETTh);
-
- // For gigabit rtl8169
-- RTL_W16(RxMaxSize, RxPacketMaxSize);
-+ RTL_W16 ( RxMaxSize, (unsigned short)priv->hw_rx_pkt_len );
-
- // Set Rx Config register
-- i = rtl8169_rx_config | (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].
-- RxConfigMask);
-- RTL_W32(RxConfig, i);
-+ i = rtl8169_rx_config | ( RTL_R32( RxConfig ) & rtl_chip_info[priv->chipset].RxConfigMask);
-+ RTL_W32 ( RxConfig, i);
-+
-
- /* Set DMA burst size and Interframe Gap Time */
-- RTL_W32(TxConfig,
-- (TX_DMA_BURST << TxDMAShift) | (InterFrameGap <<
-- TxInterFrameGapShift));
-- tp->cp_cmd |= RTL_R16(CPlusCmd);
-- RTL_W16(CPlusCmd, tp->cp_cmd);
-+ RTL_W32 ( TxConfig, (TX_DMA_BURST << TxDMAShift) | (InterFrameGap << TxInterFrameGapShift) );
-
-- if (tp->mac_version == RTL_GIGA_MAC_VER_D) {
-- dprintk(KERN_INFO PFX "Set MAC Reg C+CR Offset 0xE0: bit-3 and bit-14 MUST be 1\n");
-- tp->cp_cmd |= (1 << 14) | PCIMulRW;
-- RTL_W16(CPlusCmd, tp->cp_cmd);
-- }
-
-- tp->cur_rx = 0;
-
-- RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr & DMA_32BIT_MASK));
-- RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr >> 32));
-- RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr & DMA_32BIT_MASK));
-- RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr >> 32));
-- RTL_W8(Cfg9346, Cfg9346_Lock);
-- udelay(10);
-+ RTL_W16( CPlusCmd, RTL_R16(CPlusCmd) );
-
-- RTL_W32(RxMissed, 0);
-+ if( priv->mcfg == MCFG_METHOD_2 ||
-+ priv->mcfg == MCFG_METHOD_3)
-+ {
-+ RTL_W16( CPlusCmd, (RTL_R16(CPlusCmd)|(1<<14)|(1<<3)) );
-+ DBG_PRINT("Set MAC Reg C+CR Offset 0xE0: bit-3 and bit-14\n");
-+ }
-+ else
-+ {
-+ RTL_W16( CPlusCmd, (RTL_R16(CPlusCmd)|(1<<3)) );
-+ DBG_PRINT("Set MAC Reg C+CR Offset 0xE0: bit-3.\n");
-+ }
-
-- rtl8169_set_rx_mode(dev);
-+ {
-+ //RTL_W16(0xE2, 0x1517);
-+ //RTL_W16(0xE2, 0x152a);
-+ //RTL_W16(0xE2, 0x282a);
-+ RTL_W16(0xE2, 0x0000);
-+ }
-
-- /* no early-rx interrupts */
-- RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
-+ priv->cur_rx = 0;
-
-- /* Enable all known interrupts by setting the interrupt mask. */
-- RTL_W16(IntrMask, rtl8169_intr_mask);
-+ RTL_W32 ( TxDescStartAddr, priv->txdesc_phy_dma_addr);
-+ RTL_W32 ( TxDescStartAddr + 4, 0x00);
-+ RTL_W32 ( RxDescStartAddr, priv->rxdesc_phy_dma_addr);
-+ RTL_W32 ( RxDescStartAddr + 4, 0x00);
-
-- netif_start_queue(dev);
-+ RTL_W8 ( Cfg9346, Cfg9346_Lock );
-+ udelay (10);
-
--}
-+ RTL_W32 ( RxMissed, 0 );
-
--static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
--{
-- desc->addr = 0x0badbadbadbadbadull;
-- desc->status &= ~cpu_to_le32(OWNbit | RsvdMask);
--}
-+ rtl8169_set_rx_mode (dev);
-
--static void rtl8169_free_rx_skb(struct pci_dev *pdev, struct sk_buff **sk_buff,
-- struct RxDesc *desc)
--{
-- pci_unmap_single(pdev, le64_to_cpu(desc->addr), RX_BUF_SIZE,
-- PCI_DMA_FROMDEVICE);
-- dev_kfree_skb(*sk_buff);
-- *sk_buff = NULL;
-- rtl8169_make_unusable_by_asic(desc);
--}
-+ RTL_W16 ( MultiIntr, RTL_R16(MultiIntr) & 0xF000);
-
--static inline void rtl8169_return_to_asic(struct RxDesc *desc)
--{
-- desc->status |= cpu_to_le32(OWNbit + RX_BUF_SIZE);
--}
-+ RTL_W16 ( IntrMask, rtl8169_intr_mask);
-
--static inline void rtl8169_give_to_asic(struct RxDesc *desc, dma_addr_t mapping)
--{
-- desc->addr = cpu_to_le64(mapping);
-- desc->status |= cpu_to_le32(OWNbit + RX_BUF_SIZE);
--}
-+ netif_start_queue (dev);
-
--static int rtl8169_alloc_rx_skb(struct pci_dev *pdev, struct net_device *dev,
-- struct sk_buff **sk_buff, struct RxDesc *desc)
--{
-- struct sk_buff *skb;
-- dma_addr_t mapping;
-- int ret = 0;
-+}//end of rtl8169_hw_start (struct net_device *dev)
-
-- skb = dev_alloc_skb(RX_BUF_SIZE);
-- if (!skb)
-- goto err_out;
-
-- skb->dev = dev;
-- skb_reserve(skb, 2);
-- *sk_buff = skb;
-
-- mapping = pci_map_single(pdev, skb->tail, RX_BUF_SIZE,
-- PCI_DMA_FROMDEVICE);
-
-- rtl8169_give_to_asic(desc, mapping);
-
--out:
-- return ret;
-
--err_out:
-- ret = -ENOMEM;
-- rtl8169_make_unusable_by_asic(desc);
-- goto out;
--}
-
--static void rtl8169_rx_clear(struct rtl8169_private *tp)
-+//======================================================================================================
-+static void rtl8169_init_ring (struct net_device *dev)
- {
-+ struct rtl8169_private *priv = dev->priv;
-+ struct pci_dev *pdev = priv->pci_dev;
- int i;
-+ struct sk_buff *skb;
-+
-
-- for (i = 0; i < NUM_RX_DESC; i++) {
-- if (tp->Rx_skbuff[i]) {
-- rtl8169_free_rx_skb(tp->pci_dev, tp->Rx_skbuff + i,
-- tp->RxDescArray + i);
-- }
-+ priv->cur_rx = 0;
-+ priv->cur_tx = 0;
-+ priv->dirty_tx = 0;
-+ memset(priv->TxDescArray, 0x0, NUM_TX_DESC*sizeof(struct TxDesc));
-+ memset(priv->RxDescArray, 0x0, NUM_RX_DESC*sizeof(struct RxDesc));
-+
-+
-+ for (i=0 ; i<NUM_TX_DESC ; i++){
-+ priv->Tx_skbuff[i]=NULL;
-+ priv->txdesc_array_dma_addr[i] = pci_map_single(pdev, &priv->TxDescArray[i], sizeof(struct TxDesc), PCI_DMA_TODEVICE);
- }
--}
-
--static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev,
-- u32 start, u32 end)
--{
-- u32 cur;
--
-- for (cur = start; end - cur > 0; cur++) {
-- int ret, i = cur % NUM_RX_DESC;
-+ for (i=0; i <NUM_RX_DESC; i++) {
-+ if(i==(NUM_RX_DESC-1)){
-+ priv->RxDescArray[i].status = cpu_to_le32((OWNbit | EORbit) | (unsigned long)priv->hw_rx_pkt_len);
-+ }
-+ else{
-+ priv->RxDescArray[i].status = cpu_to_le32(OWNbit | (unsigned long)priv->hw_rx_pkt_len);
-+ }
-
-- if (tp->Rx_skbuff[i])
-- continue;
--
-- ret = rtl8169_alloc_rx_skb(tp->pci_dev, dev, tp->Rx_skbuff + i,
-- tp->RxDescArray + i);
-- if (ret < 0)
-- break;
-+ {//-----------------------------------------------------------------------
-+ skb = priv->Rx_skbuff[i];
-+ priv->rx_skbuff_dma_addr[i] = pci_map_single(pdev, skb->data, MAX_RX_SKBDATA_SIZE, PCI_DMA_FROMDEVICE);
-+
-+ if( skb != NULL ){
-+ priv->RxDescArray[i].buf_addr = cpu_to_le32(priv->rx_skbuff_dma_addr[i]);
-+ priv->RxDescArray[i].buf_Haddr = 0;
-+ }
-+ else{
-+ DBG_PRINT("%s: %s() Rx_skbuff == NULL\n", dev->name, __FUNCTION__);
-+ priv->drvinit_fail = 1;
-+ }
-+ }//-----------------------------------------------------------------------
-+ priv->rxdesc_array_dma_addr[i] = pci_map_single(pdev, &priv->RxDescArray[i], sizeof(struct RxDesc), PCI_DMA_TODEVICE);
-+ pci_dma_sync_single(pdev, priv->rxdesc_array_dma_addr[i], sizeof(struct RxDesc), PCI_DMA_TODEVICE);
- }
-- return cur - start;
- }
-
--static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
--{
-- desc->status |= cpu_to_le32(EORbit);
--}
-
--static int rtl8169_init_ring(struct net_device *dev)
--{
-- struct rtl8169_private *tp = dev->priv;
-
-- tp->cur_rx = tp->dirty_rx = 0;
-- tp->cur_tx = tp->dirty_tx = 0;
-- memset(tp->TxDescArray, 0x0, NUM_TX_DESC * sizeof (struct TxDesc));
-- memset(tp->RxDescArray, 0x0, NUM_RX_DESC * sizeof (struct RxDesc));
-
-- memset(tp->Tx_skbuff, 0x0, NUM_TX_DESC * sizeof(struct sk_buff *));
-- memset(tp->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *));
-
-- if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC) != NUM_RX_DESC)
-- goto err_out;
-
-- rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
-
-- return 0;
-+//======================================================================================================
-+static void rtl8169_tx_clear (struct rtl8169_private *priv)
-+{
-+ int i;
-
--err_out:
-- rtl8169_rx_clear(tp);
-- return -ENOMEM;
-+ priv->cur_tx = 0;
-+ for ( i = 0 ; i < NUM_TX_DESC ; i++ ){
-+ if ( priv->Tx_skbuff[i] != NULL ) {
-+ dev_kfree_skb ( priv->Tx_skbuff[i] );
-+ priv->Tx_skbuff[i] = NULL;
-+ priv->stats.tx_dropped++;
-+ }
-+ }
- }
-
--static void rtl8169_unmap_tx_skb(struct pci_dev *pdev, struct sk_buff **sk_buff,
-- struct TxDesc *desc)
--{
-- u32 len = sk_buff[0]->len;
-
-- pci_unmap_single(pdev, le64_to_cpu(desc->addr),
-- len < ETH_ZLEN ? ETH_ZLEN : len, PCI_DMA_TODEVICE);
-- desc->addr = 0x00;
-- *sk_buff = NULL;
--}
-
--static void
--rtl8169_tx_clear(struct rtl8169_private *tp)
--{
-- int i;
-
-- tp->cur_tx = 0;
-- for (i = 0; i < NUM_TX_DESC; i++) {
-- struct sk_buff *skb = tp->Tx_skbuff[i];
-
-- if (skb) {
-- rtl8169_unmap_tx_skb(tp->pci_dev, tp->Tx_skbuff + i,
-- tp->TxDescArray + i);
-- dev_kfree_skb(skb);
-- tp->stats.tx_dropped++;
-- }
-- }
--}
-
--static void
--rtl8169_tx_timeout(struct net_device *dev)
-+
-+//======================================================================================================
-+static void rtl8169_tx_timeout (struct net_device *dev)
- {
-- struct rtl8169_private *tp = dev->priv;
-- void *ioaddr = tp->mmio_addr;
-+ struct rtl8169_private *priv = dev->priv;
-+ unsigned long ioaddr = priv->ioaddr;
- u8 tmp8;
-
- /* disable Tx, if not already */
-- tmp8 = RTL_R8(ChipCmd);
-- if (tmp8 & CmdTxEnb)
-- RTL_W8(ChipCmd, tmp8 & ~CmdTxEnb);
-+ tmp8 = RTL_R8( ChipCmd );
-+ if (tmp8 & CmdTxEnb){
-+ RTL_W8 ( ChipCmd, tmp8 & ~CmdTxEnb);
-+ }
-
- /* Disable interrupts by clearing the interrupt mask. */
-- RTL_W16(IntrMask, 0x0000);
-+ RTL_W16 ( IntrMask, 0x0000);
-
- /* Stop a shared interrupt from scavenging while we are. */
-- spin_lock_irq(&tp->lock);
-- rtl8169_tx_clear(tp);
-- spin_unlock_irq(&tp->lock);
-+ spin_lock_irq (&priv->lock);
-+ rtl8169_tx_clear (priv);
-+ spin_unlock_irq (&priv->lock);
-+
-
-- /* ...and finally, reset everything */
-- rtl8169_hw_start(dev);
-+ rtl8169_hw_start (dev);
-
-- netif_wake_queue(dev);
-+ netif_wake_queue (dev);
- }
-
--static int
--rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev)
--{
-- struct rtl8169_private *tp = dev->priv;
-- void *ioaddr = tp->mmio_addr;
-- int entry = tp->cur_tx % NUM_TX_DESC;
-- u32 len = skb->len;
-
-- if (unlikely(skb->len < ETH_ZLEN)) {
-- skb = skb_padto(skb, ETH_ZLEN);
-- if (!skb)
-- goto err_update_stats;
-- len = ETH_ZLEN;
-- }
--
-- spin_lock_irq(&tp->lock);
-
-- if (!(le32_to_cpu(tp->TxDescArray[entry].status) & OWNbit)) {
-- dma_addr_t mapping;
-
-- mapping = pci_map_single(tp->pci_dev, skb->data, len,
-- PCI_DMA_TODEVICE);
-
-- tp->Tx_skbuff[entry] = skb;
-- tp->TxDescArray[entry].addr = cpu_to_le64(mapping);
-
-- tp->TxDescArray[entry].status = cpu_to_le32(OWNbit | FSbit |
-- LSbit | len | (EORbit * !((entry + 1) % NUM_TX_DESC)));
--
-- RTL_W8(TxPoll, 0x40); //set polling bit
-
-- dev->trans_start = jiffies;
-+//======================================================================================================
-+static int rtl8169_start_xmit (struct sk_buff *skb, struct net_device *dev)
-+{
-+ struct rtl8169_private *priv = dev->priv;
-+ unsigned long ioaddr = priv->ioaddr;
-+ struct pci_dev *pdev = priv->pci_dev;
-+ int entry = priv->cur_tx % NUM_TX_DESC;
-+ int buf_len = 60;
-+ dma_addr_t txbuf_dma_addr;
-
-- tp->cur_tx++;
-- } else
-- goto err_drop;
-+ spin_lock_irq (&priv->lock);
-
-+ if( (le32_to_cpu(priv->TxDescArray[entry].status) & OWNbit)==0 ){
-
-- if ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx) {
-- netif_stop_queue(dev);
-- }
--out:
-- spin_unlock_irq(&tp->lock);
-+ priv->Tx_skbuff[entry] = skb;
-+ txbuf_dma_addr = pci_map_single(pdev, skb->data, skb->len, PCI_DMA_TODEVICE);
-+
-+ priv->TxDescArray[entry].buf_addr = cpu_to_le32(txbuf_dma_addr);
-+ DBG_PRINT("%s: TX pkt_size = %d\n", __FUNCTION__, skb->len);
-+ if( skb->len <= priv->tx_pkt_len ){
-+ buf_len = skb->len;
-+ }
-+ else{
-+ printk("%s: Error -- Tx packet size(%d) > mtu(%d)+14\n", dev->name, skb->len, dev->mtu);
-+ buf_len = priv->tx_pkt_len;
-+ }
-
-- return 0;
-+ if( entry != (NUM_TX_DESC-1) ){
-+ priv->TxDescArray[entry].status = cpu_to_le32((OWNbit | FSbit | LSbit) | buf_len);
-+ }
-+ else{
-+ priv->TxDescArray[entry].status = cpu_to_le32((OWNbit | EORbit | FSbit | LSbit) | buf_len);
-+ }
-
--err_drop:
-- dev_kfree_skb(skb);
--err_update_stats:
-- tp->stats.tx_dropped++;
-- goto out;
--}
--
--static void
--rtl8169_tx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
-- void *ioaddr)
--{
-- unsigned long dirty_tx, tx_left;
--
-- assert(dev != NULL);
-- assert(tp != NULL);
-- assert(ioaddr != NULL);
--
-- dirty_tx = tp->dirty_tx;
-- tx_left = tp->cur_tx - dirty_tx;
--
-- while (tx_left > 0) {
-- int entry = dirty_tx % NUM_TX_DESC;
-- struct sk_buff *skb = tp->Tx_skbuff[entry];
-- u32 status;
--
-- rmb();
-- status = le32_to_cpu(tp->TxDescArray[entry].status);
-- if (status & OWNbit)
-- break;
-+ pci_dma_sync_single(pdev, priv->txdesc_array_dma_addr[entry], sizeof(struct TxDesc), PCI_DMA_TODEVICE);
-
-- /* FIXME: is it really accurate for TxErr ? */
-- tp->stats.tx_bytes += skb->len >= ETH_ZLEN ?
-- skb->len : ETH_ZLEN;
-- tp->stats.tx_packets++;
-- rtl8169_unmap_tx_skb(tp->pci_dev, tp->Tx_skbuff + entry,
-- tp->TxDescArray + entry);
-- dev_kfree_skb_irq(skb);
-- tp->Tx_skbuff[entry] = NULL;
-- dirty_tx++;
-- tx_left--;
-- }
-+ RTL_W8 ( TxPoll, 0x40); //set polling bit
-
-- if (tp->dirty_tx != dirty_tx) {
-- tp->dirty_tx = dirty_tx;
-- if (netif_queue_stopped(dev))
-- netif_wake_queue(dev);
-+ dev->trans_start = jiffies;
-+
-+ priv->stats.tx_bytes += ( (skb->len > ETH_ZLEN) ? skb->len : ETH_ZLEN);
-+ priv->cur_tx++;
-+ }//end of if( (priv->TxDescArray[entry].status & 0x80000000)==0 )
-+
-+ spin_unlock_irq (&priv->lock);
-+
-+ if ( (priv->cur_tx - NUM_TX_DESC) == priv->dirty_tx ){
-+ netif_stop_queue (dev);
-+ }
-+ else{
-+ if (netif_queue_stopped (dev)){
-+ netif_wake_queue (dev);
-+ }
- }
-+
-+ return 0;
- }
-
--static inline int rtl8169_try_rx_copy(struct sk_buff **sk_buff, int pkt_size,
-- struct RxDesc *desc,
-- struct net_device *dev)
--{
-- int ret = -1;
-
-- if (pkt_size < rx_copybreak) {
-- struct sk_buff *skb;
-
-- skb = dev_alloc_skb(pkt_size + 2);
-- if (skb) {
-- skb->dev = dev;
-- skb_reserve(skb, 2);
-- eth_copy_and_sum(skb, sk_buff[0]->tail, pkt_size, 0);
-- *sk_buff = skb;
-- rtl8169_return_to_asic(desc);
-- ret = 0;
-+
-+
-+
-+
-+//======================================================================================================
-+static void rtl8169_tx_interrupt (struct net_device *dev, struct rtl8169_private *priv, unsigned long ioaddr)
-+{
-+ unsigned long dirty_tx, tx_left=0;
-+ int entry = priv->cur_tx % NUM_TX_DESC;
-+ int txloop_cnt = 0;
-+
-+ assert (dev != NULL);
-+ assert (priv != NULL);
-+ assert (ioaddr != NULL);
-+
-+
-+ dirty_tx = priv->dirty_tx;
-+ tx_left = priv->cur_tx - dirty_tx;
-+
-+ while( (tx_left > 0) && (txloop_cnt < max_interrupt_work) ){
-+ if( (le32_to_cpu(priv->TxDescArray[entry].status) & OWNbit) == 0 ){
-+
-+#ifdef RTL8169_DYNAMIC_CONTROL
-+ r8169_callback_tx(&(priv->rt), 1, priv->Tx_skbuff[dirty_tx % NUM_TX_DESC]->len);
-+#endif //end #ifdef RTL8169_DYNAMIC_CONTROL
-+
-+ dev_kfree_skb_irq( priv->Tx_skbuff[dirty_tx % NUM_TX_DESC] );
-+ priv->Tx_skbuff[dirty_tx % NUM_TX_DESC] = NULL;
-+ priv->stats.tx_packets++;
-+ dirty_tx++;
-+ tx_left--;
-+ entry++;
- }
-+ txloop_cnt ++;
-+ }
-+
-+ if (priv->dirty_tx != dirty_tx) {
-+ priv->dirty_tx = dirty_tx;
-+ if (netif_queue_stopped (dev))
-+ netif_wake_queue (dev);
- }
-- return ret;
- }
-
--static void
--rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
-- void *ioaddr)
-+
-+
-+
-+
-+
-+//======================================================================================================
-+static void rtl8169_rx_interrupt (struct net_device *dev, struct rtl8169_private *priv, unsigned long ioaddr)
- {
-- unsigned long cur_rx, rx_left;
-- int delta;
-+ struct pci_dev *pdev = priv->pci_dev;
-+ int cur_rx;
-+ int pkt_size = 0 ;
-+ int rxdesc_cnt = 0;
-+ int ret;
-+ struct sk_buff *n_skb = NULL;
-+ struct sk_buff *cur_skb;
-+ struct sk_buff *rx_skb;
-+ struct RxDesc *rxdesc;
-
-- assert(dev != NULL);
-- assert(tp != NULL);
-- assert(ioaddr != NULL);
-+ assert (dev != NULL);
-+ assert (priv != NULL);
-+ assert (ioaddr != NULL);
-
-- cur_rx = tp->cur_rx;
-- rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
-
-- while (rx_left > 0) {
-- int entry = cur_rx % NUM_RX_DESC;
-- u32 status;
-+ cur_rx = priv->cur_rx;
-
-- rmb();
-- status = le32_to_cpu(tp->RxDescArray[entry].status);
-+ rxdesc = &priv->RxDescArray[cur_rx];
-+ pci_dma_sync_single(pdev, priv->rxdesc_array_dma_addr[cur_rx], sizeof(struct RxDesc), PCI_DMA_FROMDEVICE);
-
-- if (status & OWNbit)
-- break;
-- if (status & RxRES) {
-+ while ( ((le32_to_cpu(rxdesc->status) & OWNbit)== 0) && (rxdesc_cnt < max_interrupt_work) ){
-+
-+ rxdesc_cnt++;
-+
-+ if( le32_to_cpu(rxdesc->status) & RxRES ){
- printk(KERN_INFO "%s: Rx ERROR!!!\n", dev->name);
-- tp->stats.rx_errors++;
-- if (status & (RxRWT | RxRUNT))
-- tp->stats.rx_length_errors++;
-- if (status & RxCRC)
-- tp->stats.rx_crc_errors++;
-- } else {
-- struct RxDesc *desc = tp->RxDescArray + entry;
-- struct sk_buff *skb = tp->Rx_skbuff[entry];
-- int pkt_size = (status & 0x00001FFF) - 4;
-- void (*pci_action)(struct pci_dev *, dma_addr_t,
-- size_t, int) = pci_dma_sync_single_for_device;
--
--
-- pci_dma_sync_single_for_cpu(tp->pci_dev,
-- le64_to_cpu(desc->addr), RX_BUF_SIZE,
-- PCI_DMA_FROMDEVICE);
--
-- if (rtl8169_try_rx_copy(&skb, pkt_size, desc, dev)) {
-- pci_action = pci_unmap_single;
-- tp->Rx_skbuff[entry] = NULL;
-+ priv->stats.rx_errors++;
-+ if ( le32_to_cpu(rxdesc->status) & (RxRWT|RxRUNT) )
-+ priv->stats.rx_length_errors++;
-+ if ( le32_to_cpu(rxdesc->status) & RxCRC)
-+ priv->stats.rx_crc_errors++;
-+ }
-+ else{
-+ pkt_size=(int)(le32_to_cpu(rxdesc->status) & 0x00001FFF)-4;
-+
-+ if( pkt_size > priv->rx_pkt_len ){
-+ printk("%s: Error -- Rx packet size(%d) > mtu(%d)+14\n", dev->name, pkt_size, dev->mtu);
-+ pkt_size = priv->rx_pkt_len;
- }
-
-- pci_action(tp->pci_dev, le64_to_cpu(desc->addr),
-- RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
-+ DBG_PRINT("%s: RX pkt_size = %d\n", __FUNCTION__, pkt_size);
-
-- skb_put(skb, pkt_size);
-- skb->protocol = eth_type_trans(skb, dev);
-- netif_rx(skb);
--
-- dev->last_rx = jiffies;
-- tp->stats.rx_bytes += pkt_size;
-- tp->stats.rx_packets++;
-- }
--
-- cur_rx++;
-- rx_left--;
-- }
-+ {// -----------------------------------------------------
-+ rx_skb = priv->Rx_skbuff[cur_rx];
-+ n_skb = RTL8169_ALLOC_RXSKB(MAX_RX_SKBDATA_SIZE);
-+ if( n_skb != NULL ) {
-+ skb_reserve (n_skb, 2); // 16 byte align the IP fields. //
-+
-+ // Indicate rx_skb
-+ if( rx_skb != NULL ){
-+ rx_skb->dev = dev;
-+ pci_dma_sync_single(pdev, priv->rx_skbuff_dma_addr[cur_rx], sizeof(struct RxDesc), PCI_DMA_FROMDEVICE);
-+
-+ skb_put ( rx_skb, pkt_size );
-+ rx_skb->protocol = eth_type_trans ( rx_skb, dev );
-+ ret = RTL8169_NETIF_RX (rx_skb);
-+
-+// dev->last_rx = jiffies;
-+ priv->stats.rx_bytes += pkt_size;
-+ priv->stats.rx_packets++;
-+
-+#ifdef RTL8169_DYNAMIC_CONTROL
-+ r8169_callback_rx( &(priv->rt), 1, pkt_size);
-+#endif //end #ifdef RTL8169_DYNAMIC_CONTROL
-+
-+ }//end if( rx_skb != NULL )
-+
-+ priv->Rx_skbuff[cur_rx] = n_skb;
-+ }
-+ else{
-+ DBG_PRINT("%s: Allocate n_skb failed!\n",__FUNCTION__ );
-+ priv->Rx_skbuff[cur_rx] = rx_skb;
-+ }
-+
-+
-+ // Update rx descriptor
-+ if( cur_rx == (NUM_RX_DESC-1) ){
-+ priv->RxDescArray[cur_rx].status = cpu_to_le32((OWNbit | EORbit) | (unsigned long)priv->hw_rx_pkt_len);
-+ }
-+ else{
-+ priv->RxDescArray[cur_rx].status = cpu_to_le32(OWNbit | (unsigned long)priv->hw_rx_pkt_len);
-+ }
-+
-+ cur_skb = priv->Rx_skbuff[cur_rx];
-
-- tp->cur_rx = cur_rx;
-+ if( cur_skb != NULL ){
-+ priv->rx_skbuff_dma_addr[cur_rx] = pci_map_single(pdev, cur_skb->data, MAX_RX_SKBDATA_SIZE, PCI_DMA_FROMDEVICE);
-+ rxdesc->buf_addr = cpu_to_le32(priv->rx_skbuff_dma_addr[cur_rx]);
-+ }
-+ else{
-+ DBG_PRINT("%s: %s() cur_skb == NULL\n", dev->name, __FUNCTION__);
-+ }
-+
-+ }//------------------------------------------------------------
-+
-+ }// end of if( priv->RxDescArray[cur_rx].status & RxRES )
-+
-+ cur_rx = (cur_rx +1) % NUM_RX_DESC;
-+ rxdesc = &priv->RxDescArray[cur_rx];
-+ pci_dma_sync_single(pdev, priv->rxdesc_array_dma_addr[cur_rx], sizeof(struct RxDesc), PCI_DMA_FROMDEVICE);
-+
-+ }// end of while ( (priv->RxDescArray[cur_rx].status & 0x80000000)== 0)
-+
-+ if( rxdesc_cnt >= max_interrupt_work ){
-+ DBG_PRINT("%s: Too much work at Rx interrupt.\n", dev->name);
-+ }
-
-- delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx);
-- if (delta > 0)
-- tp->dirty_rx += delta;
-- else if (delta < 0)
-- printk(KERN_INFO "%s: no Rx buffer allocated\n", dev->name);
--
-- /*
-- * FIXME: until there is periodic timer to try and refill the ring,
-- * a temporary shortage may definitely kill the Rx process.
-- * - disable the asic to try and avoid an overflow and kick it again
-- * after refill ?
-- * - how do others driver handle this condition (Uh oh...).
-- */
-- if (tp->dirty_rx + NUM_RX_DESC == tp->cur_rx)
-- printk(KERN_EMERG "%s: Rx buffers exhausted\n", dev->name);
-+ priv->cur_rx = cur_rx;
- }
-
-+
-+
-+
-+
-+
-+
-+
-+//======================================================================================================
- /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */
--static irqreturn_t
--rtl8169_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+static void rtl8169_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
-+#else
-+static irqreturn_t rtl8169_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
-+#endif
- {
- struct net_device *dev = (struct net_device *) dev_instance;
-- struct rtl8169_private *tp = dev->priv;
-+ struct rtl8169_private *priv = dev->priv;
- int boguscnt = max_interrupt_work;
-- void *ioaddr = tp->mmio_addr;
-+ unsigned long ioaddr = priv->ioaddr;
- int status = 0;
-- int handled = 0;
-+ irqreturn_t interrupt_handled = IRQ_NONE;
-+
-+ RTL_W16 ( IntrMask, 0x0000);
-
- do {
- status = RTL_R16(IntrStatus);
-
-- /* hotplug/major error/no more work/shared irq */
-- if ((status == 0xFFFF) || !status)
-+ if (status == 0xFFFF)
- break;
-
-- handled = 1;
--/*
-- if (status & RxUnderrun)
-- link_changed = RTL_R16 (CSCR) & CSCR_LinkChangeBit;
--*/
-- RTL_W16(IntrStatus,
-- (status & RxFIFOOver) ? (status | RxOverflow) : status);
-
-- if (!(status & rtl8169_intr_mask))
-+ RTL_W16( IntrStatus, status );
-+
-+
-+ if ( (status & rtl8169_intr_mask ) == 0 )
- break;
-+ else
-+ interrupt_handled = IRQ_HANDLED;
-+
-+
-+ // Rx interrupt
-+// if (status & (RxOK | RxErr /* | LinkChg | RxOverflow | RxFIFOOver*/)){
-+ rtl8169_rx_interrupt (dev, priv, ioaddr);
-+// }
-
-- // Rx interrupt
-- if (status & (RxOK | RxUnderrun | RxOverflow | RxFIFOOver)) {
-- rtl8169_rx_interrupt(dev, tp, ioaddr);
-- }
- // Tx interrupt
-- if (status & (TxOK | TxErr)) {
-- spin_lock(&tp->lock);
-- rtl8169_tx_interrupt(dev, tp, ioaddr);
-- spin_unlock(&tp->lock);
-- }
-+// if (status & (TxOK | TxErr)) {
-+ spin_lock (&priv->lock);
-+ rtl8169_tx_interrupt (dev, priv, ioaddr);
-+ spin_unlock (&priv->lock);
-+// }
-
- boguscnt--;
- } while (boguscnt > 0);
-
- if (boguscnt <= 0) {
-- printk(KERN_WARNING "%s: Too much work at interrupt!\n",
-- dev->name);
-- /* Clear all interrupt sources. */
-- RTL_W16(IntrStatus, 0xffff);
-+ DBG_PRINT("%s: Too much work at interrupt!\n", dev->name);
-+ RTL_W16( IntrStatus, 0xffff); // Clear all interrupt sources
- }
-- return IRQ_RETVAL(handled);
-+
-+ RTL_W16 ( IntrMask, rtl8169_intr_mask);
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ return interrupt_handled;
-+#endif
- }
-
--static int
--rtl8169_close(struct net_device *dev)
-+
-+
-+
-+
-+
-+
-+//======================================================================================================
-+static int rtl8169_close (struct net_device *dev)
- {
-- struct rtl8169_private *tp = dev->priv;
-- struct pci_dev *pdev = tp->pci_dev;
-- void *ioaddr = tp->mmio_addr;
-+ struct rtl8169_private *priv = dev->priv;
-+ unsigned long ioaddr = priv->ioaddr;
-+ int i;
-+
-+ // -----------------------------------------
-+ rtl8169_delete_timer( &(priv->r8169_timer) );
-
-- netif_stop_queue(dev);
-
-- rtl8169_delete_timer(dev);
-+ netif_stop_queue (dev);
-
-- spin_lock_irq(&tp->lock);
-+ spin_lock_irq (&priv->lock);
-
-- /* Stop the chip's Tx and Rx DMA processes. */
-- RTL_W8(ChipCmd, 0x00);
-+ /* Stop the chip's Tx and Rx processes. */
-+ RTL_W8 ( ChipCmd, 0x00);
-
- /* Disable interrupts by clearing the interrupt mask. */
-- RTL_W16(IntrMask, 0x0000);
-+ RTL_W16 ( IntrMask, 0x0000);
-
- /* Update the error counts. */
-- tp->stats.rx_missed_errors += RTL_R32(RxMissed);
-- RTL_W32(RxMissed, 0);
-+ priv->stats.rx_missed_errors += RTL_R32(RxMissed);
-+ RTL_W32( RxMissed, 0);
-
-- spin_unlock_irq(&tp->lock);
-+ spin_unlock_irq (&priv->lock);
-
-- synchronize_irq(dev->irq);
-- free_irq(dev->irq, dev);
--
-- rtl8169_tx_clear(tp);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+ synchronize_irq ();
-+#else
-+ synchronize_irq (dev->irq);
-+#endif
-+ free_irq (dev->irq, dev);
-
-- rtl8169_rx_clear(tp);
-+ rtl8169_tx_clear (priv);
-+
-+ //2004-05-11
-+ if(priv->txdesc_space != NULL){
-+ pci_free_consistent(
-+ priv->pci_dev,
-+ priv->sizeof_txdesc_space,
-+ priv->txdesc_space,
-+ priv->txdesc_phy_dma_addr
-+ );
-+ priv->txdesc_space = NULL;
-+ }
-+
-+ if(priv->rxdesc_space != NULL){
-+ pci_free_consistent(
-+ priv->pci_dev,
-+ priv->sizeof_rxdesc_space,
-+ priv->rxdesc_space,
-+ priv->rxdesc_phy_dma_addr
-+ );
-+ priv->rxdesc_space = NULL;
-+ }
-+
-+ priv->TxDescArray = NULL;
-+ priv->RxDescArray = NULL;
-+
-+ {//-----------------------------------------------------------------------------
-+ for(i=0;i<NUM_RX_DESC;i++){
-+ if( priv->Rx_skbuff[i] != NULL ) {
-+ RTL8169_FREE_RXSKB ( priv->Rx_skbuff[i] );
-+ }
-+ }
-+ }//-----------------------------------------------------------------------------
-
-- pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
-- tp->RxPhyAddr);
-- pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
-- tp->TxPhyAddr);
-- tp->TxDescArray = NULL;
-- tp->RxDescArray = NULL;
-+ DBG_PRINT("%s: %s() alloc_rxskb_cnt = %d\n", dev->name, __FUNCTION__, alloc_rxskb_cnt );
-
- return 0;
- }
-
--static void
--rtl8169_set_rx_mode(struct net_device *dev)
-+
-+
-+
-+
-+
-+
-+//======================================================================================================
-+static unsigned const ethernet_polynomial = 0x04c11db7U;
-+static inline u32 ether_crc (int length, unsigned char *data)
-+{
-+ int crc = -1;
-+
-+ while (--length >= 0) {
-+ unsigned char current_octet = *data++;
-+ int bit;
-+ for (bit = 0; bit < 8; bit++, current_octet >>= 1)
-+ crc = (crc << 1) ^ ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);
-+ }
-+
-+ return crc;
-+}
-+
-+
-+
-+
-+
-+
-+
-+
-+//======================================================================================================
-+static void rtl8169_set_rx_mode (struct net_device *dev)
- {
-- struct rtl8169_private *tp = dev->priv;
-- void *ioaddr = tp->mmio_addr;
-+ struct rtl8169_private *priv = dev->priv;
-+ unsigned long ioaddr = priv->ioaddr;
- unsigned long flags;
- u32 mc_filter[2]; /* Multicast hash filter */
- int i, rx_mode;
-- u32 tmp = 0;
-+ u32 tmp=0;
-+
-
- if (dev->flags & IFF_PROMISC) {
- /* Unconditionally log net taps. */
-- printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n",
-- dev->name);
-- rx_mode =
-- AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
-- AcceptAllPhys;
-+ printk (KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
-+ rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys | AcceptAllPhys;
- mc_filter[1] = mc_filter[0] = 0xffffffff;
-- } else if ((dev->mc_count > multicast_filter_limit)
-- || (dev->flags & IFF_ALLMULTI)) {
-+ } else if ((dev->mc_count > multicast_filter_limit) || (dev->flags & IFF_ALLMULTI)) {
- /* Too many to filter perfectly -- accept all multicasts. */
- rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
- mc_filter[1] = mc_filter[0] = 0xffffffff;
- } else {
- struct dev_mc_list *mclist;
-- rx_mode = AcceptBroadcast | AcceptMyPhys;
-+ rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
- mc_filter[1] = mc_filter[0] = 0;
-- for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
-- i++, mclist = mclist->next) {
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+ for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; i++, mclist = mclist->next)
-+ {
-+ set_bit (ether_crc (ETH_ALEN, mclist->dmi_addr) >> 26, mc_filter);
-+ }
-+#else
-+ for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; i++, mclist = mclist->next)
-+ {
- int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
-+
- mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
- rx_mode |= AcceptMulticast;
- }
-+#endif
- }
-
-- spin_lock_irqsave(&tp->lock, flags);
-+ spin_lock_irqsave (&priv->lock, flags);
-+
-+ tmp = rtl8169_rx_config | rx_mode | (RTL_R32(RxConfig) & rtl_chip_info[priv->chipset].RxConfigMask);
-+
-+ RTL_W32 ( RxConfig, tmp);
-+ RTL_W32 ( MAR0 + 0, mc_filter[0]);
-+ RTL_W32 ( MAR0 + 4, mc_filter[1]);
-+
-+ spin_unlock_irqrestore (&priv->lock, flags);
-+
-+}//end of rtl8169_set_rx_mode (struct net_device *dev)
-+
-+
-+
-+
-+
-+
-+
-+//================================================================================
-+struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
-
-- tmp =
-- rtl8169_rx_config | rx_mode | (RTL_R32(RxConfig) &
-- rtl_chip_info[tp->chipset].
-- RxConfigMask);
--
-- RTL_W32(RxConfig, tmp);
-- RTL_W32(MAR0 + 0, mc_filter[0]);
-- RTL_W32(MAR0 + 4, mc_filter[1]);
--
-- spin_unlock_irqrestore(&tp->lock, flags);
--}
--
--/**
-- * rtl8169_get_stats - Get rtl8169 read/write statistics
-- * @dev: The Ethernet Device to get statistics for
-- *
-- * Get TX/RX statistics for rtl8169
-- */
--static struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
- {
-- struct rtl8169_private *tp = dev->priv;
-- void *ioaddr = tp->mmio_addr;
-- unsigned long flags;
-+ struct rtl8169_private *priv = dev->priv;
-
-- if (netif_running(dev)) {
-- spin_lock_irqsave(&tp->lock, flags);
-- tp->stats.rx_missed_errors += RTL_R32(RxMissed);
-- RTL_W32(RxMissed, 0);
-- spin_unlock_irqrestore(&tp->lock, flags);
-- }
--
-- return &tp->stats;
-+ return &priv->stats;
- }
-
-+
-+
-+
-+
-+
-+
-+
-+//================================================================================
- static struct pci_driver rtl8169_pci_driver = {
-- .name = MODULENAME,
-- .id_table = rtl8169_pci_tbl,
-- .probe = rtl8169_init_one,
-- .remove = __devexit_p(rtl8169_remove_one),
--#ifdef CONFIG_PM
-- .suspend = rtl8169_suspend,
-- .resume = rtl8169_resume,
--#endif
-+ name: MODULENAME,
-+ id_table: rtl8169_pci_tbl,
-+ probe: rtl8169_init_one,
-+ remove: rtl8169_remove_one,
-+ suspend: NULL,
-+ resume: NULL,
- };
-
--static int __init
--rtl8169_init_module(void)
-+
-+
-+
-+
-+//======================================================================================================
-+static int __init rtl8169_init_module (void)
- {
-- return pci_module_init(&rtl8169_pci_driver);
-+ return pci_module_init (&rtl8169_pci_driver); // pci_register_driver (drv)
- }
-
--static void __exit
--rtl8169_cleanup_module(void)
-+
-+
-+
-+//======================================================================================================
-+static void __exit rtl8169_cleanup_module (void)
- {
-- pci_unregister_driver(&rtl8169_pci_driver);
-+ pci_unregister_driver (&rtl8169_pci_driver);
- }
-
-+
-+#ifdef RTL8169_JUMBO_FRAME_SUPPORT
-+static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
-+{
-+ struct rtl8169_private *priv = dev->priv;
-+ unsigned long ioaddr = priv->ioaddr;
-+
-+ if( new_mtu > MAX_JUMBO_FRAME_MTU ){
-+ printk("%s: Error -- new_mtu(%d) > MAX_JUMBO_FRAME_MTU(%d).\n", dev->name, new_mtu, MAX_JUMBO_FRAME_MTU);
-+ return -1;
-+ }
-+
-+ dev->mtu = new_mtu;
-+
-+ priv->curr_mtu_size = new_mtu;
-+ priv->tx_pkt_len = new_mtu + ETH_HDR_LEN;
-+ priv->rx_pkt_len = new_mtu + ETH_HDR_LEN;
-+ priv->hw_rx_pkt_len = priv->rx_pkt_len + 8;
-+
-+ RTL_W8 ( Cfg9346, Cfg9346_Unlock);
-+ RTL_W16 ( RxMaxSize, (unsigned short)priv->hw_rx_pkt_len );
-+ RTL_W8 ( Cfg9346, Cfg9346_Lock);
-+
-+ DBG_PRINT("-------------------------- \n");
-+ DBG_PRINT("dev->mtu = %d \n", dev->mtu);
-+ DBG_PRINT("priv->curr_mtu_size = %d \n", priv->curr_mtu_size);
-+ DBG_PRINT("priv->rx_pkt_len = %d \n", priv->rx_pkt_len);
-+ DBG_PRINT("priv->tx_pkt_len = %d \n", priv->tx_pkt_len);
-+ DBG_PRINT("RTL_W16( RxMaxSize, %d )\n", priv->hw_rx_pkt_len);
-+ DBG_PRINT("-------------------------- \n");
-+
-+ rtl8169_close (dev);
-+ rtl8169_open (dev);
-+
-+ return 0;
-+}
-+#endif //end #ifdef RTL8169_JUMBO_FRAME_SUPPORT
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+//======================================================================================================
- module_init(rtl8169_init_module);
- module_exit(rtl8169_cleanup_module);