diff options
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 | ||
