r8169: cleanup
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:
Родитель
901dda2b5f
Коммит
07d3f51feb
|
@ -1,40 +1,11 @@
|
|||
/*
|
||||
=========================================================================
|
||||
r8169.c: A RealTek RTL-8169 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.
|
||||
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)
|
||||
* r8169.c: RealTek 8169/8168/8101 ethernet driver.
|
||||
*
|
||||
* Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
|
||||
* Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
|
||||
* Copyright (c) a lot of people too. Please respect their work.
|
||||
*
|
||||
* See MAINTAINERS file for support contact information.
|
||||
*/
|
||||
|
||||
#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_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 SafeMtu 0x1c20 /* ... actually life sucks beyond ~7k */
|
||||
#define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */
|
||||
|
@ -209,62 +180,62 @@ static struct {
|
|||
u32 msg_enable;
|
||||
} debug = { -1 };
|
||||
|
||||
enum RTL8169_registers {
|
||||
MAC0 = 0, /* Ethernet hardware address. */
|
||||
MAR0 = 8, /* Multicast filter. */
|
||||
CounterAddrLow = 0x10,
|
||||
CounterAddrHigh = 0x14,
|
||||
TxDescStartAddrLow = 0x20,
|
||||
TxDescStartAddrHigh = 0x24,
|
||||
TxHDescStartAddrLow = 0x28,
|
||||
TxHDescStartAddrHigh = 0x2c,
|
||||
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,
|
||||
MultiIntr = 0x5C,
|
||||
PHYAR = 0x60,
|
||||
TBICSR = 0x64,
|
||||
TBI_ANAR = 0x68,
|
||||
TBI_LPAR = 0x6A,
|
||||
PHYstatus = 0x6C,
|
||||
RxMaxSize = 0xDA,
|
||||
CPlusCmd = 0xE0,
|
||||
IntrMitigate = 0xE2,
|
||||
RxDescAddrLow = 0xE4,
|
||||
RxDescAddrHigh = 0xE8,
|
||||
EarlyTxThres = 0xEC,
|
||||
FuncEvent = 0xF0,
|
||||
FuncEventMask = 0xF4,
|
||||
FuncPresetState = 0xF8,
|
||||
FuncForceEvent = 0xFC,
|
||||
enum rtl_registers {
|
||||
MAC0 = 0, /* Ethernet hardware address. */
|
||||
MAR0 = 8, /* Multicast filter. */
|
||||
CounterAddrLow = 0x10,
|
||||
CounterAddrHigh = 0x14,
|
||||
TxDescStartAddrLow = 0x20,
|
||||
TxDescStartAddrHigh = 0x24,
|
||||
TxHDescStartAddrLow = 0x28,
|
||||
TxHDescStartAddrHigh = 0x2c,
|
||||
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,
|
||||
MultiIntr = 0x5c,
|
||||
PHYAR = 0x60,
|
||||
TBICSR = 0x64,
|
||||
TBI_ANAR = 0x68,
|
||||
TBI_LPAR = 0x6a,
|
||||
PHYstatus = 0x6c,
|
||||
RxMaxSize = 0xda,
|
||||
CPlusCmd = 0xe0,
|
||||
IntrMitigate = 0xe2,
|
||||
RxDescAddrLow = 0xe4,
|
||||
RxDescAddrHigh = 0xe8,
|
||||
EarlyTxThres = 0xec,
|
||||
FuncEvent = 0xf0,
|
||||
FuncEventMask = 0xf4,
|
||||
FuncPresetState = 0xf8,
|
||||
FuncForceEvent = 0xfc,
|
||||
};
|
||||
|
||||
enum RTL8169_register_content {
|
||||
enum rtl_register_content {
|
||||
/* InterruptStatusBits */
|
||||
SYSErr = 0x8000,
|
||||
PCSTimeout = 0x4000,
|
||||
SWInt = 0x0100,
|
||||
TxDescUnavail = 0x80,
|
||||
RxFIFOOver = 0x40,
|
||||
LinkChg = 0x20,
|
||||
RxOverflow = 0x10,
|
||||
TxErr = 0x08,
|
||||
TxOK = 0x04,
|
||||
RxErr = 0x02,
|
||||
RxOK = 0x01,
|
||||
SYSErr = 0x8000,
|
||||
PCSTimeout = 0x4000,
|
||||
SWInt = 0x0100,
|
||||
TxDescUnavail = 0x0080,
|
||||
RxFIFOOver = 0x0040,
|
||||
LinkChg = 0x0020,
|
||||
RxOverflow = 0x0010,
|
||||
TxErr = 0x0008,
|
||||
TxOK = 0x0004,
|
||||
RxErr = 0x0002,
|
||||
RxOK = 0x0001,
|
||||
|
||||
/* RxStatusDesc */
|
||||
RxFOVF = (1 << 23),
|
||||
|
@ -274,26 +245,26 @@ enum RTL8169_register_content {
|
|||
RxCRC = (1 << 19),
|
||||
|
||||
/* ChipCmdBits */
|
||||
CmdReset = 0x10,
|
||||
CmdRxEnb = 0x08,
|
||||
CmdTxEnb = 0x04,
|
||||
RxBufEmpty = 0x01,
|
||||
CmdReset = 0x10,
|
||||
CmdRxEnb = 0x08,
|
||||
CmdTxEnb = 0x04,
|
||||
RxBufEmpty = 0x01,
|
||||
|
||||
/* Cfg9346Bits */
|
||||
Cfg9346_Lock = 0x00,
|
||||
Cfg9346_Unlock = 0xC0,
|
||||
Cfg9346_Lock = 0x00,
|
||||
Cfg9346_Unlock = 0xc0,
|
||||
|
||||
/* rx_mode_bits */
|
||||
AcceptErr = 0x20,
|
||||
AcceptRunt = 0x10,
|
||||
AcceptBroadcast = 0x08,
|
||||
AcceptMulticast = 0x04,
|
||||
AcceptMyPhys = 0x02,
|
||||
AcceptAllPhys = 0x01,
|
||||
AcceptErr = 0x20,
|
||||
AcceptRunt = 0x10,
|
||||
AcceptBroadcast = 0x08,
|
||||
AcceptMulticast = 0x04,
|
||||
AcceptMyPhys = 0x02,
|
||||
AcceptAllPhys = 0x01,
|
||||
|
||||
/* RxConfigBits */
|
||||
RxCfgFIFOShift = 13,
|
||||
RxCfgDMAShift = 8,
|
||||
RxCfgFIFOShift = 13,
|
||||
RxCfgDMAShift = 8,
|
||||
|
||||
/* TxConfigBits */
|
||||
TxInterFrameGapShift = 24,
|
||||
|
@ -337,23 +308,23 @@ enum RTL8169_register_content {
|
|||
INTT_3 = 0x0003, // 8168
|
||||
|
||||
/* rtl8169_PHYstatus */
|
||||
TBI_Enable = 0x80,
|
||||
TxFlowCtrl = 0x40,
|
||||
RxFlowCtrl = 0x20,
|
||||
_1000bpsF = 0x10,
|
||||
_100bps = 0x08,
|
||||
_10bps = 0x04,
|
||||
LinkStatus = 0x02,
|
||||
FullDup = 0x01,
|
||||
TBI_Enable = 0x80,
|
||||
TxFlowCtrl = 0x40,
|
||||
RxFlowCtrl = 0x20,
|
||||
_1000bpsF = 0x10,
|
||||
_100bps = 0x08,
|
||||
_10bps = 0x04,
|
||||
LinkStatus = 0x02,
|
||||
FullDup = 0x01,
|
||||
|
||||
/* _TBICSRBit */
|
||||
TBILinkOK = 0x02000000,
|
||||
TBILinkOK = 0x02000000,
|
||||
|
||||
/* DumpCounterCommand */
|
||||
CounterDump = 0x8,
|
||||
CounterDump = 0x8,
|
||||
};
|
||||
|
||||
enum _DescStatusBit {
|
||||
enum desc_status_bit {
|
||||
DescOwn = (1 << 31), /* Descriptor is owned by NIC */
|
||||
RingEnd = (1 << 30), /* End of descriptor ring */
|
||||
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 =
|
||||
(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;
|
||||
|
||||
RTL_W32(PHYAR, 0x80000000 | (RegAddr & 0xFF) << 16 | value);
|
||||
RTL_W32(PHYAR, 0x80000000 | (reg_addr & 0xFF) << 16 | value);
|
||||
|
||||
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))
|
||||
break;
|
||||
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;
|
||||
|
||||
RTL_W32(PHYAR, 0x0 | (RegAddr & 0xFF) << 16);
|
||||
RTL_W32(PHYAR, 0x0 | (reg_addr & 0xFF) << 16);
|
||||
|
||||
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) {
|
||||
value = (int) (RTL_R32(PHYAR) & 0xFFFF);
|
||||
break;
|
||||
|
@ -557,7 +534,8 @@ static void rtl8169_xmii_reset_enable(void __iomem *ioaddr)
|
|||
}
|
||||
|
||||
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;
|
||||
|
||||
|
@ -613,7 +591,7 @@ static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
|||
{
|
||||
struct rtl8169_private *tp = netdev_priv(dev);
|
||||
void __iomem *ioaddr = tp->mmio_addr;
|
||||
int i;
|
||||
unsigned int i;
|
||||
static struct {
|
||||
u32 opt;
|
||||
u16 reg;
|
||||
|
@ -839,8 +817,7 @@ static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
|
|||
int ret;
|
||||
|
||||
if (tp->vlgrp && (opts2 & RxVlanTag)) {
|
||||
rtl8169_rx_hwaccel_skb(skb, tp->vlgrp,
|
||||
swab16(opts2 & 0xffff));
|
||||
rtl8169_rx_hwaccel_skb(skb, tp->vlgrp, swab16(opts2 & 0xffff));
|
||||
ret = 0;
|
||||
} else
|
||||
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 = {
|
||||
.get_drvinfo = rtl8169_get_drvinfo,
|
||||
.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,
|
||||
};
|
||||
|
||||
static void rtl8169_write_gmii_reg_bit(void __iomem *ioaddr, int reg, int bitnum,
|
||||
int bitval)
|
||||
static void rtl8169_write_gmii_reg_bit(void __iomem *ioaddr, int reg,
|
||||
int bitnum, int bitval)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
|
@ -1140,7 +1117,8 @@ static void rtl8169_print_mac_version(struct rtl8169_private *tp)
|
|||
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 {
|
||||
u16 mask;
|
||||
|
@ -1217,7 +1195,7 @@ static void rtl8169_hw_phy_config(struct net_device *dev)
|
|||
0xbf00 } //w 0 15 0 bf00
|
||||
}
|
||||
}, *p = phy_magic;
|
||||
int i;
|
||||
unsigned int i;
|
||||
|
||||
rtl8169_print_mac_version(tp);
|
||||
rtl8169_print_phy_version(tp);
|
||||
|
@ -1351,7 +1329,7 @@ static void rtl8169_phy_reset(struct net_device *dev,
|
|||
struct rtl8169_private *tp)
|
||||
{
|
||||
void __iomem *ioaddr = tp->mmio_addr;
|
||||
int i;
|
||||
unsigned int i;
|
||||
|
||||
tp->phy_reset_enable(ioaddr);
|
||||
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 net_device *dev;
|
||||
void __iomem *ioaddr;
|
||||
unsigned int pm_cap;
|
||||
int i, rc;
|
||||
unsigned int i;
|
||||
int rc;
|
||||
|
||||
if (netif_msg_drv(&debug)) {
|
||||
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)
|
||||
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 */
|
||||
if (!(pci_resource_flags(pdev, region) & IORESOURCE_MEM)) {
|
||||
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);
|
||||
|
||||
/* 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)
|
||||
break;
|
||||
msleep_interruptible(1);
|
||||
|
@ -1706,15 +1670,11 @@ err_out_free_dev_1:
|
|||
goto out;
|
||||
}
|
||||
|
||||
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 = netdev_priv(dev);
|
||||
|
||||
assert(dev != NULL);
|
||||
assert(tp != NULL);
|
||||
|
||||
flush_scheduled_work();
|
||||
|
||||
unregister_netdev(dev);
|
||||
|
@ -1814,13 +1774,13 @@ static void rtl_hw_start(struct net_device *dev)
|
|||
{
|
||||
struct rtl8169_private *tp = netdev_priv(dev);
|
||||
void __iomem *ioaddr = tp->mmio_addr;
|
||||
u32 i;
|
||||
unsigned int i;
|
||||
|
||||
/* Soft reset the chip. */
|
||||
RTL_W8(ChipCmd, CmdReset);
|
||||
|
||||
/* 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)
|
||||
break;
|
||||
msleep_interruptible(1);
|
||||
|
@ -2132,7 +2092,7 @@ err_out:
|
|||
|
||||
static void rtl8169_rx_clear(struct rtl8169_private *tp)
|
||||
{
|
||||
int i;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < NUM_RX_DESC; i++) {
|
||||
if (tp->Rx_skbuff[i]) {
|
||||
|
@ -2274,14 +2234,9 @@ static void rtl8169_reinit_task(struct work_struct *work)
|
|||
|
||||
ret = rtl8169_open(dev);
|
||||
if (unlikely(ret < 0)) {
|
||||
if (net_ratelimit()) {
|
||||
struct rtl8169_private *tp = netdev_priv(dev);
|
||||
|
||||
if (netif_msg_drv(tp)) {
|
||||
printk(PFX KERN_ERR
|
||||
"%s: reinit failure (status = %d)."
|
||||
" Rescheduling.\n", dev->name, ret);
|
||||
}
|
||||
if (net_ratelimit() && 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);
|
||||
}
|
||||
|
@ -2311,13 +2266,9 @@ static void rtl8169_reset_task(struct work_struct *work)
|
|||
rtl_hw_start(dev);
|
||||
netif_wake_queue(dev);
|
||||
} else {
|
||||
if (net_ratelimit()) {
|
||||
struct rtl8169_private *tp = netdev_priv(dev);
|
||||
|
||||
if (netif_msg_intr(tp)) {
|
||||
printk(PFX KERN_EMERG
|
||||
"%s: Rx buffers shortage\n", dev->name);
|
||||
}
|
||||
if (net_ratelimit() && netif_msg_intr(tp)) {
|
||||
printk(PFX KERN_EMERG "%s: Rx buffers shortage\n",
|
||||
dev->name);
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
static void
|
||||
rtl8169_tx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
|
||||
void __iomem *ioaddr)
|
||||
static void rtl8169_tx_interrupt(struct net_device *dev,
|
||||
struct rtl8169_private *tp,
|
||||
void __iomem *ioaddr)
|
||||
{
|
||||
unsigned int dirty_tx, tx_left;
|
||||
|
||||
assert(dev != NULL);
|
||||
assert(tp != NULL);
|
||||
assert(ioaddr != NULL);
|
||||
|
||||
dirty_tx = tp->dirty_tx;
|
||||
smp_rmb();
|
||||
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;
|
||||
}
|
||||
|
||||
static inline bool rtl8169_try_rx_copy(struct sk_buff **sk_buff, int pkt_size,
|
||||
struct pci_dev *pdev, dma_addr_t addr)
|
||||
static inline bool rtl8169_try_rx_copy(struct sk_buff **sk_buff,
|
||||
struct rtl8169_private *tp, int pkt_size,
|
||||
dma_addr_t addr)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
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)
|
||||
goto out;
|
||||
|
||||
skb = dev_alloc_skb(pkt_size + NET_IP_ALIGN);
|
||||
skb = netdev_alloc_skb(tp->dev, pkt_size + NET_IP_ALIGN);
|
||||
if (!skb)
|
||||
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_copy_from_linear_data(*sk_buff, skb->data, pkt_size);
|
||||
*sk_buff = skb;
|
||||
|
@ -2612,17 +2561,13 @@ out:
|
|||
return done;
|
||||
}
|
||||
|
||||
static int
|
||||
rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
|
||||
void __iomem *ioaddr)
|
||||
static int rtl8169_rx_interrupt(struct net_device *dev,
|
||||
struct rtl8169_private *tp,
|
||||
void __iomem *ioaddr)
|
||||
{
|
||||
unsigned int cur_rx, rx_left;
|
||||
unsigned int delta, count;
|
||||
|
||||
assert(dev != NULL);
|
||||
assert(tp != NULL);
|
||||
assert(ioaddr != NULL);
|
||||
|
||||
cur_rx = tp->cur_rx;
|
||||
rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
|
||||
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);
|
||||
|
||||
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,
|
||||
pkt_size, PCI_DMA_FROMDEVICE);
|
||||
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;
|
||||
}
|
||||
|
||||
/* 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);
|
||||
int boguscnt = max_interrupt_work;
|
||||
void __iomem *ioaddr = tp->mmio_addr;
|
||||
|
@ -2784,9 +2727,9 @@ rtl8169_interrupt(int irq, void *dev_instance)
|
|||
break;
|
||||
#else
|
||||
/* Rx interrupt */
|
||||
if (status & (RxOK | RxOverflow | RxFIFOOver)) {
|
||||
if (status & (RxOK | RxOverflow | RxFIFOOver))
|
||||
rtl8169_rx_interrupt(dev, tp, ioaddr);
|
||||
}
|
||||
|
||||
/* Tx interrupt */
|
||||
if (status & (TxOK | TxErr))
|
||||
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;
|
||||
unsigned long flags;
|
||||
u32 mc_filter[2]; /* Multicast hash filter */
|
||||
int i, rx_mode;
|
||||
int rx_mode;
|
||||
u32 tmp = 0;
|
||||
|
||||
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;
|
||||
} else {
|
||||
struct dev_mc_list *mclist;
|
||||
unsigned int i;
|
||||
|
||||
rx_mode = AcceptBroadcast | AcceptMyPhys;
|
||||
mc_filter[1] = mc_filter[0] = 0;
|
||||
for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
|
||||
|
@ -3053,14 +2998,12 @@ static struct pci_driver rtl8169_pci_driver = {
|
|||
#endif
|
||||
};
|
||||
|
||||
static int __init
|
||||
rtl8169_init_module(void)
|
||||
static int __init rtl8169_init_module(void)
|
||||
{
|
||||
return pci_register_driver(&rtl8169_pci_driver);
|
||||
}
|
||||
|
||||
static void __exit
|
||||
rtl8169_cleanup_module(void)
|
||||
static void __exit rtl8169_cleanup_module(void)
|
||||
{
|
||||
pci_unregister_driver(&rtl8169_pci_driver);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче