Loading drivers/net/starfire.c +40 −102 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ /* Written 1998-2000 by Donald Becker. Current maintainer is Ion Badulescu <ionut@cs.columbia.edu>. Please Current maintainer is Ion Badulescu <ionut ta badula tod org>. Please send all bug reports to me, and not to Donald Becker, as this code has been heavily modified from Donald's original version. Loading Loading @@ -129,12 +129,18 @@ - put the chip to a D3 slumber on driver unload - added config option to enable/disable NAPI TODO: bugfixes (no bugs known as of right now) LK1.4.2 (Ion Badulescu) - finally added firmware (GPL'ed by Adaptec) - removed compatibility code for 2.2.x TODO: - fix forced speed/duplexing code (broken a long time ago, when somebody converted the driver to use the generic MII code) - fix VLAN support */ #define DRV_NAME "starfire" #define DRV_VERSION "1.03+LK1.4.1" #define DRV_RELDATE "February 10, 2002" #define DRV_VERSION "1.03+LK1.4.2" #define DRV_RELDATE "January 19, 2005" #include <linux/config.h> #include <linux/version.h> Loading @@ -145,25 +151,15 @@ TODO: bugfixes (no bugs known as of right now) #include <linux/etherdevice.h> #include <linux/init.h> #include <linux/delay.h> #include <linux/crc32.h> #include <linux/ethtool.h> #include <linux/mii.h> #include <linux/if_vlan.h> #include <asm/processor.h> /* Processor type for cache alignment. */ #include <asm/uaccess.h> #include <asm/io.h> /* * Adaptec's license for their drivers (which is where I got the * firmware files) does not allow one to redistribute them. Thus, we can't * include the firmware with this driver. * * However, should a legal-to-distribute firmware become available, * the driver developer would need only to obtain the firmware in the * form of a C header file. * Once that's done, the #undef below must be changed into a #define * for this driver to really use the firmware. Note that Rx/Tx * hardware TCP checksumming is not possible without the firmware. * * WANTED: legal firmware to include with this GPL'd driver. */ #undef HAS_FIRMWARE #include "starfire_firmware.h" /* * The current frame processor firmware fails to checksum a fragment * of length 1. If and when this is fixed, the #define below can be removed. Loading @@ -172,13 +168,7 @@ TODO: bugfixes (no bugs known as of right now) /* * Define this if using the driver with the zero-copy patch */ #if defined(HAS_FIRMWARE) && defined(MAX_SKB_FRAGS) #define ZEROCOPY #endif #ifdef HAS_FIRMWARE #include "starfire_firmware.h" #endif /* HAS_FIRMWARE */ #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) #define VLAN_SUPPORT Loading @@ -202,11 +192,7 @@ static int mtu; The Starfire has a 512 element hash table based on the Ethernet CRC. */ static int multicast_filter_limit = 512; /* Whether to do TCP/UDP checksums in hardware */ #ifdef HAS_FIRMWARE static int enable_hw_cksum = 1; #else static int enable_hw_cksum = 0; #endif #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ /* Loading Loading @@ -291,43 +277,15 @@ static int full_duplex[MAX_UNITS] = {0, }; #define RX_DESC_ADDR_SIZE RxDescAddr32bit #endif #ifdef MAX_SKB_FRAGS #define skb_first_frag_len(skb) skb_headlen(skb) #define skb_num_frags(skb) (skb_shinfo(skb)->nr_frags + 1) #else /* not MAX_SKB_FRAGS */ #define skb_first_frag_len(skb) (skb->len) #define skb_num_frags(skb) 1 #endif /* not MAX_SKB_FRAGS */ /* 2.2.x compatibility code */ #if LINUX_VERSION_CODE < 0x20300 #include "starfire-kcomp22.h" #else /* LINUX_VERSION_CODE > 0x20300 */ #include <linux/crc32.h> #include <linux/ethtool.h> #include <linux/mii.h> #include <linux/if_vlan.h> #define init_tx_timer(dev, func, timeout) \ dev->tx_timeout = func; \ dev->watchdog_timeo = timeout; #define kick_tx_timer(dev, func, timeout) #define netif_start_if(dev) #define netif_stop_if(dev) #define PCI_SLOT_NAME(pci_dev) pci_name(pci_dev) #endif /* LINUX_VERSION_CODE > 0x20300 */ #ifdef HAVE_NETDEV_POLL #define init_poll(dev) \ do { \ dev->poll = &netdev_poll; \ dev->weight = max_interrupt_work; dev->weight = max_interrupt_work; \ } while (0) #define netdev_rx(dev, ioaddr) \ do { \ u32 intr_enable; \ Loading @@ -341,7 +299,7 @@ do { \ /* Paranoia check */ \ intr_enable = readl(ioaddr + IntrEnable); \ if (intr_enable & (IntrRxDone | IntrRxEmpty)) { \ printk("%s: interrupt while in polling mode!\n", dev->name); \ printk(KERN_INFO "%s: interrupt while in polling mode!\n", dev->name); \ intr_enable &= ~(IntrRxDone | IntrRxEmpty); \ writel(intr_enable, ioaddr + IntrEnable); \ } \ Loading Loading @@ -371,6 +329,7 @@ KERN_INFO " (unofficial 2.2/2.4 kernel port, version " DRV_VERSION ", " DRV_RELD MODULE_AUTHOR("Donald Becker <becker@scyld.com>"); MODULE_DESCRIPTION("Adaptec Starfire Ethernet driver"); MODULE_LICENSE("GPL"); MODULE_VERSION(DRV_VERSION); module_param(max_interrupt_work, int, 0); module_param(mtu, int, 0); Loading Loading @@ -425,7 +384,7 @@ on the 32/64 bitness of the architecture), and relies on automatic minimum-length padding. It does not use the completion queue consumer index, but instead checks for non-zero status entries. For receive this driver uses type 0/1/2/3 receive descriptors. The driver For receive this driver uses type 2/3 receive descriptors. The driver allocates full frame size skbuffs for the Rx ring buffers, so all frames should fit in a single descriptor. The driver does not use the completion queue consumer index, but instead checks for non-zero status entries. Loading Loading @@ -476,7 +435,7 @@ IVc. Errata */ enum chip_capability_flags {CanHaveMII=1, }; Loading Loading @@ -670,7 +629,6 @@ struct full_rx_done_desc { u32 timestamp; }; /* XXX: this is ugly and I'm not sure it's worth the trouble -Ion */ #ifdef HAS_FIRMWARE #ifdef VLAN_SUPPORT typedef struct full_rx_done_desc rx_done_desc; #define RxComplType RxComplType3 Loading @@ -678,15 +636,6 @@ typedef struct full_rx_done_desc rx_done_desc; typedef struct csum_rx_done_desc rx_done_desc; #define RxComplType RxComplType2 #endif /* not VLAN_SUPPORT */ #else /* not HAS_FIRMWARE */ #ifdef VLAN_SUPPORT typedef struct basic_rx_done_desc rx_done_desc; #define RxComplType RxComplType1 #else /* not VLAN_SUPPORT */ typedef struct short_rx_done_desc rx_done_desc; #define RxComplType RxComplType0 #endif /* not VLAN_SUPPORT */ #endif /* not HAS_FIRMWARE */ enum rx_done_bits { RxOK=0x20000000, RxFIFOErr=0x10000000, RxBufQ2=0x08000000, Loading Loading @@ -898,13 +847,10 @@ static int __devinit starfire_init_one(struct pci_dev *pdev, /* enable MWI -- it vastly improves Rx performance on sparc64 */ pci_set_mwi(pdev); #ifdef MAX_SKB_FRAGS dev->features |= NETIF_F_SG; #endif /* MAX_SKB_FRAGS */ #ifdef ZEROCOPY /* Starfire can do TCP/UDP checksumming */ if (enable_hw_cksum) dev->features |= NETIF_F_IP_CSUM; dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG; #endif /* ZEROCOPY */ #ifdef VLAN_SUPPORT dev->features |= NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER; Loading Loading @@ -1008,7 +954,8 @@ static int __devinit starfire_init_one(struct pci_dev *pdev, /* The chip-specific entries in the device structure. */ dev->open = &netdev_open; dev->hard_start_xmit = &start_tx; init_tx_timer(dev, tx_timeout, TX_TIMEOUT); dev->tx_timeout = tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; init_poll(dev); dev->stop = &netdev_close; dev->get_stats = &get_stats; Loading Loading @@ -1039,7 +986,7 @@ static int __devinit starfire_init_one(struct pci_dev *pdev, if ((mdio_read(dev, phy, MII_BMCR) & BMCR_RESET) == 0) break; if (boguscnt == 0) { printk("%s: PHY reset never completed!\n", dev->name); printk("%s: PHY#%d reset never completed!\n", dev->name, phy); continue; } mii_status = mdio_read(dev, phy, MII_BMSR); Loading Loading @@ -1110,6 +1057,7 @@ static int netdev_open(struct net_device *dev) size_t tx_done_q_size, rx_done_q_size, tx_ring_size, rx_ring_size; /* Do we ever need to reset the chip??? */ retval = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev); if (retval) return retval; Loading Loading @@ -1211,7 +1159,6 @@ static int netdev_open(struct net_device *dev) writel(np->intr_timer_ctrl, ioaddr + IntrTimerCtrl); netif_start_if(dev); netif_start_queue(dev); if (debug > 1) Loading @@ -1238,13 +1185,11 @@ static int netdev_open(struct net_device *dev) writel(ETH_P_8021Q, ioaddr + VlanType); #endif /* VLAN_SUPPORT */ #ifdef HAS_FIRMWARE /* Load Rx/Tx firmware into the frame processors */ for (i = 0; i < FIRMWARE_RX_SIZE * 2; i++) writel(firmware_rx[i], ioaddr + RxGfpMem + i * 4); for (i = 0; i < FIRMWARE_TX_SIZE * 2; i++) writel(firmware_tx[i], ioaddr + TxGfpMem + i * 4); #endif /* HAS_FIRMWARE */ if (enable_hw_cksum) /* Enable the Rx and Tx units, and the Rx/Tx frame processors. */ writel(TxEnable|TxGFPEnable|RxEnable|RxGFPEnable, ioaddr + GenCtrl); Loading Loading @@ -1378,8 +1323,6 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) u32 status; int i; kick_tx_timer(dev, tx_timeout, TX_TIMEOUT); /* * be cautious here, wrapping the queue has weird semantics * and we may not have enough slots even when it seems we do. Loading @@ -1404,7 +1347,7 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) } if (has_bad_length) skb_checksum_help(skb); skb_checksum_help(skb, 0); } #endif /* ZEROCOPY && HAS_BROKEN_FIRMWARE */ Loading Loading @@ -1433,12 +1376,10 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) np->tx_info[entry].mapping = pci_map_single(np->pci_dev, skb->data, skb_first_frag_len(skb), PCI_DMA_TODEVICE); } else { #ifdef MAX_SKB_FRAGS skb_frag_t *this_frag = &skb_shinfo(skb)->frags[i - 1]; status |= this_frag->size; np->tx_info[entry].mapping = pci_map_single(np->pci_dev, page_address(this_frag->page) + this_frag->page_offset, this_frag->size, PCI_DMA_TODEVICE); #endif /* MAX_SKB_FRAGS */ } np->tx_ring[entry].addr = cpu_to_dma(np->tx_info[entry].mapping); Loading Loading @@ -1531,7 +1472,6 @@ static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs np->tx_info[entry].mapping = 0; np->dirty_tx += np->tx_info[entry].used_slots; entry = (entry + np->tx_info[entry].used_slots) % TX_RING_SIZE; #ifdef MAX_SKB_FRAGS { int i; for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { Loading @@ -1543,7 +1483,7 @@ static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs entry++; } } #endif /* MAX_SKB_FRAGS */ dev_kfree_skb_irq(skb); } np->tx_done_q[np->tx_done].status = 0; Loading Loading @@ -1603,7 +1543,7 @@ static int __netdev_rx(struct net_device *dev, int *quota) if (debug > 4) printk(KERN_DEBUG " netdev_rx() status of %d was %#8.8x.\n", np->rx_done, desc_status); if (!(desc_status & RxOK)) { /* There was a error. */ /* There was an error. */ if (debug > 2) printk(KERN_DEBUG " netdev_rx() Rx error was %#8.8x.\n", desc_status); np->stats.rx_errors++; Loading Loading @@ -1656,11 +1596,10 @@ static int __netdev_rx(struct net_device *dev, int *quota) #endif skb->protocol = eth_type_trans(skb, dev); #if defined(HAS_FIRMWARE) || defined(VLAN_SUPPORT) #ifdef VLAN_SUPPORT if (debug > 4) printk(KERN_DEBUG " netdev_rx() status2 of %d was %#4.4x.\n", np->rx_done, le16_to_cpu(desc->status2)); #endif #ifdef HAS_FIRMWARE if (le16_to_cpu(desc->status2) & 0x0100) { skb->ip_summed = CHECKSUM_UNNECESSARY; np->stats.rx_compressed++; Loading @@ -1679,7 +1618,6 @@ static int __netdev_rx(struct net_device *dev, int *quota) skb->csum = le16_to_cpu(desc->csum); printk(KERN_DEBUG "%s: checksum_hw, status2 = %#x\n", dev->name, le16_to_cpu(desc->status2)); } #endif /* HAS_FIRMWARE */ #ifdef VLAN_SUPPORT if (np->vlgrp && le16_to_cpu(desc->status2) & 0x0200) { if (debug > 4) Loading Loading @@ -1900,9 +1838,6 @@ static struct net_device_stats *get_stats(struct net_device *dev) } /* Chips may use the upper or lower CRC bits, and may reverse and/or invert them. Select the endian-ness that results in minimal calculations. */ static void set_rx_mode(struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); Loading Loading @@ -1969,6 +1904,8 @@ static void set_rx_mode(struct net_device *dev) memset(mc_filter, 0, sizeof(mc_filter)); for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; i++, mclist = mclist->next) { /* The chip uses the upper 9 CRC bits as index into the hash table */ int bit_nr = ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 23; __u32 *fptr = (__u32 *) &mc_filter[(bit_nr >> 4) & ~1]; Loading Loading @@ -2001,7 +1938,7 @@ static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) struct netdev_private *np = netdev_priv(dev); strcpy(info->driver, DRV_NAME); strcpy(info->version, DRV_VERSION); strcpy(info->bus_info, PCI_SLOT_NAME(np->pci_dev)); strcpy(info->bus_info, pci_name(np->pci_dev)); } static int get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) Loading Loading @@ -2083,7 +2020,6 @@ static int netdev_close(struct net_device *dev) int i; netif_stop_queue(dev); netif_stop_if(dev); if (debug > 1) { printk(KERN_DEBUG "%s: Shutting down ethercard, Intr status %#8.8x.\n", Loading Loading @@ -2184,7 +2120,13 @@ static int __init starfire_init (void) /* when a module, this is printed whether or not devices are found in probe */ #ifdef MODULE printk(version); #ifdef HAVE_NETDEV_POLL printk(KERN_INFO DRV_NAME ": polling (NAPI) enabled\n"); #else printk(KERN_INFO DRV_NAME ": polling (NAPI) disabled\n"); #endif #endif #ifndef ADDR_64BITS /* we can do this test only at run-time... sigh */ if (sizeof(dma_addr_t) == sizeof(u64)) { Loading @@ -2192,10 +2134,6 @@ static int __init starfire_init (void) return -ENODEV; } #endif /* not ADDR_64BITS */ #ifndef HAS_FIRMWARE /* unconditionally disable hw cksums if firmware is not present */ enable_hw_cksum = 0; #endif /* not HAS_FIRMWARE */ return pci_module_init (&starfire_driver); } Loading drivers/net/starfire_firmware.h 0 → 100644 +346 −0 Original line number Diff line number Diff line /* * Copyright 2003 Adaptec, Inc. * * Please read the following license before using the Adaptec Software * ("Program"). If you do not agree to the license terms, do not use the * Program: * * You agree to be bound by version 2 of the General Public License ("GPL") * dated June 1991, which can be found at http://www.fsf.org/licenses/gpl.html. * If the link is broken, write to Free Software Foundation, 59 Temple Place, * Boston, Massachusetts 02111-1307. * * BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE IT IS LICENSED "AS IS" AND * THERE IS NO WARRANTY FOR THE PROGRAM, INCLUDING BUT NOT LIMITED TO THE * IMPLIED WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR A PARTICULAR PURPOSE * (TO THE EXTENT PERMITTED BY APPLICABLE LAW). USE OF THE PROGRAM IS AT YOUR * OWN RISK. IN NO EVENT WILL ADAPTEC OR ITS LICENSORS BE LIABLE TO YOU FOR * DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES * ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM. * */ static const u32 firmware_rx[] = { 0x010003dc, 0x00000000, 0x04000421, 0x00000086, 0x80000015, 0x0000180e, 0x81000015, 0x00006664, 0x1a0040ab, 0x00000b06, 0x14200011, 0x00000000, 0x14204022, 0x0000aaaa, 0x14204022, 0x00000300, 0x14204022, 0x00000000, 0x1a0040ab, 0x00000b14, 0x14200011, 0x00000000, 0x83000015, 0x00000002, 0x04000021, 0x00000000, 0x00000010, 0x00000000, 0x04000421, 0x00000087, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00008015, 0x00000000, 0x0000003e, 0x00000000, 0x00000010, 0x00000000, 0x82000015, 0x00004000, 0x009e8050, 0x00000000, 0x03008015, 0x00000000, 0x86008015, 0x00000000, 0x82000015, 0x00008000, 0x0100001c, 0x00000000, 0x000050a0, 0x0000010c, 0x4e20d011, 0x00006008, 0x1420d012, 0x00004008, 0x0000f090, 0x00007000, 0x0000c8b0, 0x00003000, 0x00004040, 0x00000000, 0x00108015, 0x00000000, 0x00a2c150, 0x00004000, 0x00a400b0, 0x00000014, 0x00000020, 0x00000000, 0x2500400d, 0x00002525, 0x00047220, 0x00003100, 0x00934070, 0x00000000, 0x00000020, 0x00000000, 0x00924460, 0x00000184, 0x2b20c011, 0x00000000, 0x0000c420, 0x00000540, 0x36014018, 0x0000422d, 0x14200011, 0x00000000, 0x00924460, 0x00000183, 0x3200001f, 0x00000034, 0x02ac0015, 0x00000002, 0x00a60110, 0x00000008, 0x42200011, 0x00000000, 0x00924060, 0x00000103, 0x0000001e, 0x00000000, 0x00000020, 0x00000100, 0x0000001e, 0x00000000, 0x00924460, 0x00000086, 0x00004080, 0x00000000, 0x0092c070, 0x00000000, 0x00924060, 0x00000100, 0x0000c890, 0x00005000, 0x00a6c110, 0x00000000, 0x00b0c090, 0x00000012, 0x021c0015, 0x00000000, 0x3200001f, 0x00000034, 0x00924460, 0x00000510, 0x44210011, 0x00000000, 0x42000011, 0x00000000, 0x83000015, 0x00000040, 0x00924460, 0x00000508, 0x45014018, 0x00004545, 0x00808050, 0x00000000, 0x62208012, 0x00000000, 0x82000015, 0x00000800, 0x15200011, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x80000015, 0x0000eea4, 0x81000015, 0x0000005f, 0x00000060, 0x00000000, 0x00004120, 0x00000000, 0x00004a00, 0x00004000, 0x00924460, 0x00000190, 0x5601401a, 0x00005956, 0x14000011, 0x00000000, 0x00934050, 0x00000018, 0x00930050, 0x00000018, 0x3601403a, 0x0000002d, 0x000643a9, 0x00000000, 0x0000c420, 0x00000140, 0x5601401a, 0x00005956, 0x14000011, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x000642a9, 0x00000000, 0x00024420, 0x00000183, 0x5601401a, 0x00005956, 0x82000015, 0x00002000, 0x15200011, 0x00000000, 0x82000015, 0x00000010, 0x15200011, 0x00000000, 0x82000015, 0x00000010, 0x15200011, 0x00000000, }; /* 104 Rx instructions */ #define FIRMWARE_RX_SIZE 104 static const u32 firmware_tx[] = { 0x010003dc, 0x00000000, 0x04000421, 0x00000086, 0x80000015, 0x0000180e, 0x81000015, 0x00006664, 0x1a0040ab, 0x00000b06, 0x14200011, 0x00000000, 0x14204022, 0x0000aaaa, 0x14204022, 0x00000300, 0x14204022, 0x00000000, 0x1a0040ab, 0x00000b14, 0x14200011, 0x00000000, 0x83000015, 0x00000002, 0x04000021, 0x00000000, 0x00000010, 0x00000000, 0x04000421, 0x00000087, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00008015, 0x00000000, 0x0000003e, 0x00000000, 0x00000010, 0x00000000, 0x82000015, 0x00004000, 0x009e8050, 0x00000000, 0x03008015, 0x00000000, 0x86008015, 0x00000000, 0x82000015, 0x00008000, 0x0100001c, 0x00000000, 0x000050a0, 0x0000010c, 0x4e20d011, 0x00006008, 0x1420d012, 0x00004008, 0x0000f090, 0x00007000, 0x0000c8b0, 0x00003000, 0x00004040, 0x00000000, 0x00108015, 0x00000000, 0x00a2c150, 0x00004000, 0x00a400b0, 0x00000014, 0x00000020, 0x00000000, 0x2500400d, 0x00002525, 0x00047220, 0x00003100, 0x00934070, 0x00000000, 0x00000020, 0x00000000, 0x00924460, 0x00000184, 0x2b20c011, 0x00000000, 0x0000c420, 0x00000540, 0x36014018, 0x0000422d, 0x14200011, 0x00000000, 0x00924460, 0x00000183, 0x3200001f, 0x00000034, 0x02ac0015, 0x00000002, 0x00a60110, 0x00000008, 0x42200011, 0x00000000, 0x00924060, 0x00000103, 0x0000001e, 0x00000000, 0x00000020, 0x00000100, 0x0000001e, 0x00000000, 0x00924460, 0x00000086, 0x00004080, 0x00000000, 0x0092c070, 0x00000000, 0x00924060, 0x00000100, 0x0000c890, 0x00005000, 0x00a6c110, 0x00000000, 0x00b0c090, 0x00000012, 0x021c0015, 0x00000000, 0x3200001f, 0x00000034, 0x00924460, 0x00000510, 0x44210011, 0x00000000, 0x42000011, 0x00000000, 0x83000015, 0x00000040, 0x00924460, 0x00000508, 0x45014018, 0x00004545, 0x00808050, 0x00000000, 0x62208012, 0x00000000, 0x82000015, 0x00000800, 0x15200011, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x80000015, 0x0000eea4, 0x81000015, 0x0000005f, 0x00000060, 0x00000000, 0x00004120, 0x00000000, 0x00004a00, 0x00004000, 0x00924460, 0x00000190, 0x5601401a, 0x00005956, 0x14000011, 0x00000000, 0x00934050, 0x00000018, 0x00930050, 0x00000018, 0x3601403a, 0x0000002d, 0x000643a9, 0x00000000, 0x0000c420, 0x00000140, 0x5601401a, 0x00005956, 0x14000011, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x000642a9, 0x00000000, 0x00024420, 0x00000183, 0x5601401a, 0x00005956, 0x82000015, 0x00002000, 0x15200011, 0x00000000, 0x82000015, 0x00000010, 0x15200011, 0x00000000, 0x82000015, 0x00000010, 0x15200011, 0x00000000, }; /* 104 Tx instructions */ #define FIRMWARE_TX_SIZE 104 #if 0 static const u32 firmware_wol[] = { 0x010003dc, 0x00000000, 0x19000421, 0x00000087, 0x80000015, 0x00001a1a, 0x81000015, 0x00001a1a, 0x1a0040ab, 0x00000b06, 0x15200011, 0x00000000, 0x15204022, 0x0000aaaa, 0x15204022, 0x00000300, 0x15204022, 0x00000000, 0x1a0040ab, 0x00000b15, 0x15200011, 0x00000000, 0x83000015, 0x00000002, 0x04000021, 0x00000000, 0x00000010, 0x00000000, 0x04000421, 0x00000087, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00008015, 0x00000000, 0x0000003e, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x82000015, 0x00004000, 0x82000015, 0x00008000, 0x0000000c, 0x00000000, 0x00000010, 0x00000000, 0x00004080, 0x00000100, 0x1f20c011, 0x00001122, 0x2720f011, 0x00003011, 0x19200071, 0x00000000, 0x1a200051, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x1d2040a4, 0x00003344, 0x1d2040a2, 0x00005566, 0x000040a0, 0x00000100, 0x00108050, 0x00000001, 0x1a208012, 0x00000006, 0x82000015, 0x00008080, 0x010003dc, 0x00000000, 0x1d2040a4, 0x00002233, 0x1d2040a4, 0x00004455, 0x2d208011, 0x00000005, 0x1d2040a4, 0x00006611, 0x00108050, 0x00000001, 0x27200011, 0x00000000, 0x1d2050a4, 0x00006600, 0x82000015, 0x00008080, 0x010003dc, 0x00000000, 0x00000050, 0x00000000, 0x1b200031, 0x00000000, 0x0000001e, 0x00000000, 0x0000001e, 0x00000000, 0x0000001e, 0x00000000, 0x0000001e, 0x00000000, 0x00924460, 0x00000086, 0x00004080, 0x00000000, 0x0092c070, 0x00000000, 0x00924060, 0x00000100, 0x0000c890, 0x00005000, 0x00a6c110, 0x00000000, 0x00b0c090, 0x00000012, 0x021c0015, 0x00000000, 0x3200001f, 0x00000034, 0x00924460, 0x00000510, 0x44210011, 0x00000000, 0x42000011, 0x00000000, 0x83000015, 0x00000040, 0x00924460, 0x00000508, 0x476a0012, 0x00000100, 0x83000015, 0x00000008, 0x16200011, 0x00000000, 0x001e8050, 0x00000000, 0x001e8050, 0x00000000, 0x00808050, 0x00000000, 0x03008015, 0x00000000, 0x62208012, 0x00000000, 0x82000015, 0x00000800, 0x16200011, 0x00000000, 0x80000015, 0x0000eea4, 0x81000015, 0x0000005f, 0x00000020, 0x00000000, 0x00004120, 0x00000000, 0x00004a00, 0x00004000, 0x00924460, 0x00000190, 0x5c01401a, 0x0000595c, 0x15000011, 0x00000000, 0x00934050, 0x00000018, 0x00930050, 0x00000018, 0x3601403a, 0x0000002d, 0x00064029, 0x00000000, 0x0000c420, 0x00000140, 0x5c01401a, 0x0000595c, 0x15000011, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00064029, 0x00000000, 0x00024420, 0x00000183, 0x5c01401a, 0x0000595c, 0x82000015, 0x00002000, 0x16200011, 0x00000000, 0x82000015, 0x00000010, 0x16200011, 0x00000000, 0x82000015, 0x00000010, 0x16200011, 0x00000000, }; /* 104 WoL instructions */ #define FIRMWARE_WOL_SIZE 104 #endif Loading
drivers/net/starfire.c +40 −102 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ /* Written 1998-2000 by Donald Becker. Current maintainer is Ion Badulescu <ionut@cs.columbia.edu>. Please Current maintainer is Ion Badulescu <ionut ta badula tod org>. Please send all bug reports to me, and not to Donald Becker, as this code has been heavily modified from Donald's original version. Loading Loading @@ -129,12 +129,18 @@ - put the chip to a D3 slumber on driver unload - added config option to enable/disable NAPI TODO: bugfixes (no bugs known as of right now) LK1.4.2 (Ion Badulescu) - finally added firmware (GPL'ed by Adaptec) - removed compatibility code for 2.2.x TODO: - fix forced speed/duplexing code (broken a long time ago, when somebody converted the driver to use the generic MII code) - fix VLAN support */ #define DRV_NAME "starfire" #define DRV_VERSION "1.03+LK1.4.1" #define DRV_RELDATE "February 10, 2002" #define DRV_VERSION "1.03+LK1.4.2" #define DRV_RELDATE "January 19, 2005" #include <linux/config.h> #include <linux/version.h> Loading @@ -145,25 +151,15 @@ TODO: bugfixes (no bugs known as of right now) #include <linux/etherdevice.h> #include <linux/init.h> #include <linux/delay.h> #include <linux/crc32.h> #include <linux/ethtool.h> #include <linux/mii.h> #include <linux/if_vlan.h> #include <asm/processor.h> /* Processor type for cache alignment. */ #include <asm/uaccess.h> #include <asm/io.h> /* * Adaptec's license for their drivers (which is where I got the * firmware files) does not allow one to redistribute them. Thus, we can't * include the firmware with this driver. * * However, should a legal-to-distribute firmware become available, * the driver developer would need only to obtain the firmware in the * form of a C header file. * Once that's done, the #undef below must be changed into a #define * for this driver to really use the firmware. Note that Rx/Tx * hardware TCP checksumming is not possible without the firmware. * * WANTED: legal firmware to include with this GPL'd driver. */ #undef HAS_FIRMWARE #include "starfire_firmware.h" /* * The current frame processor firmware fails to checksum a fragment * of length 1. If and when this is fixed, the #define below can be removed. Loading @@ -172,13 +168,7 @@ TODO: bugfixes (no bugs known as of right now) /* * Define this if using the driver with the zero-copy patch */ #if defined(HAS_FIRMWARE) && defined(MAX_SKB_FRAGS) #define ZEROCOPY #endif #ifdef HAS_FIRMWARE #include "starfire_firmware.h" #endif /* HAS_FIRMWARE */ #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) #define VLAN_SUPPORT Loading @@ -202,11 +192,7 @@ static int mtu; The Starfire has a 512 element hash table based on the Ethernet CRC. */ static int multicast_filter_limit = 512; /* Whether to do TCP/UDP checksums in hardware */ #ifdef HAS_FIRMWARE static int enable_hw_cksum = 1; #else static int enable_hw_cksum = 0; #endif #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ /* Loading Loading @@ -291,43 +277,15 @@ static int full_duplex[MAX_UNITS] = {0, }; #define RX_DESC_ADDR_SIZE RxDescAddr32bit #endif #ifdef MAX_SKB_FRAGS #define skb_first_frag_len(skb) skb_headlen(skb) #define skb_num_frags(skb) (skb_shinfo(skb)->nr_frags + 1) #else /* not MAX_SKB_FRAGS */ #define skb_first_frag_len(skb) (skb->len) #define skb_num_frags(skb) 1 #endif /* not MAX_SKB_FRAGS */ /* 2.2.x compatibility code */ #if LINUX_VERSION_CODE < 0x20300 #include "starfire-kcomp22.h" #else /* LINUX_VERSION_CODE > 0x20300 */ #include <linux/crc32.h> #include <linux/ethtool.h> #include <linux/mii.h> #include <linux/if_vlan.h> #define init_tx_timer(dev, func, timeout) \ dev->tx_timeout = func; \ dev->watchdog_timeo = timeout; #define kick_tx_timer(dev, func, timeout) #define netif_start_if(dev) #define netif_stop_if(dev) #define PCI_SLOT_NAME(pci_dev) pci_name(pci_dev) #endif /* LINUX_VERSION_CODE > 0x20300 */ #ifdef HAVE_NETDEV_POLL #define init_poll(dev) \ do { \ dev->poll = &netdev_poll; \ dev->weight = max_interrupt_work; dev->weight = max_interrupt_work; \ } while (0) #define netdev_rx(dev, ioaddr) \ do { \ u32 intr_enable; \ Loading @@ -341,7 +299,7 @@ do { \ /* Paranoia check */ \ intr_enable = readl(ioaddr + IntrEnable); \ if (intr_enable & (IntrRxDone | IntrRxEmpty)) { \ printk("%s: interrupt while in polling mode!\n", dev->name); \ printk(KERN_INFO "%s: interrupt while in polling mode!\n", dev->name); \ intr_enable &= ~(IntrRxDone | IntrRxEmpty); \ writel(intr_enable, ioaddr + IntrEnable); \ } \ Loading Loading @@ -371,6 +329,7 @@ KERN_INFO " (unofficial 2.2/2.4 kernel port, version " DRV_VERSION ", " DRV_RELD MODULE_AUTHOR("Donald Becker <becker@scyld.com>"); MODULE_DESCRIPTION("Adaptec Starfire Ethernet driver"); MODULE_LICENSE("GPL"); MODULE_VERSION(DRV_VERSION); module_param(max_interrupt_work, int, 0); module_param(mtu, int, 0); Loading Loading @@ -425,7 +384,7 @@ on the 32/64 bitness of the architecture), and relies on automatic minimum-length padding. It does not use the completion queue consumer index, but instead checks for non-zero status entries. For receive this driver uses type 0/1/2/3 receive descriptors. The driver For receive this driver uses type 2/3 receive descriptors. The driver allocates full frame size skbuffs for the Rx ring buffers, so all frames should fit in a single descriptor. The driver does not use the completion queue consumer index, but instead checks for non-zero status entries. Loading Loading @@ -476,7 +435,7 @@ IVc. Errata */ enum chip_capability_flags {CanHaveMII=1, }; Loading Loading @@ -670,7 +629,6 @@ struct full_rx_done_desc { u32 timestamp; }; /* XXX: this is ugly and I'm not sure it's worth the trouble -Ion */ #ifdef HAS_FIRMWARE #ifdef VLAN_SUPPORT typedef struct full_rx_done_desc rx_done_desc; #define RxComplType RxComplType3 Loading @@ -678,15 +636,6 @@ typedef struct full_rx_done_desc rx_done_desc; typedef struct csum_rx_done_desc rx_done_desc; #define RxComplType RxComplType2 #endif /* not VLAN_SUPPORT */ #else /* not HAS_FIRMWARE */ #ifdef VLAN_SUPPORT typedef struct basic_rx_done_desc rx_done_desc; #define RxComplType RxComplType1 #else /* not VLAN_SUPPORT */ typedef struct short_rx_done_desc rx_done_desc; #define RxComplType RxComplType0 #endif /* not VLAN_SUPPORT */ #endif /* not HAS_FIRMWARE */ enum rx_done_bits { RxOK=0x20000000, RxFIFOErr=0x10000000, RxBufQ2=0x08000000, Loading Loading @@ -898,13 +847,10 @@ static int __devinit starfire_init_one(struct pci_dev *pdev, /* enable MWI -- it vastly improves Rx performance on sparc64 */ pci_set_mwi(pdev); #ifdef MAX_SKB_FRAGS dev->features |= NETIF_F_SG; #endif /* MAX_SKB_FRAGS */ #ifdef ZEROCOPY /* Starfire can do TCP/UDP checksumming */ if (enable_hw_cksum) dev->features |= NETIF_F_IP_CSUM; dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG; #endif /* ZEROCOPY */ #ifdef VLAN_SUPPORT dev->features |= NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER; Loading Loading @@ -1008,7 +954,8 @@ static int __devinit starfire_init_one(struct pci_dev *pdev, /* The chip-specific entries in the device structure. */ dev->open = &netdev_open; dev->hard_start_xmit = &start_tx; init_tx_timer(dev, tx_timeout, TX_TIMEOUT); dev->tx_timeout = tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; init_poll(dev); dev->stop = &netdev_close; dev->get_stats = &get_stats; Loading Loading @@ -1039,7 +986,7 @@ static int __devinit starfire_init_one(struct pci_dev *pdev, if ((mdio_read(dev, phy, MII_BMCR) & BMCR_RESET) == 0) break; if (boguscnt == 0) { printk("%s: PHY reset never completed!\n", dev->name); printk("%s: PHY#%d reset never completed!\n", dev->name, phy); continue; } mii_status = mdio_read(dev, phy, MII_BMSR); Loading Loading @@ -1110,6 +1057,7 @@ static int netdev_open(struct net_device *dev) size_t tx_done_q_size, rx_done_q_size, tx_ring_size, rx_ring_size; /* Do we ever need to reset the chip??? */ retval = request_irq(dev->irq, &intr_handler, SA_SHIRQ, dev->name, dev); if (retval) return retval; Loading Loading @@ -1211,7 +1159,6 @@ static int netdev_open(struct net_device *dev) writel(np->intr_timer_ctrl, ioaddr + IntrTimerCtrl); netif_start_if(dev); netif_start_queue(dev); if (debug > 1) Loading @@ -1238,13 +1185,11 @@ static int netdev_open(struct net_device *dev) writel(ETH_P_8021Q, ioaddr + VlanType); #endif /* VLAN_SUPPORT */ #ifdef HAS_FIRMWARE /* Load Rx/Tx firmware into the frame processors */ for (i = 0; i < FIRMWARE_RX_SIZE * 2; i++) writel(firmware_rx[i], ioaddr + RxGfpMem + i * 4); for (i = 0; i < FIRMWARE_TX_SIZE * 2; i++) writel(firmware_tx[i], ioaddr + TxGfpMem + i * 4); #endif /* HAS_FIRMWARE */ if (enable_hw_cksum) /* Enable the Rx and Tx units, and the Rx/Tx frame processors. */ writel(TxEnable|TxGFPEnable|RxEnable|RxGFPEnable, ioaddr + GenCtrl); Loading Loading @@ -1378,8 +1323,6 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) u32 status; int i; kick_tx_timer(dev, tx_timeout, TX_TIMEOUT); /* * be cautious here, wrapping the queue has weird semantics * and we may not have enough slots even when it seems we do. Loading @@ -1404,7 +1347,7 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) } if (has_bad_length) skb_checksum_help(skb); skb_checksum_help(skb, 0); } #endif /* ZEROCOPY && HAS_BROKEN_FIRMWARE */ Loading Loading @@ -1433,12 +1376,10 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) np->tx_info[entry].mapping = pci_map_single(np->pci_dev, skb->data, skb_first_frag_len(skb), PCI_DMA_TODEVICE); } else { #ifdef MAX_SKB_FRAGS skb_frag_t *this_frag = &skb_shinfo(skb)->frags[i - 1]; status |= this_frag->size; np->tx_info[entry].mapping = pci_map_single(np->pci_dev, page_address(this_frag->page) + this_frag->page_offset, this_frag->size, PCI_DMA_TODEVICE); #endif /* MAX_SKB_FRAGS */ } np->tx_ring[entry].addr = cpu_to_dma(np->tx_info[entry].mapping); Loading Loading @@ -1531,7 +1472,6 @@ static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs np->tx_info[entry].mapping = 0; np->dirty_tx += np->tx_info[entry].used_slots; entry = (entry + np->tx_info[entry].used_slots) % TX_RING_SIZE; #ifdef MAX_SKB_FRAGS { int i; for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { Loading @@ -1543,7 +1483,7 @@ static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs entry++; } } #endif /* MAX_SKB_FRAGS */ dev_kfree_skb_irq(skb); } np->tx_done_q[np->tx_done].status = 0; Loading Loading @@ -1603,7 +1543,7 @@ static int __netdev_rx(struct net_device *dev, int *quota) if (debug > 4) printk(KERN_DEBUG " netdev_rx() status of %d was %#8.8x.\n", np->rx_done, desc_status); if (!(desc_status & RxOK)) { /* There was a error. */ /* There was an error. */ if (debug > 2) printk(KERN_DEBUG " netdev_rx() Rx error was %#8.8x.\n", desc_status); np->stats.rx_errors++; Loading Loading @@ -1656,11 +1596,10 @@ static int __netdev_rx(struct net_device *dev, int *quota) #endif skb->protocol = eth_type_trans(skb, dev); #if defined(HAS_FIRMWARE) || defined(VLAN_SUPPORT) #ifdef VLAN_SUPPORT if (debug > 4) printk(KERN_DEBUG " netdev_rx() status2 of %d was %#4.4x.\n", np->rx_done, le16_to_cpu(desc->status2)); #endif #ifdef HAS_FIRMWARE if (le16_to_cpu(desc->status2) & 0x0100) { skb->ip_summed = CHECKSUM_UNNECESSARY; np->stats.rx_compressed++; Loading @@ -1679,7 +1618,6 @@ static int __netdev_rx(struct net_device *dev, int *quota) skb->csum = le16_to_cpu(desc->csum); printk(KERN_DEBUG "%s: checksum_hw, status2 = %#x\n", dev->name, le16_to_cpu(desc->status2)); } #endif /* HAS_FIRMWARE */ #ifdef VLAN_SUPPORT if (np->vlgrp && le16_to_cpu(desc->status2) & 0x0200) { if (debug > 4) Loading Loading @@ -1900,9 +1838,6 @@ static struct net_device_stats *get_stats(struct net_device *dev) } /* Chips may use the upper or lower CRC bits, and may reverse and/or invert them. Select the endian-ness that results in minimal calculations. */ static void set_rx_mode(struct net_device *dev) { struct netdev_private *np = netdev_priv(dev); Loading Loading @@ -1969,6 +1904,8 @@ static void set_rx_mode(struct net_device *dev) memset(mc_filter, 0, sizeof(mc_filter)); for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; i++, mclist = mclist->next) { /* The chip uses the upper 9 CRC bits as index into the hash table */ int bit_nr = ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 23; __u32 *fptr = (__u32 *) &mc_filter[(bit_nr >> 4) & ~1]; Loading Loading @@ -2001,7 +1938,7 @@ static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) struct netdev_private *np = netdev_priv(dev); strcpy(info->driver, DRV_NAME); strcpy(info->version, DRV_VERSION); strcpy(info->bus_info, PCI_SLOT_NAME(np->pci_dev)); strcpy(info->bus_info, pci_name(np->pci_dev)); } static int get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) Loading Loading @@ -2083,7 +2020,6 @@ static int netdev_close(struct net_device *dev) int i; netif_stop_queue(dev); netif_stop_if(dev); if (debug > 1) { printk(KERN_DEBUG "%s: Shutting down ethercard, Intr status %#8.8x.\n", Loading Loading @@ -2184,7 +2120,13 @@ static int __init starfire_init (void) /* when a module, this is printed whether or not devices are found in probe */ #ifdef MODULE printk(version); #ifdef HAVE_NETDEV_POLL printk(KERN_INFO DRV_NAME ": polling (NAPI) enabled\n"); #else printk(KERN_INFO DRV_NAME ": polling (NAPI) disabled\n"); #endif #endif #ifndef ADDR_64BITS /* we can do this test only at run-time... sigh */ if (sizeof(dma_addr_t) == sizeof(u64)) { Loading @@ -2192,10 +2134,6 @@ static int __init starfire_init (void) return -ENODEV; } #endif /* not ADDR_64BITS */ #ifndef HAS_FIRMWARE /* unconditionally disable hw cksums if firmware is not present */ enable_hw_cksum = 0; #endif /* not HAS_FIRMWARE */ return pci_module_init (&starfire_driver); } Loading
drivers/net/starfire_firmware.h 0 → 100644 +346 −0 Original line number Diff line number Diff line /* * Copyright 2003 Adaptec, Inc. * * Please read the following license before using the Adaptec Software * ("Program"). If you do not agree to the license terms, do not use the * Program: * * You agree to be bound by version 2 of the General Public License ("GPL") * dated June 1991, which can be found at http://www.fsf.org/licenses/gpl.html. * If the link is broken, write to Free Software Foundation, 59 Temple Place, * Boston, Massachusetts 02111-1307. * * BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE IT IS LICENSED "AS IS" AND * THERE IS NO WARRANTY FOR THE PROGRAM, INCLUDING BUT NOT LIMITED TO THE * IMPLIED WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR A PARTICULAR PURPOSE * (TO THE EXTENT PERMITTED BY APPLICABLE LAW). USE OF THE PROGRAM IS AT YOUR * OWN RISK. IN NO EVENT WILL ADAPTEC OR ITS LICENSORS BE LIABLE TO YOU FOR * DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES * ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM. * */ static const u32 firmware_rx[] = { 0x010003dc, 0x00000000, 0x04000421, 0x00000086, 0x80000015, 0x0000180e, 0x81000015, 0x00006664, 0x1a0040ab, 0x00000b06, 0x14200011, 0x00000000, 0x14204022, 0x0000aaaa, 0x14204022, 0x00000300, 0x14204022, 0x00000000, 0x1a0040ab, 0x00000b14, 0x14200011, 0x00000000, 0x83000015, 0x00000002, 0x04000021, 0x00000000, 0x00000010, 0x00000000, 0x04000421, 0x00000087, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00008015, 0x00000000, 0x0000003e, 0x00000000, 0x00000010, 0x00000000, 0x82000015, 0x00004000, 0x009e8050, 0x00000000, 0x03008015, 0x00000000, 0x86008015, 0x00000000, 0x82000015, 0x00008000, 0x0100001c, 0x00000000, 0x000050a0, 0x0000010c, 0x4e20d011, 0x00006008, 0x1420d012, 0x00004008, 0x0000f090, 0x00007000, 0x0000c8b0, 0x00003000, 0x00004040, 0x00000000, 0x00108015, 0x00000000, 0x00a2c150, 0x00004000, 0x00a400b0, 0x00000014, 0x00000020, 0x00000000, 0x2500400d, 0x00002525, 0x00047220, 0x00003100, 0x00934070, 0x00000000, 0x00000020, 0x00000000, 0x00924460, 0x00000184, 0x2b20c011, 0x00000000, 0x0000c420, 0x00000540, 0x36014018, 0x0000422d, 0x14200011, 0x00000000, 0x00924460, 0x00000183, 0x3200001f, 0x00000034, 0x02ac0015, 0x00000002, 0x00a60110, 0x00000008, 0x42200011, 0x00000000, 0x00924060, 0x00000103, 0x0000001e, 0x00000000, 0x00000020, 0x00000100, 0x0000001e, 0x00000000, 0x00924460, 0x00000086, 0x00004080, 0x00000000, 0x0092c070, 0x00000000, 0x00924060, 0x00000100, 0x0000c890, 0x00005000, 0x00a6c110, 0x00000000, 0x00b0c090, 0x00000012, 0x021c0015, 0x00000000, 0x3200001f, 0x00000034, 0x00924460, 0x00000510, 0x44210011, 0x00000000, 0x42000011, 0x00000000, 0x83000015, 0x00000040, 0x00924460, 0x00000508, 0x45014018, 0x00004545, 0x00808050, 0x00000000, 0x62208012, 0x00000000, 0x82000015, 0x00000800, 0x15200011, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x80000015, 0x0000eea4, 0x81000015, 0x0000005f, 0x00000060, 0x00000000, 0x00004120, 0x00000000, 0x00004a00, 0x00004000, 0x00924460, 0x00000190, 0x5601401a, 0x00005956, 0x14000011, 0x00000000, 0x00934050, 0x00000018, 0x00930050, 0x00000018, 0x3601403a, 0x0000002d, 0x000643a9, 0x00000000, 0x0000c420, 0x00000140, 0x5601401a, 0x00005956, 0x14000011, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x000642a9, 0x00000000, 0x00024420, 0x00000183, 0x5601401a, 0x00005956, 0x82000015, 0x00002000, 0x15200011, 0x00000000, 0x82000015, 0x00000010, 0x15200011, 0x00000000, 0x82000015, 0x00000010, 0x15200011, 0x00000000, }; /* 104 Rx instructions */ #define FIRMWARE_RX_SIZE 104 static const u32 firmware_tx[] = { 0x010003dc, 0x00000000, 0x04000421, 0x00000086, 0x80000015, 0x0000180e, 0x81000015, 0x00006664, 0x1a0040ab, 0x00000b06, 0x14200011, 0x00000000, 0x14204022, 0x0000aaaa, 0x14204022, 0x00000300, 0x14204022, 0x00000000, 0x1a0040ab, 0x00000b14, 0x14200011, 0x00000000, 0x83000015, 0x00000002, 0x04000021, 0x00000000, 0x00000010, 0x00000000, 0x04000421, 0x00000087, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00008015, 0x00000000, 0x0000003e, 0x00000000, 0x00000010, 0x00000000, 0x82000015, 0x00004000, 0x009e8050, 0x00000000, 0x03008015, 0x00000000, 0x86008015, 0x00000000, 0x82000015, 0x00008000, 0x0100001c, 0x00000000, 0x000050a0, 0x0000010c, 0x4e20d011, 0x00006008, 0x1420d012, 0x00004008, 0x0000f090, 0x00007000, 0x0000c8b0, 0x00003000, 0x00004040, 0x00000000, 0x00108015, 0x00000000, 0x00a2c150, 0x00004000, 0x00a400b0, 0x00000014, 0x00000020, 0x00000000, 0x2500400d, 0x00002525, 0x00047220, 0x00003100, 0x00934070, 0x00000000, 0x00000020, 0x00000000, 0x00924460, 0x00000184, 0x2b20c011, 0x00000000, 0x0000c420, 0x00000540, 0x36014018, 0x0000422d, 0x14200011, 0x00000000, 0x00924460, 0x00000183, 0x3200001f, 0x00000034, 0x02ac0015, 0x00000002, 0x00a60110, 0x00000008, 0x42200011, 0x00000000, 0x00924060, 0x00000103, 0x0000001e, 0x00000000, 0x00000020, 0x00000100, 0x0000001e, 0x00000000, 0x00924460, 0x00000086, 0x00004080, 0x00000000, 0x0092c070, 0x00000000, 0x00924060, 0x00000100, 0x0000c890, 0x00005000, 0x00a6c110, 0x00000000, 0x00b0c090, 0x00000012, 0x021c0015, 0x00000000, 0x3200001f, 0x00000034, 0x00924460, 0x00000510, 0x44210011, 0x00000000, 0x42000011, 0x00000000, 0x83000015, 0x00000040, 0x00924460, 0x00000508, 0x45014018, 0x00004545, 0x00808050, 0x00000000, 0x62208012, 0x00000000, 0x82000015, 0x00000800, 0x15200011, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x80000015, 0x0000eea4, 0x81000015, 0x0000005f, 0x00000060, 0x00000000, 0x00004120, 0x00000000, 0x00004a00, 0x00004000, 0x00924460, 0x00000190, 0x5601401a, 0x00005956, 0x14000011, 0x00000000, 0x00934050, 0x00000018, 0x00930050, 0x00000018, 0x3601403a, 0x0000002d, 0x000643a9, 0x00000000, 0x0000c420, 0x00000140, 0x5601401a, 0x00005956, 0x14000011, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x000642a9, 0x00000000, 0x00024420, 0x00000183, 0x5601401a, 0x00005956, 0x82000015, 0x00002000, 0x15200011, 0x00000000, 0x82000015, 0x00000010, 0x15200011, 0x00000000, 0x82000015, 0x00000010, 0x15200011, 0x00000000, }; /* 104 Tx instructions */ #define FIRMWARE_TX_SIZE 104 #if 0 static const u32 firmware_wol[] = { 0x010003dc, 0x00000000, 0x19000421, 0x00000087, 0x80000015, 0x00001a1a, 0x81000015, 0x00001a1a, 0x1a0040ab, 0x00000b06, 0x15200011, 0x00000000, 0x15204022, 0x0000aaaa, 0x15204022, 0x00000300, 0x15204022, 0x00000000, 0x1a0040ab, 0x00000b15, 0x15200011, 0x00000000, 0x83000015, 0x00000002, 0x04000021, 0x00000000, 0x00000010, 0x00000000, 0x04000421, 0x00000087, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00008015, 0x00000000, 0x0000003e, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x82000015, 0x00004000, 0x82000015, 0x00008000, 0x0000000c, 0x00000000, 0x00000010, 0x00000000, 0x00004080, 0x00000100, 0x1f20c011, 0x00001122, 0x2720f011, 0x00003011, 0x19200071, 0x00000000, 0x1a200051, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x1d2040a4, 0x00003344, 0x1d2040a2, 0x00005566, 0x000040a0, 0x00000100, 0x00108050, 0x00000001, 0x1a208012, 0x00000006, 0x82000015, 0x00008080, 0x010003dc, 0x00000000, 0x1d2040a4, 0x00002233, 0x1d2040a4, 0x00004455, 0x2d208011, 0x00000005, 0x1d2040a4, 0x00006611, 0x00108050, 0x00000001, 0x27200011, 0x00000000, 0x1d2050a4, 0x00006600, 0x82000015, 0x00008080, 0x010003dc, 0x00000000, 0x00000050, 0x00000000, 0x1b200031, 0x00000000, 0x0000001e, 0x00000000, 0x0000001e, 0x00000000, 0x0000001e, 0x00000000, 0x0000001e, 0x00000000, 0x00924460, 0x00000086, 0x00004080, 0x00000000, 0x0092c070, 0x00000000, 0x00924060, 0x00000100, 0x0000c890, 0x00005000, 0x00a6c110, 0x00000000, 0x00b0c090, 0x00000012, 0x021c0015, 0x00000000, 0x3200001f, 0x00000034, 0x00924460, 0x00000510, 0x44210011, 0x00000000, 0x42000011, 0x00000000, 0x83000015, 0x00000040, 0x00924460, 0x00000508, 0x476a0012, 0x00000100, 0x83000015, 0x00000008, 0x16200011, 0x00000000, 0x001e8050, 0x00000000, 0x001e8050, 0x00000000, 0x00808050, 0x00000000, 0x03008015, 0x00000000, 0x62208012, 0x00000000, 0x82000015, 0x00000800, 0x16200011, 0x00000000, 0x80000015, 0x0000eea4, 0x81000015, 0x0000005f, 0x00000020, 0x00000000, 0x00004120, 0x00000000, 0x00004a00, 0x00004000, 0x00924460, 0x00000190, 0x5c01401a, 0x0000595c, 0x15000011, 0x00000000, 0x00934050, 0x00000018, 0x00930050, 0x00000018, 0x3601403a, 0x0000002d, 0x00064029, 0x00000000, 0x0000c420, 0x00000140, 0x5c01401a, 0x0000595c, 0x15000011, 0x00000000, 0x00000010, 0x00000000, 0x00000010, 0x00000000, 0x00064029, 0x00000000, 0x00024420, 0x00000183, 0x5c01401a, 0x0000595c, 0x82000015, 0x00002000, 0x16200011, 0x00000000, 0x82000015, 0x00000010, 0x16200011, 0x00000000, 0x82000015, 0x00000010, 0x16200011, 0x00000000, }; /* 104 WoL instructions */ #define FIRMWARE_WOL_SIZE 104 #endif