diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2005-05-12 20:16:24 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-05-12 20:16:24 -0400 |
commit | fdecea66687d76c7d19be6559586df5c51023d11 (patch) | |
tree | a49d87a77a86b5c2d3887d0eacc70b3c8a30b5ba /drivers/net/starfire.c | |
parent | 88d7bd8cb9eb8d64bf7997600b0d64f7834047c5 (diff) |
[netdrvr starfire] Add GPL'd firmware, remove compat code
Contributed by Ion Badulescu <ionut@badula.org>,
further fixed up by me.
Diffstat (limited to 'drivers/net/starfire.c')
-rw-r--r-- | drivers/net/starfire.c | 142 |
1 files changed, 40 insertions, 102 deletions
diff --git a/drivers/net/starfire.c b/drivers/net/starfire.c index 236bdd3f6ba0..12e2b6826fa3 100644 --- a/drivers/net/starfire.c +++ b/drivers/net/starfire.c | |||
@@ -2,7 +2,7 @@ | |||
2 | /* | 2 | /* |
3 | Written 1998-2000 by Donald Becker. | 3 | Written 1998-2000 by Donald Becker. |
4 | 4 | ||
5 | Current maintainer is Ion Badulescu <ionut@cs.columbia.edu>. Please | 5 | Current maintainer is Ion Badulescu <ionut ta badula tod org>. Please |
6 | send all bug reports to me, and not to Donald Becker, as this code | 6 | send all bug reports to me, and not to Donald Becker, as this code |
7 | has been heavily modified from Donald's original version. | 7 | has been heavily modified from Donald's original version. |
8 | 8 | ||
@@ -129,12 +129,18 @@ | |||
129 | - put the chip to a D3 slumber on driver unload | 129 | - put the chip to a D3 slumber on driver unload |
130 | - added config option to enable/disable NAPI | 130 | - added config option to enable/disable NAPI |
131 | 131 | ||
132 | TODO: bugfixes (no bugs known as of right now) | 132 | LK1.4.2 (Ion Badulescu) |
133 | - finally added firmware (GPL'ed by Adaptec) | ||
134 | - removed compatibility code for 2.2.x | ||
135 | |||
136 | TODO: - fix forced speed/duplexing code (broken a long time ago, when | ||
137 | somebody converted the driver to use the generic MII code) | ||
138 | - fix VLAN support | ||
133 | */ | 139 | */ |
134 | 140 | ||
135 | #define DRV_NAME "starfire" | 141 | #define DRV_NAME "starfire" |
136 | #define DRV_VERSION "1.03+LK1.4.1" | 142 | #define DRV_VERSION "1.03+LK1.4.2" |
137 | #define DRV_RELDATE "February 10, 2002" | 143 | #define DRV_RELDATE "January 19, 2005" |
138 | 144 | ||
139 | #include <linux/config.h> | 145 | #include <linux/config.h> |
140 | #include <linux/version.h> | 146 | #include <linux/version.h> |
@@ -145,25 +151,15 @@ TODO: bugfixes (no bugs known as of right now) | |||
145 | #include <linux/etherdevice.h> | 151 | #include <linux/etherdevice.h> |
146 | #include <linux/init.h> | 152 | #include <linux/init.h> |
147 | #include <linux/delay.h> | 153 | #include <linux/delay.h> |
154 | #include <linux/crc32.h> | ||
155 | #include <linux/ethtool.h> | ||
156 | #include <linux/mii.h> | ||
157 | #include <linux/if_vlan.h> | ||
148 | #include <asm/processor.h> /* Processor type for cache alignment. */ | 158 | #include <asm/processor.h> /* Processor type for cache alignment. */ |
149 | #include <asm/uaccess.h> | 159 | #include <asm/uaccess.h> |
150 | #include <asm/io.h> | 160 | #include <asm/io.h> |
151 | 161 | ||
152 | /* | 162 | #include "starfire_firmware.h" |
153 | * Adaptec's license for their drivers (which is where I got the | ||
154 | * firmware files) does not allow one to redistribute them. Thus, we can't | ||
155 | * include the firmware with this driver. | ||
156 | * | ||
157 | * However, should a legal-to-distribute firmware become available, | ||
158 | * the driver developer would need only to obtain the firmware in the | ||
159 | * form of a C header file. | ||
160 | * Once that's done, the #undef below must be changed into a #define | ||
161 | * for this driver to really use the firmware. Note that Rx/Tx | ||
162 | * hardware TCP checksumming is not possible without the firmware. | ||
163 | * | ||
164 | * WANTED: legal firmware to include with this GPL'd driver. | ||
165 | */ | ||
166 | #undef HAS_FIRMWARE | ||
167 | /* | 163 | /* |
168 | * The current frame processor firmware fails to checksum a fragment | 164 | * The current frame processor firmware fails to checksum a fragment |
169 | * of length 1. If and when this is fixed, the #define below can be removed. | 165 | * of length 1. If and when this is fixed, the #define below can be removed. |
@@ -172,13 +168,7 @@ TODO: bugfixes (no bugs known as of right now) | |||
172 | /* | 168 | /* |
173 | * Define this if using the driver with the zero-copy patch | 169 | * Define this if using the driver with the zero-copy patch |
174 | */ | 170 | */ |
175 | #if defined(HAS_FIRMWARE) && defined(MAX_SKB_FRAGS) | ||
176 | #define ZEROCOPY | 171 | #define ZEROCOPY |
177 | #endif | ||
178 | |||
179 | #ifdef HAS_FIRMWARE | ||
180 | #include "starfire_firmware.h" | ||
181 | #endif /* HAS_FIRMWARE */ | ||
182 | 172 | ||
183 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) | 173 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) |
184 | #define VLAN_SUPPORT | 174 | #define VLAN_SUPPORT |
@@ -202,11 +192,7 @@ static int mtu; | |||
202 | The Starfire has a 512 element hash table based on the Ethernet CRC. */ | 192 | The Starfire has a 512 element hash table based on the Ethernet CRC. */ |
203 | static int multicast_filter_limit = 512; | 193 | static int multicast_filter_limit = 512; |
204 | /* Whether to do TCP/UDP checksums in hardware */ | 194 | /* Whether to do TCP/UDP checksums in hardware */ |
205 | #ifdef HAS_FIRMWARE | ||
206 | static int enable_hw_cksum = 1; | 195 | static int enable_hw_cksum = 1; |
207 | #else | ||
208 | static int enable_hw_cksum = 0; | ||
209 | #endif | ||
210 | 196 | ||
211 | #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ | 197 | #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ |
212 | /* | 198 | /* |
@@ -291,43 +277,15 @@ static int full_duplex[MAX_UNITS] = {0, }; | |||
291 | #define RX_DESC_ADDR_SIZE RxDescAddr32bit | 277 | #define RX_DESC_ADDR_SIZE RxDescAddr32bit |
292 | #endif | 278 | #endif |
293 | 279 | ||
294 | #ifdef MAX_SKB_FRAGS | ||
295 | #define skb_first_frag_len(skb) skb_headlen(skb) | 280 | #define skb_first_frag_len(skb) skb_headlen(skb) |
296 | #define skb_num_frags(skb) (skb_shinfo(skb)->nr_frags + 1) | 281 | #define skb_num_frags(skb) (skb_shinfo(skb)->nr_frags + 1) |
297 | #else /* not MAX_SKB_FRAGS */ | ||
298 | #define skb_first_frag_len(skb) (skb->len) | ||
299 | #define skb_num_frags(skb) 1 | ||
300 | #endif /* not MAX_SKB_FRAGS */ | ||
301 | |||
302 | /* 2.2.x compatibility code */ | ||
303 | #if LINUX_VERSION_CODE < 0x20300 | ||
304 | |||
305 | #include "starfire-kcomp22.h" | ||
306 | |||
307 | #else /* LINUX_VERSION_CODE > 0x20300 */ | ||
308 | |||
309 | #include <linux/crc32.h> | ||
310 | #include <linux/ethtool.h> | ||
311 | #include <linux/mii.h> | ||
312 | |||
313 | #include <linux/if_vlan.h> | ||
314 | |||
315 | #define init_tx_timer(dev, func, timeout) \ | ||
316 | dev->tx_timeout = func; \ | ||
317 | dev->watchdog_timeo = timeout; | ||
318 | #define kick_tx_timer(dev, func, timeout) | ||
319 | |||
320 | #define netif_start_if(dev) | ||
321 | #define netif_stop_if(dev) | ||
322 | |||
323 | #define PCI_SLOT_NAME(pci_dev) pci_name(pci_dev) | ||
324 | |||
325 | #endif /* LINUX_VERSION_CODE > 0x20300 */ | ||
326 | 282 | ||
327 | #ifdef HAVE_NETDEV_POLL | 283 | #ifdef HAVE_NETDEV_POLL |
328 | #define init_poll(dev) \ | 284 | #define init_poll(dev) \ |
285 | do { \ | ||
329 | dev->poll = &netdev_poll; \ | 286 | dev->poll = &netdev_poll; \ |
330 | dev->weight = max_interrupt_work; | 287 | dev->weight = max_interrupt_work; \ |
288 | } while (0) | ||
331 | #define netdev_rx(dev, ioaddr) \ | 289 | #define netdev_rx(dev, ioaddr) \ |
332 | do { \ | 290 | do { \ |
333 | u32 intr_enable; \ | 291 | u32 intr_enable; \ |
@@ -341,7 +299,7 @@ do { \ | |||
341 | /* Paranoia check */ \ | 299 | /* Paranoia check */ \ |
342 | intr_enable = readl(ioaddr + IntrEnable); \ | 300 | intr_enable = readl(ioaddr + IntrEnable); \ |
343 | if (intr_enable & (IntrRxDone | IntrRxEmpty)) { \ | 301 | if (intr_enable & (IntrRxDone | IntrRxEmpty)) { \ |
344 | printk("%s: interrupt while in polling mode!\n", dev->name); \ | 302 | printk(KERN_INFO "%s: interrupt while in polling mode!\n", dev->name); \ |
345 | intr_enable &= ~(IntrRxDone | IntrRxEmpty); \ | 303 | intr_enable &= ~(IntrRxDone | IntrRxEmpty); \ |
346 | writel(intr_enable, ioaddr + IntrEnable); \ | 304 | writel(intr_enable, ioaddr + IntrEnable); \ |
347 | } \ | 305 | } \ |
@@ -371,6 +329,7 @@ KERN_INFO " (unofficial 2.2/2.4 kernel port, version " DRV_VERSION ", " DRV_RELD | |||
371 | MODULE_AUTHOR("Donald Becker <becker@scyld.com>"); | 329 | MODULE_AUTHOR("Donald Becker <becker@scyld.com>"); |
372 | MODULE_DESCRIPTION("Adaptec Starfire Ethernet driver"); | 330 | MODULE_DESCRIPTION("Adaptec Starfire Ethernet driver"); |
373 | MODULE_LICENSE("GPL"); | 331 | MODULE_LICENSE("GPL"); |
332 | MODULE_VERSION(DRV_VERSION); | ||
374 | 333 | ||
375 | module_param(max_interrupt_work, int, 0); | 334 | module_param(max_interrupt_work, int, 0); |
376 | module_param(mtu, int, 0); | 335 | module_param(mtu, int, 0); |
@@ -425,7 +384,7 @@ on the 32/64 bitness of the architecture), and relies on automatic | |||
425 | minimum-length padding. It does not use the completion queue | 384 | minimum-length padding. It does not use the completion queue |
426 | consumer index, but instead checks for non-zero status entries. | 385 | consumer index, but instead checks for non-zero status entries. |
427 | 386 | ||
428 | For receive this driver uses type 0/1/2/3 receive descriptors. The driver | 387 | For receive this driver uses type 2/3 receive descriptors. The driver |
429 | allocates full frame size skbuffs for the Rx ring buffers, so all frames | 388 | allocates full frame size skbuffs for the Rx ring buffers, so all frames |
430 | should fit in a single descriptor. The driver does not use the completion | 389 | should fit in a single descriptor. The driver does not use the completion |
431 | queue consumer index, but instead checks for non-zero status entries. | 390 | queue consumer index, but instead checks for non-zero status entries. |
@@ -476,7 +435,7 @@ IVc. Errata | |||
476 | 435 | ||
477 | */ | 436 | */ |
478 | 437 | ||
479 | 438 | ||
480 | 439 | ||
481 | enum chip_capability_flags {CanHaveMII=1, }; | 440 | enum chip_capability_flags {CanHaveMII=1, }; |
482 | 441 | ||
@@ -670,7 +629,6 @@ struct full_rx_done_desc { | |||
670 | u32 timestamp; | 629 | u32 timestamp; |
671 | }; | 630 | }; |
672 | /* XXX: this is ugly and I'm not sure it's worth the trouble -Ion */ | 631 | /* XXX: this is ugly and I'm not sure it's worth the trouble -Ion */ |
673 | #ifdef HAS_FIRMWARE | ||
674 | #ifdef VLAN_SUPPORT | 632 | #ifdef VLAN_SUPPORT |
675 | typedef struct full_rx_done_desc rx_done_desc; | 633 | typedef struct full_rx_done_desc rx_done_desc; |
676 | #define RxComplType RxComplType3 | 634 | #define RxComplType RxComplType3 |
@@ -678,15 +636,6 @@ typedef struct full_rx_done_desc rx_done_desc; | |||
678 | typedef struct csum_rx_done_desc rx_done_desc; | 636 | typedef struct csum_rx_done_desc rx_done_desc; |
679 | #define RxComplType RxComplType2 | 637 | #define RxComplType RxComplType2 |
680 | #endif /* not VLAN_SUPPORT */ | 638 | #endif /* not VLAN_SUPPORT */ |
681 | #else /* not HAS_FIRMWARE */ | ||
682 | #ifdef VLAN_SUPPORT | ||
683 | typedef struct basic_rx_done_desc rx_done_desc; | ||
684 | #define RxComplType RxComplType1 | ||
685 | #else /* not VLAN_SUPPORT */ | ||
686 | typedef struct short_rx_done_desc rx_done_desc; | ||
687 | #define RxComplType RxComplType0 | ||
688 | #endif /* not VLAN_SUPPORT */ | ||
689 | #endif /* not HAS_FIRMWARE */ | ||
690 | 639 | ||
691 | enum rx_done_bits { | 640 | enum rx_done_bits { |
692 | RxOK=0x20000000, RxFIFOErr=0x10000000, RxBufQ2=0x08000000, | 641 | RxOK=0x20000000, RxFIFOErr=0x10000000, RxBufQ2=0x08000000, |
@@ -898,13 +847,10 @@ static int __devinit starfire_init_one(struct pci_dev *pdev, | |||
898 | /* enable MWI -- it vastly improves Rx performance on sparc64 */ | 847 | /* enable MWI -- it vastly improves Rx performance on sparc64 */ |
899 | pci_set_mwi(pdev); | 848 | pci_set_mwi(pdev); |
900 | 849 | ||
901 | #ifdef MAX_SKB_FRAGS | ||
902 | dev->features |= NETIF_F_SG; | ||
903 | #endif /* MAX_SKB_FRAGS */ | ||
904 | #ifdef ZEROCOPY | 850 | #ifdef ZEROCOPY |
905 | /* Starfire can do TCP/UDP checksumming */ | 851 | /* Starfire can do TCP/UDP checksumming */ |
906 | if (enable_hw_cksum) | 852 | if (enable_hw_cksum) |
907 | dev->features |= NETIF_F_IP_CSUM; | 853 | dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG; |
908 | #endif /* ZEROCOPY */ | 854 | #endif /* ZEROCOPY */ |
909 | #ifdef VLAN_SUPPORT | 855 | #ifdef VLAN_SUPPORT |
910 | dev->features |= NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER; | 856 | dev->features |= NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER; |
@@ -1008,7 +954,8 @@ static int __devinit starfire_init_one(struct pci_dev *pdev, | |||
1008 | /* The chip-specific entries in the device structure. */ | 954 | /* The chip-specific entries in the device structure. */ |
1009 | dev->open = &netdev_open; | 955 | dev->open = &netdev_open; |
1010 | dev->hard_start_xmit = &start_tx; | 956 | dev->hard_start_xmit = &start_tx; |
1011 | init_tx_timer(dev, tx_timeout, TX_TIMEOUT); | 957 | dev->tx_timeout = tx_timeout; |
958 | dev->watchdog_timeo = TX_TIMEOUT; | ||
1012 | init_poll(dev); | 959 | init_poll(dev); |
1013 | dev->stop = &netdev_close; | 960 | dev->stop = &netdev_close; |
1014 | dev->get_stats = &get_stats; | 961 | dev->get_stats = &get_stats; |
@@ -1039,7 +986,7 @@ static int __devinit starfire_init_one(struct pci_dev *pdev, | |||
1039 | if ((mdio_read(dev, phy, MII_BMCR) & BMCR_RESET) == 0) | 986 | if ((mdio_read(dev, phy, MII_BMCR) & BMCR_RESET) == 0) |
1040 | break; | 987 | break; |
1041 | if (boguscnt == 0) { | 988 | if (boguscnt == 0) { |
1042 | printk("%s: PHY reset never completed!\n", dev->name); | 989 | printk("%s: PHY#%d reset never completed!\n", dev->name, phy); |
1043 | continue; | 990 | continue; |
1044 | } | 991 | } |
1045 | mii_status = mdio_read(dev, phy, MII_BMSR); | 992 | mii_status = mdio_read(dev, phy, MII_BMSR); |
@@ -1110,6 +1057,7 @@ static int netdev_open(struct net_device *dev) | |||
1110 | size_t tx_done_q_size, rx_done_q_size, tx_ring_size, rx_ring_size; | 1057 | size_t tx_done_q_size, rx_done_q_size, tx_ring_size, rx_ring_size; |
1111 | 1058 | ||
1112 | /* Do we ever need to reset the chip??? */ | 1059 | /* Do we ever need to reset the chip??? */ |
1060 | |||
1113 | retval = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev); | 1061 | retval = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev); |
1114 | if (retval) | 1062 | if (retval) |
1115 | return retval; | 1063 | return retval; |
@@ -1211,7 +1159,6 @@ static int netdev_open(struct net_device *dev) | |||
1211 | 1159 | ||
1212 | writel(np->intr_timer_ctrl, ioaddr + IntrTimerCtrl); | 1160 | writel(np->intr_timer_ctrl, ioaddr + IntrTimerCtrl); |
1213 | 1161 | ||
1214 | netif_start_if(dev); | ||
1215 | netif_start_queue(dev); | 1162 | netif_start_queue(dev); |
1216 | 1163 | ||
1217 | if (debug > 1) | 1164 | if (debug > 1) |
@@ -1238,13 +1185,11 @@ static int netdev_open(struct net_device *dev) | |||
1238 | writel(ETH_P_8021Q, ioaddr + VlanType); | 1185 | writel(ETH_P_8021Q, ioaddr + VlanType); |
1239 | #endif /* VLAN_SUPPORT */ | 1186 | #endif /* VLAN_SUPPORT */ |
1240 | 1187 | ||
1241 | #ifdef HAS_FIRMWARE | ||
1242 | /* Load Rx/Tx firmware into the frame processors */ | 1188 | /* Load Rx/Tx firmware into the frame processors */ |
1243 | for (i = 0; i < FIRMWARE_RX_SIZE * 2; i++) | 1189 | for (i = 0; i < FIRMWARE_RX_SIZE * 2; i++) |
1244 | writel(firmware_rx[i], ioaddr + RxGfpMem + i * 4); | 1190 | writel(firmware_rx[i], ioaddr + RxGfpMem + i * 4); |
1245 | for (i = 0; i < FIRMWARE_TX_SIZE * 2; i++) | 1191 | for (i = 0; i < FIRMWARE_TX_SIZE * 2; i++) |
1246 | writel(firmware_tx[i], ioaddr + TxGfpMem + i * 4); | 1192 | writel(firmware_tx[i], ioaddr + TxGfpMem + i * 4); |
1247 | #endif /* HAS_FIRMWARE */ | ||
1248 | if (enable_hw_cksum) | 1193 | if (enable_hw_cksum) |
1249 | /* Enable the Rx and Tx units, and the Rx/Tx frame processors. */ | 1194 | /* Enable the Rx and Tx units, and the Rx/Tx frame processors. */ |
1250 | writel(TxEnable|TxGFPEnable|RxEnable|RxGFPEnable, ioaddr + GenCtrl); | 1195 | writel(TxEnable|TxGFPEnable|RxEnable|RxGFPEnable, ioaddr + GenCtrl); |
@@ -1378,8 +1323,6 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) | |||
1378 | u32 status; | 1323 | u32 status; |
1379 | int i; | 1324 | int i; |
1380 | 1325 | ||
1381 | kick_tx_timer(dev, tx_timeout, TX_TIMEOUT); | ||
1382 | |||
1383 | /* | 1326 | /* |
1384 | * be cautious here, wrapping the queue has weird semantics | 1327 | * be cautious here, wrapping the queue has weird semantics |
1385 | * and we may not have enough slots even when it seems we do. | 1328 | * and we may not have enough slots even when it seems we do. |
@@ -1404,7 +1347,7 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) | |||
1404 | } | 1347 | } |
1405 | 1348 | ||
1406 | if (has_bad_length) | 1349 | if (has_bad_length) |
1407 | skb_checksum_help(skb); | 1350 | skb_checksum_help(skb, 0); |
1408 | } | 1351 | } |
1409 | #endif /* ZEROCOPY && HAS_BROKEN_FIRMWARE */ | 1352 | #endif /* ZEROCOPY && HAS_BROKEN_FIRMWARE */ |
1410 | 1353 | ||
@@ -1433,12 +1376,10 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) | |||
1433 | np->tx_info[entry].mapping = | 1376 | np->tx_info[entry].mapping = |
1434 | pci_map_single(np->pci_dev, skb->data, skb_first_frag_len(skb), PCI_DMA_TODEVICE); | 1377 | pci_map_single(np->pci_dev, skb->data, skb_first_frag_len(skb), PCI_DMA_TODEVICE); |
1435 | } else { | 1378 | } else { |
1436 | #ifdef MAX_SKB_FRAGS | ||
1437 | skb_frag_t *this_frag = &skb_shinfo(skb)->frags[i - 1]; | 1379 | skb_frag_t *this_frag = &skb_shinfo(skb)->frags[i - 1]; |
1438 | status |= this_frag->size; | 1380 | status |= this_frag->size; |
1439 | np->tx_info[entry].mapping = | 1381 | np->tx_info[entry].mapping = |
1440 | pci_map_single(np->pci_dev, page_address(this_frag->page) + this_frag->page_offset, this_frag->size, PCI_DMA_TODEVICE); | 1382 | pci_map_single(np->pci_dev, page_address(this_frag->page) + this_frag->page_offset, this_frag->size, PCI_DMA_TODEVICE); |
1441 | #endif /* MAX_SKB_FRAGS */ | ||
1442 | } | 1383 | } |
1443 | 1384 | ||
1444 | np->tx_ring[entry].addr = cpu_to_dma(np->tx_info[entry].mapping); | 1385 | np->tx_ring[entry].addr = cpu_to_dma(np->tx_info[entry].mapping); |
@@ -1531,7 +1472,6 @@ static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs | |||
1531 | np->tx_info[entry].mapping = 0; | 1472 | np->tx_info[entry].mapping = 0; |
1532 | np->dirty_tx += np->tx_info[entry].used_slots; | 1473 | np->dirty_tx += np->tx_info[entry].used_slots; |
1533 | entry = (entry + np->tx_info[entry].used_slots) % TX_RING_SIZE; | 1474 | entry = (entry + np->tx_info[entry].used_slots) % TX_RING_SIZE; |
1534 | #ifdef MAX_SKB_FRAGS | ||
1535 | { | 1475 | { |
1536 | int i; | 1476 | int i; |
1537 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 1477 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
@@ -1543,7 +1483,7 @@ static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs | |||
1543 | entry++; | 1483 | entry++; |
1544 | } | 1484 | } |
1545 | } | 1485 | } |
1546 | #endif /* MAX_SKB_FRAGS */ | 1486 | |
1547 | dev_kfree_skb_irq(skb); | 1487 | dev_kfree_skb_irq(skb); |
1548 | } | 1488 | } |
1549 | np->tx_done_q[np->tx_done].status = 0; | 1489 | np->tx_done_q[np->tx_done].status = 0; |
@@ -1603,7 +1543,7 @@ static int __netdev_rx(struct net_device *dev, int *quota) | |||
1603 | if (debug > 4) | 1543 | if (debug > 4) |
1604 | printk(KERN_DEBUG " netdev_rx() status of %d was %#8.8x.\n", np->rx_done, desc_status); | 1544 | printk(KERN_DEBUG " netdev_rx() status of %d was %#8.8x.\n", np->rx_done, desc_status); |
1605 | if (!(desc_status & RxOK)) { | 1545 | if (!(desc_status & RxOK)) { |
1606 | /* There was a error. */ | 1546 | /* There was an error. */ |
1607 | if (debug > 2) | 1547 | if (debug > 2) |
1608 | printk(KERN_DEBUG " netdev_rx() Rx error was %#8.8x.\n", desc_status); | 1548 | printk(KERN_DEBUG " netdev_rx() Rx error was %#8.8x.\n", desc_status); |
1609 | np->stats.rx_errors++; | 1549 | np->stats.rx_errors++; |
@@ -1656,11 +1596,10 @@ static int __netdev_rx(struct net_device *dev, int *quota) | |||
1656 | #endif | 1596 | #endif |
1657 | 1597 | ||
1658 | skb->protocol = eth_type_trans(skb, dev); | 1598 | skb->protocol = eth_type_trans(skb, dev); |
1659 | #if defined(HAS_FIRMWARE) || defined(VLAN_SUPPORT) | 1599 | #ifdef VLAN_SUPPORT |
1660 | if (debug > 4) | 1600 | if (debug > 4) |
1661 | printk(KERN_DEBUG " netdev_rx() status2 of %d was %#4.4x.\n", np->rx_done, le16_to_cpu(desc->status2)); | 1601 | printk(KERN_DEBUG " netdev_rx() status2 of %d was %#4.4x.\n", np->rx_done, le16_to_cpu(desc->status2)); |
1662 | #endif | 1602 | #endif |
1663 | #ifdef HAS_FIRMWARE | ||
1664 | if (le16_to_cpu(desc->status2) & 0x0100) { | 1603 | if (le16_to_cpu(desc->status2) & 0x0100) { |
1665 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 1604 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
1666 | np->stats.rx_compressed++; | 1605 | np->stats.rx_compressed++; |
@@ -1679,7 +1618,6 @@ static int __netdev_rx(struct net_device *dev, int *quota) | |||
1679 | skb->csum = le16_to_cpu(desc->csum); | 1618 | skb->csum = le16_to_cpu(desc->csum); |
1680 | printk(KERN_DEBUG "%s: checksum_hw, status2 = %#x\n", dev->name, le16_to_cpu(desc->status2)); | 1619 | printk(KERN_DEBUG "%s: checksum_hw, status2 = %#x\n", dev->name, le16_to_cpu(desc->status2)); |
1681 | } | 1620 | } |
1682 | #endif /* HAS_FIRMWARE */ | ||
1683 | #ifdef VLAN_SUPPORT | 1621 | #ifdef VLAN_SUPPORT |
1684 | if (np->vlgrp && le16_to_cpu(desc->status2) & 0x0200) { | 1622 | if (np->vlgrp && le16_to_cpu(desc->status2) & 0x0200) { |
1685 | if (debug > 4) | 1623 | if (debug > 4) |
@@ -1900,9 +1838,6 @@ static struct net_device_stats *get_stats(struct net_device *dev) | |||
1900 | } | 1838 | } |
1901 | 1839 | ||
1902 | 1840 | ||
1903 | /* Chips may use the upper or lower CRC bits, and may reverse and/or invert | ||
1904 | them. Select the endian-ness that results in minimal calculations. | ||
1905 | */ | ||
1906 | static void set_rx_mode(struct net_device *dev) | 1841 | static void set_rx_mode(struct net_device *dev) |
1907 | { | 1842 | { |
1908 | struct netdev_private *np = netdev_priv(dev); | 1843 | struct netdev_private *np = netdev_priv(dev); |
@@ -1969,6 +1904,8 @@ static void set_rx_mode(struct net_device *dev) | |||
1969 | memset(mc_filter, 0, sizeof(mc_filter)); | 1904 | memset(mc_filter, 0, sizeof(mc_filter)); |
1970 | for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; | 1905 | for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; |
1971 | i++, mclist = mclist->next) { | 1906 | i++, mclist = mclist->next) { |
1907 | /* The chip uses the upper 9 CRC bits | ||
1908 | as index into the hash table */ | ||
1972 | int bit_nr = ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 23; | 1909 | int bit_nr = ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 23; |
1973 | __u32 *fptr = (__u32 *) &mc_filter[(bit_nr >> 4) & ~1]; | 1910 | __u32 *fptr = (__u32 *) &mc_filter[(bit_nr >> 4) & ~1]; |
1974 | 1911 | ||
@@ -2001,7 +1938,7 @@ static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) | |||
2001 | struct netdev_private *np = netdev_priv(dev); | 1938 | struct netdev_private *np = netdev_priv(dev); |
2002 | strcpy(info->driver, DRV_NAME); | 1939 | strcpy(info->driver, DRV_NAME); |
2003 | strcpy(info->version, DRV_VERSION); | 1940 | strcpy(info->version, DRV_VERSION); |
2004 | strcpy(info->bus_info, PCI_SLOT_NAME(np->pci_dev)); | 1941 | strcpy(info->bus_info, pci_name(np->pci_dev)); |
2005 | } | 1942 | } |
2006 | 1943 | ||
2007 | static int get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | 1944 | static int get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) |
@@ -2083,7 +2020,6 @@ static int netdev_close(struct net_device *dev) | |||
2083 | int i; | 2020 | int i; |
2084 | 2021 | ||
2085 | netif_stop_queue(dev); | 2022 | netif_stop_queue(dev); |
2086 | netif_stop_if(dev); | ||
2087 | 2023 | ||
2088 | if (debug > 1) { | 2024 | if (debug > 1) { |
2089 | printk(KERN_DEBUG "%s: Shutting down ethercard, Intr status %#8.8x.\n", | 2025 | printk(KERN_DEBUG "%s: Shutting down ethercard, Intr status %#8.8x.\n", |
@@ -2184,7 +2120,13 @@ static int __init starfire_init (void) | |||
2184 | /* when a module, this is printed whether or not devices are found in probe */ | 2120 | /* when a module, this is printed whether or not devices are found in probe */ |
2185 | #ifdef MODULE | 2121 | #ifdef MODULE |
2186 | printk(version); | 2122 | printk(version); |
2123 | #ifdef HAVE_NETDEV_POLL | ||
2124 | printk(KERN_INFO DRV_NAME ": polling (NAPI) enabled\n"); | ||
2125 | #else | ||
2126 | printk(KERN_INFO DRV_NAME ": polling (NAPI) disabled\n"); | ||
2187 | #endif | 2127 | #endif |
2128 | #endif | ||
2129 | |||
2188 | #ifndef ADDR_64BITS | 2130 | #ifndef ADDR_64BITS |
2189 | /* we can do this test only at run-time... sigh */ | 2131 | /* we can do this test only at run-time... sigh */ |
2190 | if (sizeof(dma_addr_t) == sizeof(u64)) { | 2132 | if (sizeof(dma_addr_t) == sizeof(u64)) { |
@@ -2192,10 +2134,6 @@ static int __init starfire_init (void) | |||
2192 | return -ENODEV; | 2134 | return -ENODEV; |
2193 | } | 2135 | } |
2194 | #endif /* not ADDR_64BITS */ | 2136 | #endif /* not ADDR_64BITS */ |
2195 | #ifndef HAS_FIRMWARE | ||
2196 | /* unconditionally disable hw cksums if firmware is not present */ | ||
2197 | enable_hw_cksum = 0; | ||
2198 | #endif /* not HAS_FIRMWARE */ | ||
2199 | return pci_module_init (&starfire_driver); | 2137 | return pci_module_init (&starfire_driver); |
2200 | } | 2138 | } |
2201 | 2139 | ||