diff options
Diffstat (limited to 'drivers/net/via-rhine.c')
-rw-r--r-- | drivers/net/via-rhine.c | 207 |
1 files changed, 83 insertions, 124 deletions
diff --git a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c index 98b6f3207d3d..ae971080e2e4 100644 --- a/drivers/net/via-rhine.c +++ b/drivers/net/via-rhine.c | |||
@@ -25,117 +25,13 @@ | |||
25 | version. He may or may not be interested in bug reports on this | 25 | version. He may or may not be interested in bug reports on this |
26 | code. You can find his versions at: | 26 | code. You can find his versions at: |
27 | http://www.scyld.com/network/via-rhine.html | 27 | http://www.scyld.com/network/via-rhine.html |
28 | 28 | [link no longer provides useful info -jgarzik] | |
29 | |||
30 | Linux kernel version history: | ||
31 | |||
32 | LK1.1.0: | ||
33 | - Jeff Garzik: softnet 'n stuff | ||
34 | |||
35 | LK1.1.1: | ||
36 | - Justin Guyett: softnet and locking fixes | ||
37 | - Jeff Garzik: use PCI interface | ||
38 | |||
39 | LK1.1.2: | ||
40 | - Urban Widmark: minor cleanups, merges from Becker 1.03a/1.04 versions | ||
41 | |||
42 | LK1.1.3: | ||
43 | - Urban Widmark: use PCI DMA interface (with thanks to the eepro100.c | ||
44 | code) update "Theory of Operation" with | ||
45 | softnet/locking changes | ||
46 | - Dave Miller: PCI DMA and endian fixups | ||
47 | - Jeff Garzik: MOD_xxx race fixes, updated PCI resource allocation | ||
48 | |||
49 | LK1.1.4: | ||
50 | - Urban Widmark: fix gcc 2.95.2 problem and | ||
51 | remove writel's to fixed address 0x7c | ||
52 | |||
53 | LK1.1.5: | ||
54 | - Urban Widmark: mdio locking, bounce buffer changes | ||
55 | merges from Beckers 1.05 version | ||
56 | added netif_running_on/off support | ||
57 | |||
58 | LK1.1.6: | ||
59 | - Urban Widmark: merges from Beckers 1.08b version (VT6102 + mdio) | ||
60 | set netif_running_on/off on startup, del_timer_sync | ||
61 | |||
62 | LK1.1.7: | ||
63 | - Manfred Spraul: added reset into tx_timeout | ||
64 | |||
65 | LK1.1.9: | ||
66 | - Urban Widmark: merges from Beckers 1.10 version | ||
67 | (media selection + eeprom reload) | ||
68 | - David Vrabel: merges from D-Link "1.11" version | ||
69 | (disable WOL and PME on startup) | ||
70 | |||
71 | LK1.1.10: | ||
72 | - Manfred Spraul: use "singlecopy" for unaligned buffers | ||
73 | don't allocate bounce buffers for !ReqTxAlign cards | ||
74 | |||
75 | LK1.1.11: | ||
76 | - David Woodhouse: Set dev->base_addr before the first time we call | ||
77 | wait_for_reset(). It's a lot happier that way. | ||
78 | Free np->tx_bufs only if we actually allocated it. | ||
79 | |||
80 | LK1.1.12: | ||
81 | - Martin Eriksson: Allow Memory-Mapped IO to be enabled. | ||
82 | |||
83 | LK1.1.13 (jgarzik): | ||
84 | - Add ethtool support | ||
85 | - Replace some MII-related magic numbers with constants | ||
86 | |||
87 | LK1.1.14 (Ivan G.): | ||
88 | - fixes comments for Rhine-III | ||
89 | - removes W_MAX_TIMEOUT (unused) | ||
90 | - adds HasDavicomPhy for Rhine-I (basis: linuxfet driver; my card | ||
91 | is R-I and has Davicom chip, flag is referenced in kernel driver) | ||
92 | - sends chip_id as a parameter to wait_for_reset since np is not | ||
93 | initialized on first call | ||
94 | - changes mmio "else if (chip_id==VT6102)" to "else" so it will work | ||
95 | for Rhine-III's (documentation says same bit is correct) | ||
96 | - transmit frame queue message is off by one - fixed | ||
97 | - adds IntrNormalSummary to "Something Wicked" exclusion list | ||
98 | so normal interrupts will not trigger the message (src: Donald Becker) | ||
99 | (Roger Luethi) | ||
100 | - show confused chip where to continue after Tx error | ||
101 | - location of collision counter is chip specific | ||
102 | - allow selecting backoff algorithm (module parameter) | ||
103 | |||
104 | LK1.1.15 (jgarzik): | ||
105 | - Use new MII lib helper generic_mii_ioctl | ||
106 | |||
107 | LK1.1.16 (Roger Luethi) | ||
108 | - Etherleak fix | ||
109 | - Handle Tx buffer underrun | ||
110 | - Fix bugs in full duplex handling | ||
111 | - New reset code uses "force reset" cmd on Rhine-II | ||
112 | - Various clean ups | ||
113 | |||
114 | LK1.1.17 (Roger Luethi) | ||
115 | - Fix race in via_rhine_start_tx() | ||
116 | - On errors, wait for Tx engine to turn off before scavenging | ||
117 | - Handle Tx descriptor write-back race on Rhine-II | ||
118 | - Force flushing for PCI posted writes | ||
119 | - More reset code changes | ||
120 | |||
121 | LK1.1.18 (Roger Luethi) | ||
122 | - No filtering multicast in promisc mode (Edward Peng) | ||
123 | - Fix for Rhine-I Tx timeouts | ||
124 | |||
125 | LK1.1.19 (Roger Luethi) | ||
126 | - Increase Tx threshold for unspecified errors | ||
127 | |||
128 | LK1.2.0-2.6 (Roger Luethi) | ||
129 | - Massive clean-up | ||
130 | - Rewrite PHY, media handling (remove options, full_duplex, backoff) | ||
131 | - Fix Tx engine race for good | ||
132 | - Craig Brind: Zero padded aligned buffers for short packets. | ||
133 | 29 | ||
134 | */ | 30 | */ |
135 | 31 | ||
136 | #define DRV_NAME "via-rhine" | 32 | #define DRV_NAME "via-rhine" |
137 | #define DRV_VERSION "1.2.0-2.6" | 33 | #define DRV_VERSION "1.4.1" |
138 | #define DRV_RELDATE "June-10-2004" | 34 | #define DRV_RELDATE "July-24-2006" |
139 | 35 | ||
140 | 36 | ||
141 | /* A few user-configurable values. | 37 | /* A few user-configurable values. |
@@ -148,6 +44,10 @@ static int max_interrupt_work = 20; | |||
148 | Setting to > 1518 effectively disables this feature. */ | 44 | Setting to > 1518 effectively disables this feature. */ |
149 | static int rx_copybreak; | 45 | static int rx_copybreak; |
150 | 46 | ||
47 | /* Work-around for broken BIOSes: they are unable to get the chip back out of | ||
48 | power state D3 so PXE booting fails. bootparam(7): via-rhine.avoid_D3=1 */ | ||
49 | static int avoid_D3; | ||
50 | |||
151 | /* | 51 | /* |
152 | * In case you are looking for 'options[]' or 'full_duplex[]', they | 52 | * In case you are looking for 'options[]' or 'full_duplex[]', they |
153 | * are gone. Use ethtool(8) instead. | 53 | * are gone. Use ethtool(8) instead. |
@@ -167,7 +67,11 @@ static const int multicast_filter_limit = 32; | |||
167 | There are no ill effects from too-large receive rings. */ | 67 | There are no ill effects from too-large receive rings. */ |
168 | #define TX_RING_SIZE 16 | 68 | #define TX_RING_SIZE 16 |
169 | #define TX_QUEUE_LEN 10 /* Limit ring entries actually used. */ | 69 | #define TX_QUEUE_LEN 10 /* Limit ring entries actually used. */ |
70 | #ifdef CONFIG_VIA_RHINE_NAPI | ||
71 | #define RX_RING_SIZE 64 | ||
72 | #else | ||
170 | #define RX_RING_SIZE 16 | 73 | #define RX_RING_SIZE 16 |
74 | #endif | ||
171 | 75 | ||
172 | 76 | ||
173 | /* Operational parameters that usually are not changed. */ | 77 | /* Operational parameters that usually are not changed. */ |
@@ -220,9 +124,11 @@ MODULE_LICENSE("GPL"); | |||
220 | module_param(max_interrupt_work, int, 0); | 124 | module_param(max_interrupt_work, int, 0); |
221 | module_param(debug, int, 0); | 125 | module_param(debug, int, 0); |
222 | module_param(rx_copybreak, int, 0); | 126 | module_param(rx_copybreak, int, 0); |
127 | module_param(avoid_D3, bool, 0); | ||
223 | MODULE_PARM_DESC(max_interrupt_work, "VIA Rhine maximum events handled per interrupt"); | 128 | MODULE_PARM_DESC(max_interrupt_work, "VIA Rhine maximum events handled per interrupt"); |
224 | MODULE_PARM_DESC(debug, "VIA Rhine debug level (0-7)"); | 129 | MODULE_PARM_DESC(debug, "VIA Rhine debug level (0-7)"); |
225 | MODULE_PARM_DESC(rx_copybreak, "VIA Rhine copy breakpoint for copy-only-tiny-frames"); | 130 | MODULE_PARM_DESC(rx_copybreak, "VIA Rhine copy breakpoint for copy-only-tiny-frames"); |
131 | MODULE_PARM_DESC(avoid_D3, "Avoid power state D3 (work-around for broken BIOSes)"); | ||
226 | 132 | ||
227 | /* | 133 | /* |
228 | Theory of Operation | 134 | Theory of Operation |
@@ -356,12 +262,11 @@ enum rhine_quirks { | |||
356 | /* Beware of PCI posted writes */ | 262 | /* Beware of PCI posted writes */ |
357 | #define IOSYNC do { ioread8(ioaddr + StationAddr); } while (0) | 263 | #define IOSYNC do { ioread8(ioaddr + StationAddr); } while (0) |
358 | 264 | ||
359 | static struct pci_device_id rhine_pci_tbl[] = | 265 | static const struct pci_device_id rhine_pci_tbl[] = { |
360 | { | 266 | { 0x1106, 0x3043, PCI_ANY_ID, PCI_ANY_ID, }, /* VT86C100A */ |
361 | {0x1106, 0x3043, PCI_ANY_ID, PCI_ANY_ID, 0, 0, }, /* VT86C100A */ | 267 | { 0x1106, 0x3065, PCI_ANY_ID, PCI_ANY_ID, }, /* VT6102 */ |
362 | {0x1106, 0x3065, PCI_ANY_ID, PCI_ANY_ID, 0, 0, }, /* VT6102 */ | 268 | { 0x1106, 0x3106, PCI_ANY_ID, PCI_ANY_ID, }, /* 6105{,L,LOM} */ |
363 | {0x1106, 0x3106, PCI_ANY_ID, PCI_ANY_ID, 0, 0, }, /* 6105{,L,LOM} */ | 269 | { 0x1106, 0x3053, PCI_ANY_ID, PCI_ANY_ID, }, /* VT6105M */ |
364 | {0x1106, 0x3053, PCI_ANY_ID, PCI_ANY_ID, 0, 0, }, /* VT6105M */ | ||
365 | { } /* terminate list */ | 270 | { } /* terminate list */ |
366 | }; | 271 | }; |
367 | MODULE_DEVICE_TABLE(pci, rhine_pci_tbl); | 272 | MODULE_DEVICE_TABLE(pci, rhine_pci_tbl); |
@@ -501,7 +406,7 @@ static void rhine_tx_timeout(struct net_device *dev); | |||
501 | static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev); | 406 | static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev); |
502 | static irqreturn_t rhine_interrupt(int irq, void *dev_instance, struct pt_regs *regs); | 407 | static irqreturn_t rhine_interrupt(int irq, void *dev_instance, struct pt_regs *regs); |
503 | static void rhine_tx(struct net_device *dev); | 408 | static void rhine_tx(struct net_device *dev); |
504 | static void rhine_rx(struct net_device *dev); | 409 | static int rhine_rx(struct net_device *dev, int limit); |
505 | static void rhine_error(struct net_device *dev, int intr_status); | 410 | static void rhine_error(struct net_device *dev, int intr_status); |
506 | static void rhine_set_rx_mode(struct net_device *dev); | 411 | static void rhine_set_rx_mode(struct net_device *dev); |
507 | static struct net_device_stats *rhine_get_stats(struct net_device *dev); | 412 | static struct net_device_stats *rhine_get_stats(struct net_device *dev); |
@@ -669,6 +574,32 @@ static void rhine_poll(struct net_device *dev) | |||
669 | } | 574 | } |
670 | #endif | 575 | #endif |
671 | 576 | ||
577 | #ifdef CONFIG_VIA_RHINE_NAPI | ||
578 | static int rhine_napipoll(struct net_device *dev, int *budget) | ||
579 | { | ||
580 | struct rhine_private *rp = netdev_priv(dev); | ||
581 | void __iomem *ioaddr = rp->base; | ||
582 | int done, limit = min(dev->quota, *budget); | ||
583 | |||
584 | done = rhine_rx(dev, limit); | ||
585 | *budget -= done; | ||
586 | dev->quota -= done; | ||
587 | |||
588 | if (done < limit) { | ||
589 | netif_rx_complete(dev); | ||
590 | |||
591 | iowrite16(IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow | | ||
592 | IntrRxDropped | IntrRxNoBuf | IntrTxAborted | | ||
593 | IntrTxDone | IntrTxError | IntrTxUnderrun | | ||
594 | IntrPCIErr | IntrStatsMax | IntrLinkChange, | ||
595 | ioaddr + IntrEnable); | ||
596 | return 0; | ||
597 | } | ||
598 | else | ||
599 | return 1; | ||
600 | } | ||
601 | #endif | ||
602 | |||
672 | static void rhine_hw_init(struct net_device *dev, long pioaddr) | 603 | static void rhine_hw_init(struct net_device *dev, long pioaddr) |
673 | { | 604 | { |
674 | struct rhine_private *rp = netdev_priv(dev); | 605 | struct rhine_private *rp = netdev_priv(dev); |
@@ -849,6 +780,10 @@ static int __devinit rhine_init_one(struct pci_dev *pdev, | |||
849 | #ifdef CONFIG_NET_POLL_CONTROLLER | 780 | #ifdef CONFIG_NET_POLL_CONTROLLER |
850 | dev->poll_controller = rhine_poll; | 781 | dev->poll_controller = rhine_poll; |
851 | #endif | 782 | #endif |
783 | #ifdef CONFIG_VIA_RHINE_NAPI | ||
784 | dev->poll = rhine_napipoll; | ||
785 | dev->weight = 64; | ||
786 | #endif | ||
852 | if (rp->quirks & rqRhineI) | 787 | if (rp->quirks & rqRhineI) |
853 | dev->features |= NETIF_F_SG|NETIF_F_HW_CSUM; | 788 | dev->features |= NETIF_F_SG|NETIF_F_HW_CSUM; |
854 | 789 | ||
@@ -894,6 +829,9 @@ static int __devinit rhine_init_one(struct pci_dev *pdev, | |||
894 | } | 829 | } |
895 | } | 830 | } |
896 | rp->mii_if.phy_id = phy_id; | 831 | rp->mii_if.phy_id = phy_id; |
832 | if (debug > 1 && avoid_D3) | ||
833 | printk(KERN_INFO "%s: No D3 power state at shutdown.\n", | ||
834 | dev->name); | ||
897 | 835 | ||
898 | return 0; | 836 | return 0; |
899 | 837 | ||
@@ -1119,6 +1057,8 @@ static void init_registers(struct net_device *dev) | |||
1119 | 1057 | ||
1120 | rhine_set_rx_mode(dev); | 1058 | rhine_set_rx_mode(dev); |
1121 | 1059 | ||
1060 | netif_poll_enable(dev); | ||
1061 | |||
1122 | /* Enable interrupts by setting the interrupt mask. */ | 1062 | /* Enable interrupts by setting the interrupt mask. */ |
1123 | iowrite16(IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow | | 1063 | iowrite16(IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow | |
1124 | IntrRxDropped | IntrRxNoBuf | IntrTxAborted | | 1064 | IntrRxDropped | IntrRxNoBuf | IntrTxAborted | |
@@ -1373,8 +1313,18 @@ static irqreturn_t rhine_interrupt(int irq, void *dev_instance, struct pt_regs * | |||
1373 | dev->name, intr_status); | 1313 | dev->name, intr_status); |
1374 | 1314 | ||
1375 | if (intr_status & (IntrRxDone | IntrRxErr | IntrRxDropped | | 1315 | if (intr_status & (IntrRxDone | IntrRxErr | IntrRxDropped | |
1376 | IntrRxWakeUp | IntrRxEmpty | IntrRxNoBuf)) | 1316 | IntrRxWakeUp | IntrRxEmpty | IntrRxNoBuf)) { |
1377 | rhine_rx(dev); | 1317 | #ifdef CONFIG_VIA_RHINE_NAPI |
1318 | iowrite16(IntrTxAborted | | ||
1319 | IntrTxDone | IntrTxError | IntrTxUnderrun | | ||
1320 | IntrPCIErr | IntrStatsMax | IntrLinkChange, | ||
1321 | ioaddr + IntrEnable); | ||
1322 | |||
1323 | netif_rx_schedule(dev); | ||
1324 | #else | ||
1325 | rhine_rx(dev, RX_RING_SIZE); | ||
1326 | #endif | ||
1327 | } | ||
1378 | 1328 | ||
1379 | if (intr_status & (IntrTxErrSummary | IntrTxDone)) { | 1329 | if (intr_status & (IntrTxErrSummary | IntrTxDone)) { |
1380 | if (intr_status & IntrTxErrSummary) { | 1330 | if (intr_status & IntrTxErrSummary) { |
@@ -1472,13 +1422,12 @@ static void rhine_tx(struct net_device *dev) | |||
1472 | spin_unlock(&rp->lock); | 1422 | spin_unlock(&rp->lock); |
1473 | } | 1423 | } |
1474 | 1424 | ||
1475 | /* This routine is logically part of the interrupt handler, but isolated | 1425 | /* Process up to limit frames from receive ring */ |
1476 | for clarity and better register allocation. */ | 1426 | static int rhine_rx(struct net_device *dev, int limit) |
1477 | static void rhine_rx(struct net_device *dev) | ||
1478 | { | 1427 | { |
1479 | struct rhine_private *rp = netdev_priv(dev); | 1428 | struct rhine_private *rp = netdev_priv(dev); |
1429 | int count; | ||
1480 | int entry = rp->cur_rx % RX_RING_SIZE; | 1430 | int entry = rp->cur_rx % RX_RING_SIZE; |
1481 | int boguscnt = rp->dirty_rx + RX_RING_SIZE - rp->cur_rx; | ||
1482 | 1431 | ||
1483 | if (debug > 4) { | 1432 | if (debug > 4) { |
1484 | printk(KERN_DEBUG "%s: rhine_rx(), entry %d status %8.8x.\n", | 1433 | printk(KERN_DEBUG "%s: rhine_rx(), entry %d status %8.8x.\n", |
@@ -1487,16 +1436,18 @@ static void rhine_rx(struct net_device *dev) | |||
1487 | } | 1436 | } |
1488 | 1437 | ||
1489 | /* If EOP is set on the next entry, it's a new packet. Send it up. */ | 1438 | /* If EOP is set on the next entry, it's a new packet. Send it up. */ |
1490 | while (!(rp->rx_head_desc->rx_status & cpu_to_le32(DescOwn))) { | 1439 | for (count = 0; count < limit; ++count) { |
1491 | struct rx_desc *desc = rp->rx_head_desc; | 1440 | struct rx_desc *desc = rp->rx_head_desc; |
1492 | u32 desc_status = le32_to_cpu(desc->rx_status); | 1441 | u32 desc_status = le32_to_cpu(desc->rx_status); |
1493 | int data_size = desc_status >> 16; | 1442 | int data_size = desc_status >> 16; |
1494 | 1443 | ||
1444 | if (desc_status & DescOwn) | ||
1445 | break; | ||
1446 | |||
1495 | if (debug > 4) | 1447 | if (debug > 4) |
1496 | printk(KERN_DEBUG "rhine_rx() status is %8.8x.\n", | 1448 | printk(KERN_DEBUG "rhine_rx() status is %8.8x.\n", |
1497 | desc_status); | 1449 | desc_status); |
1498 | if (--boguscnt < 0) | 1450 | |
1499 | break; | ||
1500 | if ((desc_status & (RxWholePkt | RxErr)) != RxWholePkt) { | 1451 | if ((desc_status & (RxWholePkt | RxErr)) != RxWholePkt) { |
1501 | if ((desc_status & RxWholePkt) != RxWholePkt) { | 1452 | if ((desc_status & RxWholePkt) != RxWholePkt) { |
1502 | printk(KERN_WARNING "%s: Oversized Ethernet " | 1453 | printk(KERN_WARNING "%s: Oversized Ethernet " |
@@ -1565,7 +1516,11 @@ static void rhine_rx(struct net_device *dev) | |||
1565 | PCI_DMA_FROMDEVICE); | 1516 | PCI_DMA_FROMDEVICE); |
1566 | } | 1517 | } |
1567 | skb->protocol = eth_type_trans(skb, dev); | 1518 | skb->protocol = eth_type_trans(skb, dev); |
1519 | #ifdef CONFIG_VIA_RHINE_NAPI | ||
1520 | netif_receive_skb(skb); | ||
1521 | #else | ||
1568 | netif_rx(skb); | 1522 | netif_rx(skb); |
1523 | #endif | ||
1569 | dev->last_rx = jiffies; | 1524 | dev->last_rx = jiffies; |
1570 | rp->stats.rx_bytes += pkt_len; | 1525 | rp->stats.rx_bytes += pkt_len; |
1571 | rp->stats.rx_packets++; | 1526 | rp->stats.rx_packets++; |
@@ -1592,6 +1547,8 @@ static void rhine_rx(struct net_device *dev) | |||
1592 | } | 1547 | } |
1593 | rp->rx_ring[entry].rx_status = cpu_to_le32(DescOwn); | 1548 | rp->rx_ring[entry].rx_status = cpu_to_le32(DescOwn); |
1594 | } | 1549 | } |
1550 | |||
1551 | return count; | ||
1595 | } | 1552 | } |
1596 | 1553 | ||
1597 | /* | 1554 | /* |
@@ -1881,6 +1838,7 @@ static int rhine_close(struct net_device *dev) | |||
1881 | spin_lock_irq(&rp->lock); | 1838 | spin_lock_irq(&rp->lock); |
1882 | 1839 | ||
1883 | netif_stop_queue(dev); | 1840 | netif_stop_queue(dev); |
1841 | netif_poll_disable(dev); | ||
1884 | 1842 | ||
1885 | if (debug > 1) | 1843 | if (debug > 1) |
1886 | printk(KERN_DEBUG "%s: Shutting down ethercard, " | 1844 | printk(KERN_DEBUG "%s: Shutting down ethercard, " |
@@ -1962,7 +1920,8 @@ static void rhine_shutdown (struct pci_dev *pdev) | |||
1962 | } | 1920 | } |
1963 | 1921 | ||
1964 | /* Hit power state D3 (sleep) */ | 1922 | /* Hit power state D3 (sleep) */ |
1965 | iowrite8(ioread8(ioaddr + StickyHW) | 0x03, ioaddr + StickyHW); | 1923 | if (!avoid_D3) |
1924 | iowrite8(ioread8(ioaddr + StickyHW) | 0x03, ioaddr + StickyHW); | ||
1966 | 1925 | ||
1967 | /* TODO: Check use of pci_enable_wake() */ | 1926 | /* TODO: Check use of pci_enable_wake() */ |
1968 | 1927 | ||