diff options
-rw-r--r-- | drivers/net/starfire.c | 142 | ||||
-rw-r--r-- | drivers/net/starfire_firmware.h | 346 |
2 files changed, 386 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 | ||
diff --git a/drivers/net/starfire_firmware.h b/drivers/net/starfire_firmware.h new file mode 100644 index 000000000000..0a668528955d --- /dev/null +++ b/drivers/net/starfire_firmware.h | |||
@@ -0,0 +1,346 @@ | |||
1 | /* | ||
2 | * Copyright 2003 Adaptec, Inc. | ||
3 | * | ||
4 | * Please read the following license before using the Adaptec Software | ||
5 | * ("Program"). If you do not agree to the license terms, do not use the | ||
6 | * Program: | ||
7 | * | ||
8 | * You agree to be bound by version 2 of the General Public License ("GPL") | ||
9 | * dated June 1991, which can be found at http://www.fsf.org/licenses/gpl.html. | ||
10 | * If the link is broken, write to Free Software Foundation, 59 Temple Place, | ||
11 | * Boston, Massachusetts 02111-1307. | ||
12 | * | ||
13 | * BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE IT IS LICENSED "AS IS" AND | ||
14 | * THERE IS NO WARRANTY FOR THE PROGRAM, INCLUDING BUT NOT LIMITED TO THE | ||
15 | * IMPLIED WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR A PARTICULAR PURPOSE | ||
16 | * (TO THE EXTENT PERMITTED BY APPLICABLE LAW). USE OF THE PROGRAM IS AT YOUR | ||
17 | * OWN RISK. IN NO EVENT WILL ADAPTEC OR ITS LICENSORS BE LIABLE TO YOU FOR | ||
18 | * DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES | ||
19 | * ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM. | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | static const u32 firmware_rx[] = { | ||
24 | 0x010003dc, 0x00000000, | ||
25 | 0x04000421, 0x00000086, | ||
26 | 0x80000015, 0x0000180e, | ||
27 | 0x81000015, 0x00006664, | ||
28 | 0x1a0040ab, 0x00000b06, | ||
29 | 0x14200011, 0x00000000, | ||
30 | 0x14204022, 0x0000aaaa, | ||
31 | 0x14204022, 0x00000300, | ||
32 | 0x14204022, 0x00000000, | ||
33 | 0x1a0040ab, 0x00000b14, | ||
34 | 0x14200011, 0x00000000, | ||
35 | 0x83000015, 0x00000002, | ||
36 | 0x04000021, 0x00000000, | ||
37 | 0x00000010, 0x00000000, | ||
38 | 0x04000421, 0x00000087, | ||
39 | 0x00000010, 0x00000000, | ||
40 | 0x00000010, 0x00000000, | ||
41 | 0x00008015, 0x00000000, | ||
42 | 0x0000003e, 0x00000000, | ||
43 | 0x00000010, 0x00000000, | ||
44 | 0x82000015, 0x00004000, | ||
45 | 0x009e8050, 0x00000000, | ||
46 | 0x03008015, 0x00000000, | ||
47 | 0x86008015, 0x00000000, | ||
48 | 0x82000015, 0x00008000, | ||
49 | 0x0100001c, 0x00000000, | ||
50 | 0x000050a0, 0x0000010c, | ||
51 | 0x4e20d011, 0x00006008, | ||
52 | 0x1420d012, 0x00004008, | ||
53 | 0x0000f090, 0x00007000, | ||
54 | 0x0000c8b0, 0x00003000, | ||
55 | 0x00004040, 0x00000000, | ||
56 | 0x00108015, 0x00000000, | ||
57 | 0x00a2c150, 0x00004000, | ||
58 | 0x00a400b0, 0x00000014, | ||
59 | 0x00000020, 0x00000000, | ||
60 | 0x2500400d, 0x00002525, | ||
61 | 0x00047220, 0x00003100, | ||
62 | 0x00934070, 0x00000000, | ||
63 | 0x00000020, 0x00000000, | ||
64 | 0x00924460, 0x00000184, | ||
65 | 0x2b20c011, 0x00000000, | ||
66 | 0x0000c420, 0x00000540, | ||
67 | 0x36014018, 0x0000422d, | ||
68 | 0x14200011, 0x00000000, | ||
69 | 0x00924460, 0x00000183, | ||
70 | 0x3200001f, 0x00000034, | ||
71 | 0x02ac0015, 0x00000002, | ||
72 | 0x00a60110, 0x00000008, | ||
73 | 0x42200011, 0x00000000, | ||
74 | 0x00924060, 0x00000103, | ||
75 | 0x0000001e, 0x00000000, | ||
76 | 0x00000020, 0x00000100, | ||
77 | 0x0000001e, 0x00000000, | ||
78 | 0x00924460, 0x00000086, | ||
79 | 0x00004080, 0x00000000, | ||
80 | 0x0092c070, 0x00000000, | ||
81 | 0x00924060, 0x00000100, | ||
82 | 0x0000c890, 0x00005000, | ||
83 | 0x00a6c110, 0x00000000, | ||
84 | 0x00b0c090, 0x00000012, | ||
85 | 0x021c0015, 0x00000000, | ||
86 | 0x3200001f, 0x00000034, | ||
87 | 0x00924460, 0x00000510, | ||
88 | 0x44210011, 0x00000000, | ||
89 | 0x42000011, 0x00000000, | ||
90 | 0x83000015, 0x00000040, | ||
91 | 0x00924460, 0x00000508, | ||
92 | 0x45014018, 0x00004545, | ||
93 | 0x00808050, 0x00000000, | ||
94 | 0x62208012, 0x00000000, | ||
95 | 0x82000015, 0x00000800, | ||
96 | 0x15200011, 0x00000000, | ||
97 | 0x00000010, 0x00000000, | ||
98 | 0x00000010, 0x00000000, | ||
99 | 0x00000010, 0x00000000, | ||
100 | 0x00000010, 0x00000000, | ||
101 | 0x00000010, 0x00000000, | ||
102 | 0x80000015, 0x0000eea4, | ||
103 | 0x81000015, 0x0000005f, | ||
104 | 0x00000060, 0x00000000, | ||
105 | 0x00004120, 0x00000000, | ||
106 | 0x00004a00, 0x00004000, | ||
107 | 0x00924460, 0x00000190, | ||
108 | 0x5601401a, 0x00005956, | ||
109 | 0x14000011, 0x00000000, | ||
110 | 0x00934050, 0x00000018, | ||
111 | 0x00930050, 0x00000018, | ||
112 | 0x3601403a, 0x0000002d, | ||
113 | 0x000643a9, 0x00000000, | ||
114 | 0x0000c420, 0x00000140, | ||
115 | 0x5601401a, 0x00005956, | ||
116 | 0x14000011, 0x00000000, | ||
117 | 0x00000010, 0x00000000, | ||
118 | 0x00000010, 0x00000000, | ||
119 | 0x000642a9, 0x00000000, | ||
120 | 0x00024420, 0x00000183, | ||
121 | 0x5601401a, 0x00005956, | ||
122 | 0x82000015, 0x00002000, | ||
123 | 0x15200011, 0x00000000, | ||
124 | 0x82000015, 0x00000010, | ||
125 | 0x15200011, 0x00000000, | ||
126 | 0x82000015, 0x00000010, | ||
127 | 0x15200011, 0x00000000, | ||
128 | }; /* 104 Rx instructions */ | ||
129 | #define FIRMWARE_RX_SIZE 104 | ||
130 | |||
131 | static const u32 firmware_tx[] = { | ||
132 | 0x010003dc, 0x00000000, | ||
133 | 0x04000421, 0x00000086, | ||
134 | 0x80000015, 0x0000180e, | ||
135 | 0x81000015, 0x00006664, | ||
136 | 0x1a0040ab, 0x00000b06, | ||
137 | 0x14200011, 0x00000000, | ||
138 | 0x14204022, 0x0000aaaa, | ||
139 | 0x14204022, 0x00000300, | ||
140 | 0x14204022, 0x00000000, | ||
141 | 0x1a0040ab, 0x00000b14, | ||
142 | 0x14200011, 0x00000000, | ||
143 | 0x83000015, 0x00000002, | ||
144 | 0x04000021, 0x00000000, | ||
145 | 0x00000010, 0x00000000, | ||
146 | 0x04000421, 0x00000087, | ||
147 | 0x00000010, 0x00000000, | ||
148 | 0x00000010, 0x00000000, | ||
149 | 0x00008015, 0x00000000, | ||
150 | 0x0000003e, 0x00000000, | ||
151 | 0x00000010, 0x00000000, | ||
152 | 0x82000015, 0x00004000, | ||
153 | 0x009e8050, 0x00000000, | ||
154 | 0x03008015, 0x00000000, | ||
155 | 0x86008015, 0x00000000, | ||
156 | 0x82000015, 0x00008000, | ||
157 | 0x0100001c, 0x00000000, | ||
158 | 0x000050a0, 0x0000010c, | ||
159 | 0x4e20d011, 0x00006008, | ||
160 | 0x1420d012, 0x00004008, | ||
161 | 0x0000f090, 0x00007000, | ||
162 | 0x0000c8b0, 0x00003000, | ||
163 | 0x00004040, 0x00000000, | ||
164 | 0x00108015, 0x00000000, | ||
165 | 0x00a2c150, 0x00004000, | ||
166 | 0x00a400b0, 0x00000014, | ||
167 | 0x00000020, 0x00000000, | ||
168 | 0x2500400d, 0x00002525, | ||
169 | 0x00047220, 0x00003100, | ||
170 | 0x00934070, 0x00000000, | ||
171 | 0x00000020, 0x00000000, | ||
172 | 0x00924460, 0x00000184, | ||
173 | 0x2b20c011, 0x00000000, | ||
174 | 0x0000c420, 0x00000540, | ||
175 | 0x36014018, 0x0000422d, | ||
176 | 0x14200011, 0x00000000, | ||
177 | 0x00924460, 0x00000183, | ||
178 | 0x3200001f, 0x00000034, | ||
179 | 0x02ac0015, 0x00000002, | ||
180 | 0x00a60110, 0x00000008, | ||
181 | 0x42200011, 0x00000000, | ||
182 | 0x00924060, 0x00000103, | ||
183 | 0x0000001e, 0x00000000, | ||
184 | 0x00000020, 0x00000100, | ||
185 | 0x0000001e, 0x00000000, | ||
186 | 0x00924460, 0x00000086, | ||
187 | 0x00004080, 0x00000000, | ||
188 | 0x0092c070, 0x00000000, | ||
189 | 0x00924060, 0x00000100, | ||
190 | 0x0000c890, 0x00005000, | ||
191 | 0x00a6c110, 0x00000000, | ||
192 | 0x00b0c090, 0x00000012, | ||
193 | 0x021c0015, 0x00000000, | ||
194 | 0x3200001f, 0x00000034, | ||
195 | 0x00924460, 0x00000510, | ||
196 | 0x44210011, 0x00000000, | ||
197 | 0x42000011, 0x00000000, | ||
198 | 0x83000015, 0x00000040, | ||
199 | 0x00924460, 0x00000508, | ||
200 | 0x45014018, 0x00004545, | ||
201 | 0x00808050, 0x00000000, | ||
202 | 0x62208012, 0x00000000, | ||
203 | 0x82000015, 0x00000800, | ||
204 | 0x15200011, 0x00000000, | ||
205 | 0x00000010, 0x00000000, | ||
206 | 0x00000010, 0x00000000, | ||
207 | 0x00000010, 0x00000000, | ||
208 | 0x00000010, 0x00000000, | ||
209 | 0x00000010, 0x00000000, | ||
210 | 0x80000015, 0x0000eea4, | ||
211 | 0x81000015, 0x0000005f, | ||
212 | 0x00000060, 0x00000000, | ||
213 | 0x00004120, 0x00000000, | ||
214 | 0x00004a00, 0x00004000, | ||
215 | 0x00924460, 0x00000190, | ||
216 | 0x5601401a, 0x00005956, | ||
217 | 0x14000011, 0x00000000, | ||
218 | 0x00934050, 0x00000018, | ||
219 | 0x00930050, 0x00000018, | ||
220 | 0x3601403a, 0x0000002d, | ||
221 | 0x000643a9, 0x00000000, | ||
222 | 0x0000c420, 0x00000140, | ||
223 | 0x5601401a, 0x00005956, | ||
224 | 0x14000011, 0x00000000, | ||
225 | 0x00000010, 0x00000000, | ||
226 | 0x00000010, 0x00000000, | ||
227 | 0x000642a9, 0x00000000, | ||
228 | 0x00024420, 0x00000183, | ||
229 | 0x5601401a, 0x00005956, | ||
230 | 0x82000015, 0x00002000, | ||
231 | 0x15200011, 0x00000000, | ||
232 | 0x82000015, 0x00000010, | ||
233 | 0x15200011, 0x00000000, | ||
234 | 0x82000015, 0x00000010, | ||
235 | 0x15200011, 0x00000000, | ||
236 | }; /* 104 Tx instructions */ | ||
237 | #define FIRMWARE_TX_SIZE 104 | ||
238 | #if 0 | ||
239 | static const u32 firmware_wol[] = { | ||
240 | 0x010003dc, 0x00000000, | ||
241 | 0x19000421, 0x00000087, | ||
242 | 0x80000015, 0x00001a1a, | ||
243 | 0x81000015, 0x00001a1a, | ||
244 | 0x1a0040ab, 0x00000b06, | ||
245 | 0x15200011, 0x00000000, | ||
246 | 0x15204022, 0x0000aaaa, | ||
247 | 0x15204022, 0x00000300, | ||
248 | 0x15204022, 0x00000000, | ||
249 | 0x1a0040ab, 0x00000b15, | ||
250 | 0x15200011, 0x00000000, | ||
251 | 0x83000015, 0x00000002, | ||
252 | 0x04000021, 0x00000000, | ||
253 | 0x00000010, 0x00000000, | ||
254 | 0x04000421, 0x00000087, | ||
255 | 0x00000010, 0x00000000, | ||
256 | 0x00000010, 0x00000000, | ||
257 | 0x00008015, 0x00000000, | ||
258 | 0x0000003e, 0x00000000, | ||
259 | 0x00000010, 0x00000000, | ||
260 | 0x00000010, 0x00000000, | ||
261 | 0x82000015, 0x00004000, | ||
262 | 0x82000015, 0x00008000, | ||
263 | 0x0000000c, 0x00000000, | ||
264 | 0x00000010, 0x00000000, | ||
265 | 0x00004080, 0x00000100, | ||
266 | 0x1f20c011, 0x00001122, | ||
267 | 0x2720f011, 0x00003011, | ||
268 | 0x19200071, 0x00000000, | ||
269 | 0x1a200051, 0x00000000, | ||
270 | 0x00000010, 0x00000000, | ||
271 | 0x00000010, 0x00000000, | ||
272 | 0x1d2040a4, 0x00003344, | ||
273 | 0x1d2040a2, 0x00005566, | ||
274 | 0x000040a0, 0x00000100, | ||
275 | 0x00108050, 0x00000001, | ||
276 | 0x1a208012, 0x00000006, | ||
277 | 0x82000015, 0x00008080, | ||
278 | 0x010003dc, 0x00000000, | ||
279 | 0x1d2040a4, 0x00002233, | ||
280 | 0x1d2040a4, 0x00004455, | ||
281 | 0x2d208011, 0x00000005, | ||
282 | 0x1d2040a4, 0x00006611, | ||
283 | 0x00108050, 0x00000001, | ||
284 | 0x27200011, 0x00000000, | ||
285 | 0x1d2050a4, 0x00006600, | ||
286 | 0x82000015, 0x00008080, | ||
287 | 0x010003dc, 0x00000000, | ||
288 | 0x00000050, 0x00000000, | ||
289 | 0x1b200031, 0x00000000, | ||
290 | 0x0000001e, 0x00000000, | ||
291 | 0x0000001e, 0x00000000, | ||
292 | 0x0000001e, 0x00000000, | ||
293 | 0x0000001e, 0x00000000, | ||
294 | 0x00924460, 0x00000086, | ||
295 | 0x00004080, 0x00000000, | ||
296 | 0x0092c070, 0x00000000, | ||
297 | 0x00924060, 0x00000100, | ||
298 | 0x0000c890, 0x00005000, | ||
299 | 0x00a6c110, 0x00000000, | ||
300 | 0x00b0c090, 0x00000012, | ||
301 | 0x021c0015, 0x00000000, | ||
302 | 0x3200001f, 0x00000034, | ||
303 | 0x00924460, 0x00000510, | ||
304 | 0x44210011, 0x00000000, | ||
305 | 0x42000011, 0x00000000, | ||
306 | 0x83000015, 0x00000040, | ||
307 | 0x00924460, 0x00000508, | ||
308 | 0x476a0012, 0x00000100, | ||
309 | 0x83000015, 0x00000008, | ||
310 | 0x16200011, 0x00000000, | ||
311 | 0x001e8050, 0x00000000, | ||
312 | 0x001e8050, 0x00000000, | ||
313 | 0x00808050, 0x00000000, | ||
314 | 0x03008015, 0x00000000, | ||
315 | 0x62208012, 0x00000000, | ||
316 | 0x82000015, 0x00000800, | ||
317 | 0x16200011, 0x00000000, | ||
318 | 0x80000015, 0x0000eea4, | ||
319 | 0x81000015, 0x0000005f, | ||
320 | 0x00000020, 0x00000000, | ||
321 | 0x00004120, 0x00000000, | ||
322 | 0x00004a00, 0x00004000, | ||
323 | 0x00924460, 0x00000190, | ||
324 | 0x5c01401a, 0x0000595c, | ||
325 | 0x15000011, 0x00000000, | ||
326 | 0x00934050, 0x00000018, | ||
327 | 0x00930050, 0x00000018, | ||
328 | 0x3601403a, 0x0000002d, | ||
329 | 0x00064029, 0x00000000, | ||
330 | 0x0000c420, 0x00000140, | ||
331 | 0x5c01401a, 0x0000595c, | ||
332 | 0x15000011, 0x00000000, | ||
333 | 0x00000010, 0x00000000, | ||
334 | 0x00000010, 0x00000000, | ||
335 | 0x00064029, 0x00000000, | ||
336 | 0x00024420, 0x00000183, | ||
337 | 0x5c01401a, 0x0000595c, | ||
338 | 0x82000015, 0x00002000, | ||
339 | 0x16200011, 0x00000000, | ||
340 | 0x82000015, 0x00000010, | ||
341 | 0x16200011, 0x00000000, | ||
342 | 0x82000015, 0x00000010, | ||
343 | 0x16200011, 0x00000000, | ||
344 | }; /* 104 WoL instructions */ | ||
345 | #define FIRMWARE_WOL_SIZE 104 | ||
346 | #endif | ||