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: 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);
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче