No functionnal change:
- trim the old history log
- whitespace/indent/case police
- unsigned int where signedness does not matter
- removal of obsolete assert
- needless cast from void * (dev_instance)
- remove dead code once related to power management
- use netdev_alloc_skb.

Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
Cc: Stephen Hemminger <shemminger@linux-foundation.org>
Cc: Edward Hsu <edward_hsu@realtek.com.tw>
This commit is contained in:
Francois Romieu 2007-02-21 22:40:46 +01:00 коммит произвёл Jeff Garzik
Родитель 901dda2b5f
Коммит 07d3f51feb
1 изменённых файлов: 145 добавлений и 202 удалений

Просмотреть файл

@ -1,40 +1,11 @@
/* /*
========================================================================= * r8169.c: RealTek 8169/8168/8101 ethernet driver.
r8169.c: A RealTek RTL-8169 Gigabit Ethernet driver for Linux kernel 2.4.x. *
-------------------------------------------------------------------- * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
* Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
History: * Copyright (c) a lot of people too. Please respect their work.
Feb 4 2002 - created initially by ShuChen <shuchen@realtek.com.tw>. *
May 20 2002 - Add link status force-mode and TBI mode support. * See MAINTAINERS file for support contact information.
2004 - Massive updates. See kernel SCM system for details.
=========================================================================
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)
VERSION 1.6LK <2004/04/14>
- Merge of Realtek's version 1.6
- Conversion to DMA API
- Suspend/resume
- Endianness
- Misc Rx/Tx bugs
VERSION 2.2LK <2005/01/25>
- RX csum, TX csum/SG, TSO
- VLAN
- baby (< 7200) Jumbo frames support
- Merge of Realtek's version 2.2 (new phy)
*/ */
#include <linux/module.h> #include <linux/module.h>
@ -108,7 +79,7 @@ static const int multicast_filter_limit = 32;
#define RX_FIFO_THRESH 7 /* 7 means NO threshold, Rx buffer level before first PCI xfer. */ #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 RX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */
#define TX_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 EarlyTxThld 0x3F /* 0x3F means NO early transmit */
#define RxPacketMaxSize 0x3FE8 /* 16K - 1 - ETH_HLEN - VLAN - CRC... */ #define RxPacketMaxSize 0x3FE8 /* 16K - 1 - ETH_HLEN - VLAN - CRC... */
#define SafeMtu 0x1c20 /* ... actually life sucks beyond ~7k */ #define SafeMtu 0x1c20 /* ... actually life sucks beyond ~7k */
#define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */ #define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */
@ -209,62 +180,62 @@ static struct {
u32 msg_enable; u32 msg_enable;
} debug = { -1 }; } debug = { -1 };
enum RTL8169_registers { enum rtl_registers {
MAC0 = 0, /* Ethernet hardware address. */ MAC0 = 0, /* Ethernet hardware address. */
MAR0 = 8, /* Multicast filter. */ MAR0 = 8, /* Multicast filter. */
CounterAddrLow = 0x10, CounterAddrLow = 0x10,
CounterAddrHigh = 0x14, CounterAddrHigh = 0x14,
TxDescStartAddrLow = 0x20, TxDescStartAddrLow = 0x20,
TxDescStartAddrHigh = 0x24, TxDescStartAddrHigh = 0x24,
TxHDescStartAddrLow = 0x28, TxHDescStartAddrLow = 0x28,
TxHDescStartAddrHigh = 0x2c, TxHDescStartAddrHigh = 0x2c,
FLASH = 0x30, FLASH = 0x30,
ERSR = 0x36, ERSR = 0x36,
ChipCmd = 0x37, ChipCmd = 0x37,
TxPoll = 0x38, TxPoll = 0x38,
IntrMask = 0x3C, IntrMask = 0x3c,
IntrStatus = 0x3E, IntrStatus = 0x3e,
TxConfig = 0x40, TxConfig = 0x40,
RxConfig = 0x44, RxConfig = 0x44,
RxMissed = 0x4C, RxMissed = 0x4c,
Cfg9346 = 0x50, Cfg9346 = 0x50,
Config0 = 0x51, Config0 = 0x51,
Config1 = 0x52, Config1 = 0x52,
Config2 = 0x53, Config2 = 0x53,
Config3 = 0x54, Config3 = 0x54,
Config4 = 0x55, Config4 = 0x55,
Config5 = 0x56, Config5 = 0x56,
MultiIntr = 0x5C, MultiIntr = 0x5c,
PHYAR = 0x60, PHYAR = 0x60,
TBICSR = 0x64, TBICSR = 0x64,
TBI_ANAR = 0x68, TBI_ANAR = 0x68,
TBI_LPAR = 0x6A, TBI_LPAR = 0x6a,
PHYstatus = 0x6C, PHYstatus = 0x6c,
RxMaxSize = 0xDA, RxMaxSize = 0xda,
CPlusCmd = 0xE0, CPlusCmd = 0xe0,
IntrMitigate = 0xE2, IntrMitigate = 0xe2,
RxDescAddrLow = 0xE4, RxDescAddrLow = 0xe4,
RxDescAddrHigh = 0xE8, RxDescAddrHigh = 0xe8,
EarlyTxThres = 0xEC, EarlyTxThres = 0xec,
FuncEvent = 0xF0, FuncEvent = 0xf0,
FuncEventMask = 0xF4, FuncEventMask = 0xf4,
FuncPresetState = 0xF8, FuncPresetState = 0xf8,
FuncForceEvent = 0xFC, FuncForceEvent = 0xfc,
}; };
enum RTL8169_register_content { enum rtl_register_content {
/* InterruptStatusBits */ /* InterruptStatusBits */
SYSErr = 0x8000, SYSErr = 0x8000,
PCSTimeout = 0x4000, PCSTimeout = 0x4000,
SWInt = 0x0100, SWInt = 0x0100,
TxDescUnavail = 0x80, TxDescUnavail = 0x0080,
RxFIFOOver = 0x40, RxFIFOOver = 0x0040,
LinkChg = 0x20, LinkChg = 0x0020,
RxOverflow = 0x10, RxOverflow = 0x0010,
TxErr = 0x08, TxErr = 0x0008,
TxOK = 0x04, TxOK = 0x0004,
RxErr = 0x02, RxErr = 0x0002,
RxOK = 0x01, RxOK = 0x0001,
/* RxStatusDesc */ /* RxStatusDesc */
RxFOVF = (1 << 23), RxFOVF = (1 << 23),
@ -274,26 +245,26 @@ enum RTL8169_register_content {
RxCRC = (1 << 19), RxCRC = (1 << 19),
/* ChipCmdBits */ /* ChipCmdBits */
CmdReset = 0x10, CmdReset = 0x10,
CmdRxEnb = 0x08, CmdRxEnb = 0x08,
CmdTxEnb = 0x04, CmdTxEnb = 0x04,
RxBufEmpty = 0x01, RxBufEmpty = 0x01,
/* Cfg9346Bits */ /* Cfg9346Bits */
Cfg9346_Lock = 0x00, Cfg9346_Lock = 0x00,
Cfg9346_Unlock = 0xC0, Cfg9346_Unlock = 0xc0,
/* rx_mode_bits */ /* rx_mode_bits */
AcceptErr = 0x20, AcceptErr = 0x20,
AcceptRunt = 0x10, AcceptRunt = 0x10,
AcceptBroadcast = 0x08, AcceptBroadcast = 0x08,
AcceptMulticast = 0x04, AcceptMulticast = 0x04,
AcceptMyPhys = 0x02, AcceptMyPhys = 0x02,
AcceptAllPhys = 0x01, AcceptAllPhys = 0x01,
/* RxConfigBits */ /* RxConfigBits */
RxCfgFIFOShift = 13, RxCfgFIFOShift = 13,
RxCfgDMAShift = 8, RxCfgDMAShift = 8,
/* TxConfigBits */ /* TxConfigBits */
TxInterFrameGapShift = 24, TxInterFrameGapShift = 24,
@ -337,23 +308,23 @@ enum RTL8169_register_content {
INTT_3 = 0x0003, // 8168 INTT_3 = 0x0003, // 8168
/* rtl8169_PHYstatus */ /* rtl8169_PHYstatus */
TBI_Enable = 0x80, TBI_Enable = 0x80,
TxFlowCtrl = 0x40, TxFlowCtrl = 0x40,
RxFlowCtrl = 0x20, RxFlowCtrl = 0x20,
_1000bpsF = 0x10, _1000bpsF = 0x10,
_100bps = 0x08, _100bps = 0x08,
_10bps = 0x04, _10bps = 0x04,
LinkStatus = 0x02, LinkStatus = 0x02,
FullDup = 0x01, FullDup = 0x01,
/* _TBICSRBit */ /* _TBICSRBit */
TBILinkOK = 0x02000000, TBILinkOK = 0x02000000,
/* DumpCounterCommand */ /* DumpCounterCommand */
CounterDump = 0x8, CounterDump = 0x8,
}; };
enum _DescStatusBit { enum desc_status_bit {
DescOwn = (1 << 31), /* Descriptor is owned by NIC */ DescOwn = (1 << 31), /* Descriptor is owned by NIC */
RingEnd = (1 << 30), /* End of descriptor ring */ RingEnd = (1 << 30), /* End of descriptor ring */
FirstFrag = (1 << 29), /* First segment of a packet */ FirstFrag = (1 << 29), /* First segment of a packet */
@ -478,28 +449,34 @@ static int rtl8169_poll(struct net_device *dev, int *budget);
static const unsigned int rtl8169_rx_config = static const unsigned int rtl8169_rx_config =
(RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift); (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
static void mdio_write(void __iomem *ioaddr, int RegAddr, int value) static void mdio_write(void __iomem *ioaddr, int reg_addr, int value)
{ {
int i; int i;
RTL_W32(PHYAR, 0x80000000 | (RegAddr & 0xFF) << 16 | value); RTL_W32(PHYAR, 0x80000000 | (reg_addr & 0xFF) << 16 | value);
for (i = 20; i > 0; i--) { for (i = 20; i > 0; i--) {
/* Check if the RTL8169 has completed writing to the specified MII register */ /*
* Check if the RTL8169 has completed writing to the specified
* MII register.
*/
if (!(RTL_R32(PHYAR) & 0x80000000)) if (!(RTL_R32(PHYAR) & 0x80000000))
break; break;
udelay(25); udelay(25);
} }
} }
static int mdio_read(void __iomem *ioaddr, int RegAddr) static int mdio_read(void __iomem *ioaddr, int reg_addr)
{ {
int i, value = -1; int i, value = -1;
RTL_W32(PHYAR, 0x0 | (RegAddr & 0xFF) << 16); RTL_W32(PHYAR, 0x0 | (reg_addr & 0xFF) << 16);
for (i = 20; i > 0; i--) { for (i = 20; i > 0; i--) {
/* Check if the RTL8169 has completed retrieving data from the specified MII register */ /*
* Check if the RTL8169 has completed retrieving data from
* the specified MII register.
*/
if (RTL_R32(PHYAR) & 0x80000000) { if (RTL_R32(PHYAR) & 0x80000000) {
value = (int) (RTL_R32(PHYAR) & 0xFFFF); value = (int) (RTL_R32(PHYAR) & 0xFFFF);
break; break;
@ -557,7 +534,8 @@ static void rtl8169_xmii_reset_enable(void __iomem *ioaddr)
} }
static void rtl8169_check_link_status(struct net_device *dev, static void rtl8169_check_link_status(struct net_device *dev,
struct rtl8169_private *tp, void __iomem *ioaddr) struct rtl8169_private *tp,
void __iomem *ioaddr)
{ {
unsigned long flags; unsigned long flags;
@ -613,7 +591,7 @@ static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
{ {
struct rtl8169_private *tp = netdev_priv(dev); struct rtl8169_private *tp = netdev_priv(dev);
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
int i; unsigned int i;
static struct { static struct {
u32 opt; u32 opt;
u16 reg; u16 reg;
@ -839,8 +817,7 @@ static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
int ret; int ret;
if (tp->vlgrp && (opts2 & RxVlanTag)) { if (tp->vlgrp && (opts2 & RxVlanTag)) {
rtl8169_rx_hwaccel_skb(skb, tp->vlgrp, rtl8169_rx_hwaccel_skb(skb, tp->vlgrp, swab16(opts2 & 0xffff));
swab16(opts2 & 0xffff));
ret = 0; ret = 0;
} else } else
ret = -1; ret = -1;
@ -1061,7 +1038,6 @@ static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
} }
} }
static const struct ethtool_ops rtl8169_ethtool_ops = { static const struct ethtool_ops rtl8169_ethtool_ops = {
.get_drvinfo = rtl8169_get_drvinfo, .get_drvinfo = rtl8169_get_drvinfo,
.get_regs_len = rtl8169_get_regs_len, .get_regs_len = rtl8169_get_regs_len,
@ -1087,8 +1063,8 @@ static const struct ethtool_ops rtl8169_ethtool_ops = {
.get_perm_addr = ethtool_op_get_perm_addr, .get_perm_addr = ethtool_op_get_perm_addr,
}; };
static void rtl8169_write_gmii_reg_bit(void __iomem *ioaddr, int reg, int bitnum, static void rtl8169_write_gmii_reg_bit(void __iomem *ioaddr, int reg,
int bitval) int bitnum, int bitval)
{ {
int val; int val;
@ -1098,7 +1074,8 @@ static void rtl8169_write_gmii_reg_bit(void __iomem *ioaddr, int reg, int bitnum
mdio_write(ioaddr, reg, val & 0xffff); mdio_write(ioaddr, reg, val & 0xffff);
} }
static void rtl8169_get_mac_version(struct rtl8169_private *tp, void __iomem *ioaddr) static void rtl8169_get_mac_version(struct rtl8169_private *tp,
void __iomem *ioaddr)
{ {
/* /*
* The driver currently handles the 8168Bf and the 8168Be identically * The driver currently handles the 8168Bf and the 8168Be identically
@ -1140,7 +1117,8 @@ static void rtl8169_print_mac_version(struct rtl8169_private *tp)
dprintk("mac_version = 0x%02x\n", tp->mac_version); dprintk("mac_version = 0x%02x\n", tp->mac_version);
} }
static void rtl8169_get_phy_version(struct rtl8169_private *tp, void __iomem *ioaddr) static void rtl8169_get_phy_version(struct rtl8169_private *tp,
void __iomem *ioaddr)
{ {
const struct { const struct {
u16 mask; u16 mask;
@ -1217,7 +1195,7 @@ static void rtl8169_hw_phy_config(struct net_device *dev)
0xbf00 } //w 0 15 0 bf00 0xbf00 } //w 0 15 0 bf00
} }
}, *p = phy_magic; }, *p = phy_magic;
int i; unsigned int i;
rtl8169_print_mac_version(tp); rtl8169_print_mac_version(tp);
rtl8169_print_phy_version(tp); rtl8169_print_phy_version(tp);
@ -1351,7 +1329,7 @@ static void rtl8169_phy_reset(struct net_device *dev,
struct rtl8169_private *tp) struct rtl8169_private *tp)
{ {
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
int i; unsigned int i;
tp->phy_reset_enable(ioaddr); tp->phy_reset_enable(ioaddr);
for (i = 0; i < 100; i++) { for (i = 0; i < 100; i++) {
@ -1463,8 +1441,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
struct rtl8169_private *tp; struct rtl8169_private *tp;
struct net_device *dev; struct net_device *dev;
void __iomem *ioaddr; void __iomem *ioaddr;
unsigned int pm_cap; unsigned int i;
int i, rc; int rc;
if (netif_msg_drv(&debug)) { if (netif_msg_drv(&debug)) {
printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n", printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
@ -1497,20 +1475,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (rc < 0) if (rc < 0)
goto err_out_disable_2; goto err_out_disable_2;
/* 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, acpi_idle_state;
pci_read_config_word(pdev, pm_cap + PCI_PM_CTRL, &pwr_command);
acpi_idle_state = pwr_command & PCI_PM_CTRL_STATE_MASK;
} else {
if (netif_msg_probe(tp)) {
dev_err(&pdev->dev,
"PowerManagement capability not found.\n");
}
}
/* make sure PCI base addr 1 is MMIO */ /* make sure PCI base addr 1 is MMIO */
if (!(pci_resource_flags(pdev, region) & IORESOURCE_MEM)) { if (!(pci_resource_flags(pdev, region) & IORESOURCE_MEM)) {
if (netif_msg_probe(tp)) { if (netif_msg_probe(tp)) {
@ -1574,7 +1538,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
RTL_W8(ChipCmd, CmdReset); RTL_W8(ChipCmd, CmdReset);
/* Check that the chip has finished the reset. */ /* Check that the chip has finished the reset. */
for (i = 100; i > 0; i--) { for (i = 0; i < 100; i++) {
if ((RTL_R8(ChipCmd) & CmdReset) == 0) if ((RTL_R8(ChipCmd) & CmdReset) == 0)
break; break;
msleep_interruptible(1); msleep_interruptible(1);
@ -1706,15 +1670,11 @@ err_out_free_dev_1:
goto out; goto out;
} }
static void __devexit static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
rtl8169_remove_one(struct pci_dev *pdev)
{ {
struct net_device *dev = pci_get_drvdata(pdev); struct net_device *dev = pci_get_drvdata(pdev);
struct rtl8169_private *tp = netdev_priv(dev); struct rtl8169_private *tp = netdev_priv(dev);
assert(dev != NULL);
assert(tp != NULL);
flush_scheduled_work(); flush_scheduled_work();
unregister_netdev(dev); unregister_netdev(dev);
@ -1814,13 +1774,13 @@ static void rtl_hw_start(struct net_device *dev)
{ {
struct rtl8169_private *tp = netdev_priv(dev); struct rtl8169_private *tp = netdev_priv(dev);
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
u32 i; unsigned int i;
/* Soft reset the chip. */ /* Soft reset the chip. */
RTL_W8(ChipCmd, CmdReset); RTL_W8(ChipCmd, CmdReset);
/* Check that the chip has finished the reset. */ /* Check that the chip has finished the reset. */
for (i = 100; i > 0; i--) { for (i = 0; i < 100; i++) {
if ((RTL_R8(ChipCmd) & CmdReset) == 0) if ((RTL_R8(ChipCmd) & CmdReset) == 0)
break; break;
msleep_interruptible(1); msleep_interruptible(1);
@ -2132,7 +2092,7 @@ err_out:
static void rtl8169_rx_clear(struct rtl8169_private *tp) static void rtl8169_rx_clear(struct rtl8169_private *tp)
{ {
int i; unsigned int i;
for (i = 0; i < NUM_RX_DESC; i++) { for (i = 0; i < NUM_RX_DESC; i++) {
if (tp->Rx_skbuff[i]) { if (tp->Rx_skbuff[i]) {
@ -2274,14 +2234,9 @@ static void rtl8169_reinit_task(struct work_struct *work)
ret = rtl8169_open(dev); ret = rtl8169_open(dev);
if (unlikely(ret < 0)) { if (unlikely(ret < 0)) {
if (net_ratelimit()) { if (net_ratelimit() && netif_msg_drv(tp)) {
struct rtl8169_private *tp = netdev_priv(dev); printk(PFX KERN_ERR "%s: reinit failure (status = %d)."
" Rescheduling.\n", dev->name, ret);
if (netif_msg_drv(tp)) {
printk(PFX KERN_ERR
"%s: reinit failure (status = %d)."
" Rescheduling.\n", dev->name, ret);
}
} }
rtl8169_schedule_work(dev, rtl8169_reinit_task); rtl8169_schedule_work(dev, rtl8169_reinit_task);
} }
@ -2311,13 +2266,9 @@ static void rtl8169_reset_task(struct work_struct *work)
rtl_hw_start(dev); rtl_hw_start(dev);
netif_wake_queue(dev); netif_wake_queue(dev);
} else { } else {
if (net_ratelimit()) { if (net_ratelimit() && netif_msg_intr(tp)) {
struct rtl8169_private *tp = netdev_priv(dev); printk(PFX KERN_EMERG "%s: Rx buffers shortage\n",
dev->name);
if (netif_msg_intr(tp)) {
printk(PFX KERN_EMERG
"%s: Rx buffers shortage\n", dev->name);
}
} }
rtl8169_schedule_work(dev, rtl8169_reset_task); rtl8169_schedule_work(dev, rtl8169_reset_task);
} }
@ -2524,16 +2475,12 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev)
rtl8169_schedule_work(dev, rtl8169_reinit_task); rtl8169_schedule_work(dev, rtl8169_reinit_task);
} }
static void static void rtl8169_tx_interrupt(struct net_device *dev,
rtl8169_tx_interrupt(struct net_device *dev, struct rtl8169_private *tp, struct rtl8169_private *tp,
void __iomem *ioaddr) void __iomem *ioaddr)
{ {
unsigned int dirty_tx, tx_left; unsigned int dirty_tx, tx_left;
assert(dev != NULL);
assert(tp != NULL);
assert(ioaddr != NULL);
dirty_tx = tp->dirty_tx; dirty_tx = tp->dirty_tx;
smp_rmb(); smp_rmb();
tx_left = tp->cur_tx - dirty_tx; tx_left = tp->cur_tx - dirty_tx;
@ -2590,8 +2537,9 @@ static inline void rtl8169_rx_csum(struct sk_buff *skb, struct RxDesc *desc)
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
} }
static inline bool rtl8169_try_rx_copy(struct sk_buff **sk_buff, int pkt_size, static inline bool rtl8169_try_rx_copy(struct sk_buff **sk_buff,
struct pci_dev *pdev, dma_addr_t addr) struct rtl8169_private *tp, int pkt_size,
dma_addr_t addr)
{ {
struct sk_buff *skb; struct sk_buff *skb;
bool done = false; bool done = false;
@ -2599,11 +2547,12 @@ static inline bool rtl8169_try_rx_copy(struct sk_buff **sk_buff, int pkt_size,
if (pkt_size >= rx_copybreak) if (pkt_size >= rx_copybreak)
goto out; goto out;
skb = dev_alloc_skb(pkt_size + NET_IP_ALIGN); skb = netdev_alloc_skb(tp->dev, pkt_size + NET_IP_ALIGN);
if (!skb) if (!skb)
goto out; goto out;
pci_dma_sync_single_for_cpu(pdev, addr, pkt_size, PCI_DMA_FROMDEVICE); pci_dma_sync_single_for_cpu(tp->pci_dev, addr, pkt_size,
PCI_DMA_FROMDEVICE);
skb_reserve(skb, NET_IP_ALIGN); skb_reserve(skb, NET_IP_ALIGN);
skb_copy_from_linear_data(*sk_buff, skb->data, pkt_size); skb_copy_from_linear_data(*sk_buff, skb->data, pkt_size);
*sk_buff = skb; *sk_buff = skb;
@ -2612,17 +2561,13 @@ out:
return done; return done;
} }
static int static int rtl8169_rx_interrupt(struct net_device *dev,
rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp, struct rtl8169_private *tp,
void __iomem *ioaddr) void __iomem *ioaddr)
{ {
unsigned int cur_rx, rx_left; unsigned int cur_rx, rx_left;
unsigned int delta, count; unsigned int delta, count;
assert(dev != NULL);
assert(tp != NULL);
assert(ioaddr != NULL);
cur_rx = tp->cur_rx; cur_rx = tp->cur_rx;
rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx; rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
rx_left = rtl8169_rx_quota(rx_left, (u32) dev->quota); rx_left = rtl8169_rx_quota(rx_left, (u32) dev->quota);
@ -2673,7 +2618,7 @@ rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
rtl8169_rx_csum(skb, desc); rtl8169_rx_csum(skb, desc);
if (rtl8169_try_rx_copy(&skb, pkt_size, pdev, addr)) { if (rtl8169_try_rx_copy(&skb, tp, pkt_size, addr)) {
pci_dma_sync_single_for_device(pdev, addr, pci_dma_sync_single_for_device(pdev, addr,
pkt_size, PCI_DMA_FROMDEVICE); pkt_size, PCI_DMA_FROMDEVICE);
rtl8169_mark_to_asic(desc, tp->rx_buf_sz); rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
@ -2723,11 +2668,9 @@ rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
return count; return count;
} }
/* 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)
static irqreturn_t
rtl8169_interrupt(int irq, void *dev_instance)
{ {
struct net_device *dev = (struct net_device *) dev_instance; struct net_device *dev = dev_instance;
struct rtl8169_private *tp = netdev_priv(dev); struct rtl8169_private *tp = netdev_priv(dev);
int boguscnt = max_interrupt_work; int boguscnt = max_interrupt_work;
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
@ -2784,9 +2727,9 @@ rtl8169_interrupt(int irq, void *dev_instance)
break; break;
#else #else
/* Rx interrupt */ /* Rx interrupt */
if (status & (RxOK | RxOverflow | RxFIFOOver)) { if (status & (RxOK | RxOverflow | RxFIFOOver))
rtl8169_rx_interrupt(dev, tp, ioaddr); rtl8169_rx_interrupt(dev, tp, ioaddr);
}
/* Tx interrupt */ /* Tx interrupt */
if (status & (TxOK | TxErr)) if (status & (TxOK | TxErr))
rtl8169_tx_interrupt(dev, tp, ioaddr); rtl8169_tx_interrupt(dev, tp, ioaddr);
@ -2918,7 +2861,7 @@ static void rtl_set_rx_mode(struct net_device *dev)
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
unsigned long flags; unsigned long flags;
u32 mc_filter[2]; /* Multicast hash filter */ u32 mc_filter[2]; /* Multicast hash filter */
int i, rx_mode; int rx_mode;
u32 tmp = 0; u32 tmp = 0;
if (dev->flags & IFF_PROMISC) { if (dev->flags & IFF_PROMISC) {
@ -2938,6 +2881,8 @@ static void rtl_set_rx_mode(struct net_device *dev)
mc_filter[1] = mc_filter[0] = 0xffffffff; mc_filter[1] = mc_filter[0] = 0xffffffff;
} else { } else {
struct dev_mc_list *mclist; struct dev_mc_list *mclist;
unsigned int i;
rx_mode = AcceptBroadcast | AcceptMyPhys; rx_mode = AcceptBroadcast | AcceptMyPhys;
mc_filter[1] = mc_filter[0] = 0; mc_filter[1] = mc_filter[0] = 0;
for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
@ -3053,14 +2998,12 @@ static struct pci_driver rtl8169_pci_driver = {
#endif #endif
}; };
static int __init static int __init rtl8169_init_module(void)
rtl8169_init_module(void)
{ {
return pci_register_driver(&rtl8169_pci_driver); return pci_register_driver(&rtl8169_pci_driver);
} }
static void __exit static void __exit rtl8169_cleanup_module(void)
rtl8169_cleanup_module(void)
{ {
pci_unregister_driver(&rtl8169_pci_driver); pci_unregister_driver(&rtl8169_pci_driver);
} }