···738738 short vtag;739739#endif740740 int rx_pkt_limit = dev->quota;741741+ unsigned long flags;741742742743 do{ 743744 /* process receive packets until we use the quota*/···842841 /* Receive descriptor is empty now */843842 dev->quota -= num_rx_pkt;844843 *budget -= num_rx_pkt;844844+845845+ spin_lock_irqsave(&lp->lock, flags);845846 netif_rx_complete(dev);846846- /* enable receive interrupt */847847 writel(VAL0|RINTEN0, mmio + INTEN0);848848 writel(VAL2 | RDMD0, mmio + CMD0);849849+ spin_unlock_irqrestore(&lp->lock, flags);849850 return 0;851851+850852rx_not_empty:851853 /* Do not call a netif_rx_complete */852854 dev->quota -= num_rx_pkt; 853855 *budget -= num_rx_pkt;854856 return 1;855855-856856-857857}858858859859#else···12631261 struct net_device * dev = (struct net_device *) dev_id;12641262 struct amd8111e_priv *lp = netdev_priv(dev);12651263 void __iomem *mmio = lp->mmio;12661266- unsigned int intr0;12641264+ unsigned int intr0, intren0;12671265 unsigned int handled = 1;1268126612691269- if(dev == NULL)12671267+ if(unlikely(dev == NULL))12701268 return IRQ_NONE;1271126912721272- if (regs) spin_lock (&lp->lock);12701270+ spin_lock(&lp->lock);12711271+12731272 /* disabling interrupt */12741273 writel(INTREN, mmio + CMD0);1275127412761275 /* Read interrupt status */12771276 intr0 = readl(mmio + INT0);12771277+ intren0 = readl(mmio + INTEN0);1278127812791279 /* Process all the INT event until INTR bit is clear. */12801280···12971293 /* Schedule a polling routine */12981294 __netif_rx_schedule(dev);12991295 }13001300- else {12961296+ else if (intren0 & RINTEN0) {13011297 printk("************Driver bug! \13021298 interrupt while in poll\n");13031303- /* Fix by disabling interrupts */13041304- writel(RINT0, mmio + INT0);12991299+ /* Fix by disable receive interrupts */13001300+ writel(RINTEN0, mmio + INTEN0);13051301 }13061302 }13071303#else···13251321err_no_interrupt:13261322 writel( VAL0 | INTREN,mmio + CMD0);1327132313281328- if (regs) spin_unlock(&lp->lock);13241324+ spin_unlock(&lp->lock);1329132513301326 return IRQ_RETVAL(handled);13311327}
+139-26
drivers/net/e100.c
···155155156156#define DRV_NAME "e100"157157#define DRV_EXT "-NAPI"158158-#define DRV_VERSION "3.3.6-k2"DRV_EXT158158+#define DRV_VERSION "3.4.8-k2"DRV_EXT159159#define DRV_DESCRIPTION "Intel(R) PRO/100 Network Driver"160160-#define DRV_COPYRIGHT "Copyright(c) 1999-2004 Intel Corporation"160160+#define DRV_COPYRIGHT "Copyright(c) 1999-2005 Intel Corporation"161161#define PFX DRV_NAME ": "162162163163#define E100_WATCHDOG_PERIOD (2 * HZ)···210210 INTEL_8255X_ETHERNET_DEVICE(0x1069, 6),211211 INTEL_8255X_ETHERNET_DEVICE(0x106A, 6),212212 INTEL_8255X_ETHERNET_DEVICE(0x106B, 6),213213+ INTEL_8255X_ETHERNET_DEVICE(0x1091, 7),214214+ INTEL_8255X_ETHERNET_DEVICE(0x1092, 7),215215+ INTEL_8255X_ETHERNET_DEVICE(0x1093, 7),216216+ INTEL_8255X_ETHERNET_DEVICE(0x1094, 7),217217+ INTEL_8255X_ETHERNET_DEVICE(0x1095, 7),213218 INTEL_8255X_ETHERNET_DEVICE(0x1209, 0),214219 INTEL_8255X_ETHERNET_DEVICE(0x1229, 0),215220 INTEL_8255X_ETHERNET_DEVICE(0x2449, 2),216221 INTEL_8255X_ETHERNET_DEVICE(0x2459, 2),217222 INTEL_8255X_ETHERNET_DEVICE(0x245D, 2),223223+ INTEL_8255X_ETHERNET_DEVICE(0x27DC, 7),218224 { 0, }219225};220226MODULE_DEVICE_TABLE(pci, e100_id_table);···273267enum scb_status {274268 rus_ready = 0x10,275269 rus_mask = 0x3C,270270+};271271+272272+enum ru_state {273273+ RU_SUSPENDED = 0,274274+ RU_RUNNING = 1,275275+ RU_UNINITIALIZED = -1,276276};277277278278enum scb_stat_ack {···522510 struct rx *rx_to_use;523511 struct rx *rx_to_clean;524512 struct rfd blank_rfd;525525- int ru_running;513513+ enum ru_state ru_running;526514527515 spinlock_t cb_lock ____cacheline_aligned;528516 spinlock_t cmd_lock;···551539 struct timer_list watchdog;552540 struct timer_list blink_timer;553541 struct mii_if_info mii;542542+ struct work_struct tx_timeout_task;554543 enum loopback loopback;555544556545 struct mem *mem;···783770 return 0;784771}785772786786-#define E100_WAIT_SCB_TIMEOUT 40773773+#define E100_WAIT_SCB_TIMEOUT 20000 /* we might have to wait 100ms!!! */787774static inline int e100_exec_cmd(struct nic *nic, u8 cmd, dma_addr_t dma_addr)788775{789776 unsigned long flags;···853840 * because the controller is too busy, so854841 * let's just queue the command and try again855842 * when another command is scheduled. */843843+ if(err == -ENOSPC) {844844+ //request a reset845845+ schedule_work(&nic->tx_timeout_task);846846+ }856847 break;857848 } else {858849 nic->cuc_cmd = cuc_resume;···901884902885static void e100_get_defaults(struct nic *nic)903886{904904- struct param_range rfds = { .min = 64, .max = 256, .count = 64 };887887+ struct param_range rfds = { .min = 16, .max = 256, .count = 64 };905888 struct param_range cbs = { .min = 64, .max = 256, .count = 64 };906889907890 pci_read_config_byte(nic->pdev, PCI_REVISION_ID, &nic->rev_id);···916899 /* Quadwords to DMA into FIFO before starting frame transmit */917900 nic->tx_threshold = 0xE0;918901919919- nic->tx_command = cpu_to_le16(cb_tx | cb_i | cb_tx_sf |920920- ((nic->mac >= mac_82558_D101_A4) ? cb_cid : 0));902902+ /* no interrupt for every tx completion, delay = 256us if not 557*/903903+ nic->tx_command = cpu_to_le16(cb_tx | cb_tx_sf |904904+ ((nic->mac >= mac_82558_D101_A4) ? cb_cid : cb_i));921905922906 /* Template for a freshly allocated RFD */923907 nic->blank_rfd.command = cpu_to_le16(cb_el);···982964 if(nic->flags & multicast_all)983965 config->multicast_all = 0x1; /* 1=accept, 0=no */984966985985- if(!(nic->flags & wol_magic))967967+ /* disable WoL when up */968968+ if(netif_running(nic->netdev) || !(nic->flags & wol_magic))986969 config->magic_packet_disable = 0x1; /* 1=off, 0=on */987970988971 if(nic->mac >= mac_82558_D101_A4) {···12221203 }12231204 }1224120512251225- e100_exec_cmd(nic, cuc_dump_reset, 0);12061206+12071207+ if(e100_exec_cmd(nic, cuc_dump_reset, 0))12081208+ DPRINTK(TX_ERR, DEBUG, "exec cuc_dump_reset failed\n");12261209}1227121012281211static void e100_adjust_adaptive_ifs(struct nic *nic, int speed, int duplex)···13001279 struct sk_buff *skb)13011280{13021281 cb->command = nic->tx_command;12821282+ /* interrupt every 16 packets regardless of delay */12831283+ if((nic->cbs_avail & ~15) == nic->cbs_avail) cb->command |= cb_i;13031284 cb->u.tcb.tbd_array = cb->dma_addr + offsetof(struct cb, u.tcb.tbd);13041285 cb->u.tcb.tcb_byte_count = 0;13051286 cb->u.tcb.threshold = nic->tx_threshold;13061287 cb->u.tcb.tbd_count = 1;13071288 cb->u.tcb.tbd.buf_addr = cpu_to_le32(pci_map_single(nic->pdev,13081289 skb->data, skb->len, PCI_DMA_TODEVICE));12901290+ // check for mapping failure?13091291 cb->u.tcb.tbd.size = cpu_to_le16(skb->len);13101292}13111293···13211297 /* SW workaround for ICH[x] 10Mbps/half duplex Tx hang.13221298 Issue a NOP command followed by a 1us delay before13231299 issuing the Tx command. */13241324- e100_exec_cmd(nic, cuc_nop, 0);13001300+ if(e100_exec_cmd(nic, cuc_nop, 0))13011301+ DPRINTK(TX_ERR, DEBUG, "exec cuc_nop failed\n");13251302 udelay(1);13261303 }13271304···14401415 return 0;14411416}1442141714431443-static inline void e100_start_receiver(struct nic *nic)14181418+static inline void e100_start_receiver(struct nic *nic, struct rx *rx)14441419{14201420+ if(!nic->rxs) return;14211421+ if(RU_SUSPENDED != nic->ru_running) return;14221422+14231423+ /* handle init time starts */14241424+ if(!rx) rx = nic->rxs;14251425+14451426 /* (Re)start RU if suspended or idle and RFA is non-NULL */14461446- if(!nic->ru_running && nic->rx_to_clean->skb) {14471447- e100_exec_cmd(nic, ruc_start, nic->rx_to_clean->dma_addr);14481448- nic->ru_running = 1;14271427+ if(rx->skb) {14281428+ e100_exec_cmd(nic, ruc_start, rx->dma_addr);14291429+ nic->ru_running = RU_RUNNING;14491430 }14501431}14511432···14671436 memcpy(rx->skb->data, &nic->blank_rfd, sizeof(struct rfd));14681437 rx->dma_addr = pci_map_single(nic->pdev, rx->skb->data,14691438 RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);14391439+14401440+ if(pci_dma_mapping_error(rx->dma_addr)) {14411441+ dev_kfree_skb_any(rx->skb);14421442+ rx->skb = 0;14431443+ rx->dma_addr = 0;14441444+ return -ENOMEM;14451445+ }1470144614711447 /* Link the RFD to end of RFA by linking previous RFD to14721448 * this one, and clearing EL bit of previous. */···1509147115101472 /* If data isn't ready, nothing to indicate */15111473 if(unlikely(!(rfd_status & cb_complete)))15121512- return -EAGAIN;14741474+ return -ENODATA;1513147515141476 /* Get actual data size */15151477 actual_size = le16_to_cpu(rfd->actual_size) & 0x3FFF;···15191481 /* Get data */15201482 pci_unmap_single(nic->pdev, rx->dma_addr,15211483 RFD_BUF_LEN, PCI_DMA_FROMDEVICE);14841484+14851485+ /* this allows for a fast restart without re-enabling interrupts */14861486+ if(le16_to_cpu(rfd->command) & cb_el)14871487+ nic->ru_running = RU_SUSPENDED;1522148815231489 /* Pull off the RFD and put the actual data (minus eth hdr) */15241490 skb_reserve(skb, sizeof(struct rfd));···15561514 unsigned int work_to_do)15571515{15581516 struct rx *rx;15171517+ int restart_required = 0;15181518+ struct rx *rx_to_start = NULL;15191519+15201520+ /* are we already rnr? then pay attention!!! this ensures that15211521+ * the state machine progression never allows a start with a 15221522+ * partially cleaned list, avoiding a race between hardware15231523+ * and rx_to_clean when in NAPI mode */15241524+ if(RU_SUSPENDED == nic->ru_running)15251525+ restart_required = 1;1559152615601527 /* Indicate newly arrived packets */15611528 for(rx = nic->rx_to_clean; rx->skb; rx = nic->rx_to_clean = rx->next) {15621562- if(e100_rx_indicate(nic, rx, work_done, work_to_do))15291529+ int err = e100_rx_indicate(nic, rx, work_done, work_to_do);15301530+ if(-EAGAIN == err) {15311531+ /* hit quota so have more work to do, restart once15321532+ * cleanup is complete */15331533+ restart_required = 0;15341534+ break;15351535+ } else if(-ENODATA == err)15631536 break; /* No more to clean */15641537 }15381538+15391539+ /* save our starting point as the place we'll restart the receiver */15401540+ if(restart_required)15411541+ rx_to_start = nic->rx_to_clean;1565154215661543 /* Alloc new skbs to refill list */15671544 for(rx = nic->rx_to_use; !rx->skb; rx = nic->rx_to_use = rx->next) {···15881527 break; /* Better luck next time (see watchdog) */15891528 }1590152915911591- e100_start_receiver(nic);15301530+ if(restart_required) {15311531+ // ack the rnr?15321532+ writeb(stat_ack_rnr, &nic->csr->scb.stat_ack);15331533+ e100_start_receiver(nic, rx_to_start);15341534+ if(work_done)15351535+ (*work_done)++;15361536+ }15921537}1593153815941539static void e100_rx_clean_list(struct nic *nic)15951540{15961541 struct rx *rx;15971542 unsigned int i, count = nic->params.rfds.count;15431543+15441544+ nic->ru_running = RU_UNINITIALIZED;1598154515991546 if(nic->rxs) {16001547 for(rx = nic->rxs, i = 0; i < count; rx++, i++) {···16171548 }1618154916191550 nic->rx_to_use = nic->rx_to_clean = NULL;16201620- nic->ru_running = 0;16211551}1622155216231553static int e100_rx_alloc_list(struct nic *nic)···16251557 unsigned int i, count = nic->params.rfds.count;1626155816271559 nic->rx_to_use = nic->rx_to_clean = NULL;15601560+ nic->ru_running = RU_UNINITIALIZED;1628156116291562 if(!(nic->rxs = kmalloc(sizeof(struct rx) * count, GFP_ATOMIC)))16301563 return -ENOMEM;···16411572 }1642157316431574 nic->rx_to_use = nic->rx_to_clean = nic->rxs;15751575+ nic->ru_running = RU_SUSPENDED;1644157616451577 return 0;16461578}···1663159316641594 /* We hit Receive No Resource (RNR); restart RU after cleaning */16651595 if(stat_ack & stat_ack_rnr)16661666- nic->ru_running = 0;15961596+ nic->ru_running = RU_SUSPENDED;1667159716681598 e100_disable_irq(nic);16691599 netif_rx_schedule(netdev);···17331663 return 0;17341664}1735166516661666+#ifdef CONFIG_PM17361667static int e100_asf(struct nic *nic)17371668{17381669 /* ASF can be enabled from eeprom */···17421671 !(nic->eeprom[eeprom_config_asf] & eeprom_gcl) &&17431672 ((nic->eeprom[eeprom_smbus_addr] & 0xFF) != 0xFE));17441673}16741674+#endif1745167517461676static int e100_up(struct nic *nic)17471677{···17551683 if((err = e100_hw_init(nic)))17561684 goto err_clean_cbs;17571685 e100_set_multicast_list(nic->netdev);17581758- e100_start_receiver(nic);16861686+ e100_start_receiver(nic, 0);17591687 mod_timer(&nic->watchdog, jiffies);17601688 if((err = request_irq(nic->pdev->irq, e100_intr, SA_SHIRQ,17611689 nic->netdev->name, nic->netdev)))17621690 goto err_no_irq;17631763- e100_enable_irq(nic);17641691 netif_wake_queue(nic->netdev);16921692+ netif_poll_enable(nic->netdev);16931693+ /* enable ints _after_ enabling poll, preventing a race between16941694+ * disable ints+schedule */16951695+ e100_enable_irq(nic);17651696 return 0;1766169717671698err_no_irq:···1778170317791704static void e100_down(struct nic *nic)17801705{17061706+ /* wait here for poll to complete */17071707+ netif_poll_disable(nic->netdev);17081708+ netif_stop_queue(nic->netdev);17811709 e100_hw_reset(nic);17821710 free_irq(nic->pdev->irq, nic->netdev);17831711 del_timer_sync(&nic->watchdog);17841712 netif_carrier_off(nic->netdev);17851785- netif_stop_queue(nic->netdev);17861713 e100_clean_cbs(nic);17871714 e100_rx_clean_list(nic);17881715}1789171617901717static void e100_tx_timeout(struct net_device *netdev)17181718+{17191719+ struct nic *nic = netdev_priv(netdev);17201720+17211721+ /* Reset outside of interrupt context, to avoid request_irq 17221722+ * in interrupt context */17231723+ schedule_work(&nic->tx_timeout_task);17241724+}17251725+17261726+static void e100_tx_timeout_task(struct net_device *netdev)17911727{17921728 struct nic *nic = netdev_priv(netdev);17931729···18351749 mdio_write(nic->netdev, nic->mii.phy_id, MII_BMCR,18361750 BMCR_LOOPBACK);1837175118381838- e100_start_receiver(nic);17521752+ e100_start_receiver(nic, 0);1839175318401754 if(!(skb = dev_alloc_skb(ETH_DATA_LEN))) {18411755 err = -ENOMEM;···19551869 else19561870 nic->flags &= ~wol_magic;1957187119581958- pci_enable_wake(nic->pdev, 0, nic->flags & (wol_magic | e100_asf(nic)));19591872 e100_exec_cb(nic, NULL, e100_configure);1960187319611874 return 0;···2308222323092224 e100_get_defaults(nic);2310222522262226+ /* locks must be initialized before calling hw_reset */23112227 spin_lock_init(&nic->cb_lock);23122228 spin_lock_init(&nic->cmd_lock);23132229···23252239 init_timer(&nic->blink_timer);23262240 nic->blink_timer.function = e100_blink_led;23272241 nic->blink_timer.data = (unsigned long)nic;22422242+22432243+ INIT_WORK(&nic->tx_timeout_task,22442244+ (void (*)(void *))e100_tx_timeout_task, netdev);2328224523292246 if((err = e100_alloc(nic))) {23302247 DPRINTK(PROBE, ERR, "Cannot alloc driver memory, aborting.\n");···23522263 (nic->eeprom[eeprom_id] & eeprom_id_wol))23532264 nic->flags |= wol_magic;2354226523552355- pci_enable_wake(pdev, 0, nic->flags & (wol_magic | e100_asf(nic)));22662266+ /* ack any pending wake events, disable PME */22672267+ pci_enable_wake(pdev, 0, 0);2356226823572269 strcpy(netdev->name, "eth%d");23582270 if((err = register_netdev(netdev))) {···2425233524262336 pci_set_power_state(pdev, PCI_D0);24272337 pci_restore_state(pdev);24282428- e100_hw_init(nic);23382338+ /* ack any pending wake events, disable PME */23392339+ pci_enable_wake(pdev, 0, 0);23402340+ if(e100_hw_init(nic))23412341+ DPRINTK(HW, ERR, "e100_hw_init failed\n");2429234224302343 netif_device_attach(netdev);24312344 if(netif_running(netdev))···24372344 return 0;24382345}24392346#endif23472347+23482348+23492349+static void e100_shutdown(struct device *dev)23502350+{23512351+ struct pci_dev *pdev = container_of(dev, struct pci_dev, dev);23522352+ struct net_device *netdev = pci_get_drvdata(pdev);23532353+ struct nic *nic = netdev_priv(netdev);23542354+23552355+#ifdef CONFIG_PM23562356+ pci_enable_wake(pdev, 0, nic->flags & (wol_magic | e100_asf(nic)));23572357+#else23582358+ pci_enable_wake(pdev, 0, nic->flags & (wol_magic));23592359+#endif23602360+}23612361+2440236224412363static struct pci_driver e100_driver = {24422364 .name = DRV_NAME,···24622354 .suspend = e100_suspend,24632355 .resume = e100_resume,24642356#endif23572357+23582358+ .driver = {23592359+ .shutdown = e100_shutdown,23602360+ }23612361+24652362};2466236324672364static int __init e100_init_module(void)
+33-4
drivers/net/e1000/e1000.h
···11/*******************************************************************************223344- Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.44+ Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.5566 This program is free software; you can redistribute it and/or modify it 77 under the terms of the GNU General Public License as published by the Free ···112112#define E1000_MAX_82544_RXD 4096113113114114/* Supported Rx Buffer Sizes */115115+#define E1000_RXBUFFER_128 128 /* Used for packet split */116116+#define E1000_RXBUFFER_256 256 /* Used for packet split */115117#define E1000_RXBUFFER_2048 2048116118#define E1000_RXBUFFER_4096 4096117119#define E1000_RXBUFFER_8192 8192···139137/* How many Rx Buffers do we bundle into one write to the hardware ? */140138#define E1000_RX_BUFFER_WRITE 16 /* Must be power of 2 */141139142142-#define AUTO_ALL_MODES 0143143-#define E1000_EEPROM_82544_APM 0x0004144144-#define E1000_EEPROM_APME 0x0400140140+#define AUTO_ALL_MODES 0141141+#define E1000_EEPROM_82544_APM 0x0400142142+#define E1000_EEPROM_APME 0x0400145143146144#ifndef E1000_MASTER_SLAVE147145/* Switch to override PHY master/slave setting */148146#define E1000_MASTER_SLAVE e1000_ms_hw_default149147#endif148148+149149+#define E1000_MNG_VLAN_NONE -1150150+/* Number of packet split data buffers (not including the header buffer) */151151+#define PS_PAGE_BUFFERS MAX_PS_BUFFERS-1150152151153/* only works for sizes that are powers of 2 */152154#define E1000_ROUNDUP(i, size) ((i) = (((i) + (size) - 1) & ~((size) - 1)))···164158 uint16_t length;165159 uint16_t next_to_watch;166160};161161+162162+struct e1000_ps_page { struct page *ps_page[MAX_PS_BUFFERS]; };163163+struct e1000_ps_page_dma { uint64_t ps_page_dma[MAX_PS_BUFFERS]; };167164168165struct e1000_desc_ring {169166 /* pointer to the descriptor ring memory */···183174 unsigned int next_to_clean;184175 /* array of buffer information structs */185176 struct e1000_buffer *buffer_info;177177+ /* arrays of page information for packet split */178178+ struct e1000_ps_page *ps_page;179179+ struct e1000_ps_page_dma *ps_page_dma;186180};187181188182#define E1000_DESC_UNUSED(R) \189183 ((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \190184 (R)->next_to_clean - (R)->next_to_use - 1)191185186186+#define E1000_RX_DESC_PS(R, i) \187187+ (&(((union e1000_rx_desc_packet_split *)((R).desc))[i]))188188+#define E1000_RX_DESC_EXT(R, i) \189189+ (&(((union e1000_rx_desc_extended *)((R).desc))[i]))192190#define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i]))193191#define E1000_RX_DESC(R, i) E1000_GET_DESC(R, i, e1000_rx_desc)194192#define E1000_TX_DESC(R, i) E1000_GET_DESC(R, i, e1000_tx_desc)···208192 struct timer_list watchdog_timer;209193 struct timer_list phy_info_timer;210194 struct vlan_group *vlgrp;195195+ uint16_t mng_vlan_id;211196 uint32_t bd_number;212197 uint32_t rx_buffer_len;213198 uint32_t part_num;···245228 boolean_t detect_tx_hung;246229247230 /* RX */231231+#ifdef CONFIG_E1000_NAPI232232+ boolean_t (*clean_rx) (struct e1000_adapter *adapter, int *work_done,233233+ int work_to_do);234234+#else235235+ boolean_t (*clean_rx) (struct e1000_adapter *adapter);236236+#endif237237+ void (*alloc_rx_buf) (struct e1000_adapter *adapter);248238 struct e1000_desc_ring rx_ring;249239 uint64_t hw_csum_err;250240 uint64_t hw_csum_good;251241 uint32_t rx_int_delay;252242 uint32_t rx_abs_int_delay;253243 boolean_t rx_csum;244244+ boolean_t rx_ps;254245 uint32_t gorcl;255246 uint64_t gorcl_old;247247+ uint16_t rx_ps_bsize0;256248257249 /* Interrupt Throttle Rate */258250 uint32_t itr;···283257284258285259 int msg_enable;260260+#ifdef CONFIG_PCI_MSI261261+ boolean_t have_msi;262262+#endif286263};287264#endif /* _E1000_H_ */
+68-35
drivers/net/e1000/e1000_ethtool.c
···11/*******************************************************************************223344- Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.44+ Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.5566 This program is free software; you can redistribute it and/or modify it 77 under the terms of the GNU General Public License as published by the Free ···6969 { "rx_crc_errors", E1000_STAT(net_stats.rx_crc_errors) },7070 { "rx_frame_errors", E1000_STAT(net_stats.rx_frame_errors) },7171 { "rx_fifo_errors", E1000_STAT(net_stats.rx_fifo_errors) },7272+ { "rx_no_buffer_count", E1000_STAT(stats.rnbc) },7273 { "rx_missed_errors", E1000_STAT(net_stats.rx_missed_errors) },7374 { "tx_aborted_errors", E1000_STAT(net_stats.tx_aborted_errors) },7475 { "tx_carrier_errors", E1000_STAT(net_stats.tx_carrier_errors) },···594593 tx_old = adapter->tx_ring;595594 rx_old = adapter->rx_ring;596595597597- if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) 596596+ if((ring->rx_mini_pending) || (ring->rx_jumbo_pending))598597 return -EINVAL;599598600599 if(netif_running(adapter->netdev))···785784 /* Hook up test interrupt handler just for this test */786785 if(!request_irq(irq, &e1000_test_intr, 0, netdev->name, netdev)) {787786 shared_int = FALSE;788788- } else if(request_irq(irq, &e1000_test_intr, SA_SHIRQ, 789789- netdev->name, netdev)){787787+ } else if(request_irq(irq, &e1000_test_intr, SA_SHIRQ,788788+ netdev->name, netdev)){790789 *data = 1;791790 return -1;792791 }···843842 * test failed.844843 */845844 adapter->test_icr = 0;846846- E1000_WRITE_REG(&adapter->hw, IMC, 847847- (~mask & 0x00007FFF));848848- E1000_WRITE_REG(&adapter->hw, ICS, 849849- (~mask & 0x00007FFF));845845+ E1000_WRITE_REG(&adapter->hw, IMC, ~mask & 0x00007FFF);846846+ E1000_WRITE_REG(&adapter->hw, ICS, ~mask & 0x00007FFF);850847 msec_delay(10);851848852849 if(adapter->test_icr) {···918919919920 /* Setup Tx descriptor ring and Tx buffers */920921921921- txdr->count = 80;922922+ if(!txdr->count)923923+ txdr->count = E1000_DEFAULT_TXD; 922924923925 size = txdr->count * sizeof(struct e1000_buffer);924926 if(!(txdr->buffer_info = kmalloc(size, GFP_KERNEL))) {···974974975975 /* Setup Rx descriptor ring and Rx buffers */976976977977- rxdr->count = 80;977977+ if(!rxdr->count)978978+ rxdr->count = E1000_DEFAULT_RXD; 978979979980 size = rxdr->count * sizeof(struct e1000_buffer);980981 if(!(rxdr->buffer_info = kmalloc(size, GFP_KERNEL))) {···10091008 struct e1000_rx_desc *rx_desc = E1000_RX_DESC(*rxdr, i);10101009 struct sk_buff *skb;1011101010121012- if(!(skb = alloc_skb(E1000_RXBUFFER_2048 + NET_IP_ALIGN, 10111011+ if(!(skb = alloc_skb(E1000_RXBUFFER_2048 + NET_IP_ALIGN,10131012 GFP_KERNEL))) {10141013 ret_val = 6;10151014 goto err_nomem;···13111310 struct e1000_desc_ring *txdr = &adapter->test_tx_ring;13121311 struct e1000_desc_ring *rxdr = &adapter->test_rx_ring;13131312 struct pci_dev *pdev = adapter->pdev;13141314- int i, ret_val;13131313+ int i, j, k, l, lc, good_cnt, ret_val=0;13141314+ unsigned long time;1315131513161316 E1000_WRITE_REG(&adapter->hw, RDT, rxdr->count - 1);1317131713181318- for(i = 0; i < 64; i++) {13191319- e1000_create_lbtest_frame(txdr->buffer_info[i].skb, 1024);13201320- pci_dma_sync_single_for_device(pdev, txdr->buffer_info[i].dma,13211321- txdr->buffer_info[i].length,13221322- PCI_DMA_TODEVICE);13231323- }13241324- E1000_WRITE_REG(&adapter->hw, TDT, i);13181318+ /* Calculate the loop count based on the largest descriptor ring 13191319+ * The idea is to wrap the largest ring a number of times using 6413201320+ * send/receive pairs during each loop13211321+ */1325132213261326- msec_delay(200);13231323+ if(rxdr->count <= txdr->count)13241324+ lc = ((txdr->count / 64) * 2) + 1;13251325+ else13261326+ lc = ((rxdr->count / 64) * 2) + 1;1327132713281328- i = 0;13291329- do {13301330- pci_dma_sync_single_for_cpu(pdev, rxdr->buffer_info[i].dma,13311331- rxdr->buffer_info[i].length,13321332- PCI_DMA_FROMDEVICE);13331333-13341334- ret_val = e1000_check_lbtest_frame(rxdr->buffer_info[i].skb,13351335- 1024);13361336- i++;13371337- } while (ret_val != 0 && i < 64);13381338-13281328+ k = l = 0;13291329+ for(j = 0; j <= lc; j++) { /* loop count loop */13301330+ for(i = 0; i < 64; i++) { /* send the packets */13311331+ e1000_create_lbtest_frame(txdr->buffer_info[i].skb, 13321332+ 1024);13331333+ pci_dma_sync_single_for_device(pdev, 13341334+ txdr->buffer_info[k].dma,13351335+ txdr->buffer_info[k].length,13361336+ PCI_DMA_TODEVICE);13371337+ if(unlikely(++k == txdr->count)) k = 0;13381338+ }13391339+ E1000_WRITE_REG(&adapter->hw, TDT, k);13401340+ msec_delay(200);13411341+ time = jiffies; /* set the start time for the receive */13421342+ good_cnt = 0;13431343+ do { /* receive the sent packets */13441344+ pci_dma_sync_single_for_cpu(pdev, 13451345+ rxdr->buffer_info[l].dma,13461346+ rxdr->buffer_info[l].length,13471347+ PCI_DMA_FROMDEVICE);13481348+13491349+ ret_val = e1000_check_lbtest_frame(13501350+ rxdr->buffer_info[l].skb,13511351+ 1024);13521352+ if(!ret_val)13531353+ good_cnt++;13541354+ if(unlikely(++l == rxdr->count)) l = 0;13551355+ /* time + 20 msecs (200 msecs on 2.4) is more than 13561356+ * enough time to complete the receives, if it's 13571357+ * exceeded, break and error off13581358+ */13591359+ } while (good_cnt < 64 && jiffies < (time + 20));13601360+ if(good_cnt != 64) {13611361+ ret_val = 13; /* ret_val is the same as mis-compare */13621362+ break; 13631363+ }13641364+ if(jiffies >= (time + 2)) {13651365+ ret_val = 14; /* error code for time out error */13661366+ break;13671367+ }13681368+ } /* end loop count loop */13391369 return ret_val;13401370}13411371···13861354e1000_link_test(struct e1000_adapter *adapter, uint64_t *data)13871355{13881356 *data = 0;13891389-13901357 if (adapter->hw.media_type == e1000_media_type_internal_serdes) {13911358 int i = 0;13921359 adapter->hw.serdes_link_down = TRUE;1393136013941394- /* on some blade server designs link establishment */13951395- /* could take as long as 2-3 minutes. */13611361+ /* On some blade server designs, link establishment13621362+ * could take as long as 2-3 minutes */13961363 do {13971364 e1000_check_for_link(&adapter->hw);13981365 if (adapter->hw.serdes_link_down == FALSE)···13991368 msec_delay(20);14001369 } while (i++ < 3750);1401137014021402- *data = 1; 13711371+ *data = 1;14031372 } else {14041373 e1000_check_for_link(&adapter->hw);13741374+ if(adapter->hw.autoneg) /* if auto_neg is set wait for it */13751375+ msec_delay(4000);1405137614061377 if(!(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU)) {14071378 *data = 1;
+1603-396
drivers/net/e1000/e1000_hw.c
···11/*******************************************************************************223344- Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.44+ Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.5566 This program is free software; you can redistribute it and/or modify it 77 under the terms of the GNU General Public License as published by the Free ···6363static int32_t e1000_acquire_eeprom(struct e1000_hw *hw);6464static void e1000_release_eeprom(struct e1000_hw *hw);6565static void e1000_standby_eeprom(struct e1000_hw *hw);6666-static int32_t e1000_id_led_init(struct e1000_hw * hw);6766static int32_t e1000_set_vco_speed(struct e1000_hw *hw);6867static int32_t e1000_polarity_reversal_workaround(struct e1000_hw *hw);6968static int32_t e1000_set_phy_mode(struct e1000_hw *hw);6969+static int32_t e1000_host_if_read_cookie(struct e1000_hw *hw, uint8_t *buffer);7070+static uint8_t e1000_calculate_mng_checksum(char *buffer, uint32_t length);70717172/* IGP cable length table */7273static const···8180 100, 100, 100, 100, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,8281 110, 110, 110, 110, 110, 110, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120};83828383+static const8484+uint16_t e1000_igp_2_cable_length_table[IGP02E1000_AGC_LENGTH_TABLE_SIZE] =8585+ { 8, 13, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43,8686+ 22, 24, 27, 30, 32, 35, 37, 40, 42, 44, 47, 49, 51, 54, 56, 58,8787+ 32, 35, 38, 41, 44, 47, 50, 53, 55, 58, 61, 63, 66, 69, 71, 74,8888+ 43, 47, 51, 54, 58, 61, 64, 67, 71, 74, 77, 80, 82, 85, 88, 90,8989+ 57, 62, 66, 70, 74, 77, 81, 85, 88, 91, 94, 97, 100, 103, 106, 108,9090+ 73, 78, 82, 87, 91, 95, 98, 102, 105, 109, 112, 114, 117, 119, 122, 124,9191+ 91, 96, 101, 105, 109, 113, 116, 119, 122, 125, 127, 128, 128, 128, 128, 128,9292+ 108, 113, 117, 121, 124, 127, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128};9393+84948595/******************************************************************************8696 * Set the phy type member in the hw struct.···10391{10492 DEBUGFUNC("e1000_set_phy_type");105939494+ if(hw->mac_type == e1000_undefined)9595+ return -E1000_ERR_PHY_TYPE;9696+10697 switch(hw->phy_id) {10798 case M88E1000_E_PHY_ID:10899 case M88E1000_I_PHY_ID:109100 case M88E1011_I_PHY_ID:101101+ case M88E1111_I_PHY_ID:110102 hw->phy_type = e1000_phy_m88;111103 break;112104 case IGP01E1000_I_PHY_ID:···143127 uint16_t phy_saved_data;144128145129 DEBUGFUNC("e1000_phy_init_script");146146-147130148131 if(hw->phy_init_script) {149132 msec_delay(20);···286271 case E1000_DEV_ID_82546GB_FIBER:287272 case E1000_DEV_ID_82546GB_SERDES:288273 case E1000_DEV_ID_82546GB_PCIE:274274+ case E1000_DEV_ID_82546GB_QUAD_COPPER:289275 hw->mac_type = e1000_82546_rev_3;290276 break;291277 case E1000_DEV_ID_82541EI:···305289 case E1000_DEV_ID_82547GI:306290 hw->mac_type = e1000_82547_rev_2;307291 break;292292+ case E1000_DEV_ID_82573E:293293+ case E1000_DEV_ID_82573E_IAMT:294294+ hw->mac_type = e1000_82573;295295+ break;308296 default:309297 /* Should never have loaded on this device */310298 return -E1000_ERR_MAC_TYPE;311299 }312300313301 switch(hw->mac_type) {302302+ case e1000_82573:303303+ hw->eeprom_semaphore_present = TRUE;304304+ /* fall through */314305 case e1000_82541:315306 case e1000_82547:316307 case e1000_82541_rev_2:···383360 uint32_t icr;384361 uint32_t manc;385362 uint32_t led_ctrl;363363+ uint32_t timeout;364364+ uint32_t extcnf_ctrl;365365+ int32_t ret_val;386366387367 DEBUGFUNC("e1000_reset_hw");388368···393367 if(hw->mac_type == e1000_82542_rev2_0) {394368 DEBUGOUT("Disabling MWI on 82542 rev 2.0\n");395369 e1000_pci_clear_mwi(hw);370370+ }371371+372372+ if(hw->bus_type == e1000_bus_type_pci_express) {373373+ /* Prevent the PCI-E bus from sticking if there is no TLP connection374374+ * on the last TLP read/write transaction when MAC is reset.375375+ */376376+ if(e1000_disable_pciex_master(hw) != E1000_SUCCESS) {377377+ DEBUGOUT("PCI-E Master disable polling has failed.\n");378378+ }396379 }397380398381 /* Clear interrupt mask to stop board from generating interrupts */···428393429394 /* Must reset the PHY before resetting the MAC */430395 if((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {431431- E1000_WRITE_REG_IO(hw, CTRL, (ctrl | E1000_CTRL_PHY_RST));396396+ E1000_WRITE_REG(hw, CTRL, (ctrl | E1000_CTRL_PHY_RST));432397 msec_delay(5);398398+ }399399+400400+ /* Must acquire the MDIO ownership before MAC reset.401401+ * Ownership defaults to firmware after a reset. */402402+ if(hw->mac_type == e1000_82573) {403403+ timeout = 10;404404+405405+ extcnf_ctrl = E1000_READ_REG(hw, EXTCNF_CTRL);406406+ extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP;407407+408408+ do {409409+ E1000_WRITE_REG(hw, EXTCNF_CTRL, extcnf_ctrl);410410+ extcnf_ctrl = E1000_READ_REG(hw, EXTCNF_CTRL);411411+412412+ if(extcnf_ctrl & E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP)413413+ break;414414+ else415415+ extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP;416416+417417+ msec_delay(2);418418+ timeout--;419419+ } while(timeout);433420 }434421435422 /* Issue a global reset to the MAC. This will reset the chip's···507450 /* Wait for EEPROM reload */508451 msec_delay(20);509452 break;453453+ case e1000_82573:454454+ udelay(10);455455+ ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);456456+ ctrl_ext |= E1000_CTRL_EXT_EE_RST;457457+ E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext);458458+ E1000_WRITE_FLUSH(hw);459459+ /* fall through */460460+ ret_val = e1000_get_auto_rd_done(hw);461461+ if(ret_val)462462+ /* We don't want to continue accessing MAC registers. */463463+ return ret_val;464464+ break;510465 default:511466 /* Wait for EEPROM reload (it happens automatically) */512467 msec_delay(5);···526457 }527458528459 /* Disable HW ARPs on ASF enabled adapters */529529- if(hw->mac_type >= e1000_82540) {460460+ if(hw->mac_type >= e1000_82540 && hw->mac_type <= e1000_82547_rev_2) {530461 manc = E1000_READ_REG(hw, MANC);531462 manc &= ~(E1000_MANC_ARP_EN);532463 E1000_WRITE_REG(hw, MANC, manc);···579510 uint16_t pcix_stat_hi_word;580511 uint16_t cmd_mmrbc;581512 uint16_t stat_mmrbc;513513+ uint32_t mta_size;514514+582515 DEBUGFUNC("e1000_init_hw");583516584517 /* Initialize Identification LED */···595524596525 /* Disabling VLAN filtering. */597526 DEBUGOUT("Initializing the IEEE VLAN\n");598598- E1000_WRITE_REG(hw, VET, 0);599599-527527+ if (hw->mac_type < e1000_82545_rev_3)528528+ E1000_WRITE_REG(hw, VET, 0);600529 e1000_clear_vfta(hw);601530602531 /* For 82542 (rev 2.0), disable MWI and put the receiver into reset */···624553625554 /* Zero out the Multicast HASH table */626555 DEBUGOUT("Zeroing the MTA\n");627627- for(i = 0; i < E1000_MC_TBL_SIZE; i++)556556+ mta_size = E1000_MC_TBL_SIZE;557557+ for(i = 0; i < mta_size; i++)628558 E1000_WRITE_REG_ARRAY(hw, MTA, i, 0);629559630560 /* Set the PCI priority bit correctly in the CTRL register. This631561 * determines if the adapter gives priority to receives, or if it632632- * gives equal priority to transmits and receives.562562+ * gives equal priority to transmits and receives. Valid only on563563+ * 82542 and 82543 silicon.633564 */634634- if(hw->dma_fairness) {565565+ if(hw->dma_fairness && hw->mac_type <= e1000_82543) {635566 ctrl = E1000_READ_REG(hw, CTRL);636567 E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PRIOR);637568 }···671598 if(hw->mac_type > e1000_82544) {672599 ctrl = E1000_READ_REG(hw, TXDCTL);673600 ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | E1000_TXDCTL_FULL_TX_DESC_WB;601601+ switch (hw->mac_type) {602602+ default:603603+ break;604604+ case e1000_82573:605605+ ctrl |= E1000_TXDCTL_COUNT_DESC;606606+ break;607607+ }674608 E1000_WRITE_REG(hw, TXDCTL, ctrl);675609 }610610+611611+ if (hw->mac_type == e1000_82573) {612612+ e1000_enable_tx_pkt_filtering(hw); 613613+ }614614+676615677616 /* Clear all of the statistics registers (clear on read). It is678617 * important that we do this after we have tried to establish link···764679 * control setting, then the variable hw->fc will765680 * be initialized based on a value in the EEPROM.766681 */767767- if(e1000_read_eeprom(hw, EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data) < 0) {682682+ if(e1000_read_eeprom(hw, EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data)) {768683 DEBUGOUT("EEPROM Read Error\n");769684 return -E1000_ERR_EEPROM;770685 }···821736 E1000_WRITE_REG(hw, FCAL, FLOW_CONTROL_ADDRESS_LOW);822737 E1000_WRITE_REG(hw, FCAH, FLOW_CONTROL_ADDRESS_HIGH);823738 E1000_WRITE_REG(hw, FCT, FLOW_CONTROL_TYPE);739739+824740 E1000_WRITE_REG(hw, FCTTV, hw->fc_pause_time);825741826742 /* Set the flow control receive threshold registers. Normally,···992906}993907994908/******************************************************************************995995-* Detects which PHY is present and the speed and duplex909909+* Make sure we have a valid PHY and change PHY mode before link setup.996910*997911* hw - Struct containing variables accessed by shared code998912******************************************************************************/999913static int32_t10001000-e1000_setup_copper_link(struct e1000_hw *hw)914914+e1000_copper_link_preconfig(struct e1000_hw *hw)1001915{1002916 uint32_t ctrl;10031003- uint32_t led_ctrl;1004917 int32_t ret_val;10051005- uint16_t i;1006918 uint16_t phy_data;100791910081008- DEBUGFUNC("e1000_setup_copper_link");920920+ DEBUGFUNC("e1000_copper_link_preconfig");10099211010922 ctrl = E1000_READ_REG(hw, CTRL);1011923 /* With 82543, we need to force speed and duplex on the MAC equal to what···1017933 } else {1018934 ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX | E1000_CTRL_SLU);1019935 E1000_WRITE_REG(hw, CTRL, ctrl);10201020- e1000_phy_hw_reset(hw);936936+ ret_val = e1000_phy_hw_reset(hw);937937+ if(ret_val)938938+ return ret_val;1021939 }10229401023941 /* Make sure we have a valid PHY */···1047961 hw->mac_type == e1000_82541_rev_2 || hw->mac_type == e1000_82547_rev_2)1048962 hw->phy_reset_disable = FALSE;104996310501050- if(!hw->phy_reset_disable) {10511051- if (hw->phy_type == e1000_phy_igp) {964964+ return E1000_SUCCESS;965965+}105296610531053- ret_val = e1000_phy_reset(hw);10541054- if(ret_val) {10551055- DEBUGOUT("Error Resetting the PHY\n");10561056- return ret_val;10571057- }105896710591059- /* Wait 10ms for MAC to configure PHY from eeprom settings */10601060- msec_delay(15);968968+/********************************************************************969969+* Copper link setup for e1000_phy_igp series.970970+*971971+* hw - Struct containing variables accessed by shared code972972+*********************************************************************/973973+static int32_t974974+e1000_copper_link_igp_setup(struct e1000_hw *hw)975975+{976976+ uint32_t led_ctrl;977977+ int32_t ret_val;978978+ uint16_t phy_data;106197910621062- /* Configure activity LED after PHY reset */10631063- led_ctrl = E1000_READ_REG(hw, LEDCTL);10641064- led_ctrl &= IGP_ACTIVITY_LED_MASK;10651065- led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);10661066- E1000_WRITE_REG(hw, LEDCTL, led_ctrl);980980+ DEBUGFUNC("e1000_copper_link_igp_setup");106798110681068- /* disable lplu d3 during driver init */10691069- ret_val = e1000_set_d3_lplu_state(hw, FALSE);10701070- if(ret_val) {10711071- DEBUGOUT("Error Disabling LPLU D3\n");10721072- return ret_val;10731073- }982982+ if (hw->phy_reset_disable)983983+ return E1000_SUCCESS;984984+985985+ ret_val = e1000_phy_reset(hw);986986+ if (ret_val) {987987+ DEBUGOUT("Error Resetting the PHY\n");988988+ return ret_val;989989+ }107499010751075- /* Configure mdi-mdix settings */10761076- ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL,10771077- &phy_data);991991+ /* Wait 10ms for MAC to configure PHY from eeprom settings */992992+ msec_delay(15);993993+994994+ /* Configure activity LED after PHY reset */995995+ led_ctrl = E1000_READ_REG(hw, LEDCTL);996996+ led_ctrl &= IGP_ACTIVITY_LED_MASK;997997+ led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);998998+ E1000_WRITE_REG(hw, LEDCTL, led_ctrl);999999+10001000+ /* disable lplu d3 during driver init */10011001+ ret_val = e1000_set_d3_lplu_state(hw, FALSE);10021002+ if (ret_val) {10031003+ DEBUGOUT("Error Disabling LPLU D3\n");10041004+ return ret_val;10051005+ }10061006+10071007+ /* disable lplu d0 during driver init */10081008+ ret_val = e1000_set_d0_lplu_state(hw, FALSE);10091009+ if (ret_val) {10101010+ DEBUGOUT("Error Disabling LPLU D0\n");10111011+ return ret_val;10121012+ }10131013+ /* Configure mdi-mdix settings */10141014+ ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data);10151015+ if (ret_val)10161016+ return ret_val;10171017+10181018+ if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {10191019+ hw->dsp_config_state = e1000_dsp_config_disabled;10201020+ /* Force MDI for earlier revs of the IGP PHY */10211021+ phy_data &= ~(IGP01E1000_PSCR_AUTO_MDIX | IGP01E1000_PSCR_FORCE_MDI_MDIX);10221022+ hw->mdix = 1;10231023+10241024+ } else {10251025+ hw->dsp_config_state = e1000_dsp_config_enabled;10261026+ phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX;10271027+10281028+ switch (hw->mdix) {10291029+ case 1:10301030+ phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX;10311031+ break;10321032+ case 2:10331033+ phy_data |= IGP01E1000_PSCR_FORCE_MDI_MDIX;10341034+ break;10351035+ case 0:10361036+ default:10371037+ phy_data |= IGP01E1000_PSCR_AUTO_MDIX;10381038+ break;10391039+ }10401040+ }10411041+ ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, phy_data);10421042+ if(ret_val)10431043+ return ret_val;10441044+10451045+ /* set auto-master slave resolution settings */10461046+ if(hw->autoneg) {10471047+ e1000_ms_type phy_ms_setting = hw->master_slave;10481048+10491049+ if(hw->ffe_config_state == e1000_ffe_config_active)10501050+ hw->ffe_config_state = e1000_ffe_config_enabled;10511051+10521052+ if(hw->dsp_config_state == e1000_dsp_config_activated)10531053+ hw->dsp_config_state = e1000_dsp_config_enabled;10541054+10551055+ /* when autonegotiation advertisment is only 1000Mbps then we10561056+ * should disable SmartSpeed and enable Auto MasterSlave10571057+ * resolution as hardware default. */10581058+ if(hw->autoneg_advertised == ADVERTISE_1000_FULL) {10591059+ /* Disable SmartSpeed */10601060+ ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &phy_data);10781061 if(ret_val)10791062 return ret_val;10801080-10811081- if((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {10821082- hw->dsp_config_state = e1000_dsp_config_disabled;10831083- /* Force MDI for earlier revs of the IGP PHY */10841084- phy_data &= ~(IGP01E1000_PSCR_AUTO_MDIX |10851085- IGP01E1000_PSCR_FORCE_MDI_MDIX);10861086- hw->mdix = 1;10871087-10881088- } else {10891089- hw->dsp_config_state = e1000_dsp_config_enabled;10901090- phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX;10911091-10921092- switch (hw->mdix) {10931093- case 1:10941094- phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX;10951095- break;10961096- case 2:10971097- phy_data |= IGP01E1000_PSCR_FORCE_MDI_MDIX;10981098- break;10991099- case 0:11001100- default:11011101- phy_data |= IGP01E1000_PSCR_AUTO_MDIX;11021102- break;11031103- }11041104- }11051105- ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL,11061106- phy_data);11071107- if(ret_val)11081108- return ret_val;11091109-11101110- /* set auto-master slave resolution settings */11111111- if(hw->autoneg) {11121112- e1000_ms_type phy_ms_setting = hw->master_slave;11131113-11141114- if(hw->ffe_config_state == e1000_ffe_config_active)11151115- hw->ffe_config_state = e1000_ffe_config_enabled;11161116-11171117- if(hw->dsp_config_state == e1000_dsp_config_activated)11181118- hw->dsp_config_state = e1000_dsp_config_enabled;11191119-11201120- /* when autonegotiation advertisment is only 1000Mbps then we11211121- * should disable SmartSpeed and enable Auto MasterSlave11221122- * resolution as hardware default. */11231123- if(hw->autoneg_advertised == ADVERTISE_1000_FULL) {11241124- /* Disable SmartSpeed */11251125- ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,11261126- &phy_data);11271127- if(ret_val)11281128- return ret_val;11291129- phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;11301130- ret_val = e1000_write_phy_reg(hw,10631063+ phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;10641064+ ret_val = e1000_write_phy_reg(hw,11311065 IGP01E1000_PHY_PORT_CONFIG,11321066 phy_data);11331133- if(ret_val)11341134- return ret_val;11351135- /* Set auto Master/Slave resolution process */11361136- ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);11371137- if(ret_val)11381138- return ret_val;11391139- phy_data &= ~CR_1000T_MS_ENABLE;11401140- ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);11411141- if(ret_val)11421142- return ret_val;11431143- }11441144-11451145- ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);11461146- if(ret_val)11471147- return ret_val;11481148-11491149- /* load defaults for future use */11501150- hw->original_master_slave = (phy_data & CR_1000T_MS_ENABLE) ?11511151- ((phy_data & CR_1000T_MS_VALUE) ?11521152- e1000_ms_force_master :11531153- e1000_ms_force_slave) :11541154- e1000_ms_auto;11551155-11561156- switch (phy_ms_setting) {11571157- case e1000_ms_force_master:11581158- phy_data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE);11591159- break;11601160- case e1000_ms_force_slave:11611161- phy_data |= CR_1000T_MS_ENABLE;11621162- phy_data &= ~(CR_1000T_MS_VALUE);11631163- break;11641164- case e1000_ms_auto:11651165- phy_data &= ~CR_1000T_MS_ENABLE;11661166- default:11671167- break;11681168- }11691169- ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);11701170- if(ret_val)11711171- return ret_val;11721172- }11731173- } else {11741174- /* Enable CRS on TX. This must be set for half-duplex operation. */11751175- ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,11761176- &phy_data);11771067 if(ret_val)11781068 return ret_val;10691069+ /* Set auto Master/Slave resolution process */10701070+ ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);10711071+ if(ret_val)10721072+ return ret_val;10731073+ phy_data &= ~CR_1000T_MS_ENABLE;10741074+ ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);10751075+ if(ret_val)10761076+ return ret_val;10771077+ }1179107811801180- phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;10791079+ ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);10801080+ if(ret_val)10811081+ return ret_val;1181108211821182- /* Options:11831183- * MDI/MDI-X = 0 (default)11841184- * 0 - Auto for all speeds11851185- * 1 - MDI mode11861186- * 2 - MDI-X mode11871187- * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes)11881188- */11891189- phy_data &= ~M88E1000_PSCR_AUTO_X_MODE;10831083+ /* load defaults for future use */10841084+ hw->original_master_slave = (phy_data & CR_1000T_MS_ENABLE) ?10851085+ ((phy_data & CR_1000T_MS_VALUE) ?10861086+ e1000_ms_force_master :10871087+ e1000_ms_force_slave) :10881088+ e1000_ms_auto;1190108911911191- switch (hw->mdix) {11921192- case 1:11931193- phy_data |= M88E1000_PSCR_MDI_MANUAL_MODE;11941194- break;11951195- case 2:11961196- phy_data |= M88E1000_PSCR_MDIX_MANUAL_MODE;11971197- break;11981198- case 3:11991199- phy_data |= M88E1000_PSCR_AUTO_X_1000T;12001200- break;12011201- case 0:10901090+ switch (phy_ms_setting) {10911091+ case e1000_ms_force_master:10921092+ phy_data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE);10931093+ break;10941094+ case e1000_ms_force_slave:10951095+ phy_data |= CR_1000T_MS_ENABLE;10961096+ phy_data &= ~(CR_1000T_MS_VALUE);10971097+ break;10981098+ case e1000_ms_auto:10991099+ phy_data &= ~CR_1000T_MS_ENABLE;12021100 default:12031203- phy_data |= M88E1000_PSCR_AUTO_X_MODE;12041204- break;12051205- }11011101+ break;11021102+ }11031103+ ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);11041104+ if(ret_val)11051105+ return ret_val;11061106+ }1206110712071207- /* Options:12081208- * disable_polarity_correction = 0 (default)12091209- * Automatic Correction for Reversed Cable Polarity12101210- * 0 - Disabled12111211- * 1 - Enabled12121212- */12131213- phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL;12141214- if(hw->disable_polarity_correction == 1)12151215- phy_data |= M88E1000_PSCR_POLARITY_REVERSAL;12161216- ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,12171217- phy_data);12181218- if(ret_val)12191219- return ret_val;11081108+ return E1000_SUCCESS;11091109+}1220111012211221- /* Force TX_CLK in the Extended PHY Specific Control Register12221222- * to 25MHz clock.12231223- */12241224- ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL,12251225- &phy_data);12261226- if(ret_val)12271227- return ret_val;1228111112291229- phy_data |= M88E1000_EPSCR_TX_CLK_25;11121112+/********************************************************************11131113+* Copper link setup for e1000_phy_m88 series.11141114+*11151115+* hw - Struct containing variables accessed by shared code11161116+*********************************************************************/11171117+static int32_t11181118+e1000_copper_link_mgp_setup(struct e1000_hw *hw)11191119+{11201120+ int32_t ret_val;11211121+ uint16_t phy_data;1230112212311231- if (hw->phy_revision < M88E1011_I_REV_4) {12321232- /* Configure Master and Slave downshift values */12331233- phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK |11231123+ DEBUGFUNC("e1000_copper_link_mgp_setup");11241124+11251125+ if(hw->phy_reset_disable)11261126+ return E1000_SUCCESS;11271127+11281128+ /* Enable CRS on TX. This must be set for half-duplex operation. */11291129+ ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);11301130+ if(ret_val)11311131+ return ret_val;11321132+11331133+ phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;11341134+11351135+ /* Options:11361136+ * MDI/MDI-X = 0 (default)11371137+ * 0 - Auto for all speeds11381138+ * 1 - MDI mode11391139+ * 2 - MDI-X mode11401140+ * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes)11411141+ */11421142+ phy_data &= ~M88E1000_PSCR_AUTO_X_MODE;11431143+11441144+ switch (hw->mdix) {11451145+ case 1:11461146+ phy_data |= M88E1000_PSCR_MDI_MANUAL_MODE;11471147+ break;11481148+ case 2:11491149+ phy_data |= M88E1000_PSCR_MDIX_MANUAL_MODE;11501150+ break;11511151+ case 3:11521152+ phy_data |= M88E1000_PSCR_AUTO_X_1000T;11531153+ break;11541154+ case 0:11551155+ default:11561156+ phy_data |= M88E1000_PSCR_AUTO_X_MODE;11571157+ break;11581158+ }11591159+11601160+ /* Options:11611161+ * disable_polarity_correction = 0 (default)11621162+ * Automatic Correction for Reversed Cable Polarity11631163+ * 0 - Disabled11641164+ * 1 - Enabled11651165+ */11661166+ phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL;11671167+ if(hw->disable_polarity_correction == 1)11681168+ phy_data |= M88E1000_PSCR_POLARITY_REVERSAL;11691169+ ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);11701170+ if(ret_val)11711171+ return ret_val;11721172+11731173+ /* Force TX_CLK in the Extended PHY Specific Control Register11741174+ * to 25MHz clock.11751175+ */11761176+ ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data);11771177+ if(ret_val)11781178+ return ret_val;11791179+11801180+ phy_data |= M88E1000_EPSCR_TX_CLK_25;11811181+11821182+ if (hw->phy_revision < M88E1011_I_REV_4) {11831183+ /* Configure Master and Slave downshift values */11841184+ phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK |12341185 M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK);12351235- phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X |11861186+ phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X |12361187 M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X);12371237- ret_val = e1000_write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL,12381238- phy_data);12391239- if(ret_val)12401240- return ret_val;12411241- }11881188+ ret_val = e1000_write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data);11891189+ if(ret_val)11901190+ return ret_val;11911191+ }1242119212431243- /* SW Reset the PHY so all changes take effect */12441244- ret_val = e1000_phy_reset(hw);12451245- if(ret_val) {12461246- DEBUGOUT("Error Resetting the PHY\n");12471247- return ret_val;12481248- }11931193+ /* SW Reset the PHY so all changes take effect */11941194+ ret_val = e1000_phy_reset(hw);11951195+ if(ret_val) {11961196+ DEBUGOUT("Error Resetting the PHY\n");11971197+ return ret_val;11981198+ }11991199+12001200+ return E1000_SUCCESS;12011201+}12021202+12031203+/********************************************************************12041204+* Setup auto-negotiation and flow control advertisements,12051205+* and then perform auto-negotiation.12061206+*12071207+* hw - Struct containing variables accessed by shared code12081208+*********************************************************************/12091209+static int32_t12101210+e1000_copper_link_autoneg(struct e1000_hw *hw)12111211+{12121212+ int32_t ret_val;12131213+ uint16_t phy_data;12141214+12151215+ DEBUGFUNC("e1000_copper_link_autoneg");12161216+12171217+ /* Perform some bounds checking on the hw->autoneg_advertised12181218+ * parameter. If this variable is zero, then set it to the default.12191219+ */12201220+ hw->autoneg_advertised &= AUTONEG_ADVERTISE_SPEED_DEFAULT;12211221+12221222+ /* If autoneg_advertised is zero, we assume it was not defaulted12231223+ * by the calling code so we set to advertise full capability.12241224+ */12251225+ if(hw->autoneg_advertised == 0)12261226+ hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT;12271227+12281228+ DEBUGOUT("Reconfiguring auto-neg advertisement params\n");12291229+ ret_val = e1000_phy_setup_autoneg(hw);12301230+ if(ret_val) {12311231+ DEBUGOUT("Error Setting up Auto-Negotiation\n");12321232+ return ret_val;12331233+ }12341234+ DEBUGOUT("Restarting Auto-Neg\n");12351235+12361236+ /* Restart auto-negotiation by setting the Auto Neg Enable bit and12371237+ * the Auto Neg Restart bit in the PHY control register.12381238+ */12391239+ ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data);12401240+ if(ret_val)12411241+ return ret_val;12421242+12431243+ phy_data |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG);12441244+ ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data);12451245+ if(ret_val)12461246+ return ret_val;12471247+12481248+ /* Does the user want to wait for Auto-Neg to complete here, or12491249+ * check at a later time (for example, callback routine).12501250+ */12511251+ if(hw->wait_autoneg_complete) {12521252+ ret_val = e1000_wait_autoneg(hw);12531253+ if(ret_val) {12541254+ DEBUGOUT("Error while waiting for autoneg to complete\n");12551255+ return ret_val;12491256 }12571257+ }1250125812511251- /* Options:12521252- * autoneg = 1 (default)12531253- * PHY will advertise value(s) parsed from12541254- * autoneg_advertised and fc12551255- * autoneg = 012561256- * PHY will be set to 10H, 10F, 100H, or 100F12571257- * depending on value parsed from forced_speed_duplex.12581258- */12591259+ hw->get_link_status = TRUE;1259126012601260- /* Is autoneg enabled? This is enabled by default or by software12611261- * override. If so, call e1000_phy_setup_autoneg routine to parse the12621262- * autoneg_advertised and fc options. If autoneg is NOT enabled, then12631263- * the user should have provided a speed/duplex override. If so, then12641264- * call e1000_phy_force_speed_duplex to parse and set this up.12651265- */12661266- if(hw->autoneg) {12671267- /* Perform some bounds checking on the hw->autoneg_advertised12681268- * parameter. If this variable is zero, then set it to the default.12691269- */12701270- hw->autoneg_advertised &= AUTONEG_ADVERTISE_SPEED_DEFAULT;12611261+ return E1000_SUCCESS;12621262+}1271126312721272- /* If autoneg_advertised is zero, we assume it was not defaulted12731273- * by the calling code so we set to advertise full capability.12741274- */12751275- if(hw->autoneg_advertised == 0)12761276- hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT;1277126412781278- DEBUGOUT("Reconfiguring auto-neg advertisement params\n");12791279- ret_val = e1000_phy_setup_autoneg(hw);12801280- if(ret_val) {12811281- DEBUGOUT("Error Setting up Auto-Negotiation\n");12821282- return ret_val;12831283- }12841284- DEBUGOUT("Restarting Auto-Neg\n");12851285-12861286- /* Restart auto-negotiation by setting the Auto Neg Enable bit and12871287- * the Auto Neg Restart bit in the PHY control register.12881288- */12891289- ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data);12901290- if(ret_val)12911291- return ret_val;12921292-12931293- phy_data |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG);12941294- ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data);12951295- if(ret_val)12961296- return ret_val;12971297-12981298- /* Does the user want to wait for Auto-Neg to complete here, or12991299- * check at a later time (for example, callback routine).13001300- */13011301- if(hw->wait_autoneg_complete) {13021302- ret_val = e1000_wait_autoneg(hw);13031303- if(ret_val) {13041304- DEBUGOUT("Error while waiting for autoneg to complete\n");13051305- return ret_val;13061306- }13071307- }13081308- hw->get_link_status = TRUE;13091309- } else {13101310- DEBUGOUT("Forcing speed and duplex\n");13111311- ret_val = e1000_phy_force_speed_duplex(hw);13121312- if(ret_val) {13131313- DEBUGOUT("Error Forcing Speed and Duplex\n");13141314- return ret_val;13151315- }12651265+/******************************************************************************12661266+* Config the MAC and the PHY after link is up.12671267+* 1) Set up the MAC to the current PHY speed/duplex12681268+* if we are on 82543. If we12691269+* are on newer silicon, we only need to configure12701270+* collision distance in the Transmit Control Register.12711271+* 2) Set up flow control on the MAC to that established with12721272+* the link partner.12731273+* 3) Config DSP to improve Gigabit link quality for some PHY revisions. 12741274+*12751275+* hw - Struct containing variables accessed by shared code12761276+******************************************************************************/12771277+static int32_t12781278+e1000_copper_link_postconfig(struct e1000_hw *hw)12791279+{12801280+ int32_t ret_val;12811281+ DEBUGFUNC("e1000_copper_link_postconfig");12821282+12831283+ if(hw->mac_type >= e1000_82544) {12841284+ e1000_config_collision_dist(hw);12851285+ } else {12861286+ ret_val = e1000_config_mac_to_phy(hw);12871287+ if(ret_val) {12881288+ DEBUGOUT("Error configuring MAC to PHY settings\n");12891289+ return ret_val;13161290 }13171317- } /* !hw->phy_reset_disable */12911291+ }12921292+ ret_val = e1000_config_fc_after_link_up(hw);12931293+ if(ret_val) {12941294+ DEBUGOUT("Error Configuring Flow Control\n");12951295+ return ret_val;12961296+ }12971297+12981298+ /* Config DSP to improve Giga link quality */12991299+ if(hw->phy_type == e1000_phy_igp) {13001300+ ret_val = e1000_config_dsp_after_link_change(hw, TRUE);13011301+ if(ret_val) {13021302+ DEBUGOUT("Error Configuring DSP after link up\n");13031303+ return ret_val;13041304+ }13051305+ }13061306+13071307+ return E1000_SUCCESS;13081308+}13091309+13101310+/******************************************************************************13111311+* Detects which PHY is present and setup the speed and duplex13121312+*13131313+* hw - Struct containing variables accessed by shared code13141314+******************************************************************************/13151315+static int32_t13161316+e1000_setup_copper_link(struct e1000_hw *hw)13171317+{13181318+ int32_t ret_val;13191319+ uint16_t i;13201320+ uint16_t phy_data;13211321+13221322+ DEBUGFUNC("e1000_setup_copper_link");13231323+13241324+ /* Check if it is a valid PHY and set PHY mode if necessary. */13251325+ ret_val = e1000_copper_link_preconfig(hw);13261326+ if(ret_val)13271327+ return ret_val;13281328+13291329+ if (hw->phy_type == e1000_phy_igp ||13301330+ hw->phy_type == e1000_phy_igp_2) {13311331+ ret_val = e1000_copper_link_igp_setup(hw);13321332+ if(ret_val)13331333+ return ret_val;13341334+ } else if (hw->phy_type == e1000_phy_m88) {13351335+ ret_val = e1000_copper_link_mgp_setup(hw);13361336+ if(ret_val)13371337+ return ret_val;13381338+ }13391339+13401340+ if(hw->autoneg) {13411341+ /* Setup autoneg and flow control advertisement 13421342+ * and perform autonegotiation */ 13431343+ ret_val = e1000_copper_link_autoneg(hw);13441344+ if(ret_val)13451345+ return ret_val; 13461346+ } else {13471347+ /* PHY will be set to 10H, 10F, 100H,or 100F13481348+ * depending on value from forced_speed_duplex. */13491349+ DEBUGOUT("Forcing speed and duplex\n");13501350+ ret_val = e1000_phy_force_speed_duplex(hw);13511351+ if(ret_val) {13521352+ DEBUGOUT("Error Forcing Speed and Duplex\n");13531353+ return ret_val;13541354+ }13551355+ }1318135613191357 /* Check link status. Wait up to 100 microseconds for link to become13201358 * valid.···14521242 return ret_val;1453124314541244 if(phy_data & MII_SR_LINK_STATUS) {14551455- /* We have link, so we need to finish the config process:14561456- * 1) Set up the MAC to the current PHY speed/duplex14571457- * if we are on 82543. If we14581458- * are on newer silicon, we only need to configure14591459- * collision distance in the Transmit Control Register.14601460- * 2) Set up flow control on the MAC to that established with14611461- * the link partner.14621462- */14631463- if(hw->mac_type >= e1000_82544) {14641464- e1000_config_collision_dist(hw);14651465- } else {14661466- ret_val = e1000_config_mac_to_phy(hw);14671467- if(ret_val) {14681468- DEBUGOUT("Error configuring MAC to PHY settings\n");14691469- return ret_val;14701470- }14711471- }14721472- ret_val = e1000_config_fc_after_link_up(hw);14731473- if(ret_val) {14741474- DEBUGOUT("Error Configuring Flow Control\n");12451245+ /* Config the MAC and PHY after link is up */12461246+ ret_val = e1000_copper_link_postconfig(hw);12471247+ if(ret_val)14751248 return ret_val;14761476- }14771477- DEBUGOUT("Valid link established!!!\n");14781478-14791479- if(hw->phy_type == e1000_phy_igp) {14801480- ret_val = e1000_config_dsp_after_link_change(hw, TRUE);14811481- if(ret_val) {14821482- DEBUGOUT("Error Configuring DSP after link up\n");14831483- return ret_val;14841484- }14851485- }12491249+14861250 DEBUGOUT("Valid link established!!!\n");14871251 return E1000_SUCCESS;14881252 }···14861302 if(ret_val)14871303 return ret_val;1488130414891489- /* Read the MII 1000Base-T Control Register (Address 9). */14901490- ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg);14911491- if(ret_val)14921492- return ret_val;13051305+ /* Read the MII 1000Base-T Control Register (Address 9). */13061306+ ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg);13071307+ if(ret_val)13081308+ return ret_val;1493130914941310 /* Need to parse both autoneg_advertised and fc and set up14951311 * the appropriate PHY registers. First we will parse for···1601141716021418 DEBUGOUT1("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg);1603141916041604- ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg);14201420+ ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg); 16051421 if(ret_val)16061422 return ret_val;16071423···1862167818631679 DEBUGFUNC("e1000_config_mac_to_phy");1864168016811681+ /* 82544 or newer MAC, Auto Speed Detection takes care of 16821682+ * MAC speed/duplex configuration.*/16831683+ if (hw->mac_type >= e1000_82544)16841684+ return E1000_SUCCESS;16851685+18651686 /* Read the Device Control Register and set the bits to Force Speed18661687 * and Duplex.18671688 */···18771688 /* Set up duplex in the Device Control and Transmit Control18781689 * registers depending on negotiated values.18791690 */18801880- if (hw->phy_type == e1000_phy_igp) {18811881- ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS,18821882- &phy_data);18831883- if(ret_val)18841884- return ret_val;16911691+ ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);16921692+ if(ret_val)16931693+ return ret_val;1885169418861886- if(phy_data & IGP01E1000_PSSR_FULL_DUPLEX) ctrl |= E1000_CTRL_FD;18871887- else ctrl &= ~E1000_CTRL_FD;16951695+ if(phy_data & M88E1000_PSSR_DPLX) 16961696+ ctrl |= E1000_CTRL_FD;16971697+ else 16981698+ ctrl &= ~E1000_CTRL_FD;1888169918891889- e1000_config_collision_dist(hw);17001700+ e1000_config_collision_dist(hw);1890170118911891- /* Set up speed in the Device Control register depending on18921892- * negotiated values.18931893- */18941894- if((phy_data & IGP01E1000_PSSR_SPEED_MASK) ==18951895- IGP01E1000_PSSR_SPEED_1000MBPS)18961896- ctrl |= E1000_CTRL_SPD_1000;18971897- else if((phy_data & IGP01E1000_PSSR_SPEED_MASK) ==18981898- IGP01E1000_PSSR_SPEED_100MBPS)18991899- ctrl |= E1000_CTRL_SPD_100;19001900- } else {19011901- ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,19021902- &phy_data);19031903- if(ret_val)19041904- return ret_val;17021702+ /* Set up speed in the Device Control register depending on17031703+ * negotiated values.17041704+ */17051705+ if((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS)17061706+ ctrl |= E1000_CTRL_SPD_1000;17071707+ else if((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_100MBS)17081708+ ctrl |= E1000_CTRL_SPD_100;1905170919061906- if(phy_data & M88E1000_PSSR_DPLX) ctrl |= E1000_CTRL_FD;19071907- else ctrl &= ~E1000_CTRL_FD;19081908-19091909- e1000_config_collision_dist(hw);19101910-19111911- /* Set up speed in the Device Control register depending on19121912- * negotiated values.19131913- */19141914- if((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS)19151915- ctrl |= E1000_CTRL_SPD_1000;19161916- else if((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_100MBS)19171917- ctrl |= E1000_CTRL_SPD_100;19181918- }19191710 /* Write the configured values back to the Device Control Reg. */19201711 E1000_WRITE_REG(hw, CTRL, ctrl);19211712 return E1000_SUCCESS;···2663249426642495 DEBUGFUNC("e1000_read_phy_reg");2665249626662666-26672667- if(hw->phy_type == e1000_phy_igp &&24972497+ if((hw->phy_type == e1000_phy_igp || 24982498+ hw->phy_type == e1000_phy_igp_2) &&26682499 (reg_addr > MAX_PHY_MULTI_PAGE_REG)) {26692500 ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,26702501 (uint16_t)reg_addr);···2769260027702601 DEBUGFUNC("e1000_write_phy_reg");2771260227722772-27732773- if(hw->phy_type == e1000_phy_igp &&26032603+ if((hw->phy_type == e1000_phy_igp || 26042604+ hw->phy_type == e1000_phy_igp_2) &&27742605 (reg_addr > MAX_PHY_MULTI_PAGE_REG)) {27752606 ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,27762607 (uint16_t)reg_addr);···28482679 return E1000_SUCCESS;28492680}2850268126822682+28512683/******************************************************************************28522684* Returns the PHY to the power-on reset state28532685*28542686* hw - Struct containing variables accessed by shared code28552687******************************************************************************/28562856-void26882688+int32_t28572689e1000_phy_hw_reset(struct e1000_hw *hw)28582690{28592691 uint32_t ctrl, ctrl_ext;28602692 uint32_t led_ctrl;26932693+ int32_t ret_val;2861269428622695 DEBUGFUNC("e1000_phy_hw_reset");26962696+26972697+ /* In the case of the phy reset being blocked, it's not an error, we26982698+ * simply return success without performing the reset. */26992699+ ret_val = e1000_check_phy_reset_block(hw);27002700+ if (ret_val)27012701+ return E1000_SUCCESS;2863270228642703 DEBUGOUT("Resetting Phy...\n");28652704···29042727 led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);29052728 E1000_WRITE_REG(hw, LEDCTL, led_ctrl);29062729 }27302730+27312731+ /* Wait for FW to finish PHY configuration. */27322732+ ret_val = e1000_get_phy_cfg_done(hw);27332733+27342734+ return ret_val;29072735}2908273629092737/******************************************************************************···2926274429272745 DEBUGFUNC("e1000_phy_reset");2928274629292929- if(hw->mac_type != e1000_82541_rev_2) {27472747+ /* In the case of the phy reset being blocked, it's not an error, we27482748+ * simply return success without performing the reset. */27492749+ ret_val = e1000_check_phy_reset_block(hw);27502750+ if (ret_val)27512751+ return E1000_SUCCESS;27522752+27532753+ switch (hw->mac_type) {27542754+ case e1000_82541_rev_2:27552755+ ret_val = e1000_phy_hw_reset(hw);27562756+ if(ret_val)27572757+ return ret_val;27582758+ break;27592759+ default:29302760 ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data);29312761 if(ret_val)29322762 return ret_val;···29492755 return ret_val;2950275629512757 udelay(1);29522952- } else e1000_phy_hw_reset(hw);27582758+ break;27592759+ }2953276029542954- if(hw->phy_type == e1000_phy_igp)27612761+ if(hw->phy_type == e1000_phy_igp || hw->phy_type == e1000_phy_igp_2)29552762 e1000_phy_init_script(hw);2956276329572764 return E1000_SUCCESS;···30052810 case e1000_82547:30062811 case e1000_82547_rev_2:30072812 if(hw->phy_id == IGP01E1000_I_PHY_ID) match = TRUE;28132813+ break;28142814+ case e1000_82573:28152815+ if(hw->phy_id == M88E1111_I_PHY_ID) match = TRUE;30082816 break;30092817 default:30102818 DEBUGOUT1("Invalid MAC type %d\n", hw->mac_type);···3064286630652867 /* The downshift status is checked only once, after link is established,30662868 * and it stored in the hw->speed_downgraded parameter. */30673067- phy_info->downshift = hw->speed_downgraded;28692869+ phy_info->downshift = (e1000_downshift)hw->speed_downgraded;3068287030692871 /* IGP01E1000 does not need to support it. */30702872 phy_info->extended_10bt_distance = e1000_10bt_ext_dist_enable_normal;···31032905 if(ret_val)31042906 return ret_val;3105290731063106- /* transalte to old method */29082908+ /* Translate to old method */31072909 average = (max_length + min_length) / 2;3108291031092911 if(average <= e1000_igp_cable_length_50)···3138294031392941 /* The downshift status is checked only once, after link is established,31402942 * and it stored in the hw->speed_downgraded parameter. */31413141- phy_info->downshift = hw->speed_downgraded;29432943+ phy_info->downshift = (e1000_downshift)hw->speed_downgraded;3142294431432945 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);31442946 if(ret_val)···32273029 return -E1000_ERR_CONFIG;32283030 }3229303132303230- if(hw->phy_type == e1000_phy_igp)30323032+ if(hw->phy_type == e1000_phy_igp ||30333033+ hw->phy_type == e1000_phy_igp_2)32313034 return e1000_phy_igp_get_info(hw, phy_info);32323035 else32333036 return e1000_phy_m88_get_info(hw, phy_info);···32543055 *32553056 * hw - Struct containing variables accessed by shared code32563057 *****************************************************************************/32573257-void30583058+int32_t32583059e1000_init_eeprom_params(struct e1000_hw *hw)32593060{32603061 struct e1000_eeprom_info *eeprom = &hw->eeprom;32613062 uint32_t eecd = E1000_READ_REG(hw, EECD);30633063+ int32_t ret_val = E1000_SUCCESS;32623064 uint16_t eeprom_size;3263306532643066 DEBUGFUNC("e1000_init_eeprom_params");···32743074 eeprom->opcode_bits = 3;32753075 eeprom->address_bits = 6;32763076 eeprom->delay_usec = 50;30773077+ eeprom->use_eerd = FALSE;30783078+ eeprom->use_eewr = FALSE;32773079 break;32783080 case e1000_82540:32793081 case e1000_82545:···32923090 eeprom->word_size = 64;32933091 eeprom->address_bits = 6;32943092 }30933093+ eeprom->use_eerd = FALSE;30943094+ eeprom->use_eewr = FALSE;32953095 break;32963096 case e1000_82541:32973097 case e1000_82541_rev_2:···33223118 eeprom->address_bits = 6;33233119 }33243120 }31213121+ eeprom->use_eerd = FALSE;31223122+ eeprom->use_eewr = FALSE;31233123+ break;31243124+ case e1000_82573:31253125+ eeprom->type = e1000_eeprom_spi;31263126+ eeprom->opcode_bits = 8;31273127+ eeprom->delay_usec = 1;31283128+ if (eecd & E1000_EECD_ADDR_BITS) {31293129+ eeprom->page_size = 32;31303130+ eeprom->address_bits = 16;31313131+ } else {31323132+ eeprom->page_size = 8;31333133+ eeprom->address_bits = 8;31343134+ }31353135+ eeprom->use_eerd = TRUE;31363136+ eeprom->use_eewr = TRUE;31373137+ if(e1000_is_onboard_nvm_eeprom(hw) == FALSE) {31383138+ eeprom->type = e1000_eeprom_flash;31393139+ eeprom->word_size = 2048;31403140+31413141+ /* Ensure that the Autonomous FLASH update bit is cleared due to31423142+ * Flash update issue on parts which use a FLASH for NVM. */31433143+ eecd &= ~E1000_EECD_AUPDEN;31443144+ E1000_WRITE_REG(hw, EECD, eecd);31453145+ }33253146 break;33263147 default:33273148 break;33283149 }3329315033303151 if (eeprom->type == e1000_eeprom_spi) {33313331- eeprom->word_size = 64;33323332- if (e1000_read_eeprom(hw, EEPROM_CFG, 1, &eeprom_size) == 0) {33333333- eeprom_size &= EEPROM_SIZE_MASK;33343334-33353335- switch (eeprom_size) {33363336- case EEPROM_SIZE_16KB:33373337- eeprom->word_size = 8192;33383338- break;33393339- case EEPROM_SIZE_8KB:33403340- eeprom->word_size = 4096;33413341- break;33423342- case EEPROM_SIZE_4KB:33433343- eeprom->word_size = 2048;33443344- break;33453345- case EEPROM_SIZE_2KB:33463346- eeprom->word_size = 1024;33473347- break;33483348- case EEPROM_SIZE_1KB:33493349- eeprom->word_size = 512;33503350- break;33513351- case EEPROM_SIZE_512B:33523352- eeprom->word_size = 256;33533353- break;33543354- case EEPROM_SIZE_128B:33553355- default:33563356- eeprom->word_size = 64;33573357- break;33583358- }31523152+ /* eeprom_size will be an enum [0..8] that maps to eeprom sizes 128B to31533153+ * 32KB (incremented by powers of 2).31543154+ */31553155+ if(hw->mac_type <= e1000_82547_rev_2) {31563156+ /* Set to default value for initial eeprom read. */31573157+ eeprom->word_size = 64;31583158+ ret_val = e1000_read_eeprom(hw, EEPROM_CFG, 1, &eeprom_size);31593159+ if(ret_val)31603160+ return ret_val;31613161+ eeprom_size = (eeprom_size & EEPROM_SIZE_MASK) >> EEPROM_SIZE_SHIFT;31623162+ /* 256B eeprom size was not supported in earlier hardware, so we31633163+ * bump eeprom_size up one to ensure that "1" (which maps to 256B)31643164+ * is never the result used in the shifting logic below. */31653165+ if(eeprom_size)31663166+ eeprom_size++;31673167+ } else {31683168+ eeprom_size = (uint16_t)((eecd & E1000_EECD_SIZE_EX_MASK) >>31693169+ E1000_EECD_SIZE_EX_SHIFT);33593170 }31713171+31723172+ eeprom->word_size = 1 << (eeprom_size + EEPROM_WORD_SIZE_SHIFT);33603173 }31743174+ return ret_val;33613175}3362317633633177/******************************************************************************···3528330635293307 DEBUGFUNC("e1000_acquire_eeprom");3530330833093309+ if(e1000_get_hw_eeprom_semaphore(hw))33103310+ return -E1000_ERR_EEPROM;33113311+35313312 eecd = E1000_READ_REG(hw, EECD);3532331333143314+ if (hw->mac_type != e1000_82573) {35333315 /* Request EEPROM Access */35343316 if(hw->mac_type > e1000_82544) {35353317 eecd |= E1000_EECD_REQ;···35513325 DEBUGOUT("Could not acquire EEPROM grant\n");35523326 return -E1000_ERR_EEPROM;35533327 }33283328+ }35543329 }3555333035563331 /* Setup EEPROM for Read/Write */···36703443 eecd &= ~E1000_EECD_REQ;36713444 E1000_WRITE_REG(hw, EECD, eecd);36723445 }34463446+34473447+ e1000_put_hw_eeprom_semaphore(hw);36733448}3674344936753450/******************************************************************************···37333504{37343505 struct e1000_eeprom_info *eeprom = &hw->eeprom;37353506 uint32_t i = 0;35073507+ int32_t ret_val;3736350837373509 DEBUGFUNC("e1000_read_eeprom");35103510+37383511 /* A check for invalid values: offset too large, too many words, and not37393512 * enough words.37403513 */···37463515 return -E1000_ERR_EEPROM;37473516 }3748351737493749- /* Prepare the EEPROM for reading */37503750- if(e1000_acquire_eeprom(hw) != E1000_SUCCESS)37513751- return -E1000_ERR_EEPROM;35183518+ /* FLASH reads without acquiring the semaphore are safe in 82573-based35193519+ * controllers.35203520+ */35213521+ if ((e1000_is_onboard_nvm_eeprom(hw) == TRUE) ||35223522+ (hw->mac_type != e1000_82573)) {35233523+ /* Prepare the EEPROM for reading */35243524+ if(e1000_acquire_eeprom(hw) != E1000_SUCCESS)35253525+ return -E1000_ERR_EEPROM;35263526+ }35273527+35283528+ if(eeprom->use_eerd == TRUE) {35293529+ ret_val = e1000_read_eeprom_eerd(hw, offset, words, data);35303530+ if ((e1000_is_onboard_nvm_eeprom(hw) == TRUE) ||35313531+ (hw->mac_type != e1000_82573))35323532+ e1000_release_eeprom(hw);35333533+ return ret_val;35343534+ }3752353537533536 if(eeprom->type == e1000_eeprom_spi) {37543537 uint16_t word_in;···38143569}3815357038163571/******************************************************************************35723572+ * Reads a 16 bit word from the EEPROM using the EERD register.35733573+ *35743574+ * hw - Struct containing variables accessed by shared code35753575+ * offset - offset of word in the EEPROM to read35763576+ * data - word read from the EEPROM35773577+ * words - number of words to read35783578+ *****************************************************************************/35793579+int32_t35803580+e1000_read_eeprom_eerd(struct e1000_hw *hw,35813581+ uint16_t offset,35823582+ uint16_t words,35833583+ uint16_t *data)35843584+{35853585+ uint32_t i, eerd = 0;35863586+ int32_t error = 0;35873587+35883588+ for (i = 0; i < words; i++) {35893589+ eerd = ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) +35903590+ E1000_EEPROM_RW_REG_START;35913591+35923592+ E1000_WRITE_REG(hw, EERD, eerd);35933593+ error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_READ);35943594+35953595+ if(error) {35963596+ break;35973597+ }35983598+ data[i] = (E1000_READ_REG(hw, EERD) >> E1000_EEPROM_RW_REG_DATA);35993599+36003600+ }36013601+36023602+ return error;36033603+}36043604+36053605+/******************************************************************************36063606+ * Writes a 16 bit word from the EEPROM using the EEWR register.36073607+ *36083608+ * hw - Struct containing variables accessed by shared code36093609+ * offset - offset of word in the EEPROM to read36103610+ * data - word read from the EEPROM36113611+ * words - number of words to read36123612+ *****************************************************************************/36133613+int32_t36143614+e1000_write_eeprom_eewr(struct e1000_hw *hw,36153615+ uint16_t offset,36163616+ uint16_t words,36173617+ uint16_t *data)36183618+{36193619+ uint32_t register_value = 0;36203620+ uint32_t i = 0;36213621+ int32_t error = 0;36223622+36233623+ for (i = 0; i < words; i++) {36243624+ register_value = (data[i] << E1000_EEPROM_RW_REG_DATA) | 36253625+ ((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) | 36263626+ E1000_EEPROM_RW_REG_START;36273627+36283628+ error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE);36293629+ if(error) {36303630+ break;36313631+ } 36323632+36333633+ E1000_WRITE_REG(hw, EEWR, register_value);36343634+36353635+ error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE);36363636+36373637+ if(error) {36383638+ break;36393639+ } 36403640+ }36413641+36423642+ return error;36433643+}36443644+36453645+/******************************************************************************36463646+ * Polls the status bit (bit 1) of the EERD to determine when the read is done.36473647+ *36483648+ * hw - Struct containing variables accessed by shared code36493649+ *****************************************************************************/36503650+int32_t36513651+e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd)36523652+{36533653+ uint32_t attempts = 100000;36543654+ uint32_t i, reg = 0;36553655+ int32_t done = E1000_ERR_EEPROM;36563656+36573657+ for(i = 0; i < attempts; i++) {36583658+ if(eerd == E1000_EEPROM_POLL_READ)36593659+ reg = E1000_READ_REG(hw, EERD);36603660+ else 36613661+ reg = E1000_READ_REG(hw, EEWR);36623662+36633663+ if(reg & E1000_EEPROM_RW_REG_DONE) {36643664+ done = E1000_SUCCESS;36653665+ break;36663666+ }36673667+ udelay(5);36683668+ }36693669+36703670+ return done;36713671+}36723672+36733673+/***************************************************************************36743674+* Description: Determines if the onboard NVM is FLASH or EEPROM.36753675+*36763676+* hw - Struct containing variables accessed by shared code36773677+****************************************************************************/36783678+boolean_t36793679+e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw)36803680+{36813681+ uint32_t eecd = 0;36823682+36833683+ if(hw->mac_type == e1000_82573) {36843684+ eecd = E1000_READ_REG(hw, EECD);36853685+36863686+ /* Isolate bits 15 & 16 */36873687+ eecd = ((eecd >> 15) & 0x03);36883688+36893689+ /* If both bits are set, device is Flash type */36903690+ if(eecd == 0x03) {36913691+ return FALSE;36923692+ }36933693+ }36943694+ return TRUE;36953695+}36963696+36973697+/******************************************************************************38173698 * Verifies that the EEPROM has a valid checksum38183699 *38193700 * hw - Struct containing variables accessed by shared code···39553584 uint16_t i, eeprom_data;3956358539573586 DEBUGFUNC("e1000_validate_eeprom_checksum");35873587+35883588+ if ((hw->mac_type == e1000_82573) &&35893589+ (e1000_is_onboard_nvm_eeprom(hw) == FALSE)) {35903590+ /* Check bit 4 of word 10h. If it is 0, firmware is done updating35913591+ * 10h-12h. Checksum may need to be fixed. */35923592+ e1000_read_eeprom(hw, 0x10, 1, &eeprom_data);35933593+ if ((eeprom_data & 0x10) == 0) {35943594+ /* Read 0x23 and check bit 15. This bit is a 1 when the checksum35953595+ * has already been fixed. If the checksum is still wrong and this35963596+ * bit is a 1, we need to return bad checksum. Otherwise, we need35973597+ * to set this bit to a 1 and update the checksum. */35983598+ e1000_read_eeprom(hw, 0x23, 1, &eeprom_data);35993599+ if ((eeprom_data & 0x8000) == 0) {36003600+ eeprom_data |= 0x8000;36013601+ e1000_write_eeprom(hw, 0x23, 1, &eeprom_data);36023602+ e1000_update_eeprom_checksum(hw);36033603+ }36043604+ }36053605+ }3958360639593607 for(i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++) {39603608 if(e1000_read_eeprom(hw, i, 1, &eeprom_data) < 0) {···40183628 if(e1000_write_eeprom(hw, EEPROM_CHECKSUM_REG, 1, &checksum) < 0) {40193629 DEBUGOUT("EEPROM Write Error\n");40203630 return -E1000_ERR_EEPROM;36313631+ } else if (hw->eeprom.type == e1000_eeprom_flash) {36323632+ e1000_commit_shadow_ram(hw);40213633 }40223634 return E1000_SUCCESS;40233635}···40543662 DEBUGOUT("\"words\" parameter out of bounds\n");40553663 return -E1000_ERR_EEPROM;40563664 }36653665+36663666+ /* 82573 reads only through eerd */36673667+ if(eeprom->use_eewr == TRUE)36683668+ return e1000_write_eeprom_eewr(hw, offset, words, data);4057366940583670 /* Prepare the EEPROM for writing */40593671 if (e1000_acquire_eeprom(hw) != E1000_SUCCESS)···42293833}4230383442313835/******************************************************************************38363836+ * Flushes the cached eeprom to NVM. This is done by saving the modified values38373837+ * in the eeprom cache and the non modified values in the currently active bank38383838+ * to the new bank.38393839+ *38403840+ * hw - Struct containing variables accessed by shared code38413841+ * offset - offset of word in the EEPROM to read38423842+ * data - word read from the EEPROM38433843+ * words - number of words to read38443844+ *****************************************************************************/38453845+int32_t38463846+e1000_commit_shadow_ram(struct e1000_hw *hw)38473847+{38483848+ uint32_t attempts = 100000;38493849+ uint32_t eecd = 0;38503850+ uint32_t flop = 0;38513851+ uint32_t i = 0;38523852+ int32_t error = E1000_SUCCESS;38533853+38543854+ /* The flop register will be used to determine if flash type is STM */38553855+ flop = E1000_READ_REG(hw, FLOP);38563856+38573857+ if (hw->mac_type == e1000_82573) {38583858+ for (i=0; i < attempts; i++) {38593859+ eecd = E1000_READ_REG(hw, EECD);38603860+ if ((eecd & E1000_EECD_FLUPD) == 0) {38613861+ break;38623862+ }38633863+ udelay(5);38643864+ }38653865+38663866+ if (i == attempts) {38673867+ return -E1000_ERR_EEPROM;38683868+ }38693869+38703870+ /* If STM opcode located in bits 15:8 of flop, reset firmware */38713871+ if ((flop & 0xFF00) == E1000_STM_OPCODE) {38723872+ E1000_WRITE_REG(hw, HICR, E1000_HICR_FW_RESET);38733873+ }38743874+38753875+ /* Perform the flash update */38763876+ E1000_WRITE_REG(hw, EECD, eecd | E1000_EECD_FLUPD);38773877+38783878+ for (i=0; i < attempts; i++) {38793879+ eecd = E1000_READ_REG(hw, EECD);38803880+ if ((eecd & E1000_EECD_FLUPD) == 0) {38813881+ break;38823882+ }38833883+ udelay(5);38843884+ }38853885+38863886+ if (i == attempts) {38873887+ return -E1000_ERR_EEPROM;38883888+ }38893889+ }38903890+38913891+ return error;38923892+}38933893+38943894+/******************************************************************************42323895 * Reads the adapter's part number from the EEPROM42333896 *42343897 * hw - Struct containing variables accessed by shared code···43663911e1000_init_rx_addrs(struct e1000_hw *hw)43673912{43683913 uint32_t i;39143914+ uint32_t rar_num;4369391543703916 DEBUGFUNC("e1000_init_rx_addrs");43713917···4375391943763920 e1000_rar_set(hw, hw->mac_addr, 0);4377392139223922+ rar_num = E1000_RAR_ENTRIES;43783923 /* Zero out the other 15 receive addresses. */43793924 DEBUGOUT("Clearing RAR[1-15]\n");43804380- for(i = 1; i < E1000_RAR_ENTRIES; i++) {39253925+ for(i = 1; i < rar_num; i++) {43813926 E1000_WRITE_REG_ARRAY(hw, RA, (i << 1), 0);43823927 E1000_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0);43833928 }···44073950{44083951 uint32_t hash_value;44093952 uint32_t i;44104410-39533953+ uint32_t num_rar_entry;39543954+ uint32_t num_mta_entry;39553955+44113956 DEBUGFUNC("e1000_mc_addr_list_update");4412395744133958 /* Set the new number of MC addresses that we are being requested to use. */···4417395844183959 /* Clear RAR[1-15] */44193960 DEBUGOUT(" Clearing RAR[1-15]\n");44204420- for(i = rar_used_count; i < E1000_RAR_ENTRIES; i++) {39613961+ num_rar_entry = E1000_RAR_ENTRIES;39623962+ for(i = rar_used_count; i < num_rar_entry; i++) {44213963 E1000_WRITE_REG_ARRAY(hw, RA, (i << 1), 0);44223964 E1000_WRITE_REG_ARRAY(hw, RA, ((i << 1) + 1), 0);44233965 }4424396644253967 /* Clear the MTA */44263968 DEBUGOUT(" Clearing MTA\n");44274427- for(i = 0; i < E1000_NUM_MTA_REGISTERS; i++) {39693969+ num_mta_entry = E1000_NUM_MTA_REGISTERS;39703970+ for(i = 0; i < num_mta_entry; i++) {44283971 E1000_WRITE_REG_ARRAY(hw, MTA, i, 0);44293972 }44303973···44503989 /* Place this multicast address in the RAR if there is room, *44513990 * else put it in the MTA44523991 */44534453- if(rar_used_count < E1000_RAR_ENTRIES) {39923992+ if (rar_used_count < num_rar_entry) {44543993 e1000_rar_set(hw,44553994 mc_addr_list + (i * (ETH_LENGTH_OF_ADDRESS + pad)),44563995 rar_used_count);···45014040 }4502404145034042 hash_value &= 0xFFF;40434043+45044044 return hash_value;45054045}45064046···46064144e1000_clear_vfta(struct e1000_hw *hw)46074145{46084146 uint32_t offset;41474147+ uint32_t vfta_value = 0;41484148+ uint32_t vfta_offset = 0;41494149+ uint32_t vfta_bit_in_reg = 0;4609415046104610- for(offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++)46114611- E1000_WRITE_REG_ARRAY(hw, VFTA, offset, 0);41514151+ if (hw->mac_type == e1000_82573) {41524152+ if (hw->mng_cookie.vlan_id != 0) {41534153+ /* The VFTA is a 4096b bit-field, each identifying a single VLAN41544154+ * ID. The following operations determine which 32b entry41554155+ * (i.e. offset) into the array we want to set the VLAN ID41564156+ * (i.e. bit) of the manageability unit. */41574157+ vfta_offset = (hw->mng_cookie.vlan_id >>41584158+ E1000_VFTA_ENTRY_SHIFT) &41594159+ E1000_VFTA_ENTRY_MASK;41604160+ vfta_bit_in_reg = 1 << (hw->mng_cookie.vlan_id &41614161+ E1000_VFTA_ENTRY_BIT_SHIFT_MASK);41624162+ }41634163+ }41644164+ for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) {41654165+ /* If the offset we want to clear is the same offset of the41664166+ * manageability VLAN ID, then clear all bits except that of the41674167+ * manageability unit */41684168+ vfta_value = (offset == vfta_offset) ? vfta_bit_in_reg : 0;41694169+ E1000_WRITE_REG_ARRAY(hw, VFTA, offset, vfta_value);41704170+ }46124171}4613417246144614-static int32_t41734173+int32_t46154174e1000_id_led_init(struct e1000_hw * hw)46164175{46174176 uint32_t ledctl;···49634480 temp = E1000_READ_REG(hw, MGTPRC);49644481 temp = E1000_READ_REG(hw, MGTPDC);49654482 temp = E1000_READ_REG(hw, MGTPTC);44834483+44844484+ if(hw->mac_type <= e1000_82547_rev_2) return;44854485+44864486+ temp = E1000_READ_REG(hw, IAC);44874487+ temp = E1000_READ_REG(hw, ICRXOC);44884488+ temp = E1000_READ_REG(hw, ICRXPTC);44894489+ temp = E1000_READ_REG(hw, ICRXATC);44904490+ temp = E1000_READ_REG(hw, ICTXPTC);44914491+ temp = E1000_READ_REG(hw, ICTXATC);44924492+ temp = E1000_READ_REG(hw, ICTXQEC);44934493+ temp = E1000_READ_REG(hw, ICTXQMTC);44944494+ temp = E1000_READ_REG(hw, ICRXDMTC);44954495+49664496}4967449749684498/******************************************************************************···51424646 hw->bus_speed = e1000_bus_speed_unknown;51434647 hw->bus_width = e1000_bus_width_unknown;51444648 break;46494649+ case e1000_82573:46504650+ hw->bus_type = e1000_bus_type_pci_express;46514651+ hw->bus_speed = e1000_bus_speed_2500;46524652+ hw->bus_width = e1000_bus_width_pciex_4;46534653+ break;51454654 default:51464655 status = E1000_READ_REG(hw, STATUS);51474656 hw->bus_type = (status & E1000_STATUS_PCIX_MODE) ?···5250474952514750 /* Use old method for Phy older than IGP */52524751 if(hw->phy_type == e1000_phy_m88) {47524752+52534753 ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,52544754 &phy_data);52554755 if(ret_val)···53674865 return ret_val;53684866 *polarity = (phy_data & M88E1000_PSSR_REV_POLARITY) >>53694867 M88E1000_PSSR_REV_POLARITY_SHIFT;53705370- } else if(hw->phy_type == e1000_phy_igp) {48684868+ } else if(hw->phy_type == e1000_phy_igp ||48694869+ hw->phy_type == e1000_phy_igp_2) {53714870 /* Read the Status register to check the speed */53724871 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS,53734872 &phy_data);···5420491754214918 DEBUGFUNC("e1000_check_downshift");5422491954235423- if(hw->phy_type == e1000_phy_igp) {49204920+ if(hw->phy_type == e1000_phy_igp || 49214921+ hw->phy_type == e1000_phy_igp_2) {54244922 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_LINK_HEALTH,54254923 &phy_data);54264924 if(ret_val)···54374933 hw->speed_downgraded = (phy_data & M88E1000_PSSR_DOWNSHIFT) >>54384934 M88E1000_PSSR_DOWNSHIFT_SHIFT;54394935 }49364936+54404937 return E1000_SUCCESS;54414938}54424939···55525047 if(ret_val)55535048 return ret_val;5554504955555555- msec_delay(20);50505050+ msec_delay_irq(20);5556505155575052 ret_val = e1000_write_phy_reg(hw, 0x0000,55585053 IGP01E1000_IEEE_FORCE_GIGA);···55765071 if(ret_val)55775072 return ret_val;5578507355795579- msec_delay(20);50745074+ msec_delay_irq(20);5580507555815076 /* Now enable the transmitter */55825077 ret_val = e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data);···56015096 if(ret_val)56025097 return ret_val;5603509856045604- msec_delay(20);50995099+ msec_delay_irq(20);5605510056065101 ret_val = e1000_write_phy_reg(hw, 0x0000,56075102 IGP01E1000_IEEE_FORCE_GIGA);···56175112 if(ret_val)56185113 return ret_val;5619511456205620- msec_delay(20);51155115+ msec_delay_irq(20);5621511656225117 /* Now enable the transmitter */56235118 ret_val = e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data);···56925187 uint16_t phy_data;56935188 DEBUGFUNC("e1000_set_d3_lplu_state");5694518956955695- if(!((hw->mac_type == e1000_82541_rev_2) ||56965696- (hw->mac_type == e1000_82547_rev_2)))51905190+ if(hw->phy_type != e1000_phy_igp && hw->phy_type != e1000_phy_igp_2)56975191 return E1000_SUCCESS;5698519256995193 /* During driver activity LPLU should not be used or it will attain link57005194 * from the lowest speeds starting from 10Mbps. The capability is used for57015195 * Dx transitions and states */57025702- ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO, &phy_data);57035703- if(ret_val)57045704- return ret_val;57055705-57065706- if(!active) {57075707- phy_data &= ~IGP01E1000_GMII_FLEX_SPD;57085708- ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data);51965196+ if(hw->mac_type == e1000_82541_rev_2 || hw->mac_type == e1000_82547_rev_2) {51975197+ ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO, &phy_data);57095198 if(ret_val)57105199 return ret_val;52005200+ } else {52015201+ ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data);52025202+ if(ret_val)52035203+ return ret_val;52045204+ }52055205+52065206+ if(!active) {52075207+ if(hw->mac_type == e1000_82541_rev_2 ||52085208+ hw->mac_type == e1000_82547_rev_2) {52095209+ phy_data &= ~IGP01E1000_GMII_FLEX_SPD;52105210+ ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data);52115211+ if(ret_val)52125212+ return ret_val;52135213+ } else {52145214+ phy_data &= ~IGP02E1000_PM_D3_LPLU;52155215+ ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,52165216+ phy_data);52175217+ if (ret_val)52185218+ return ret_val;52195219+ }5711522057125221 /* LPLU and SmartSpeed are mutually exclusive. LPLU is used during57135222 * Dx states where the power conservation is most important. During···57555236 (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_ALL ) ||57565237 (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_100_ALL)) {5757523857585758- phy_data |= IGP01E1000_GMII_FLEX_SPD;57595759- ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data);52395239+ if(hw->mac_type == e1000_82541_rev_2 ||52405240+ hw->mac_type == e1000_82547_rev_2) {52415241+ phy_data |= IGP01E1000_GMII_FLEX_SPD;52425242+ ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data);52435243+ if(ret_val)52445244+ return ret_val;52455245+ } else {52465246+ phy_data |= IGP02E1000_PM_D3_LPLU;52475247+ ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT,52485248+ phy_data);52495249+ if (ret_val)52505250+ return ret_val;52515251+ }52525252+52535253+ /* When LPLU is enabled we should disable SmartSpeed */52545254+ ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &phy_data);57605255 if(ret_val)57615256 return ret_val;52575257+52585258+ phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;52595259+ ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, phy_data);52605260+ if(ret_val)52615261+ return ret_val;52625262+52635263+ }52645264+ return E1000_SUCCESS;52655265+}52665266+52675267+/*****************************************************************************52685268+ *52695269+ * This function sets the lplu d0 state according to the active flag. When52705270+ * activating lplu this function also disables smart speed and vise versa.52715271+ * lplu will not be activated unless the device autonegotiation advertisment52725272+ * meets standards of either 10 or 10/100 or 10/100/1000 at all duplexes.52735273+ * hw: Struct containing variables accessed by shared code52745274+ * active - true to enable lplu false to disable lplu.52755275+ *52765276+ * returns: - E1000_ERR_PHY if fail to read/write the PHY52775277+ * E1000_SUCCESS at any other case.52785278+ *52795279+ ****************************************************************************/52805280+52815281+int32_t52825282+e1000_set_d0_lplu_state(struct e1000_hw *hw,52835283+ boolean_t active)52845284+{52855285+ int32_t ret_val;52865286+ uint16_t phy_data;52875287+ DEBUGFUNC("e1000_set_d0_lplu_state");52885288+52895289+ if(hw->mac_type <= e1000_82547_rev_2)52905290+ return E1000_SUCCESS;52915291+52925292+ ret_val = e1000_read_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, &phy_data);52935293+ if(ret_val)52945294+ return ret_val;52955295+52965296+ if (!active) {52975297+ phy_data &= ~IGP02E1000_PM_D0_LPLU;52985298+ ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);52995299+ if (ret_val)53005300+ return ret_val;53015301+53025302+ /* LPLU and SmartSpeed are mutually exclusive. LPLU is used during53035303+ * Dx states where the power conservation is most important. During53045304+ * driver activity we should enable SmartSpeed, so performance is53055305+ * maintained. */53065306+ if (hw->smart_speed == e1000_smart_speed_on) {53075307+ ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,53085308+ &phy_data);53095309+ if(ret_val)53105310+ return ret_val;53115311+53125312+ phy_data |= IGP01E1000_PSCFR_SMART_SPEED;53135313+ ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,53145314+ phy_data);53155315+ if(ret_val)53165316+ return ret_val;53175317+ } else if (hw->smart_speed == e1000_smart_speed_off) {53185318+ ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,53195319+ &phy_data);53205320+ if (ret_val)53215321+ return ret_val;53225322+53235323+ phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;53245324+ ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,53255325+ phy_data);53265326+ if(ret_val)53275327+ return ret_val;53285328+ }53295329+53305330+53315331+ } else {53325332+53335333+ phy_data |= IGP02E1000_PM_D0_LPLU; 53345334+ ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);53355335+ if (ret_val)53365336+ return ret_val;5762533757635338 /* When LPLU is enabled we should disable SmartSpeed */57645339 ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &phy_data);···59295316 return ret_val;5930531759315318 return E1000_SUCCESS;53195319+}53205320+53215321+53225322+/*****************************************************************************53235323+ * This function reads the cookie from ARC ram.53245324+ *53255325+ * returns: - E1000_SUCCESS .53265326+ ****************************************************************************/53275327+int32_t53285328+e1000_host_if_read_cookie(struct e1000_hw * hw, uint8_t *buffer)53295329+{53305330+ uint8_t i;53315331+ uint32_t offset = E1000_MNG_DHCP_COOKIE_OFFSET; 53325332+ uint8_t length = E1000_MNG_DHCP_COOKIE_LENGTH;53335333+53345334+ length = (length >> 2);53355335+ offset = (offset >> 2);53365336+53375337+ for (i = 0; i < length; i++) {53385338+ *((uint32_t *) buffer + i) =53395339+ E1000_READ_REG_ARRAY_DWORD(hw, HOST_IF, offset + i);53405340+ }53415341+ return E1000_SUCCESS;53425342+}53435343+53445344+53455345+/*****************************************************************************53465346+ * This function checks whether the HOST IF is enabled for command operaton53475347+ * and also checks whether the previous command is completed.53485348+ * It busy waits in case of previous command is not completed.53495349+ *53505350+ * returns: - E1000_ERR_HOST_INTERFACE_COMMAND in case if is not ready or 53515351+ * timeout53525352+ * - E1000_SUCCESS for success.53535353+ ****************************************************************************/53545354+int32_t53555355+e1000_mng_enable_host_if(struct e1000_hw * hw)53565356+{53575357+ uint32_t hicr;53585358+ uint8_t i;53595359+53605360+ /* Check that the host interface is enabled. */53615361+ hicr = E1000_READ_REG(hw, HICR);53625362+ if ((hicr & E1000_HICR_EN) == 0) {53635363+ DEBUGOUT("E1000_HOST_EN bit disabled.\n");53645364+ return -E1000_ERR_HOST_INTERFACE_COMMAND;53655365+ }53665366+ /* check the previous command is completed */53675367+ for (i = 0; i < E1000_MNG_DHCP_COMMAND_TIMEOUT; i++) {53685368+ hicr = E1000_READ_REG(hw, HICR);53695369+ if (!(hicr & E1000_HICR_C))53705370+ break;53715371+ msec_delay_irq(1);53725372+ }53735373+53745374+ if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) { 53755375+ DEBUGOUT("Previous command timeout failed .\n");53765376+ return -E1000_ERR_HOST_INTERFACE_COMMAND;53775377+ }53785378+ return E1000_SUCCESS;53795379+}53805380+53815381+/*****************************************************************************53825382+ * This function writes the buffer content at the offset given on the host if.53835383+ * It also does alignment considerations to do the writes in most efficient way.53845384+ * Also fills up the sum of the buffer in *buffer parameter.53855385+ *53865386+ * returns - E1000_SUCCESS for success.53875387+ ****************************************************************************/53885388+int32_t53895389+e1000_mng_host_if_write(struct e1000_hw * hw, uint8_t *buffer,53905390+ uint16_t length, uint16_t offset, uint8_t *sum)53915391+{53925392+ uint8_t *tmp;53935393+ uint8_t *bufptr = buffer;53945394+ uint32_t data;53955395+ uint16_t remaining, i, j, prev_bytes;53965396+53975397+ /* sum = only sum of the data and it is not checksum */53985398+53995399+ if (length == 0 || offset + length > E1000_HI_MAX_MNG_DATA_LENGTH) {54005400+ return -E1000_ERR_PARAM;54015401+ }54025402+54035403+ tmp = (uint8_t *)&data;54045404+ prev_bytes = offset & 0x3;54055405+ offset &= 0xFFFC;54065406+ offset >>= 2;54075407+54085408+ if (prev_bytes) {54095409+ data = E1000_READ_REG_ARRAY_DWORD(hw, HOST_IF, offset);54105410+ for (j = prev_bytes; j < sizeof(uint32_t); j++) {54115411+ *(tmp + j) = *bufptr++;54125412+ *sum += *(tmp + j);54135413+ }54145414+ E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, offset, data);54155415+ length -= j - prev_bytes;54165416+ offset++;54175417+ }54185418+54195419+ remaining = length & 0x3;54205420+ length -= remaining;54215421+54225422+ /* Calculate length in DWORDs */54235423+ length >>= 2;54245424+54255425+ /* The device driver writes the relevant command block into the54265426+ * ram area. */54275427+ for (i = 0; i < length; i++) {54285428+ for (j = 0; j < sizeof(uint32_t); j++) {54295429+ *(tmp + j) = *bufptr++;54305430+ *sum += *(tmp + j);54315431+ }54325432+54335433+ E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, offset + i, data);54345434+ }54355435+ if (remaining) {54365436+ for (j = 0; j < sizeof(uint32_t); j++) {54375437+ if (j < remaining)54385438+ *(tmp + j) = *bufptr++;54395439+ else54405440+ *(tmp + j) = 0;54415441+54425442+ *sum += *(tmp + j);54435443+ }54445444+ E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, offset + i, data);54455445+ }54465446+54475447+ return E1000_SUCCESS;54485448+}54495449+54505450+54515451+/*****************************************************************************54525452+ * This function writes the command header after does the checksum calculation.54535453+ *54545454+ * returns - E1000_SUCCESS for success.54555455+ ****************************************************************************/54565456+int32_t54575457+e1000_mng_write_cmd_header(struct e1000_hw * hw,54585458+ struct e1000_host_mng_command_header * hdr)54595459+{54605460+ uint16_t i;54615461+ uint8_t sum;54625462+ uint8_t *buffer;54635463+54645464+ /* Write the whole command header structure which includes sum of54655465+ * the buffer */54665466+54675467+ uint16_t length = sizeof(struct e1000_host_mng_command_header);54685468+54695469+ sum = hdr->checksum;54705470+ hdr->checksum = 0;54715471+54725472+ buffer = (uint8_t *) hdr;54735473+ i = length;54745474+ while(i--)54755475+ sum += buffer[i];54765476+54775477+ hdr->checksum = 0 - sum;54785478+54795479+ length >>= 2;54805480+ /* The device driver writes the relevant command block into the ram area. */54815481+ for (i = 0; i < length; i++)54825482+ E1000_WRITE_REG_ARRAY_DWORD(hw, HOST_IF, i, *((uint32_t *) hdr + i));54835483+54845484+ return E1000_SUCCESS;54855485+}54865486+54875487+54885488+/*****************************************************************************54895489+ * This function indicates to ARC that a new command is pending which completes54905490+ * one write operation by the driver.54915491+ *54925492+ * returns - E1000_SUCCESS for success.54935493+ ****************************************************************************/54945494+int32_t54955495+e1000_mng_write_commit(54965496+ struct e1000_hw * hw)54975497+{54985498+ uint32_t hicr;54995499+55005500+ hicr = E1000_READ_REG(hw, HICR);55015501+ /* Setting this bit tells the ARC that a new command is pending. */55025502+ E1000_WRITE_REG(hw, HICR, hicr | E1000_HICR_C);55035503+55045504+ return E1000_SUCCESS;55055505+}55065506+55075507+55085508+/*****************************************************************************55095509+ * This function checks the mode of the firmware.55105510+ *55115511+ * returns - TRUE when the mode is IAMT or FALSE.55125512+ ****************************************************************************/55135513+boolean_t55145514+e1000_check_mng_mode(55155515+ struct e1000_hw *hw)55165516+{55175517+ uint32_t fwsm;55185518+55195519+ fwsm = E1000_READ_REG(hw, FWSM);55205520+55215521+ if((fwsm & E1000_FWSM_MODE_MASK) ==55225522+ (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT))55235523+ return TRUE;55245524+55255525+ return FALSE;55265526+}55275527+55285528+55295529+/*****************************************************************************55305530+ * This function writes the dhcp info .55315531+ ****************************************************************************/55325532+int32_t55335533+e1000_mng_write_dhcp_info(struct e1000_hw * hw, uint8_t *buffer,55345534+ uint16_t length)55355535+{55365536+ int32_t ret_val;55375537+ struct e1000_host_mng_command_header hdr;55385538+55395539+ hdr.command_id = E1000_MNG_DHCP_TX_PAYLOAD_CMD;55405540+ hdr.command_length = length;55415541+ hdr.reserved1 = 0;55425542+ hdr.reserved2 = 0;55435543+ hdr.checksum = 0;55445544+55455545+ ret_val = e1000_mng_enable_host_if(hw);55465546+ if (ret_val == E1000_SUCCESS) {55475547+ ret_val = e1000_mng_host_if_write(hw, buffer, length, sizeof(hdr),55485548+ &(hdr.checksum));55495549+ if (ret_val == E1000_SUCCESS) {55505550+ ret_val = e1000_mng_write_cmd_header(hw, &hdr);55515551+ if (ret_val == E1000_SUCCESS)55525552+ ret_val = e1000_mng_write_commit(hw);55535553+ }55545554+ }55555555+ return ret_val;55565556+}55575557+55585558+55595559+/*****************************************************************************55605560+ * This function calculates the checksum.55615561+ *55625562+ * returns - checksum of buffer contents.55635563+ ****************************************************************************/55645564+uint8_t55655565+e1000_calculate_mng_checksum(char *buffer, uint32_t length)55665566+{55675567+ uint8_t sum = 0;55685568+ uint32_t i;55695569+55705570+ if (!buffer)55715571+ return 0;55725572+55735573+ for (i=0; i < length; i++)55745574+ sum += buffer[i];55755575+55765576+ return (uint8_t) (0 - sum);55775577+}55785578+55795579+/*****************************************************************************55805580+ * This function checks whether tx pkt filtering needs to be enabled or not.55815581+ *55825582+ * returns - TRUE for packet filtering or FALSE.55835583+ ****************************************************************************/55845584+boolean_t55855585+e1000_enable_tx_pkt_filtering(struct e1000_hw *hw)55865586+{55875587+ /* called in init as well as watchdog timer functions */55885588+55895589+ int32_t ret_val, checksum;55905590+ boolean_t tx_filter = FALSE;55915591+ struct e1000_host_mng_dhcp_cookie *hdr = &(hw->mng_cookie);55925592+ uint8_t *buffer = (uint8_t *) &(hw->mng_cookie);55935593+55945594+ if (e1000_check_mng_mode(hw)) {55955595+ ret_val = e1000_mng_enable_host_if(hw);55965596+ if (ret_val == E1000_SUCCESS) {55975597+ ret_val = e1000_host_if_read_cookie(hw, buffer);55985598+ if (ret_val == E1000_SUCCESS) {55995599+ checksum = hdr->checksum;56005600+ hdr->checksum = 0;56015601+ if ((hdr->signature == E1000_IAMT_SIGNATURE) &&56025602+ checksum == e1000_calculate_mng_checksum((char *)buffer,56035603+ E1000_MNG_DHCP_COOKIE_LENGTH)) {56045604+ if (hdr->status &56055605+ E1000_MNG_DHCP_COOKIE_STATUS_PARSING_SUPPORT)56065606+ tx_filter = TRUE;56075607+ } else56085608+ tx_filter = TRUE;56095609+ } else56105610+ tx_filter = TRUE;56115611+ }56125612+ }56135613+56145614+ hw->tx_pkt_filtering = tx_filter;56155615+ return tx_filter;56165616+}56175617+56185618+/******************************************************************************56195619+ * Verifies the hardware needs to allow ARPs to be processed by the host56205620+ *56215621+ * hw - Struct containing variables accessed by shared code56225622+ *56235623+ * returns: - TRUE/FALSE56245624+ *56255625+ *****************************************************************************/56265626+uint32_t56275627+e1000_enable_mng_pass_thru(struct e1000_hw *hw)56285628+{56295629+ uint32_t manc;56305630+ uint32_t fwsm, factps;56315631+56325632+ if (hw->asf_firmware_present) {56335633+ manc = E1000_READ_REG(hw, MANC);56345634+56355635+ if (!(manc & E1000_MANC_RCV_TCO_EN) ||56365636+ !(manc & E1000_MANC_EN_MAC_ADDR_FILTER))56375637+ return FALSE;56385638+ if (e1000_arc_subsystem_valid(hw) == TRUE) {56395639+ fwsm = E1000_READ_REG(hw, FWSM);56405640+ factps = E1000_READ_REG(hw, FACTPS);56415641+56425642+ if (((fwsm & E1000_FWSM_MODE_MASK) ==56435643+ (e1000_mng_mode_pt << E1000_FWSM_MODE_SHIFT)) &&56445644+ (factps & E1000_FACTPS_MNGCG))56455645+ return TRUE;56465646+ } else56475647+ if ((manc & E1000_MANC_SMBUS_EN) && !(manc & E1000_MANC_ASF_EN))56485648+ return TRUE;56495649+ }56505650+ return FALSE;59325651}5933565259345653static int32_t···63475402 }63485403 return E1000_SUCCESS;63495404}54055405+54065406+/***************************************************************************54075407+ *54085408+ * Disables PCI-Express master access.54095409+ *54105410+ * hw: Struct containing variables accessed by shared code54115411+ *54125412+ * returns: - none.54135413+ *54145414+ ***************************************************************************/54155415+void54165416+e1000_set_pci_express_master_disable(struct e1000_hw *hw)54175417+{54185418+ uint32_t ctrl;54195419+54205420+ DEBUGFUNC("e1000_set_pci_express_master_disable");54215421+54225422+ if (hw->bus_type != e1000_bus_type_pci_express)54235423+ return;54245424+54255425+ ctrl = E1000_READ_REG(hw, CTRL);54265426+ ctrl |= E1000_CTRL_GIO_MASTER_DISABLE;54275427+ E1000_WRITE_REG(hw, CTRL, ctrl);54285428+}54295429+54305430+/***************************************************************************54315431+ *54325432+ * Enables PCI-Express master access.54335433+ *54345434+ * hw: Struct containing variables accessed by shared code54355435+ *54365436+ * returns: - none.54375437+ *54385438+ ***************************************************************************/54395439+void54405440+e1000_enable_pciex_master(struct e1000_hw *hw)54415441+{54425442+ uint32_t ctrl;54435443+54445444+ DEBUGFUNC("e1000_enable_pciex_master");54455445+54465446+ if (hw->bus_type != e1000_bus_type_pci_express)54475447+ return;54485448+54495449+ ctrl = E1000_READ_REG(hw, CTRL);54505450+ ctrl &= ~E1000_CTRL_GIO_MASTER_DISABLE;54515451+ E1000_WRITE_REG(hw, CTRL, ctrl);54525452+}54535453+54545454+/*******************************************************************************54555455+ *54565456+ * Disables PCI-Express master access and verifies there are no pending requests54575457+ *54585458+ * hw: Struct containing variables accessed by shared code54595459+ *54605460+ * returns: - E1000_ERR_MASTER_REQUESTS_PENDING if master disable bit hasn't54615461+ * caused the master requests to be disabled.54625462+ * E1000_SUCCESS master requests disabled.54635463+ *54645464+ ******************************************************************************/54655465+int32_t54665466+e1000_disable_pciex_master(struct e1000_hw *hw)54675467+{54685468+ int32_t timeout = MASTER_DISABLE_TIMEOUT; /* 80ms */54695469+54705470+ DEBUGFUNC("e1000_disable_pciex_master");54715471+54725472+ if (hw->bus_type != e1000_bus_type_pci_express)54735473+ return E1000_SUCCESS;54745474+54755475+ e1000_set_pci_express_master_disable(hw);54765476+54775477+ while(timeout) {54785478+ if(!(E1000_READ_REG(hw, STATUS) & E1000_STATUS_GIO_MASTER_ENABLE))54795479+ break;54805480+ else54815481+ udelay(100);54825482+ timeout--;54835483+ }54845484+54855485+ if(!timeout) {54865486+ DEBUGOUT("Master requests are pending.\n");54875487+ return -E1000_ERR_MASTER_REQUESTS_PENDING;54885488+ }54895489+54905490+ return E1000_SUCCESS;54915491+}54925492+54935493+/*******************************************************************************54945494+ *54955495+ * Check for EEPROM Auto Read bit done.54965496+ *54975497+ * hw: Struct containing variables accessed by shared code54985498+ *54995499+ * returns: - E1000_ERR_RESET if fail to reset MAC55005500+ * E1000_SUCCESS at any other case.55015501+ *55025502+ ******************************************************************************/55035503+int32_t55045504+e1000_get_auto_rd_done(struct e1000_hw *hw)55055505+{55065506+ int32_t timeout = AUTO_READ_DONE_TIMEOUT;55075507+55085508+ DEBUGFUNC("e1000_get_auto_rd_done");55095509+55105510+ switch (hw->mac_type) {55115511+ default:55125512+ msec_delay(5);55135513+ break;55145514+ case e1000_82573:55155515+ while(timeout) {55165516+ if (E1000_READ_REG(hw, EECD) & E1000_EECD_AUTO_RD) break;55175517+ else msec_delay(1);55185518+ timeout--;55195519+ }55205520+55215521+ if(!timeout) {55225522+ DEBUGOUT("Auto read by HW from EEPROM has not completed.\n");55235523+ return -E1000_ERR_RESET;55245524+ }55255525+ break;55265526+ }55275527+55285528+ return E1000_SUCCESS;55295529+}55305530+55315531+/***************************************************************************55325532+ * Checks if the PHY configuration is done55335533+ *55345534+ * hw: Struct containing variables accessed by shared code55355535+ *55365536+ * returns: - E1000_ERR_RESET if fail to reset MAC55375537+ * E1000_SUCCESS at any other case.55385538+ *55395539+ ***************************************************************************/55405540+int32_t55415541+e1000_get_phy_cfg_done(struct e1000_hw *hw)55425542+{55435543+ DEBUGFUNC("e1000_get_phy_cfg_done");55445544+55455545+ /* Simply wait for 10ms */55465546+ msec_delay(10);55475547+55485548+ return E1000_SUCCESS;55495549+}55505550+55515551+/***************************************************************************55525552+ *55535553+ * Using the combination of SMBI and SWESMBI semaphore bits when resetting55545554+ * adapter or Eeprom access.55555555+ *55565556+ * hw: Struct containing variables accessed by shared code55575557+ *55585558+ * returns: - E1000_ERR_EEPROM if fail to access EEPROM.55595559+ * E1000_SUCCESS at any other case.55605560+ *55615561+ ***************************************************************************/55625562+int32_t55635563+e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw)55645564+{55655565+ int32_t timeout;55665566+ uint32_t swsm;55675567+55685568+ DEBUGFUNC("e1000_get_hw_eeprom_semaphore");55695569+55705570+ if(!hw->eeprom_semaphore_present)55715571+ return E1000_SUCCESS;55725572+55735573+55745574+ /* Get the FW semaphore. */55755575+ timeout = hw->eeprom.word_size + 1;55765576+ while(timeout) {55775577+ swsm = E1000_READ_REG(hw, SWSM);55785578+ swsm |= E1000_SWSM_SWESMBI;55795579+ E1000_WRITE_REG(hw, SWSM, swsm);55805580+ /* if we managed to set the bit we got the semaphore. */55815581+ swsm = E1000_READ_REG(hw, SWSM);55825582+ if(swsm & E1000_SWSM_SWESMBI)55835583+ break;55845584+55855585+ udelay(50);55865586+ timeout--;55875587+ }55885588+55895589+ if(!timeout) {55905590+ /* Release semaphores */55915591+ e1000_put_hw_eeprom_semaphore(hw);55925592+ DEBUGOUT("Driver can't access the Eeprom - SWESMBI bit is set.\n");55935593+ return -E1000_ERR_EEPROM;55945594+ }55955595+55965596+ return E1000_SUCCESS;55975597+}55985598+55995599+/***************************************************************************56005600+ * This function clears HW semaphore bits.56015601+ *56025602+ * hw: Struct containing variables accessed by shared code56035603+ *56045604+ * returns: - None.56055605+ *56065606+ ***************************************************************************/56075607+void56085608+e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw)56095609+{56105610+ uint32_t swsm;56115611+56125612+ DEBUGFUNC("e1000_put_hw_eeprom_semaphore");56135613+56145614+ if(!hw->eeprom_semaphore_present)56155615+ return;56165616+56175617+ swsm = E1000_READ_REG(hw, SWSM);56185618+ /* Release both semaphores. */56195619+ swsm &= ~(E1000_SWSM_SMBI | E1000_SWSM_SWESMBI);56205620+ E1000_WRITE_REG(hw, SWSM, swsm);56215621+}56225622+56235623+/******************************************************************************56245624+ * Checks if PHY reset is blocked due to SOL/IDER session, for example.56255625+ * Returning E1000_BLK_PHY_RESET isn't necessarily an error. But it's up to56265626+ * the caller to figure out how to deal with it.56275627+ *56285628+ * hw - Struct containing variables accessed by shared code56295629+ *56305630+ * returns: - E1000_BLK_PHY_RESET56315631+ * E1000_SUCCESS56325632+ *56335633+ *****************************************************************************/56345634+int32_t56355635+e1000_check_phy_reset_block(struct e1000_hw *hw)56365636+{56375637+ uint32_t manc = 0;56385638+ if(hw->mac_type > e1000_82547_rev_2)56395639+ manc = E1000_READ_REG(hw, MANC);56405640+ return (manc & E1000_MANC_BLK_PHY_RST_ON_IDE) ?56415641+ E1000_BLK_PHY_RESET : E1000_SUCCESS;56425642+}56435643+56445644+uint8_t56455645+e1000_arc_subsystem_valid(struct e1000_hw *hw)56465646+{56475647+ uint32_t fwsm;56485648+56495649+ /* On 8257x silicon, registers in the range of 0x8800 - 0x8FFC56505650+ * may not be provided a DMA clock when no manageability features are56515651+ * enabled. We do not want to perform any reads/writes to these registers56525652+ * if this is the case. We read FWSM to determine the manageability mode.56535653+ */56545654+ switch (hw->mac_type) {56555655+ case e1000_82573:56565656+ fwsm = E1000_READ_REG(hw, FWSM);56575657+ if((fwsm & E1000_FWSM_MODE_MASK) != 0)56585658+ return TRUE;56595659+ break;56605660+ default:56615661+ break;56625662+ }56635663+ return FALSE;56645664+}56655665+56665666+63505667
+547-23
drivers/net/e1000/e1000_hw.h
···11/*******************************************************************************223344- Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.44+ Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.5566 This program is free software; you can redistribute it and/or modify it 77 under the terms of the GNU General Public License as published by the Free ···5757 e1000_82541_rev_2,5858 e1000_82547,5959 e1000_82547_rev_2,6060+ e1000_82573,6061 e1000_num_macs6162} e1000_mac_type;6263···6564 e1000_eeprom_uninitialized = 0,6665 e1000_eeprom_spi,6766 e1000_eeprom_microwire,6767+ e1000_eeprom_flash,6868 e1000_num_eeprom_types6969} e1000_eeprom_type;7070···9896 e1000_bus_type_unknown = 0,9997 e1000_bus_type_pci,10098 e1000_bus_type_pcix,9999+ e1000_bus_type_pci_express,101100 e1000_bus_type_reserved102101} e1000_bus_type;103102···110107 e1000_bus_speed_100,111108 e1000_bus_speed_120,112109 e1000_bus_speed_133,110110+ e1000_bus_speed_2500,113111 e1000_bus_speed_reserved114112} e1000_bus_speed;115113···119115 e1000_bus_width_unknown = 0,120116 e1000_bus_width_32,121117 e1000_bus_width_64,118118+ e1000_bus_width_pciex_1,119119+ e1000_bus_width_pciex_4,122120 e1000_bus_width_reserved123121} e1000_bus_width;124122···202196typedef enum {203197 e1000_phy_m88 = 0,204198 e1000_phy_igp,199199+ e1000_phy_igp_2,205200 e1000_phy_undefined = 0xFF206201} e1000_phy_type;207202···249242 uint16_t address_bits;250243 uint16_t delay_usec;251244 uint16_t page_size;245245+ boolean_t use_eerd;246246+ boolean_t use_eewr;252247};248248+249249+/* Flex ASF Information */250250+#define E1000_HOST_IF_MAX_SIZE 2048251251+252252+typedef enum {253253+ e1000_byte_align = 0,254254+ e1000_word_align = 1,255255+ e1000_dword_align = 2256256+} e1000_align_type;253257254258255259···272254#define E1000_ERR_PARAM 4273255#define E1000_ERR_MAC_TYPE 5274256#define E1000_ERR_PHY_TYPE 6257257+#define E1000_ERR_RESET 9258258+#define E1000_ERR_MASTER_REQUESTS_PENDING 10259259+#define E1000_ERR_HOST_INTERFACE_COMMAND 11260260+#define E1000_BLK_PHY_RESET 12275261276262/* Function prototypes */277263/* Initialization */278264int32_t e1000_reset_hw(struct e1000_hw *hw);279265int32_t e1000_init_hw(struct e1000_hw *hw);266266+int32_t e1000_id_led_init(struct e1000_hw * hw);280267int32_t e1000_set_mac_type(struct e1000_hw *hw);281268void e1000_set_media_type(struct e1000_hw *hw);282269···298275/* PHY */299276int32_t e1000_read_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *phy_data);300277int32_t e1000_write_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t data);301301-void e1000_phy_hw_reset(struct e1000_hw *hw);278278+int32_t e1000_phy_hw_reset(struct e1000_hw *hw);302279int32_t e1000_phy_reset(struct e1000_hw *hw);303280int32_t e1000_detect_gig_phy(struct e1000_hw *hw);304281int32_t e1000_phy_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info);···310287int32_t e1000_validate_mdi_setting(struct e1000_hw *hw);311288312289/* EEPROM Functions */313313-void e1000_init_eeprom_params(struct e1000_hw *hw);290290+int32_t e1000_init_eeprom_params(struct e1000_hw *hw);291291+boolean_t e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw);292292+int32_t e1000_read_eeprom_eerd(struct e1000_hw *hw, uint16_t offset, uint16_t words, uint16_t *data);293293+int32_t e1000_write_eeprom_eewr(struct e1000_hw *hw, uint16_t offset, uint16_t words, uint16_t *data);294294+int32_t e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd);295295+296296+/* MNG HOST IF functions */297297+uint32_t e1000_enable_mng_pass_thru(struct e1000_hw *hw);298298+299299+#define E1000_MNG_DHCP_TX_PAYLOAD_CMD 64300300+#define E1000_HI_MAX_MNG_DATA_LENGTH 0x6F8 /* Host Interface data length */301301+302302+#define E1000_MNG_DHCP_COMMAND_TIMEOUT 10 /* Time in ms to process MNG command */303303+#define E1000_MNG_DHCP_COOKIE_OFFSET 0x6F0 /* Cookie offset */304304+#define E1000_MNG_DHCP_COOKIE_LENGTH 0x10 /* Cookie length */305305+#define E1000_MNG_IAMT_MODE 0x3306306+#define E1000_IAMT_SIGNATURE 0x544D4149 /* Intel(R) Active Management Technology signature */307307+308308+#define E1000_MNG_DHCP_COOKIE_STATUS_PARSING_SUPPORT 0x1 /* DHCP parsing enabled */309309+#define E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT 0x2 /* DHCP parsing enabled */310310+#define E1000_VFTA_ENTRY_SHIFT 0x5311311+#define E1000_VFTA_ENTRY_MASK 0x7F312312+#define E1000_VFTA_ENTRY_BIT_SHIFT_MASK 0x1F313313+314314+struct e1000_host_mng_command_header {315315+ uint8_t command_id;316316+ uint8_t checksum;317317+ uint16_t reserved1;318318+ uint16_t reserved2;319319+ uint16_t command_length;320320+};321321+322322+struct e1000_host_mng_command_info {323323+ struct e1000_host_mng_command_header command_header; /* Command Head/Command Result Head has 4 bytes */324324+ uint8_t command_data[E1000_HI_MAX_MNG_DATA_LENGTH]; /* Command data can length 0..0x658*/325325+};326326+#ifdef __BIG_ENDIAN327327+struct e1000_host_mng_dhcp_cookie{328328+ uint32_t signature;329329+ uint16_t vlan_id;330330+ uint8_t reserved0;331331+ uint8_t status;332332+ uint32_t reserved1;333333+ uint8_t checksum;334334+ uint8_t reserved3;335335+ uint16_t reserved2;336336+};337337+#else338338+struct e1000_host_mng_dhcp_cookie{339339+ uint32_t signature;340340+ uint8_t status;341341+ uint8_t reserved0;342342+ uint16_t vlan_id;343343+ uint32_t reserved1;344344+ uint16_t reserved2;345345+ uint8_t reserved3;346346+ uint8_t checksum;347347+};348348+#endif349349+350350+int32_t e1000_mng_write_dhcp_info(struct e1000_hw *hw, uint8_t *buffer, 351351+ uint16_t length);352352+boolean_t e1000_check_mng_mode(struct e1000_hw *hw);353353+boolean_t e1000_enable_tx_pkt_filtering(struct e1000_hw *hw);354354+int32_t e1000_mng_enable_host_if(struct e1000_hw *hw);355355+int32_t e1000_mng_host_if_write(struct e1000_hw *hw, uint8_t *buffer,356356+ uint16_t length, uint16_t offset, uint8_t *sum);357357+int32_t e1000_mng_write_cmd_header(struct e1000_hw* hw, 358358+ struct e1000_host_mng_command_header* hdr);359359+360360+int32_t e1000_mng_write_commit(struct e1000_hw *hw);361361+314362int32_t e1000_read_eeprom(struct e1000_hw *hw, uint16_t reg, uint16_t words, uint16_t *data);315363int32_t e1000_validate_eeprom_checksum(struct e1000_hw *hw);316364int32_t e1000_update_eeprom_checksum(struct e1000_hw *hw);317365int32_t e1000_write_eeprom(struct e1000_hw *hw, uint16_t reg, uint16_t words, uint16_t *data);318366int32_t e1000_read_part_num(struct e1000_hw *hw, uint32_t * part_num);319367int32_t e1000_read_mac_addr(struct e1000_hw * hw);368368+int32_t e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask);369369+void e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask);320370321371/* Filters (multicast, vlan, receive) */322372void e1000_init_rx_addrs(struct e1000_hw *hw);···409313/* Adaptive IFS Functions */410314411315/* Everything else */412412-uint32_t e1000_enable_mng_pass_thru(struct e1000_hw *hw);413316void e1000_clear_hw_cntrs(struct e1000_hw *hw);414317void e1000_reset_adaptive(struct e1000_hw *hw);415318void e1000_update_adaptive(struct e1000_hw *hw);···425330void e1000_write_reg_io(struct e1000_hw *hw, uint32_t offset, uint32_t value);426331int32_t e1000_config_dsp_after_link_change(struct e1000_hw *hw, boolean_t link_up);427332int32_t e1000_set_d3_lplu_state(struct e1000_hw *hw, boolean_t active);333333+int32_t e1000_set_d0_lplu_state(struct e1000_hw *hw, boolean_t active);334334+void e1000_set_pci_express_master_disable(struct e1000_hw *hw);335335+void e1000_enable_pciex_master(struct e1000_hw *hw);336336+int32_t e1000_disable_pciex_master(struct e1000_hw *hw);337337+int32_t e1000_get_auto_rd_done(struct e1000_hw *hw);338338+int32_t e1000_get_phy_cfg_done(struct e1000_hw *hw);339339+int32_t e1000_get_software_semaphore(struct e1000_hw *hw);340340+void e1000_release_software_semaphore(struct e1000_hw *hw);341341+int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);342342+int32_t e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw);343343+void e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw);344344+int32_t e1000_commit_shadow_ram(struct e1000_hw *hw);345345+uint8_t e1000_arc_subsystem_valid(struct e1000_hw *hw);428346429347#define E1000_READ_REG_IO(a, reg) \430348 e1000_read_reg_io((a), E1000_##reg)···477369#define E1000_DEV_ID_82546GB_SERDES 0x107B478370#define E1000_DEV_ID_82546GB_PCIE 0x108A479371#define E1000_DEV_ID_82547EI 0x1019372372+#define E1000_DEV_ID_82573E 0x108B373373+#define E1000_DEV_ID_82573E_IAMT 0x108C374374+375375+#define E1000_DEV_ID_82546GB_QUAD_COPPER 0x1099480376481377#define NODE_ADDRESS_SIZE 6482378#define ETH_LENGTH_OF_ADDRESS 6···493381#define E1000_REVISION_0 0494382#define E1000_REVISION_1 1495383#define E1000_REVISION_2 2384384+#define E1000_REVISION_3 3496385497386#define SPEED_10 10498387#define SPEED_100 100···550437 E1000_IMS_RXSEQ | \551438 E1000_IMS_LSC)552439440440+553441/* Number of high/low register pairs in the RAR. The RAR (Receive Address554442 * Registers) holds the directed and multicast addresses that we monitor. We555443 * reserve one of these spots for our directed address, allowing us room for···571457 uint16_t special;572458};573459460460+/* Receive Descriptor - Extended */461461+union e1000_rx_desc_extended {462462+ struct {463463+ uint64_t buffer_addr;464464+ uint64_t reserved;465465+ } read;466466+ struct {467467+ struct {468468+ uint32_t mrq; /* Multiple Rx Queues */469469+ union {470470+ uint32_t rss; /* RSS Hash */471471+ struct {472472+ uint16_t ip_id; /* IP id */473473+ uint16_t csum; /* Packet Checksum */474474+ } csum_ip;475475+ } hi_dword;476476+ } lower;477477+ struct {478478+ uint32_t status_error; /* ext status/error */479479+ uint16_t length;480480+ uint16_t vlan; /* VLAN tag */481481+ } upper;482482+ } wb; /* writeback */483483+};484484+485485+#define MAX_PS_BUFFERS 4486486+/* Receive Descriptor - Packet Split */487487+union e1000_rx_desc_packet_split {488488+ struct {489489+ /* one buffer for protocol header(s), three data buffers */490490+ uint64_t buffer_addr[MAX_PS_BUFFERS];491491+ } read;492492+ struct {493493+ struct {494494+ uint32_t mrq; /* Multiple Rx Queues */495495+ union {496496+ uint32_t rss; /* RSS Hash */497497+ struct {498498+ uint16_t ip_id; /* IP id */499499+ uint16_t csum; /* Packet Checksum */500500+ } csum_ip;501501+ } hi_dword;502502+ } lower;503503+ struct {504504+ uint32_t status_error; /* ext status/error */505505+ uint16_t length0; /* length of buffer 0 */506506+ uint16_t vlan; /* VLAN tag */507507+ } middle;508508+ struct {509509+ uint16_t header_status;510510+ uint16_t length[3]; /* length of buffers 1-3 */511511+ } upper;512512+ uint64_t reserved;513513+ } wb; /* writeback */514514+};515515+574516/* Receive Decriptor bit definitions */575517#define E1000_RXD_STAT_DD 0x01 /* Descriptor Done */576518#define E1000_RXD_STAT_EOP 0x02 /* End of Packet */577519#define E1000_RXD_STAT_IXSM 0x04 /* Ignore checksum */578520#define E1000_RXD_STAT_VP 0x08 /* IEEE VLAN Packet */521521+#define E1000_RXD_STAT_UDPCS 0x10 /* UDP xsum caculated */579522#define E1000_RXD_STAT_TCPCS 0x20 /* TCP xsum calculated */580523#define E1000_RXD_STAT_IPCS 0x40 /* IP xsum calculated */581524#define E1000_RXD_STAT_PIF 0x80 /* passed in-exact filter */525525+#define E1000_RXD_STAT_IPIDV 0x200 /* IP identification valid */526526+#define E1000_RXD_STAT_UDPV 0x400 /* Valid UDP checksum */527527+#define E1000_RXD_STAT_ACK 0x8000 /* ACK Packet indication */582528#define E1000_RXD_ERR_CE 0x01 /* CRC Error */583529#define E1000_RXD_ERR_SE 0x02 /* Symbol Error */584530#define E1000_RXD_ERR_SEQ 0x04 /* Sequence Error */···648474#define E1000_RXD_ERR_RXE 0x80 /* Rx Data Error */649475#define E1000_RXD_SPC_VLAN_MASK 0x0FFF /* VLAN ID is in lower 12 bits */650476#define E1000_RXD_SPC_PRI_MASK 0xE000 /* Priority is in upper 3 bits */651651-#define E1000_RXD_SPC_PRI_SHIFT 0x000D /* Priority is in upper 3 of 16 */477477+#define E1000_RXD_SPC_PRI_SHIFT 13652478#define E1000_RXD_SPC_CFI_MASK 0x1000 /* CFI is bit 12 */653653-#define E1000_RXD_SPC_CFI_SHIFT 0x000C /* CFI is bit 12 */479479+#define E1000_RXD_SPC_CFI_SHIFT 12480480+481481+#define E1000_RXDEXT_STATERR_CE 0x01000000482482+#define E1000_RXDEXT_STATERR_SE 0x02000000483483+#define E1000_RXDEXT_STATERR_SEQ 0x04000000484484+#define E1000_RXDEXT_STATERR_CXE 0x10000000485485+#define E1000_RXDEXT_STATERR_TCPE 0x20000000486486+#define E1000_RXDEXT_STATERR_IPE 0x40000000487487+#define E1000_RXDEXT_STATERR_RXE 0x80000000488488+489489+#define E1000_RXDPS_HDRSTAT_HDRSP 0x00008000490490+#define E1000_RXDPS_HDRSTAT_HDRLEN_MASK 0x000003FF654491655492/* mask to determine if packets should be dropped due to frame errors */656493#define E1000_RXD_ERR_FRAME_ERR_MASK ( \···670485 E1000_RXD_ERR_SEQ | \671486 E1000_RXD_ERR_CXE | \672487 E1000_RXD_ERR_RXE)488488+489489+490490+/* Same mask, but for extended and packet split descriptors */491491+#define E1000_RXDEXT_ERR_FRAME_ERR_MASK ( \492492+ E1000_RXDEXT_STATERR_CE | \493493+ E1000_RXDEXT_STATERR_SE | \494494+ E1000_RXDEXT_STATERR_SEQ | \495495+ E1000_RXDEXT_STATERR_CXE | \496496+ E1000_RXDEXT_STATERR_RXE)673497674498/* Transmit Descriptor */675499struct e1000_tx_desc {···861667#define E1000_ICS 0x000C8 /* Interrupt Cause Set - WO */862668#define E1000_IMS 0x000D0 /* Interrupt Mask Set - RW */863669#define E1000_IMC 0x000D8 /* Interrupt Mask Clear - WO */670670+#define E1000_IAM 0x000E0 /* Interrupt Acknowledge Auto Mask */864671#define E1000_RCTL 0x00100 /* RX Control - RW */865672#define E1000_FCTTV 0x00170 /* Flow Control Transmit Timer Value - RW */866673#define E1000_TXCW 0x00178 /* TX Configuration Word - RW */···871676#define E1000_TBT 0x00448 /* TX Burst Timer - RW */872677#define E1000_AIT 0x00458 /* Adaptive Interframe Spacing Throttle - RW */873678#define E1000_LEDCTL 0x00E00 /* LED Control - RW */679679+#define E1000_EXTCNF_CTRL 0x00F00 /* Extended Configuration Control */680680+#define E1000_EXTCNF_SIZE 0x00F08 /* Extended Configuration Size */874681#define E1000_PBA 0x01000 /* Packet Buffer Allocation - RW */682682+#define E1000_PBS 0x01008 /* Packet Buffer Size */683683+#define E1000_EEMNGCTL 0x01010 /* MNG EEprom Control */684684+#define E1000_FLASH_UPDATES 1000685685+#define E1000_EEARBC 0x01024 /* EEPROM Auto Read Bus Control */686686+#define E1000_FLASHT 0x01028 /* FLASH Timer Register */687687+#define E1000_EEWR 0x0102C /* EEPROM Write Register - RW */688688+#define E1000_FLSWCTL 0x01030 /* FLASH control register */689689+#define E1000_FLSWDATA 0x01034 /* FLASH data register */690690+#define E1000_FLSWCNT 0x01038 /* FLASH Access Counter */691691+#define E1000_FLOP 0x0103C /* FLASH Opcode Register */692692+#define E1000_ERT 0x02008 /* Early Rx Threshold - RW */875693#define E1000_FCRTL 0x02160 /* Flow Control Receive Threshold Low - RW */876694#define E1000_FCRTH 0x02168 /* Flow Control Receive Threshold High - RW */695695+#define E1000_PSRCTL 0x02170 /* Packet Split Receive Control - RW */877696#define E1000_RDBAL 0x02800 /* RX Descriptor Base Address Low - RW */878697#define E1000_RDBAH 0x02804 /* RX Descriptor Base Address High - RW */879698#define E1000_RDLEN 0x02808 /* RX Descriptor Length - RW */···897688#define E1000_RXDCTL 0x02828 /* RX Descriptor Control - RW */898689#define E1000_RADV 0x0282C /* RX Interrupt Absolute Delay Timer - RW */899690#define E1000_RSRPD 0x02C00 /* RX Small Packet Detect - RW */691691+#define E1000_RAID 0x02C08 /* Receive Ack Interrupt Delay - RW */900692#define E1000_TXDMAC 0x03000 /* TX DMA Control - RW */901693#define E1000_TDFH 0x03410 /* TX Data FIFO Head - RW */902694#define E1000_TDFT 0x03418 /* TX Data FIFO Tail - RW */···913703#define E1000_TXDCTL 0x03828 /* TX Descriptor Control - RW */914704#define E1000_TADV 0x0382C /* TX Interrupt Absolute Delay Val - RW */915705#define E1000_TSPMT 0x03830 /* TCP Segmentation PAD & Min Threshold - RW */706706+#define E1000_TARC0 0x03840 /* TX Arbitration Count (0) */707707+#define E1000_TDBAL1 0x03900 /* TX Desc Base Address Low (1) - RW */708708+#define E1000_TDBAH1 0x03904 /* TX Desc Base Address High (1) - RW */709709+#define E1000_TDLEN1 0x03908 /* TX Desc Length (1) - RW */710710+#define E1000_TDH1 0x03910 /* TX Desc Head (1) - RW */711711+#define E1000_TDT1 0x03918 /* TX Desc Tail (1) - RW */712712+#define E1000_TXDCTL1 0x03928 /* TX Descriptor Control (1) - RW */713713+#define E1000_TARC1 0x03940 /* TX Arbitration Count (1) */916714#define E1000_CRCERRS 0x04000 /* CRC Error Count - R/clr */917715#define E1000_ALGNERRC 0x04004 /* Alignment Error Count - R/clr */918716#define E1000_SYMERRS 0x04008 /* Symbol Error Count - R/clr */···979761#define E1000_BPTC 0x040F4 /* Broadcast Packets TX Count - R/clr */980762#define E1000_TSCTC 0x040F8 /* TCP Segmentation Context TX - R/clr */981763#define E1000_TSCTFC 0x040FC /* TCP Segmentation Context TX Fail - R/clr */764764+#define E1000_IAC 0x4100 /* Interrupt Assertion Count */765765+#define E1000_ICRXPTC 0x4104 /* Interrupt Cause Rx Packet Timer Expire Count */766766+#define E1000_ICRXATC 0x4108 /* Interrupt Cause Rx Absolute Timer Expire Count */767767+#define E1000_ICTXPTC 0x410C /* Interrupt Cause Tx Packet Timer Expire Count */768768+#define E1000_ICTXATC 0x4110 /* Interrupt Cause Tx Absolute Timer Expire Count */769769+#define E1000_ICTXQEC 0x4118 /* Interrupt Cause Tx Queue Empty Count */770770+#define E1000_ICTXQMTC 0x411C /* Interrupt Cause Tx Queue Minimum Threshold Count */771771+#define E1000_ICRXDMTC 0x4120 /* Interrupt Cause Rx Descriptor Minimum Threshold Count */772772+#define E1000_ICRXOC 0x4124 /* Interrupt Cause Receiver Overrun Count */982773#define E1000_RXCSUM 0x05000 /* RX Checksum Control - RW */774774+#define E1000_RFCTL 0x05008 /* Receive Filter Control*/983775#define E1000_MTA 0x05200 /* Multicast Table Array - RW Array */984776#define E1000_RA 0x05400 /* Receive Address - RW Array */985777#define E1000_VFTA 0x05600 /* VLAN Filter Table Array - RW Array */···1007779#define E1000_FFMT 0x09000 /* Flexible Filter Mask Table - RW Array */1008780#define E1000_FFVT 0x09800 /* Flexible Filter Value Table - RW Array */1009781782782+#define E1000_GCR 0x05B00 /* PCI-Ex Control */783783+#define E1000_GSCL_1 0x05B10 /* PCI-Ex Statistic Control #1 */784784+#define E1000_GSCL_2 0x05B14 /* PCI-Ex Statistic Control #2 */785785+#define E1000_GSCL_3 0x05B18 /* PCI-Ex Statistic Control #3 */786786+#define E1000_GSCL_4 0x05B1C /* PCI-Ex Statistic Control #4 */787787+#define E1000_FACTPS 0x05B30 /* Function Active and Power State to MNG */788788+#define E1000_SWSM 0x05B50 /* SW Semaphore */789789+#define E1000_FWSM 0x05B54 /* FW Semaphore */790790+#define E1000_FFLT_DBG 0x05F04 /* Debug Register */791791+#define E1000_HICR 0x08F00 /* Host Inteface Control */1010792/* Register Set (82542)1011793 *1012794 * Some of the 82542 registers are located at different offsets than they are···1067829#define E1000_82542_VFTA 0x006001068830#define E1000_82542_LEDCTL E1000_LEDCTL1069831#define E1000_82542_PBA E1000_PBA832832+#define E1000_82542_PBS E1000_PBS833833+#define E1000_82542_EEMNGCTL E1000_EEMNGCTL834834+#define E1000_82542_EEARBC E1000_EEARBC835835+#define E1000_82542_FLASHT E1000_FLASHT836836+#define E1000_82542_EEWR E1000_EEWR837837+#define E1000_82542_FLSWCTL E1000_FLSWCTL838838+#define E1000_82542_FLSWDATA E1000_FLSWDATA839839+#define E1000_82542_FLSWCNT E1000_FLSWCNT840840+#define E1000_82542_FLOP E1000_FLOP841841+#define E1000_82542_EXTCNF_CTRL E1000_EXTCNF_CTRL842842+#define E1000_82542_EXTCNF_SIZE E1000_EXTCNF_SIZE843843+#define E1000_82542_ERT E1000_ERT1070844#define E1000_82542_RXDCTL E1000_RXDCTL1071845#define E1000_82542_RADV E1000_RADV1072846#define E1000_82542_RSRPD E1000_RSRPD···1163913#define E1000_82542_FFMT E1000_FFMT1164914#define E1000_82542_FFVT E1000_FFVT1165915#define E1000_82542_HOST_IF E1000_HOST_IF916916+#define E1000_82542_IAM E1000_IAM917917+#define E1000_82542_EEMNGCTL E1000_EEMNGCTL918918+#define E1000_82542_PSRCTL E1000_PSRCTL919919+#define E1000_82542_RAID E1000_RAID920920+#define E1000_82542_TARC0 E1000_TARC0921921+#define E1000_82542_TDBAL1 E1000_TDBAL1922922+#define E1000_82542_TDBAH1 E1000_TDBAH1923923+#define E1000_82542_TDLEN1 E1000_TDLEN1924924+#define E1000_82542_TDH1 E1000_TDH1925925+#define E1000_82542_TDT1 E1000_TDT1926926+#define E1000_82542_TXDCTL1 E1000_TXDCTL1927927+#define E1000_82542_TARC1 E1000_TARC1928928+#define E1000_82542_RFCTL E1000_RFCTL929929+#define E1000_82542_GCR E1000_GCR930930+#define E1000_82542_GSCL_1 E1000_GSCL_1931931+#define E1000_82542_GSCL_2 E1000_GSCL_2932932+#define E1000_82542_GSCL_3 E1000_GSCL_3933933+#define E1000_82542_GSCL_4 E1000_GSCL_4934934+#define E1000_82542_FACTPS E1000_FACTPS935935+#define E1000_82542_SWSM E1000_SWSM936936+#define E1000_82542_FWSM E1000_FWSM937937+#define E1000_82542_FFLT_DBG E1000_FFLT_DBG938938+#define E1000_82542_IAC E1000_IAC939939+#define E1000_82542_ICRXPTC E1000_ICRXPTC940940+#define E1000_82542_ICRXATC E1000_ICRXATC941941+#define E1000_82542_ICTXPTC E1000_ICTXPTC942942+#define E1000_82542_ICTXATC E1000_ICTXATC943943+#define E1000_82542_ICTXQEC E1000_ICTXQEC944944+#define E1000_82542_ICTXQMTC E1000_ICTXQMTC945945+#define E1000_82542_ICRXDMTC E1000_ICRXDMTC946946+#define E1000_82542_ICRXOC E1000_ICRXOC947947+#define E1000_82542_HICR E1000_HICR11669481167949/* Statistics counters collected by the MAC */1168950struct e1000_hw_stats {···1256974 uint64_t bptc;1257975 uint64_t tsctc;1258976 uint64_t tsctfc;977977+ uint64_t iac;978978+ uint64_t icrxptc;979979+ uint64_t icrxatc;980980+ uint64_t ictxptc;981981+ uint64_t ictxatc;982982+ uint64_t ictxqec;983983+ uint64_t ictxqmtc;984984+ uint64_t icrxdmtc;985985+ uint64_t icrxoc;1259986};12609871261988/* Structure containing variables used by the shared code (e1000_hw.c) */1262989struct e1000_hw {12631263- uint8_t __iomem *hw_addr;990990+ uint8_t *hw_addr;991991+ uint8_t *flash_address;1264992 e1000_mac_type mac_type;1265993 e1000_phy_type phy_type;1266994 uint32_t phy_init_script;···1285993 e1000_ms_type original_master_slave;1286994 e1000_ffe_config ffe_config_state;1287995 uint32_t asf_firmware_present;996996+ uint32_t eeprom_semaphore_present;1288997 unsigned long io_base;1289998 uint32_t phy_id;1290999 uint32_t phy_revision;···13021009 uint32_t ledctl_default;13031010 uint32_t ledctl_mode1;13041011 uint32_t ledctl_mode2;10121012+ boolean_t tx_pkt_filtering;10131013+ struct e1000_host_mng_dhcp_cookie mng_cookie;13051014 uint16_t phy_spd_default;13061015 uint16_t autoneg_advertised;13071016 uint16_t pci_cmd_word;···13421047 boolean_t adaptive_ifs;13431048 boolean_t ifs_params_forced;13441049 boolean_t in_ifs_mode;10501050+ boolean_t mng_reg_access_disabled;13451051};134610521347105313481054#define E1000_EEPROM_SWDPIN0 0x0001 /* SWDPIN 0 EEPROM Value */13491055#define E1000_EEPROM_LED_LOGIC 0x0020 /* Led Logic Word */10561056+#define E1000_EEPROM_RW_REG_DATA 16 /* Offset to data in EEPROM read/write registers */10571057+#define E1000_EEPROM_RW_REG_DONE 2 /* Offset to READ/WRITE done bit */10581058+#define E1000_EEPROM_RW_REG_START 1 /* First bit for telling part to start operation */10591059+#define E1000_EEPROM_RW_ADDR_SHIFT 2 /* Shift to the address bits */10601060+#define E1000_EEPROM_POLL_WRITE 1 /* Flag for polling for write complete */10611061+#define E1000_EEPROM_POLL_READ 0 /* Flag for polling for read complete */13501062/* Register Bit Masks */13511063/* Device Control */13521064#define E1000_CTRL_FD 0x00000001 /* Full duplex.0=half; 1=full */13531065#define E1000_CTRL_BEM 0x00000002 /* Endian Mode.0=little,1=big */13541066#define E1000_CTRL_PRIOR 0x00000004 /* Priority on PCI. 0=rx,1=fair */10671067+#define E1000_CTRL_GIO_MASTER_DISABLE 0x00000004 /*Blocks new Master requests */13551068#define E1000_CTRL_LRST 0x00000008 /* Link reset. 0=normal,1=reset */13561069#define E1000_CTRL_TME 0x00000010 /* Test mode. 0=normal,1=test */13571070#define E1000_CTRL_SLE 0x00000020 /* Serial Link on 0=dis,1=en */···13731070#define E1000_CTRL_BEM32 0x00000400 /* Big Endian 32 mode */13741071#define E1000_CTRL_FRCSPD 0x00000800 /* Force Speed */13751072#define E1000_CTRL_FRCDPX 0x00001000 /* Force Duplex */10731073+#define E1000_CTRL_D_UD_POLARITY 0x00004000 /* Defined polarity of Dock/Undock indication in SDP[0] */13761074#define E1000_CTRL_SWDPIN0 0x00040000 /* SWDPIN 0 value */13771075#define E1000_CTRL_SWDPIN1 0x00080000 /* SWDPIN 1 value */13781076#define E1000_CTRL_SWDPIN2 0x00100000 /* SWDPIN 2 value */···13931089#define E1000_STATUS_FD 0x00000001 /* Full duplex.0=half,1=full */13941090#define E1000_STATUS_LU 0x00000002 /* Link up.0=no,1=link */13951091#define E1000_STATUS_FUNC_MASK 0x0000000C /* PCI Function Mask */10921092+#define E1000_STATUS_FUNC_SHIFT 213961093#define E1000_STATUS_FUNC_0 0x00000000 /* Function 0 */13971094#define E1000_STATUS_FUNC_1 0x00000004 /* Function 1 */13981095#define E1000_STATUS_TXOFF 0x00000010 /* transmission paused */···14031098#define E1000_STATUS_SPEED_100 0x00000040 /* Speed 100Mb/s */14041099#define E1000_STATUS_SPEED_1000 0x00000080 /* Speed 1000Mb/s */14051100#define E1000_STATUS_ASDV 0x00000300 /* Auto speed detect value */11011101+#define E1000_STATUS_DOCK_CI 0x00000800 /* Change in Dock/Undock state. Clear on write '0'. */11021102+#define E1000_STATUS_GIO_MASTER_ENABLE 0x00080000 /* Status of Master requests. */14061103#define E1000_STATUS_MTXCKOK 0x00000400 /* MTX clock running OK */14071104#define E1000_STATUS_PCI66 0x00000800 /* In 66Mhz slot */14081105#define E1000_STATUS_BUS64 0x00001000 /* In 64 bit slot */···14351128#ifndef E1000_EEPROM_GRANT_ATTEMPTS14361129#define E1000_EEPROM_GRANT_ATTEMPTS 1000 /* EEPROM # attempts to gain grant */14371130#endif11311131+#define E1000_EECD_AUTO_RD 0x00000200 /* EEPROM Auto Read done */11321132+#define E1000_EECD_SIZE_EX_MASK 0x00007800 /* EEprom Size */11331133+#define E1000_EECD_SIZE_EX_SHIFT 1111341134+#define E1000_EECD_NVADDS 0x00018000 /* NVM Address Size */11351135+#define E1000_EECD_SELSHAD 0x00020000 /* Select Shadow RAM */11361136+#define E1000_EECD_INITSRAM 0x00040000 /* Initialize Shadow RAM */11371137+#define E1000_EECD_FLUPD 0x00080000 /* Update FLASH */11381138+#define E1000_EECD_AUPDEN 0x00100000 /* Enable Autonomous FLASH update */11391139+#define E1000_EECD_SHADV 0x00200000 /* Shadow RAM Data Valid */11401140+#define E1000_EECD_SEC1VAL 0x00400000 /* Sector One Valid */11411141+#define E1000_STM_OPCODE 0xDB0011421142+#define E1000_HICR_FW_RESET 0xC01438114314391144/* EEPROM Read */14401145#define E1000_EERD_START 0x00000001 /* Start Read */···14901171#define E1000_CTRL_EXT_WR_WMARK_320 0x0100000014911172#define E1000_CTRL_EXT_WR_WMARK_384 0x0200000014921173#define E1000_CTRL_EXT_WR_WMARK_448 0x0300000011741174+#define E1000_CTRL_EXT_IAME 0x08000000 /* Interrupt acknowledge Auto-mask */11751175+#define E1000_CTRL_EXT_INT_TIMER_CLR 0x20000000 /* Clear Interrupt timers after IMS clear */1493117614941177/* MDI Control */14951178#define E1000_MDIC_DATA_MASK 0x0000FFFF···15081187/* LED Control */15091188#define E1000_LEDCTL_LED0_MODE_MASK 0x0000000F15101189#define E1000_LEDCTL_LED0_MODE_SHIFT 011901190+#define E1000_LEDCTL_LED0_BLINK_RATE 0x000002015111191#define E1000_LEDCTL_LED0_IVRT 0x0000004015121192#define E1000_LEDCTL_LED0_BLINK 0x0000008015131193#define E1000_LEDCTL_LED1_MODE_MASK 0x00000F0015141194#define E1000_LEDCTL_LED1_MODE_SHIFT 811951195+#define E1000_LEDCTL_LED1_BLINK_RATE 0x000200015151196#define E1000_LEDCTL_LED1_IVRT 0x0000400015161197#define E1000_LEDCTL_LED1_BLINK 0x0000800015171198#define E1000_LEDCTL_LED2_MODE_MASK 0x000F000015181199#define E1000_LEDCTL_LED2_MODE_SHIFT 1612001200+#define E1000_LEDCTL_LED2_BLINK_RATE 0x0020000015191201#define E1000_LEDCTL_LED2_IVRT 0x0040000015201202#define E1000_LEDCTL_LED2_BLINK 0x0080000015211203#define E1000_LEDCTL_LED3_MODE_MASK 0x0F000000···15621238#define E1000_ICR_GPI_EN3 0x00004000 /* GP Int 3 */15631239#define E1000_ICR_TXD_LOW 0x0000800015641240#define E1000_ICR_SRPD 0x0001000012411241+#define E1000_ICR_ACK 0x00020000 /* Receive Ack frame */12421242+#define E1000_ICR_MNG 0x00040000 /* Manageability event */12431243+#define E1000_ICR_DOCK 0x00080000 /* Dock/Undock */12441244+#define E1000_ICR_INT_ASSERTED 0x80000000 /* If this bit asserted, the driver should claim the interrupt */1565124515661246/* Interrupt Cause Set */15671247#define E1000_ICS_TXDW E1000_ICR_TXDW /* Transmit desc written back */···15831255#define E1000_ICS_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */15841256#define E1000_ICS_TXD_LOW E1000_ICR_TXD_LOW15851257#define E1000_ICS_SRPD E1000_ICR_SRPD12581258+#define E1000_ICS_ACK E1000_ICR_ACK /* Receive Ack frame */12591259+#define E1000_ICS_MNG E1000_ICR_MNG /* Manageability event */12601260+#define E1000_ICS_DOCK E1000_ICR_DOCK /* Dock/Undock */1586126115871262/* Interrupt Mask Set */15881263#define E1000_IMS_TXDW E1000_ICR_TXDW /* Transmit desc written back */···16031272#define E1000_IMS_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */16041273#define E1000_IMS_TXD_LOW E1000_ICR_TXD_LOW16051274#define E1000_IMS_SRPD E1000_ICR_SRPD12751275+#define E1000_IMS_ACK E1000_ICR_ACK /* Receive Ack frame */12761276+#define E1000_IMS_MNG E1000_ICR_MNG /* Manageability event */12771277+#define E1000_IMS_DOCK E1000_ICR_DOCK /* Dock/Undock */1606127816071279/* Interrupt Mask Clear */16081280#define E1000_IMC_TXDW E1000_ICR_TXDW /* Transmit desc written back */···16231289#define E1000_IMC_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */16241290#define E1000_IMC_TXD_LOW E1000_ICR_TXD_LOW16251291#define E1000_IMC_SRPD E1000_ICR_SRPD12921292+#define E1000_IMC_ACK E1000_ICR_ACK /* Receive Ack frame */12931293+#define E1000_IMC_MNG E1000_ICR_MNG /* Manageability event */12941294+#define E1000_IMC_DOCK E1000_ICR_DOCK /* Dock/Undock */1626129516271296/* Receive Control */16281297#define E1000_RCTL_RST 0x00000001 /* Software reset */···16381301#define E1000_RCTL_LBM_MAC 0x00000040 /* MAC loopback mode */16391302#define E1000_RCTL_LBM_SLP 0x00000080 /* serial link loopback mode */16401303#define E1000_RCTL_LBM_TCVR 0x000000C0 /* tcvr loopback mode */13041304+#define E1000_RCTL_DTYP_MASK 0x00000C00 /* Descriptor type mask */13051305+#define E1000_RCTL_DTYP_PS 0x00000400 /* Packet Split descriptor */16411306#define E1000_RCTL_RDMTS_HALF 0x00000000 /* rx desc min threshold size */16421307#define E1000_RCTL_RDMTS_QUAT 0x00000100 /* rx desc min threshold size */16431308#define E1000_RCTL_RDMTS_EIGTH 0x00000200 /* rx desc min threshold size */···16661327#define E1000_RCTL_PMCF 0x00800000 /* pass MAC control frames */16671328#define E1000_RCTL_BSEX 0x02000000 /* Buffer size extension */16681329#define E1000_RCTL_SECRC 0x04000000 /* Strip Ethernet CRC */13301330+#define E1000_RCTL_FLXBUF_MASK 0x78000000 /* Flexible buffer size */13311331+#define E1000_RCTL_FLXBUF_SHIFT 27 /* Flexible buffer shift */13321332+13331333+/* Use byte values for the following shift parameters13341334+ * Usage:13351335+ * psrctl |= (((ROUNDUP(value0, 128) >> E1000_PSRCTL_BSIZE0_SHIFT) &13361336+ * E1000_PSRCTL_BSIZE0_MASK) |13371337+ * ((ROUNDUP(value1, 1024) >> E1000_PSRCTL_BSIZE1_SHIFT) &13381338+ * E1000_PSRCTL_BSIZE1_MASK) |13391339+ * ((ROUNDUP(value2, 1024) << E1000_PSRCTL_BSIZE2_SHIFT) &13401340+ * E1000_PSRCTL_BSIZE2_MASK) |13411341+ * ((ROUNDUP(value3, 1024) << E1000_PSRCTL_BSIZE3_SHIFT) |;13421342+ * E1000_PSRCTL_BSIZE3_MASK))13431343+ * where value0 = [128..16256], default=25613441344+ * value1 = [1024..64512], default=409613451345+ * value2 = [0..64512], default=409613461346+ * value3 = [0..64512], default=013471347+ */13481348+13491349+#define E1000_PSRCTL_BSIZE0_MASK 0x0000007F13501350+#define E1000_PSRCTL_BSIZE1_MASK 0x00003F0013511351+#define E1000_PSRCTL_BSIZE2_MASK 0x003F000013521352+#define E1000_PSRCTL_BSIZE3_MASK 0x3F00000013531353+13541354+#define E1000_PSRCTL_BSIZE0_SHIFT 7 /* Shift _right_ 7 */13551355+#define E1000_PSRCTL_BSIZE1_SHIFT 2 /* Shift _right_ 2 */13561356+#define E1000_PSRCTL_BSIZE2_SHIFT 6 /* Shift _left_ 6 */13571357+#define E1000_PSRCTL_BSIZE3_SHIFT 14 /* Shift _left_ 14 */1669135816701359/* Receive Descriptor */16711360#define E1000_RDT_DELAY 0x0000ffff /* Delay timer (1=1024us) */···17081341#define E1000_FCRTL_RTL 0x0000FFF8 /* Mask Bits[15:3] for RTL */17091342#define E1000_FCRTL_XONE 0x80000000 /* Enable XON frame transmission */1710134313441344+/* Header split receive */13451345+#define E1000_RFCTL_ISCSI_DIS 0x0000000113461346+#define E1000_RFCTL_ISCSI_DWC_MASK 0x0000003E13471347+#define E1000_RFCTL_ISCSI_DWC_SHIFT 113481348+#define E1000_RFCTL_NFSW_DIS 0x0000004013491349+#define E1000_RFCTL_NFSR_DIS 0x0000008013501350+#define E1000_RFCTL_NFS_VER_MASK 0x0000030013511351+#define E1000_RFCTL_NFS_VER_SHIFT 813521352+#define E1000_RFCTL_IPV6_DIS 0x0000040013531353+#define E1000_RFCTL_IPV6_XSUM_DIS 0x0000080013541354+#define E1000_RFCTL_ACK_DIS 0x0000100013551355+#define E1000_RFCTL_ACKD_DIS 0x0000200013561356+#define E1000_RFCTL_IPFRSP_DIS 0x0000400013571357+#define E1000_RFCTL_EXTEN 0x0000800013581358+#define E1000_RFCTL_IPV6_EX_DIS 0x0001000013591359+#define E1000_RFCTL_NEW_IPV6_EXT_DIS 0x0002000013601360+17111361/* Receive Descriptor Control */17121362#define E1000_RXDCTL_PTHRESH 0x0000003F /* RXDCTL Prefetch Threshold */17131363#define E1000_RXDCTL_HTHRESH 0x00003F00 /* RXDCTL Host Threshold */···17381354#define E1000_TXDCTL_GRAN 0x01000000 /* TXDCTL Granularity */17391355#define E1000_TXDCTL_LWTHRESH 0xFE000000 /* TXDCTL Low Threshold */17401356#define E1000_TXDCTL_FULL_TX_DESC_WB 0x01010000 /* GRAN=1, WTHRESH=1 */13571357+#define E1000_TXDCTL_COUNT_DESC 0x00400000 /* Enable the counting of desc.13581358+ still to be processed. */1741135917421360/* Transmit Configuration Word */17431361#define E1000_TXCW_FD 0x00000020 /* TXCW full duplex */···17731387#define E1000_TCTL_PBE 0x00800000 /* Packet Burst Enable */17741388#define E1000_TCTL_RTLC 0x01000000 /* Re-transmit on late collision */17751389#define E1000_TCTL_NRTU 0x02000000 /* No Re-transmit on underrun */13901390+#define E1000_TCTL_MULR 0x10000000 /* Multiple request support */1776139117771392/* Receive Checksum Control */17781393#define E1000_RXCSUM_PCSS_MASK 0x000000FF /* Packet Checksum Start */17791394#define E1000_RXCSUM_IPOFL 0x00000100 /* IPv4 checksum offload */17801395#define E1000_RXCSUM_TUOFL 0x00000200 /* TCP / UDP checksum offload */17811396#define E1000_RXCSUM_IPV6OFL 0x00000400 /* IPv6 checksum offload */13971397+#define E1000_RXCSUM_IPPCSE 0x00001000 /* IP payload checksum enable */13981398+#define E1000_RXCSUM_PCSD 0x00002000 /* packet checksum disabled */13991399+1782140017831401/* Definitions for power management and wakeup registers */17841402/* Wake Up Control */···18011411#define E1000_WUFC_ARP 0x00000020 /* ARP Request Packet Wakeup Enable */18021412#define E1000_WUFC_IPV4 0x00000040 /* Directed IPv4 Packet Wakeup Enable */18031413#define E1000_WUFC_IPV6 0x00000080 /* Directed IPv6 Packet Wakeup Enable */14141414+#define E1000_WUFC_IGNORE_TCO 0x00008000 /* Ignore WakeOn TCO packets */18041415#define E1000_WUFC_FLX0 0x00010000 /* Flexible Filter 0 Enable */18051416#define E1000_WUFC_FLX1 0x00020000 /* Flexible Filter 1 Enable */18061417#define E1000_WUFC_FLX2 0x00040000 /* Flexible Filter 2 Enable */···18371446#define E1000_MANC_ARP_EN 0x00002000 /* Enable ARP Request Filtering */18381447#define E1000_MANC_NEIGHBOR_EN 0x00004000 /* Enable Neighbor Discovery18391448 * Filtering */14491449+#define E1000_MANC_ARP_RES_EN 0x00008000 /* Enable ARP response Filtering */18401450#define E1000_MANC_TCO_RESET 0x00010000 /* TCO Reset Occurred */18411451#define E1000_MANC_RCV_TCO_EN 0x00020000 /* Receive TCO Packets Enabled */18421452#define E1000_MANC_REPORT_STATUS 0x00040000 /* Status Reporting Enabled */14531453+#define E1000_MANC_BLK_PHY_RST_ON_IDE 0x00040000 /* Block phy resets */18431454#define E1000_MANC_EN_MAC_ADDR_FILTER 0x00100000 /* Enable MAC address18441455 * filtering */18451456#define E1000_MANC_EN_MNG2HOST 0x00200000 /* Enable MNG packets to host18461457 * memory */14581458+#define E1000_MANC_EN_IP_ADDR_FILTER 0x00400000 /* Enable IP address14591459+ * filtering */14601460+#define E1000_MANC_EN_XSUM_FILTER 0x00800000 /* Enable checksum filtering */14611461+#define E1000_MANC_BR_EN 0x01000000 /* Enable broadcast filtering */18471462#define E1000_MANC_SMB_REQ 0x01000000 /* SMBus Request */18481463#define E1000_MANC_SMB_GNT 0x02000000 /* SMBus Grant */18491464#define E1000_MANC_SMB_CLK_IN 0x04000000 /* SMBus Clock In */···18601463#define E1000_MANC_SMB_DATA_OUT_SHIFT 28 /* SMBus Data Out Shift */18611464#define E1000_MANC_SMB_CLK_OUT_SHIFT 29 /* SMBus Clock Out Shift */1862146514661466+/* SW Semaphore Register */14671467+#define E1000_SWSM_SMBI 0x00000001 /* Driver Semaphore bit */14681468+#define E1000_SWSM_SWESMBI 0x00000002 /* FW Semaphore bit */14691469+#define E1000_SWSM_WMNG 0x00000004 /* Wake MNG Clock */14701470+#define E1000_SWSM_DRV_LOAD 0x00000008 /* Driver Loaded Bit */14711471+14721472+/* FW Semaphore Register */14731473+#define E1000_FWSM_MODE_MASK 0x0000000E /* FW mode */14741474+#define E1000_FWSM_MODE_SHIFT 114751475+#define E1000_FWSM_FW_VALID 0x00008000 /* FW established a valid mode */14761476+14771477+/* FFLT Debug Register */14781478+#define E1000_FFLT_DBG_INVC 0x00100000 /* Invalid /C/ code handling */14791479+14801480+typedef enum {14811481+ e1000_mng_mode_none = 0,14821482+ e1000_mng_mode_asf,14831483+ e1000_mng_mode_pt,14841484+ e1000_mng_mode_ipmi,14851485+ e1000_mng_mode_host_interface_only14861486+} e1000_mng_mode;14871487+14881488+/* Host Inteface Control Register */14891489+#define E1000_HICR_EN 0x00000001 /* Enable Bit - RO */14901490+#define E1000_HICR_C 0x00000002 /* Driver sets this bit when done14911491+ * to put command in RAM */14921492+#define E1000_HICR_SV 0x00000004 /* Status Validity */14931493+#define E1000_HICR_FWR 0x00000080 /* FW reset. Set by the Host */14941494+14951495+/* Host Interface Command Interface - Address range 0x8800-0x8EFF */14961496+#define E1000_HI_MAX_DATA_LENGTH 252 /* Host Interface data length */14971497+#define E1000_HI_MAX_BLOCK_BYTE_LENGTH 1792 /* Number of bytes in range */14981498+#define E1000_HI_MAX_BLOCK_DWORD_LENGTH 448 /* Number of dwords in range */14991499+#define E1000_HI_COMMAND_TIMEOUT 500 /* Time in ms to process HI command */15001500+15011501+struct e1000_host_command_header {15021502+ uint8_t command_id;15031503+ uint8_t command_length;15041504+ uint8_t command_options; /* I/F bits for command, status for return */15051505+ uint8_t checksum;15061506+};15071507+struct e1000_host_command_info {15081508+ struct e1000_host_command_header command_header; /* Command Head/Command Result Head has 4 bytes */15091509+ uint8_t command_data[E1000_HI_MAX_DATA_LENGTH]; /* Command data can length 0..252 */15101510+};15111511+15121512+/* Host SMB register #0 */15131513+#define E1000_HSMC0R_CLKIN 0x00000001 /* SMB Clock in */15141514+#define E1000_HSMC0R_DATAIN 0x00000002 /* SMB Data in */15151515+#define E1000_HSMC0R_DATAOUT 0x00000004 /* SMB Data out */15161516+#define E1000_HSMC0R_CLKOUT 0x00000008 /* SMB Clock out */15171517+15181518+/* Host SMB register #1 */15191519+#define E1000_HSMC1R_CLKIN E1000_HSMC0R_CLKIN15201520+#define E1000_HSMC1R_DATAIN E1000_HSMC0R_DATAIN15211521+#define E1000_HSMC1R_DATAOUT E1000_HSMC0R_DATAOUT15221522+#define E1000_HSMC1R_CLKOUT E1000_HSMC0R_CLKOUT15231523+15241524+/* FW Status Register */15251525+#define E1000_FWSTS_FWS_MASK 0x000000FF /* FW Status */15261526+18631527/* Wake Up Packet Length */18641528#define E1000_WUPL_LENGTH_MASK 0x0FFF /* Only the lower 12 bits are valid */1865152918661530#define E1000_MDALIGN 409615311531+15321532+#define E1000_GCR_BEM32 0x0040000015331533+/* Function Active and Power State to MNG */15341534+#define E1000_FACTPS_FUNC0_POWER_STATE_MASK 0x0000000315351535+#define E1000_FACTPS_LAN0_VALID 0x0000000415361536+#define E1000_FACTPS_FUNC0_AUX_EN 0x0000000815371537+#define E1000_FACTPS_FUNC1_POWER_STATE_MASK 0x000000C015381538+#define E1000_FACTPS_FUNC1_POWER_STATE_SHIFT 615391539+#define E1000_FACTPS_LAN1_VALID 0x0000010015401540+#define E1000_FACTPS_FUNC1_AUX_EN 0x0000020015411541+#define E1000_FACTPS_FUNC2_POWER_STATE_MASK 0x0000300015421542+#define E1000_FACTPS_FUNC2_POWER_STATE_SHIFT 1215431543+#define E1000_FACTPS_IDE_ENABLE 0x0000400015441544+#define E1000_FACTPS_FUNC2_AUX_EN 0x0000800015451545+#define E1000_FACTPS_FUNC3_POWER_STATE_MASK 0x000C000015461546+#define E1000_FACTPS_FUNC3_POWER_STATE_SHIFT 1815471547+#define E1000_FACTPS_SP_ENABLE 0x0010000015481548+#define E1000_FACTPS_FUNC3_AUX_EN 0x0020000015491549+#define E1000_FACTPS_FUNC4_POWER_STATE_MASK 0x0300000015501550+#define E1000_FACTPS_FUNC4_POWER_STATE_SHIFT 2415511551+#define E1000_FACTPS_IPMI_ENABLE 0x0400000015521552+#define E1000_FACTPS_FUNC4_AUX_EN 0x0800000015531553+#define E1000_FACTPS_MNGCG 0x2000000015541554+#define E1000_FACTPS_LAN_FUNC_SEL 0x4000000015551555+#define E1000_FACTPS_PM_STATE_CHANGED 0x800000001867155618681557/* EEPROM Commands - Microwire */18691558#define EEPROM_READ_OPCODE_MICROWIRE 0x6 /* EEPROM read opcode */···1960147719611478/* EEPROM Commands - SPI */19621479#define EEPROM_MAX_RETRY_SPI 5000 /* Max wait of 5ms, for RDY signal */19631963-#define EEPROM_READ_OPCODE_SPI 0x3 /* EEPROM read opcode */19641964-#define EEPROM_WRITE_OPCODE_SPI 0x2 /* EEPROM write opcode */19651965-#define EEPROM_A8_OPCODE_SPI 0x8 /* opcode bit-3 = address bit-8 */19661966-#define EEPROM_WREN_OPCODE_SPI 0x6 /* EEPROM set Write Enable latch */19671967-#define EEPROM_WRDI_OPCODE_SPI 0x4 /* EEPROM reset Write Enable latch */19681968-#define EEPROM_RDSR_OPCODE_SPI 0x5 /* EEPROM read Status register */19691969-#define EEPROM_WRSR_OPCODE_SPI 0x1 /* EEPROM write Status register */14801480+#define EEPROM_READ_OPCODE_SPI 0x03 /* EEPROM read opcode */14811481+#define EEPROM_WRITE_OPCODE_SPI 0x02 /* EEPROM write opcode */14821482+#define EEPROM_A8_OPCODE_SPI 0x08 /* opcode bit-3 = address bit-8 */14831483+#define EEPROM_WREN_OPCODE_SPI 0x06 /* EEPROM set Write Enable latch */14841484+#define EEPROM_WRDI_OPCODE_SPI 0x04 /* EEPROM reset Write Enable latch */14851485+#define EEPROM_RDSR_OPCODE_SPI 0x05 /* EEPROM read Status register */14861486+#define EEPROM_WRSR_OPCODE_SPI 0x01 /* EEPROM write Status register */14871487+#define EEPROM_ERASE4K_OPCODE_SPI 0x20 /* EEPROM ERASE 4KB */14881488+#define EEPROM_ERASE64K_OPCODE_SPI 0xD8 /* EEPROM ERASE 64KB */14891489+#define EEPROM_ERASE256_OPCODE_SPI 0xDB /* EEPROM ERASE 256B */1970149019711491/* EEPROM Size definitions */19721972-#define EEPROM_SIZE_16KB 0x180019731973-#define EEPROM_SIZE_8KB 0x140019741974-#define EEPROM_SIZE_4KB 0x100019751975-#define EEPROM_SIZE_2KB 0x0C0019761976-#define EEPROM_SIZE_1KB 0x080019771977-#define EEPROM_SIZE_512B 0x040019781978-#define EEPROM_SIZE_128B 0x000014921492+#define EEPROM_WORD_SIZE_SHIFT 614931493+#define EEPROM_SIZE_SHIFT 1019791494#define EEPROM_SIZE_MASK 0x1C001980149519811496/* EEPROM Word Offsets */···20871606#define IFS_MIN 4020881607#define IFS_RATIO 42089160816091609+/* Extended Configuration Control and Size */16101610+#define E1000_EXTCNF_CTRL_PCIE_WRITE_ENABLE 0x0000000116111611+#define E1000_EXTCNF_CTRL_PHY_WRITE_ENABLE 0x0000000216121612+#define E1000_EXTCNF_CTRL_D_UD_ENABLE 0x0000000416131613+#define E1000_EXTCNF_CTRL_D_UD_LATENCY 0x0000000816141614+#define E1000_EXTCNF_CTRL_D_UD_OWNER 0x0000001016151615+#define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x0000002016161616+#define E1000_EXTCNF_CTRL_MDIO_HW_OWNERSHIP 0x0000004016171617+#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER 0x1FFF000016181618+16191619+#define E1000_EXTCNF_SIZE_EXT_PHY_LENGTH 0x000000FF16201620+#define E1000_EXTCNF_SIZE_EXT_DOCK_LENGTH 0x0000FF0016211621+#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH 0x00FF000016221622+20901623/* PBA constants */16241624+#define E1000_PBA_12K 0x000C /* 12KB, default Rx allocation */20911625#define E1000_PBA_16K 0x0010 /* 16KB, default TX allocation */20921626#define E1000_PBA_22K 0x001620931627#define E1000_PBA_24K 0x0018···2158166221591663/* Number of milliseconds we wait for auto-negotiation to complete */21601664#define LINK_UP_TIMEOUT 50016651665+16661666+/* Number of 100 microseconds we wait for PCI Express master disable */16671667+#define MASTER_DISABLE_TIMEOUT 80016681668+/* Number of milliseconds we wait for Eeprom auto read bit done after MAC reset */16691669+#define AUTO_READ_DONE_TIMEOUT 1016701670+/* Number of milliseconds we wait for PHY configuration done after MAC reset */16711671+#define PHY_CFG_TIMEOUT 402161167221621673#define E1000_TX_BUFFER_SIZE ((uint32_t)1514)21631674···22661763#define IGP01E1000_PHY_LINK_HEALTH 0x13 /* PHY Link Health Register */22671764#define IGP01E1000_GMII_FIFO 0x14 /* GMII FIFO Register */22681765#define IGP01E1000_PHY_CHANNEL_QUALITY 0x15 /* PHY Channel Quality Register */17661766+#define IGP02E1000_PHY_POWER_MGMT 0x1922691767#define IGP01E1000_PHY_PAGE_SELECT 0x1F /* PHY Page Select Core Register */2270176822711769/* IGP01E1000 AGC Registers - stores the cable length values*/···22751771#define IGP01E1000_PHY_AGC_C 0x147222761772#define IGP01E1000_PHY_AGC_D 0x18722277177317741774+/* IGP02E1000 AGC Registers for cable length values */17751775+#define IGP02E1000_PHY_AGC_A 0x11B117761776+#define IGP02E1000_PHY_AGC_B 0x12B117771777+#define IGP02E1000_PHY_AGC_C 0x14B117781778+#define IGP02E1000_PHY_AGC_D 0x18B117791779+22781780/* IGP01E1000 DSP Reset Register */22791781#define IGP01E1000_PHY_DSP_RESET 0x1F3322801782#define IGP01E1000_PHY_DSP_SET 0x1F7122811783#define IGP01E1000_PHY_DSP_FFE 0x1F352282178422831785#define IGP01E1000_PHY_CHANNEL_NUM 417861786+#define IGP02E1000_PHY_CHANNEL_NUM 417871787+22841788#define IGP01E1000_PHY_AGC_PARAM_A 0x117122851789#define IGP01E1000_PHY_AGC_PARAM_B 0x127122861790#define IGP01E1000_PHY_AGC_PARAM_C 0x1471···25722060#define IGP01E1000_MSE_CHANNEL_B 0x0F0025732061#define IGP01E1000_MSE_CHANNEL_A 0xF0002574206220632063+#define IGP02E1000_PM_SPD 0x0001 /* Smart Power Down */20642064+#define IGP02E1000_PM_D3_LPLU 0x0004 /* Enable LPLU in non-D0a modes */20652065+#define IGP02E1000_PM_D0_LPLU 0x0002 /* Enable LPLU in D0a mode */20662066+25752067/* IGP01E1000 DSP reset macros */25762068#define DSP_RESET_ENABLE 0x025772069#define DSP_RESET_DISABLE 0x225782070#define E1000_MAX_DSP_RESETS 102579207125802580-/* IGP01E1000 AGC Registers */20722072+/* IGP01E1000 & IGP02E1000 AGC Registers */2581207325822074#define IGP01E1000_AGC_LENGTH_SHIFT 7 /* Coarse - 13:11, Fine - 10:7 */20752075+#define IGP02E1000_AGC_LENGTH_SHIFT 9 /* Coarse - 15:13, Fine - 12:9 */20762076+20772077+/* IGP02E1000 AGC Register Length 9-bit mask */20782078+#define IGP02E1000_AGC_LENGTH_MASK 0x7F2583207925842080/* 7 bits (3 Coarse + 4 Fine) --> 128 optional values */25852081#define IGP01E1000_AGC_LENGTH_TABLE_SIZE 12820822082+#define IGP02E1000_AGC_LENGTH_TABLE_SIZE 1282586208325872587-/* The precision of the length is +/- 10 meters */20842084+/* The precision error of the cable length is +/- 10 meters */25882085#define IGP01E1000_AGC_RANGE 1020862086+#define IGP02E1000_AGC_RANGE 102589208725902088/* IGP01E1000 PCS Initialization register */25912089/* bits 3:6 in the PCS registers stores the channels polarity */···26352113#define M88E1000_12_PHY_ID M88E1000_E_PHY_ID26362114#define M88E1000_14_PHY_ID M88E1000_E_PHY_ID26372115#define M88E1011_I_REV_4 0x0421162116+#define M88E1111_I_PHY_ID 0x01410CC021172117+#define L1LXT971A_PHY_ID 0x001378E02638211826392119/* Miscellaneous PHY bit definitions. */26402120#define PHY_PREAMBLE 0xFFFFFFFF
+896-261
drivers/net/e1000/e1000_main.c
···11/*******************************************************************************223344- Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.44+ Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.5566 This program is free software; you can redistribute it and/or modify it 77 under the terms of the GNU General Public License as published by the Free ···2929#include "e1000.h"30303131/* Change Log3232- * 5.3.12 6/7/043333- * - kcompat NETIF_MSG for older kernels (2.4.9) <sean.p.mcdermott@intel.com>3434- * - if_mii support and associated kcompat for older kernels3535- * - More errlogging support from Jon Mason <jonmason@us.ibm.com>3636- * - Fix TSO issues on PPC64 machines -- Jon Mason <jonmason@us.ibm.com>3737- *3838- * 5.7.1 12/16/043939- * - Resurrect 82547EI/GI related fix in e1000_intr to avoid deadlocks. This4040- * fix was removed as it caused system instability. The suspected cause of 4141- * this is the called to e1000_irq_disable in e1000_intr. Inlined the 4242- * required piece of e1000_irq_disable into e1000_intr - Anton Blanchard4343- * 5.7.0 12/10/044444- * - include fix to the condition that determines when to quit NAPI - Robert Olsson4545- * - use netif_poll_{disable/enable} to synchronize between NAPI and i/f up/down4646- * 5.6.5 11/01/044747- * - Enabling NETIF_F_SG without checksum offload is illegal - 4848- John Mason <jdmason@us.ibm.com>4949- * 5.6.3 10/26/045050- * - Remove redundant initialization - Jamal Hadi5151- * - Reset buffer_info->dma in tx resource cleanup logic5252- * 5.6.2 10/12/045353- * - Avoid filling tx_ring completely - shemminger@osdl.org5454- * - Replace schedule_timeout() with msleep()/msleep_interruptible() -5555- * nacc@us.ibm.com5656- * - Sparse cleanup - shemminger@osdl.org5757- * - Fix tx resource cleanup logic5858- * - LLTX support - ak@suse.de and hadi@cyberus.ca3232+ * 6.0.44+ 2/15/053333+ * o applied Anton's patch to resolve tx hang in hardware3434+ * o Applied Andrew Mortons patch - e1000 stops working after resume5935 */60366137char e1000_driver_name[] = "e1000";···4165#else4266#define DRIVERNAPI "-NAPI"4367#endif4444-#define DRV_VERSION "5.7.6-k2"DRIVERNAPI6868+#define DRV_VERSION "6.0.54-k2"DRIVERNAPI4569char e1000_driver_version[] = DRV_VERSION;4670char e1000_copyright[] = "Copyright (c) 1999-2004 Intel Corporation.";4771···7296 INTEL_E1000_ETHERNET_DEVICE(0x1017),7397 INTEL_E1000_ETHERNET_DEVICE(0x1018),7498 INTEL_E1000_ETHERNET_DEVICE(0x1019),9999+ INTEL_E1000_ETHERNET_DEVICE(0x101A),75100 INTEL_E1000_ETHERNET_DEVICE(0x101D),76101 INTEL_E1000_ETHERNET_DEVICE(0x101E),77102 INTEL_E1000_ETHERNET_DEVICE(0x1026),···87110 INTEL_E1000_ETHERNET_DEVICE(0x107B),88111 INTEL_E1000_ETHERNET_DEVICE(0x107C),89112 INTEL_E1000_ETHERNET_DEVICE(0x108A),113113+ INTEL_E1000_ETHERNET_DEVICE(0x108B),114114+ INTEL_E1000_ETHERNET_DEVICE(0x108C),115115+ INTEL_E1000_ETHERNET_DEVICE(0x1099),90116 /* required last entry */91117 {0,}92118};···135155static int e1000_clean(struct net_device *netdev, int *budget);136156static boolean_t e1000_clean_rx_irq(struct e1000_adapter *adapter,137157 int *work_done, int work_to_do);158158+static boolean_t e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,159159+ int *work_done, int work_to_do);138160#else139161static boolean_t e1000_clean_rx_irq(struct e1000_adapter *adapter);162162+static boolean_t e1000_clean_rx_irq_ps(struct e1000_adapter *adapter);140163#endif141164static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter);165165+static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter);142166static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd);143167static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,144168 int cmd);···270286 E1000_WRITE_FLUSH(&adapter->hw);271287 }272288}273273-289289+void290290+e1000_update_mng_vlan(struct e1000_adapter *adapter)291291+{292292+ struct net_device *netdev = adapter->netdev;293293+ uint16_t vid = adapter->hw.mng_cookie.vlan_id;294294+ uint16_t old_vid = adapter->mng_vlan_id;295295+ if(adapter->vlgrp) {296296+ if(!adapter->vlgrp->vlan_devices[vid]) {297297+ if(adapter->hw.mng_cookie.status &298298+ E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) {299299+ e1000_vlan_rx_add_vid(netdev, vid);300300+ adapter->mng_vlan_id = vid;301301+ } else302302+ adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;303303+304304+ if((old_vid != (uint16_t)E1000_MNG_VLAN_NONE) &&305305+ (vid != old_vid) && 306306+ !adapter->vlgrp->vlan_devices[old_vid])307307+ e1000_vlan_rx_kill_vid(netdev, old_vid);308308+ }309309+ }310310+}311311+274312int275313e1000_up(struct e1000_adapter *adapter)276314{···316310 e1000_configure_tx(adapter);317311 e1000_setup_rctl(adapter);318312 e1000_configure_rx(adapter);319319- e1000_alloc_rx_buffers(adapter);313313+ adapter->alloc_rx_buf(adapter);320314315315+#ifdef CONFIG_PCI_MSI316316+ if(adapter->hw.mac_type > e1000_82547_rev_2) {317317+ adapter->have_msi = TRUE;318318+ if((err = pci_enable_msi(adapter->pdev))) {319319+ DPRINTK(PROBE, ERR,320320+ "Unable to allocate MSI interrupt Error: %d\n", err);321321+ adapter->have_msi = FALSE;322322+ }323323+ }324324+#endif321325 if((err = request_irq(adapter->pdev->irq, &e1000_intr,322326 SA_SHIRQ | SA_SAMPLE_RANDOM,323323- netdev->name, netdev)))327327+ netdev->name, netdev))) {328328+ DPRINTK(PROBE, ERR,329329+ "Unable to allocate interrupt Error: %d\n", err);324330 return err;331331+ }325332326333 mod_timer(&adapter->watchdog_timer, jiffies);327327- e1000_irq_enable(adapter);328334329335#ifdef CONFIG_E1000_NAPI330336 netif_poll_enable(netdev);331337#endif338338+ e1000_irq_enable(adapter);339339+332340 return 0;333341}334342···353333354334 e1000_irq_disable(adapter);355335 free_irq(adapter->pdev->irq, netdev);336336+#ifdef CONFIG_PCI_MSI337337+ if(adapter->hw.mac_type > e1000_82547_rev_2 &&338338+ adapter->have_msi == TRUE)339339+ pci_disable_msi(adapter->pdev);340340+#endif356341 del_timer_sync(&adapter->tx_fifo_stall_timer);357342 del_timer_sync(&adapter->watchdog_timer);358343 del_timer_sync(&adapter->phy_info_timer);···375350 e1000_clean_rx_ring(adapter);376351377352 /* If WoL is not enabled353353+ * and management mode is not IAMT378354 * Power down the PHY so no link is implied when interface is down */379379- if(!adapter->wol && adapter->hw.media_type == e1000_media_type_copper) {355355+ if(!adapter->wol && adapter->hw.mac_type >= e1000_82540 &&356356+ adapter->hw.media_type == e1000_media_type_copper &&357357+ !e1000_check_mng_mode(&adapter->hw) &&358358+ !(E1000_READ_REG(&adapter->hw, MANC) & E1000_MANC_SMBUS_EN)) {380359 uint16_t mii_reg;381360 e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg);382361 mii_reg |= MII_CR_POWER_DOWN;383362 e1000_write_phy_reg(&adapter->hw, PHY_CTRL, mii_reg);363363+ mdelay(1);384364 }385365}386366387367void388368e1000_reset(struct e1000_adapter *adapter)389369{390390- uint32_t pba;370370+ struct net_device *netdev = adapter->netdev;371371+ uint32_t pba, manc;372372+ uint16_t fc_high_water_mark = E1000_FC_HIGH_DIFF;373373+ uint16_t fc_low_water_mark = E1000_FC_LOW_DIFF;391374392375 /* Repartition Pba for greater than 9k mtu393376 * To take effect CTRL.RST is required.394377 */395378396396- if(adapter->hw.mac_type < e1000_82547) {397397- if(adapter->rx_buffer_len > E1000_RXBUFFER_8192)398398- pba = E1000_PBA_40K;399399- else400400- pba = E1000_PBA_48K;401401- } else {402402- if(adapter->rx_buffer_len > E1000_RXBUFFER_8192)403403- pba = E1000_PBA_22K;404404- else405405- pba = E1000_PBA_30K;379379+ switch (adapter->hw.mac_type) {380380+ case e1000_82547:381381+ case e1000_82547_rev_2:382382+ pba = E1000_PBA_30K;383383+ break;384384+ case e1000_82573:385385+ pba = E1000_PBA_12K;386386+ break;387387+ default:388388+ pba = E1000_PBA_48K;389389+ break;390390+ }391391+392392+ if((adapter->hw.mac_type != e1000_82573) &&393393+ (adapter->rx_buffer_len > E1000_RXBUFFER_8192)) {394394+ pba -= 8; /* allocate more FIFO for Tx */395395+ /* send an XOFF when there is enough space in the396396+ * Rx FIFO to hold one extra full size Rx packet 397397+ */398398+ fc_high_water_mark = netdev->mtu + ENET_HEADER_SIZE + 399399+ ETHERNET_FCS_SIZE + 1;400400+ fc_low_water_mark = fc_high_water_mark + 8;401401+ }402402+403403+404404+ if(adapter->hw.mac_type == e1000_82547) {406405 adapter->tx_fifo_head = 0;407406 adapter->tx_head_addr = pba << E1000_TX_HEAD_ADDR_SHIFT;408407 adapter->tx_fifo_size =409408 (E1000_PBA_40K - pba) << E1000_PBA_BYTES_SHIFT;410409 atomic_set(&adapter->tx_fifo_stall, 0);411410 }411411+412412 E1000_WRITE_REG(&adapter->hw, PBA, pba);413413414414 /* flow control settings */415415 adapter->hw.fc_high_water = (pba << E1000_PBA_BYTES_SHIFT) -416416- E1000_FC_HIGH_DIFF;416416+ fc_high_water_mark;417417 adapter->hw.fc_low_water = (pba << E1000_PBA_BYTES_SHIFT) -418418- E1000_FC_LOW_DIFF;418418+ fc_low_water_mark;419419 adapter->hw.fc_pause_time = E1000_FC_PAUSE_TIME;420420 adapter->hw.fc_send_xon = 1;421421 adapter->hw.fc = adapter->hw.original_fc;422422423423+ /* Allow time for pending master requests to run */423424 e1000_reset_hw(&adapter->hw);424425 if(adapter->hw.mac_type >= e1000_82544)425426 E1000_WRITE_REG(&adapter->hw, WUC, 0);426427 if(e1000_init_hw(&adapter->hw))427428 DPRINTK(PROBE, ERR, "Hardware Error\n");428428-429429+ e1000_update_mng_vlan(adapter);429430 /* Enable h/w to recognize an 802.1Q VLAN Ethernet packet */430431 E1000_WRITE_REG(&adapter->hw, VET, ETHERNET_IEEE_VLAN_TYPE);431432432433 e1000_reset_adaptive(&adapter->hw);433434 e1000_phy_get_info(&adapter->hw, &adapter->phy_info);435435+ if (adapter->en_mng_pt) {436436+ manc = E1000_READ_REG(&adapter->hw, MANC);437437+ manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST);438438+ E1000_WRITE_REG(&adapter->hw, MANC, manc);439439+ }434440}435441436442/**···482426{483427 struct net_device *netdev;484428 struct e1000_adapter *adapter;429429+ unsigned long mmio_start, mmio_len;430430+ uint32_t swsm;431431+485432 static int cards_found = 0;486486- unsigned long mmio_start;487487- int mmio_len;488488- int pci_using_dac;489489- int i;490490- int err;433433+ int i, err, pci_using_dac;491434 uint16_t eeprom_data;492435 uint16_t eeprom_apme_mask = E1000_EEPROM_APME;493493-494436 if((err = pci_enable_device(pdev)))495437 return err;496438···575521 if((err = e1000_sw_init(adapter)))576522 goto err_sw_init;577523524524+ if((err = e1000_check_phy_reset_block(&adapter->hw)))525525+ DPRINTK(PROBE, INFO, "PHY reset is blocked due to SOL/IDER session.\n");526526+578527 if(adapter->hw.mac_type >= e1000_82543) {579528 netdev->features = NETIF_F_SG |580529 NETIF_F_HW_CSUM |···590533 if((adapter->hw.mac_type >= e1000_82544) &&591534 (adapter->hw.mac_type != e1000_82547))592535 netdev->features |= NETIF_F_TSO;536536+537537+#ifdef NETIF_F_TSO_IPV6538538+ if(adapter->hw.mac_type > e1000_82547_rev_2)539539+ netdev->features |= NETIF_F_TSO_IPV6;540540+#endif593541#endif594542 if(pci_using_dac)595543 netdev->features |= NETIF_F_HIGHDMA;···602540 /* hard_start_xmit is safe against parallel locking */603541 netdev->features |= NETIF_F_LLTX; 604542543543+ adapter->en_mng_pt = e1000_enable_mng_pass_thru(&adapter->hw);544544+605545 /* before reading the EEPROM, reset the controller to 606546 * put the device in a known good starting state */607547···619555620556 /* copy the MAC address out of the EEPROM */621557622622- if (e1000_read_mac_addr(&adapter->hw))558558+ if(e1000_read_mac_addr(&adapter->hw))623559 DPRINTK(PROBE, ERR, "EEPROM Read Error\n");624560 memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len);625561···693629 /* reset the hardware with the new settings */694630 e1000_reset(adapter);695631632632+ /* Let firmware know the driver has taken over */633633+ switch(adapter->hw.mac_type) {634634+ case e1000_82573:635635+ swsm = E1000_READ_REG(&adapter->hw, SWSM);636636+ E1000_WRITE_REG(&adapter->hw, SWSM,637637+ swsm | E1000_SWSM_DRV_LOAD);638638+ break;639639+ default:640640+ break;641641+ }642642+696643 strcpy(netdev->name, "eth%d");697644 if((err = register_netdev(netdev)))698645 goto err_register;···739664{740665 struct net_device *netdev = pci_get_drvdata(pdev);741666 struct e1000_adapter *adapter = netdev->priv;742742- uint32_t manc;667667+ uint32_t manc, swsm;743668744669 flush_scheduled_work();745670···752677 }753678 }754679680680+ switch(adapter->hw.mac_type) {681681+ case e1000_82573:682682+ swsm = E1000_READ_REG(&adapter->hw, SWSM);683683+ E1000_WRITE_REG(&adapter->hw, SWSM,684684+ swsm & ~E1000_SWSM_DRV_LOAD);685685+ break;686686+687687+ default:688688+ break;689689+ }690690+755691 unregister_netdev(netdev);756692757757- e1000_phy_hw_reset(&adapter->hw);693693+ if(!e1000_check_phy_reset_block(&adapter->hw))694694+ e1000_phy_hw_reset(&adapter->hw);758695759696 iounmap(adapter->hw.hw_addr);760697 pci_release_regions(pdev);···804717 pci_read_config_word(pdev, PCI_COMMAND, &hw->pci_cmd_word);805718806719 adapter->rx_buffer_len = E1000_RXBUFFER_2048;720720+ adapter->rx_ps_bsize0 = E1000_RXBUFFER_256;807721 hw->max_frame_size = netdev->mtu +808722 ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;809723 hw->min_frame_size = MINIMUM_ETHERNET_FRAME_SIZE;···818730819731 /* initialize eeprom parameters */820732821821- e1000_init_eeprom_params(hw);733733+ if(e1000_init_eeprom_params(hw)) {734734+ E1000_ERR("EEPROM initialization failed\n");735735+ return -EIO;736736+ }822737823738 switch(hw->mac_type) {824739 default:···886795887796 if((err = e1000_up(adapter)))888797 goto err_up;798798+ adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;799799+ if((adapter->hw.mng_cookie.status &800800+ E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) {801801+ e1000_update_mng_vlan(adapter);802802+ }889803890804 return E1000_SUCCESS;891805···926830 e1000_free_tx_resources(adapter);927831 e1000_free_rx_resources(adapter);928832833833+ if((adapter->hw.mng_cookie.status &834834+ E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) {835835+ e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);836836+ }929837 return 0;930838}931839932840/**933841 * e1000_check_64k_bound - check that memory doesn't cross 64kB boundary934842 * @adapter: address of board private structure935935- * @begin: address of beginning of memory936936- * @end: address of end of memory843843+ * @start: address of beginning of memory844844+ * @len: length of memory937845 **/938846static inline boolean_t939847e1000_check_64k_bound(struct e1000_adapter *adapter,···946846 unsigned long begin = (unsigned long) start;947847 unsigned long end = begin + len;948848949949- /* first rev 82545 and 82546 need to not allow any memory950950- * write location to cross a 64k boundary due to errata 23 */849849+ /* First rev 82545 and 82546 need to not allow any memory850850+ * write location to cross 64k boundary due to errata 23 */951851 if (adapter->hw.mac_type == e1000_82545 ||952952- adapter->hw.mac_type == e1000_82546 ) {953953-954954- /* check buffer doesn't cross 64kB */852852+ adapter->hw.mac_type == e1000_82546) {955853 return ((begin ^ (end - 1)) >> 16) != 0 ? FALSE : TRUE;956854 }957855···973875 size = sizeof(struct e1000_buffer) * txdr->count;974876 txdr->buffer_info = vmalloc(size);975877 if(!txdr->buffer_info) {976976- DPRINTK(PROBE, ERR, 977977- "Unable to Allocate Memory for the Transmit descriptor ring\n");878878+ DPRINTK(PROBE, ERR,879879+ "Unable to allocate memory for the transmit descriptor ring\n");978880 return -ENOMEM;979881 }980882 memset(txdr->buffer_info, 0, size);···987889 txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma);988890 if(!txdr->desc) {989891setup_tx_desc_die:990990- DPRINTK(PROBE, ERR, 991991- "Unable to Allocate Memory for the Transmit descriptor ring\n");992892 vfree(txdr->buffer_info);893893+ DPRINTK(PROBE, ERR,894894+ "Unable to allocate memory for the transmit descriptor ring\n");993895 return -ENOMEM;994896 }995897996996- /* fix for errata 23, cant cross 64kB boundary */898898+ /* Fix for errata 23, can't cross 64kB boundary */997899 if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) {998900 void *olddesc = txdr->desc;999901 dma_addr_t olddma = txdr->dma;10001000- DPRINTK(TX_ERR,ERR,"txdr align check failed: %u bytes at %p\n",10011001- txdr->size, txdr->desc);10021002- /* try again, without freeing the previous */902902+ DPRINTK(TX_ERR, ERR, "txdr align check failed: %u bytes "903903+ "at %p\n", txdr->size, txdr->desc);904904+ /* Try again, without freeing the previous */1003905 txdr->desc = pci_alloc_consistent(pdev, txdr->size, &txdr->dma);10041004- /* failed allocation, critial failure */1005906 if(!txdr->desc) {907907+ /* Failed allocation, critical failure */1006908 pci_free_consistent(pdev, txdr->size, olddesc, olddma);1007909 goto setup_tx_desc_die;1008910 }10099111010912 if (!e1000_check_64k_bound(adapter, txdr->desc, txdr->size)) {1011913 /* give up */10121012- pci_free_consistent(pdev, txdr->size,10131013- txdr->desc, txdr->dma);914914+ pci_free_consistent(pdev, txdr->size, txdr->desc,915915+ txdr->dma);1014916 pci_free_consistent(pdev, txdr->size, olddesc, olddma);1015917 DPRINTK(PROBE, ERR,10161016- "Unable to Allocate aligned Memory for the Transmit"10171017- " descriptor ring\n");918918+ "Unable to allocate aligned memory "919919+ "for the transmit descriptor ring\n");1018920 vfree(txdr->buffer_info);1019921 return -ENOMEM;1020922 } else {10211021- /* free old, move on with the new one since its okay */923923+ /* Free old allocation, new allocation was successful */1022924 pci_free_consistent(pdev, txdr->size, olddesc, olddma);1023925 }1024926 }···11201022{11211023 struct e1000_desc_ring *rxdr = &adapter->rx_ring;11221024 struct pci_dev *pdev = adapter->pdev;11231123- int size;10251025+ int size, desc_len;1124102611251027 size = sizeof(struct e1000_buffer) * rxdr->count;11261028 rxdr->buffer_info = vmalloc(size);11271029 if(!rxdr->buffer_info) {11281128- DPRINTK(PROBE, ERR, 11291129- "Unable to Allocate Memory for the Recieve descriptor ring\n");10301030+ DPRINTK(PROBE, ERR,10311031+ "Unable to allocate memory for the receive descriptor ring\n");11301032 return -ENOMEM;11311033 }11321034 memset(rxdr->buffer_info, 0, size);1133103510361036+ size = sizeof(struct e1000_ps_page) * rxdr->count;10371037+ rxdr->ps_page = kmalloc(size, GFP_KERNEL);10381038+ if(!rxdr->ps_page) {10391039+ vfree(rxdr->buffer_info);10401040+ DPRINTK(PROBE, ERR,10411041+ "Unable to allocate memory for the receive descriptor ring\n");10421042+ return -ENOMEM;10431043+ }10441044+ memset(rxdr->ps_page, 0, size);10451045+10461046+ size = sizeof(struct e1000_ps_page_dma) * rxdr->count;10471047+ rxdr->ps_page_dma = kmalloc(size, GFP_KERNEL);10481048+ if(!rxdr->ps_page_dma) {10491049+ vfree(rxdr->buffer_info);10501050+ kfree(rxdr->ps_page);10511051+ DPRINTK(PROBE, ERR,10521052+ "Unable to allocate memory for the receive descriptor ring\n");10531053+ return -ENOMEM;10541054+ }10551055+ memset(rxdr->ps_page_dma, 0, size);10561056+10571057+ if(adapter->hw.mac_type <= e1000_82547_rev_2)10581058+ desc_len = sizeof(struct e1000_rx_desc);10591059+ else10601060+ desc_len = sizeof(union e1000_rx_desc_packet_split);10611061+11341062 /* Round up to nearest 4K */1135106311361136- rxdr->size = rxdr->count * sizeof(struct e1000_rx_desc);10641064+ rxdr->size = rxdr->count * desc_len;11371065 E1000_ROUNDUP(rxdr->size, 4096);1138106611391067 rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma);1140106811411069 if(!rxdr->desc) {11421070setup_rx_desc_die:11431143- DPRINTK(PROBE, ERR, 11441144- "Unble to Allocate Memory for the Recieve descriptor ring\n");11451071 vfree(rxdr->buffer_info);10721072+ kfree(rxdr->ps_page);10731073+ kfree(rxdr->ps_page_dma);10741074+ DPRINTK(PROBE, ERR,10751075+ "Unable to allocate memory for the receive descriptor ring\n");11461076 return -ENOMEM;11471077 }1148107811491149- /* fix for errata 23, cant cross 64kB boundary */10791079+ /* Fix for errata 23, can't cross 64kB boundary */11501080 if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) {11511081 void *olddesc = rxdr->desc;11521082 dma_addr_t olddma = rxdr->dma;11531153- DPRINTK(RX_ERR,ERR,11541154- "rxdr align check failed: %u bytes at %p\n",11551155- rxdr->size, rxdr->desc);11561156- /* try again, without freeing the previous */10831083+ DPRINTK(RX_ERR, ERR, "rxdr align check failed: %u bytes "10841084+ "at %p\n", rxdr->size, rxdr->desc);10851085+ /* Try again, without freeing the previous */11571086 rxdr->desc = pci_alloc_consistent(pdev, rxdr->size, &rxdr->dma);11581158- /* failed allocation, critial failure */11591087 if(!rxdr->desc) {10881088+ /* Failed allocation, critical failure */11601089 pci_free_consistent(pdev, rxdr->size, olddesc, olddma);11611090 goto setup_rx_desc_die;11621091 }1163109211641093 if (!e1000_check_64k_bound(adapter, rxdr->desc, rxdr->size)) {11651094 /* give up */11661166- pci_free_consistent(pdev, rxdr->size,11671167- rxdr->desc, rxdr->dma);10951095+ pci_free_consistent(pdev, rxdr->size, rxdr->desc,10961096+ rxdr->dma);11681097 pci_free_consistent(pdev, rxdr->size, olddesc, olddma);11691169- DPRINTK(PROBE, ERR, 11701170- "Unable to Allocate aligned Memory for the"11711171- " Receive descriptor ring\n");10981098+ DPRINTK(PROBE, ERR,10991099+ "Unable to allocate aligned memory "11001100+ "for the receive descriptor ring\n");11721101 vfree(rxdr->buffer_info);11021102+ kfree(rxdr->ps_page);11031103+ kfree(rxdr->ps_page_dma);11731104 return -ENOMEM;11741105 } else {11751175- /* free old, move on with the new one since its okay */11061106+ /* Free old allocation, new allocation was successful */11761107 pci_free_consistent(pdev, rxdr->size, olddesc, olddma);11771108 }11781109 }···12141087}1215108812161089/**12171217- * e1000_setup_rctl - configure the receive control register10901090+ * e1000_setup_rctl - configure the receive control registers12181091 * @adapter: Board private structure12191092 **/1220109312211094static void12221095e1000_setup_rctl(struct e1000_adapter *adapter)12231096{12241224- uint32_t rctl;10971097+ uint32_t rctl, rfctl;10981098+ uint32_t psrctl = 0;1225109912261100 rctl = E1000_READ_REG(&adapter->hw, RCTL);12271101···12371109 else12381110 rctl &= ~E1000_RCTL_SBP;1239111111121112+ if (adapter->netdev->mtu <= ETH_DATA_LEN)11131113+ rctl &= ~E1000_RCTL_LPE;11141114+ else11151115+ rctl |= E1000_RCTL_LPE;11161116+12401117 /* Setup buffer sizes */12411241- rctl &= ~(E1000_RCTL_SZ_4096);12421242- rctl |= (E1000_RCTL_BSEX | E1000_RCTL_LPE);12431243- switch (adapter->rx_buffer_len) {12441244- case E1000_RXBUFFER_2048:12451245- default:12461246- rctl |= E1000_RCTL_SZ_2048;12471247- rctl &= ~(E1000_RCTL_BSEX | E1000_RCTL_LPE);12481248- break;12491249- case E1000_RXBUFFER_4096:12501250- rctl |= E1000_RCTL_SZ_4096;12511251- break;12521252- case E1000_RXBUFFER_8192:12531253- rctl |= E1000_RCTL_SZ_8192;12541254- break;12551255- case E1000_RXBUFFER_16384:12561256- rctl |= E1000_RCTL_SZ_16384;12571257- break;11181118+ if(adapter->hw.mac_type == e1000_82573) {11191119+ /* We can now specify buffers in 1K increments.11201120+ * BSIZE and BSEX are ignored in this case. */11211121+ rctl |= adapter->rx_buffer_len << 0x11;11221122+ } else {11231123+ rctl &= ~E1000_RCTL_SZ_4096;11241124+ rctl |= E1000_RCTL_BSEX; 11251125+ switch (adapter->rx_buffer_len) {11261126+ case E1000_RXBUFFER_2048:11271127+ default:11281128+ rctl |= E1000_RCTL_SZ_2048;11291129+ rctl &= ~E1000_RCTL_BSEX;11301130+ break;11311131+ case E1000_RXBUFFER_4096:11321132+ rctl |= E1000_RCTL_SZ_4096;11331133+ break;11341134+ case E1000_RXBUFFER_8192:11351135+ rctl |= E1000_RCTL_SZ_8192;11361136+ break;11371137+ case E1000_RXBUFFER_16384:11381138+ rctl |= E1000_RCTL_SZ_16384;11391139+ break;11401140+ }11411141+ }11421142+11431143+#ifdef CONFIG_E1000_PACKET_SPLIT11441144+ /* 82571 and greater support packet-split where the protocol11451145+ * header is placed in skb->data and the packet data is11461146+ * placed in pages hanging off of skb_shinfo(skb)->nr_frags.11471147+ * In the case of a non-split, skb->data is linearly filled,11481148+ * followed by the page buffers. Therefore, skb->data is11491149+ * sized to hold the largest protocol header.11501150+ */11511151+ adapter->rx_ps = (adapter->hw.mac_type > e1000_82547_rev_2) 11521152+ && (adapter->netdev->mtu 11531153+ < ((3 * PAGE_SIZE) + adapter->rx_ps_bsize0));11541154+#endif11551155+ if(adapter->rx_ps) {11561156+ /* Configure extra packet-split registers */11571157+ rfctl = E1000_READ_REG(&adapter->hw, RFCTL);11581158+ rfctl |= E1000_RFCTL_EXTEN;11591159+ /* disable IPv6 packet split support */11601160+ rfctl |= E1000_RFCTL_IPV6_DIS;11611161+ E1000_WRITE_REG(&adapter->hw, RFCTL, rfctl);11621162+11631163+ rctl |= E1000_RCTL_DTYP_PS | E1000_RCTL_SECRC;11641164+11651165+ psrctl |= adapter->rx_ps_bsize0 >>11661166+ E1000_PSRCTL_BSIZE0_SHIFT;11671167+ psrctl |= PAGE_SIZE >>11681168+ E1000_PSRCTL_BSIZE1_SHIFT;11691169+ psrctl |= PAGE_SIZE <<11701170+ E1000_PSRCTL_BSIZE2_SHIFT;11711171+ psrctl |= PAGE_SIZE <<11721172+ E1000_PSRCTL_BSIZE3_SHIFT;11731173+11741174+ E1000_WRITE_REG(&adapter->hw, PSRCTL, psrctl);12581175 }1259117612601177 E1000_WRITE_REG(&adapter->hw, RCTL, rctl);···13161143e1000_configure_rx(struct e1000_adapter *adapter)13171144{13181145 uint64_t rdba = adapter->rx_ring.dma;13191319- uint32_t rdlen = adapter->rx_ring.count * sizeof(struct e1000_rx_desc);13201320- uint32_t rctl;13211321- uint32_t rxcsum;11461146+ uint32_t rdlen, rctl, rxcsum;11471147+11481148+ if(adapter->rx_ps) {11491149+ rdlen = adapter->rx_ring.count *11501150+ sizeof(union e1000_rx_desc_packet_split);11511151+ adapter->clean_rx = e1000_clean_rx_irq_ps;11521152+ adapter->alloc_rx_buf = e1000_alloc_rx_buffers_ps;11531153+ } else {11541154+ rdlen = adapter->rx_ring.count * sizeof(struct e1000_rx_desc);11551155+ adapter->clean_rx = e1000_clean_rx_irq;11561156+ adapter->alloc_rx_buf = e1000_alloc_rx_buffers;11571157+ }1322115813231159 /* disable receives while setting up the descriptors */13241160 rctl = E1000_READ_REG(&adapter->hw, RCTL);···13541172 E1000_WRITE_REG(&adapter->hw, RDT, 0);1355117313561174 /* Enable 82543 Receive Checksum Offload for TCP and UDP */13571357- if((adapter->hw.mac_type >= e1000_82543) &&13581358- (adapter->rx_csum == TRUE)) {11751175+ if(adapter->hw.mac_type >= e1000_82543) {13591176 rxcsum = E1000_READ_REG(&adapter->hw, RXCSUM);13601360- rxcsum |= E1000_RXCSUM_TUOFL;11771177+ if(adapter->rx_csum == TRUE) {11781178+ rxcsum |= E1000_RXCSUM_TUOFL;11791179+11801180+ /* Enable 82573 IPv4 payload checksum for UDP fragments11811181+ * Must be used in conjunction with packet-split. */11821182+ if((adapter->hw.mac_type > e1000_82547_rev_2) && 11831183+ (adapter->rx_ps)) {11841184+ rxcsum |= E1000_RXCSUM_IPPCSE;11851185+ }11861186+ } else {11871187+ rxcsum &= ~E1000_RXCSUM_TUOFL;11881188+ /* don't need to clear IPPCSE as it defaults to 0 */11891189+ }13611190 E1000_WRITE_REG(&adapter->hw, RXCSUM, rxcsum);13621191 }11921192+11931193+ if (adapter->hw.mac_type == e1000_82573)11941194+ E1000_WRITE_REG(&adapter->hw, ERT, 0x0100);1363119513641196 /* Enable Receives */13651197 E1000_WRITE_REG(&adapter->hw, RCTL, rctl);···14061210e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,14071211 struct e1000_buffer *buffer_info)14081212{14091409- struct pci_dev *pdev = adapter->pdev;14101410-14111213 if(buffer_info->dma) {14121412- pci_unmap_page(pdev,14131413- buffer_info->dma,14141414- buffer_info->length,14151415- PCI_DMA_TODEVICE);12141214+ pci_unmap_page(adapter->pdev,12151215+ buffer_info->dma,12161216+ buffer_info->length,12171217+ PCI_DMA_TODEVICE);14161218 buffer_info->dma = 0;14171219 }14181220 if(buffer_info->skb) {···14351241 /* Free all the Tx ring sk_buffs */1436124214371243 if (likely(adapter->previous_buffer_info.skb != NULL)) {14381438- e1000_unmap_and_free_tx_resource(adapter, 12441244+ e1000_unmap_and_free_tx_resource(adapter,14391245 &adapter->previous_buffer_info);14401246 }14411247···1475128114761282 vfree(rx_ring->buffer_info);14771283 rx_ring->buffer_info = NULL;12841284+ kfree(rx_ring->ps_page);12851285+ rx_ring->ps_page = NULL;12861286+ kfree(rx_ring->ps_page_dma);12871287+ rx_ring->ps_page_dma = NULL;1478128814791289 pci_free_consistent(pdev, rx_ring->size, rx_ring->desc, rx_ring->dma);14801290···14951297{14961298 struct e1000_desc_ring *rx_ring = &adapter->rx_ring;14971299 struct e1000_buffer *buffer_info;13001300+ struct e1000_ps_page *ps_page;13011301+ struct e1000_ps_page_dma *ps_page_dma;14981302 struct pci_dev *pdev = adapter->pdev;14991303 unsigned long size;15001500- unsigned int i;13041304+ unsigned int i, j;1501130515021306 /* Free all the Rx ring sk_buffs */1503130715041308 for(i = 0; i < rx_ring->count; i++) {15051309 buffer_info = &rx_ring->buffer_info[i];15061310 if(buffer_info->skb) {15071507-13111311+ ps_page = &rx_ring->ps_page[i];13121312+ ps_page_dma = &rx_ring->ps_page_dma[i];15081313 pci_unmap_single(pdev,15091314 buffer_info->dma,15101315 buffer_info->length,···1515131415161315 dev_kfree_skb(buffer_info->skb);15171316 buffer_info->skb = NULL;13171317+13181318+ for(j = 0; j < PS_PAGE_BUFFERS; j++) {13191319+ if(!ps_page->ps_page[j]) break;13201320+ pci_unmap_single(pdev,13211321+ ps_page_dma->ps_page_dma[j],13221322+ PAGE_SIZE, PCI_DMA_FROMDEVICE);13231323+ ps_page_dma->ps_page_dma[j] = 0;13241324+ put_page(ps_page->ps_page[j]);13251325+ ps_page->ps_page[j] = NULL;13261326+ }15181327 }15191328 }1520132915211330 size = sizeof(struct e1000_buffer) * rx_ring->count;15221331 memset(rx_ring->buffer_info, 0, size);13321332+ size = sizeof(struct e1000_ps_page) * rx_ring->count;13331333+ memset(rx_ring->ps_page, 0, size);13341334+ size = sizeof(struct e1000_ps_page_dma) * rx_ring->count;13351335+ memset(rx_ring->ps_page_dma, 0, size);1523133615241337 /* Zero out the descriptor ring */15251338···16371422 struct e1000_adapter *adapter = netdev->priv;16381423 struct e1000_hw *hw = &adapter->hw;16391424 struct dev_mc_list *mc_ptr;14251425+ unsigned long flags;16401426 uint32_t rctl;16411427 uint32_t hash_value;16421428 int i;16431643- unsigned long flags;16441644-16451645- /* Check for Promiscuous and All Multicast modes */1646142916471430 spin_lock_irqsave(&adapter->tx_lock, flags);14311431+14321432+ /* Check for Promiscuous and All Multicast modes */1648143316491434 rctl = E1000_READ_REG(hw, RCTL);16501435···17711556 uint32_t link;1772155717731558 e1000_check_for_link(&adapter->hw);15591559+ if (adapter->hw.mac_type == e1000_82573) {15601560+ e1000_enable_tx_pkt_filtering(&adapter->hw);15611561+ if(adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id)15621562+ e1000_update_mng_vlan(adapter);15631563+ } 1774156417751565 if((adapter->hw.media_type == e1000_media_type_internal_serdes) &&17761566 !(E1000_READ_REG(&adapter->hw, TXCW) & E1000_TXCW_ANE))···18521632 /* Cause software interrupt to ensure rx ring is cleaned */18531633 E1000_WRITE_REG(&adapter->hw, ICS, E1000_ICS_RXDMT0);1854163418551855- /* Force detection of hung controller every watchdog period*/16351635+ /* Force detection of hung controller every watchdog period */18561636 adapter->detect_tx_hung = TRUE;1857163718581638 /* Reset the timer */···18621642#define E1000_TX_FLAGS_CSUM 0x0000000118631643#define E1000_TX_FLAGS_VLAN 0x0000000218641644#define E1000_TX_FLAGS_TSO 0x0000000416451645+#define E1000_TX_FLAGS_IPV4 0x0000000818651646#define E1000_TX_FLAGS_VLAN_MASK 0xffff000018661647#define E1000_TX_FLAGS_VLAN_SHIFT 1618671648···18731652 struct e1000_context_desc *context_desc;18741653 unsigned int i;18751654 uint32_t cmd_length = 0;18761876- uint16_t ipcse, tucse, mss;16551655+ uint16_t ipcse = 0, tucse, mss;18771656 uint8_t ipcss, ipcso, tucss, tucso, hdr_len;18781657 int err;18791658···1886166518871666 hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2));18881667 mss = skb_shinfo(skb)->tso_size;18891889- skb->nh.iph->tot_len = 0;18901890- skb->nh.iph->check = 0;18911891- skb->h.th->check = ~csum_tcpudp_magic(skb->nh.iph->saddr,18921892- skb->nh.iph->daddr,18931893- 0,18941894- IPPROTO_TCP,18951895- 0);16681668+ if(skb->protocol == ntohs(ETH_P_IP)) {16691669+ skb->nh.iph->tot_len = 0;16701670+ skb->nh.iph->check = 0;16711671+ skb->h.th->check =16721672+ ~csum_tcpudp_magic(skb->nh.iph->saddr,16731673+ skb->nh.iph->daddr,16741674+ 0,16751675+ IPPROTO_TCP,16761676+ 0);16771677+ cmd_length = E1000_TXD_CMD_IP;16781678+ ipcse = skb->h.raw - skb->data - 1;16791679+#ifdef NETIF_F_TSO_IPV616801680+ } else if(skb->protocol == ntohs(ETH_P_IPV6)) {16811681+ skb->nh.ipv6h->payload_len = 0;16821682+ skb->h.th->check =16831683+ ~csum_ipv6_magic(&skb->nh.ipv6h->saddr,16841684+ &skb->nh.ipv6h->daddr,16851685+ 0,16861686+ IPPROTO_TCP,16871687+ 0);16881688+ ipcse = 0;16891689+#endif16901690+ }18961691 ipcss = skb->nh.raw - skb->data;18971692 ipcso = (void *)&(skb->nh.iph->check) - (void *)skb->data;18981898- ipcse = skb->h.raw - skb->data - 1;18991693 tucss = skb->h.raw - skb->data;19001694 tucso = (void *)&(skb->h.th->check) - (void *)skb->data;19011695 tucse = 0;1902169619031697 cmd_length |= (E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE |19041904- E1000_TXD_CMD_IP | E1000_TXD_CMD_TCP |19051905- (skb->len - (hdr_len)));16981698+ E1000_TXD_CMD_TCP | (skb->len - (hdr_len)));1906169919071700 i = adapter->tx_ring.next_to_use;19081701 context_desc = E1000_CONTEXT_DESC(adapter->tx_ring, i);···19951760 if(unlikely(mss && !nr_frags && size == len && size > 8))19961761 size -= 4;19971762#endif17631763+ /* work-around for errata 10 and it applies17641764+ * to all controllers in PCI-X mode17651765+ * The fix is to make sure that the first descriptor of a17661766+ * packet is smaller than 2048 - 16 - 16 (or 2016) bytes17671767+ */17681768+ if(unlikely((adapter->hw.bus_type == e1000_bus_type_pcix) &&17691769+ (size > 2015) && count == 0))17701770+ size = 2015;17711771+19981772 /* Workaround for potential 82544 hang in PCI-X. Avoid19991773 * terminating buffers within evenly-aligned dwords. */20001774 if(unlikely(adapter->pcix_82544 &&···20841840 if(likely(tx_flags & E1000_TX_FLAGS_TSO)) {20851841 txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D |20861842 E1000_TXD_CMD_TSE;20872087- txd_upper |= (E1000_TXD_POPTS_IXSM | E1000_TXD_POPTS_TXSM) << 8;18431843+ txd_upper |= E1000_TXD_POPTS_TXSM << 8;18441844+18451845+ if(likely(tx_flags & E1000_TX_FLAGS_IPV4))18461846+ txd_upper |= E1000_TXD_POPTS_IXSM << 8;20881847 }2089184820901849 if(likely(tx_flags & E1000_TX_FLAGS_CSUM)) {···21621915 return 0;21631916}2164191719181918+#define MINIMUM_DHCP_PACKET_SIZE 28219191919+static inline int19201920+e1000_transfer_dhcp_info(struct e1000_adapter *adapter, struct sk_buff *skb)19211921+{19221922+ struct e1000_hw *hw = &adapter->hw;19231923+ uint16_t length, offset;19241924+ if(vlan_tx_tag_present(skb)) {19251925+ if(!((vlan_tx_tag_get(skb) == adapter->hw.mng_cookie.vlan_id) &&19261926+ ( adapter->hw.mng_cookie.status &19271927+ E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT)) )19281928+ return 0;19291929+ }19301930+ if(htons(ETH_P_IP) == skb->protocol) {19311931+ const struct iphdr *ip = skb->nh.iph;19321932+ if(IPPROTO_UDP == ip->protocol) {19331933+ struct udphdr *udp = (struct udphdr *)(skb->h.uh);19341934+ if(ntohs(udp->dest) == 67) {19351935+ offset = (uint8_t *)udp + 8 - skb->data;19361936+ length = skb->len - offset;19371937+19381938+ return e1000_mng_write_dhcp_info(hw,19391939+ (uint8_t *)udp + 8, length);19401940+ }19411941+ }19421942+ } else if((skb->len > MINIMUM_DHCP_PACKET_SIZE) && (!skb->protocol)) {19431943+ struct ethhdr *eth = (struct ethhdr *) skb->data;19441944+ if((htons(ETH_P_IP) == eth->h_proto)) {19451945+ const struct iphdr *ip = 19461946+ (struct iphdr *)((uint8_t *)skb->data+14);19471947+ if(IPPROTO_UDP == ip->protocol) {19481948+ struct udphdr *udp = 19491949+ (struct udphdr *)((uint8_t *)ip + 19501950+ (ip->ihl << 2));19511951+ if(ntohs(udp->dest) == 67) {19521952+ offset = (uint8_t *)udp + 8 - skb->data;19531953+ length = skb->len - offset;19541954+19551955+ return e1000_mng_write_dhcp_info(hw,19561956+ (uint8_t *)udp + 8, 19571957+ length);19581958+ }19591959+ }19601960+ }19611961+ }19621962+ return 0;19631963+}19641964+21651965#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 )21661966static int21671967e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)···2233193922341940#ifdef NETIF_F_TSO22351941 mss = skb_shinfo(skb)->tso_size;22362236- /* The controller does a simple calculation to19421942+ /* The controller does a simple calculation to 22371943 * make sure there is enough room in the FIFO before22381944 * initiating the DMA for each buffer. The calc is:22391945 * 4 = ceil(buffer len/mss). To make sure we don't···2246195222471953 if((mss) || (skb->ip_summed == CHECKSUM_HW))22481954 count++;22492249- count++; /* for sentinel desc */19551955+ count++;22501956#else22511957 if(skb->ip_summed == CHECKSUM_HW)22521958 count++;···22541960 count += TXD_USE_COUNT(len, max_txd_pwr);2255196122561962 if(adapter->pcix_82544)19631963+ count++;19641964+19651965+ /* work-around for errata 10 and it applies to all controllers 19661966+ * in PCI-X mode, so add one more descriptor to the count19671967+ */19681968+ if(unlikely((adapter->hw.bus_type == e1000_bus_type_pcix) &&19691969+ (len > 2015)))22571970 count++;2258197122591972 nr_frags = skb_shinfo(skb)->nr_frags;···22761975 local_irq_restore(flags); 22771976 return NETDEV_TX_LOCKED; 22781977 } 19781978+ if(adapter->hw.tx_pkt_filtering && (adapter->hw.mac_type == e1000_82573) )19791979+ e1000_transfer_dhcp_info(adapter, skb);19801980+2279198122801982 /* need: count + 2 desc gap to keep tail from touching22811983 * head, otherwise try next time */···23142010 tx_flags |= E1000_TX_FLAGS_TSO;23152011 else if(likely(e1000_tx_csum(adapter, skb)))23162012 tx_flags |= E1000_TX_FLAGS_CSUM;20132013+20142014+ /* Old method was to assume IPv4 packet by default if TSO was enabled.20152015+ * 82573 hardware supports TSO capabilities for IPv6 as well...20162016+ * no longer assume, we must. */20172017+ if(likely(skb->protocol == ntohs(ETH_P_IP)))20182018+ tx_flags |= E1000_TX_FLAGS_IPV4;2317201923182020 e1000_tx_queue(adapter,23192021 e1000_tx_map(adapter, skb, first, max_per_txd, nr_frags, mss),···23872077e1000_change_mtu(struct net_device *netdev, int new_mtu)23882078{23892079 struct e1000_adapter *adapter = netdev->priv;23902390- int old_mtu = adapter->rx_buffer_len;23912080 int max_frame = new_mtu + ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;2392208123932082 if((max_frame < MINIMUM_ETHERNET_FRAME_SIZE) ||···23952086 return -EINVAL;23962087 }2397208823982398- if(max_frame <= MAXIMUM_ETHERNET_FRAME_SIZE) {23992399- adapter->rx_buffer_len = E1000_RXBUFFER_2048;24002400-24012401- } else if(adapter->hw.mac_type < e1000_82543) {24022402- DPRINTK(PROBE, ERR, "Jumbo Frames not supported on 82542\n");20892089+#define MAX_STD_JUMBO_FRAME_SIZE 921620902090+ /* might want this to be bigger enum check... */20912091+ if (adapter->hw.mac_type == e1000_82573 &&20922092+ max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) {20932093+ DPRINTK(PROBE, ERR, "Jumbo Frames not supported "20942094+ "on 82573\n");24032095 return -EINVAL;24042404-24052405- } else if(max_frame <= E1000_RXBUFFER_4096) {24062406- adapter->rx_buffer_len = E1000_RXBUFFER_4096;24072407-24082408- } else if(max_frame <= E1000_RXBUFFER_8192) {24092409- adapter->rx_buffer_len = E1000_RXBUFFER_8192;24102410-24112411- } else {24122412- adapter->rx_buffer_len = E1000_RXBUFFER_16384;24132096 }2414209724152415- if(old_mtu != adapter->rx_buffer_len && netif_running(netdev)) {20982098+ if(adapter->hw.mac_type > e1000_82547_rev_2) {20992099+ adapter->rx_buffer_len = max_frame;21002100+ E1000_ROUNDUP(adapter->rx_buffer_len, 1024);21012101+ } else {21022102+ if(unlikely((adapter->hw.mac_type < e1000_82543) &&21032103+ (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE))) {21042104+ DPRINTK(PROBE, ERR, "Jumbo Frames not supported "21052105+ "on 82542\n");21062106+ return -EINVAL;21072107+21082108+ } else {21092109+ if(max_frame <= E1000_RXBUFFER_2048) {21102110+ adapter->rx_buffer_len = E1000_RXBUFFER_2048;21112111+ } else if(max_frame <= E1000_RXBUFFER_4096) {21122112+ adapter->rx_buffer_len = E1000_RXBUFFER_4096;21132113+ } else if(max_frame <= E1000_RXBUFFER_8192) {21142114+ adapter->rx_buffer_len = E1000_RXBUFFER_8192;21152115+ } else if(max_frame <= E1000_RXBUFFER_16384) {21162116+ adapter->rx_buffer_len = E1000_RXBUFFER_16384;21172117+ }21182118+ }21192119+ }21202120+21212121+ netdev->mtu = new_mtu;21222122+21232123+ if(netif_running(netdev)) {24162124 e1000_down(adapter);24172125 e1000_up(adapter);24182126 }2419212724202420- netdev->mtu = new_mtu;24212128 adapter->hw.max_frame_size = max_frame;2422212924232130 return 0;···25242199 adapter->stats.tsctc += E1000_READ_REG(hw, TSCTC);25252200 adapter->stats.tsctfc += E1000_READ_REG(hw, TSCTFC);25262201 }22022202+ if(hw->mac_type > e1000_82547_rev_2) {22032203+ adapter->stats.iac += E1000_READ_REG(hw, IAC);22042204+ adapter->stats.icrxoc += E1000_READ_REG(hw, ICRXOC);22052205+ adapter->stats.icrxptc += E1000_READ_REG(hw, ICRXPTC);22062206+ adapter->stats.icrxatc += E1000_READ_REG(hw, ICRXATC);22072207+ adapter->stats.ictxptc += E1000_READ_REG(hw, ICTXPTC);22082208+ adapter->stats.ictxatc += E1000_READ_REG(hw, ICTXATC);22092209+ adapter->stats.ictxqec += E1000_READ_REG(hw, ICTXQEC);22102210+ adapter->stats.ictxqmtc += E1000_READ_REG(hw, ICTXQMTC);22112211+ adapter->stats.icrxdmtc += E1000_READ_REG(hw, ICRXDMTC);22122212+ }2527221325282214 /* Fill out the OS statistics structure */25292215···2549221325502214 adapter->net_stats.rx_errors = adapter->stats.rxerrc +25512215 adapter->stats.crcerrs + adapter->stats.algnerrc +25522552- adapter->stats.rlec + adapter->stats.rnbc +25532553- adapter->stats.mpc + adapter->stats.cexterr;25542554- adapter->net_stats.rx_dropped = adapter->stats.rnbc;22162216+ adapter->stats.rlec + adapter->stats.mpc + 22172217+ adapter->stats.cexterr;22182218+ adapter->net_stats.rx_dropped = adapter->stats.mpc;25552219 adapter->net_stats.rx_length_errors = adapter->stats.rlec;25562220 adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs;25572221 adapter->net_stats.rx_frame_errors = adapter->stats.algnerrc;···26362300 */26372301 if(hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2){26382302 atomic_inc(&adapter->irq_sem);26392639- E1000_WRITE_REG(&adapter->hw, IMC, ~0);23032303+ E1000_WRITE_REG(hw, IMC, ~0);26402304 }2641230526422306 for(i = 0; i < E1000_MAX_INTR; i++)26432643- if(unlikely(!e1000_clean_rx_irq(adapter) &23072307+ if(unlikely(!adapter->clean_rx(adapter) &26442308 !e1000_clean_tx_irq(adapter)))26452309 break;26462310···26642328 int work_to_do = min(*budget, netdev->quota);26652329 int tx_cleaned;26662330 int work_done = 0;26672667-23312331+26682332 tx_cleaned = e1000_clean_tx_irq(adapter);26692669- e1000_clean_rx_irq(adapter, &work_done, work_to_do);23332333+ adapter->clean_rx(adapter, &work_done, work_to_do);2670233426712335 *budget -= work_done;26722336 netdev->quota -= work_done;2673233726742674- /* if no Tx and not enough Rx work done, exit the polling mode */26752675- if((!tx_cleaned && (work_done < work_to_do)) || 26762676- !netif_running(netdev)) {23382338+ /* If no Tx and no Rx work done, exit the polling mode */23392339+ if ((!tx_cleaned && (work_done == 0)) || !netif_running(netdev)) {26772340 netif_rx_complete(netdev);26782341 e1000_irq_enable(adapter);26792342 return 0;···27022367 eop_desc = E1000_TX_DESC(*tx_ring, eop);2703236827042369 while(eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) {27052705- /* pre-mature writeback of Tx descriptors */27062706- /* clear (free buffers and unmap pci_mapping) */27072707- /* previous_buffer_info */23702370+ /* Premature writeback of Tx descriptors clear (free buffers23712371+ * and unmap pci_mapping) previous_buffer_info */27082372 if (likely(adapter->previous_buffer_info.skb != NULL)) {27092709- e1000_unmap_and_free_tx_resource(adapter, 23732373+ e1000_unmap_and_free_tx_resource(adapter,27102374 &adapter->previous_buffer_info);27112375 }27122376···27142380 buffer_info = &tx_ring->buffer_info[i];27152381 cleaned = (i == eop);2716238227172717- /* pre-mature writeback of Tx descriptors */27182718- /* save the cleaning of the this for the */27192719- /* next iteration */27202720- if (cleaned) {27212721- memcpy(&adapter->previous_buffer_info,27222722- buffer_info,27232723- sizeof(struct e1000_buffer));27242724- memset(buffer_info,27252725- 0,27262726- sizeof(struct e1000_buffer));23832383+#ifdef NETIF_F_TSO23842384+ if (!(netdev->features & NETIF_F_TSO)) {23852385+#endif23862386+ e1000_unmap_and_free_tx_resource(adapter,23872387+ buffer_info);23882388+#ifdef NETIF_F_TSO27272389 } else {27282728- e1000_unmap_and_free_tx_resource(adapter, 27292729- buffer_info);23902390+ if (cleaned) {23912391+ memcpy(&adapter->previous_buffer_info,23922392+ buffer_info,23932393+ sizeof(struct e1000_buffer));23942394+ memset(buffer_info, 0,23952395+ sizeof(struct e1000_buffer));23962396+ } else {23972397+ e1000_unmap_and_free_tx_resource(23982398+ adapter, buffer_info);23992399+ }27302400 }24012401+#endif2731240227322403 tx_desc->buffer_addr = 0;27332404 tx_desc->lower.data = 0;27342405 tx_desc->upper.data = 0;2735240627362736- cleaned = (i == eop);27372407 if(unlikely(++i == tx_ring->count)) i = 0;27382408 }27392409···27542416 netif_wake_queue(netdev);2755241727562418 spin_unlock(&adapter->tx_lock);27572757-27582419 if(adapter->detect_tx_hung) {27592759- /* detect a transmit hang in hardware, this serializes the24202420+24212421+ /* Detect a transmit hang in hardware, this serializes the27602422 * check with the clearing of time_stamp and movement of i */27612423 adapter->detect_tx_hung = FALSE;27622762- if(tx_ring->buffer_info[i].dma &&27632763- time_after(jiffies, tx_ring->buffer_info[i].time_stamp + HZ) &&27642764- !(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_TXOFF))27652765- netif_stop_queue(netdev);27662766- }24242424+ if (tx_ring->buffer_info[i].dma &&24252425+ time_after(jiffies, tx_ring->buffer_info[i].time_stamp + HZ)24262426+ && !(E1000_READ_REG(&adapter->hw, STATUS) &24272427+ E1000_STATUS_TXOFF)) {2767242824292429+ /* detected Tx unit hang */24302430+ i = tx_ring->next_to_clean;24312431+ eop = tx_ring->buffer_info[i].next_to_watch;24322432+ eop_desc = E1000_TX_DESC(*tx_ring, eop);24332433+ DPRINTK(TX_ERR, ERR, "Detected Tx Unit Hang\n"24342434+ " TDH <%x>\n"24352435+ " TDT <%x>\n"24362436+ " next_to_use <%x>\n"24372437+ " next_to_clean <%x>\n"24382438+ "buffer_info[next_to_clean]\n"24392439+ " dma <%llx>\n"24402440+ " time_stamp <%lx>\n"24412441+ " next_to_watch <%x>\n"24422442+ " jiffies <%lx>\n"24432443+ " next_to_watch.status <%x>\n",24442444+ E1000_READ_REG(&adapter->hw, TDH),24452445+ E1000_READ_REG(&adapter->hw, TDT),24462446+ tx_ring->next_to_use,24472447+ i,24482448+ tx_ring->buffer_info[i].dma,24492449+ tx_ring->buffer_info[i].time_stamp,24502450+ eop,24512451+ jiffies,24522452+ eop_desc->upper.fields.status);24532453+ netif_stop_queue(netdev);24542454+ }24552455+ }24562456+#ifdef NETIF_F_TSO24572457+24582458+ if( unlikely(!(eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&24592459+ time_after(jiffies, adapter->previous_buffer_info.time_stamp + HZ)))24602460+ e1000_unmap_and_free_tx_resource(24612461+ adapter, &adapter->previous_buffer_info);24622462+24632463+#endif27682464 return cleaned;27692465}2770246627712467/**27722468 * e1000_rx_checksum - Receive Checksum Offload for 8254327732773- * @adapter: board private structure27742774- * @rx_desc: receive descriptor27752775- * @sk_buff: socket buffer with received data24692469+ * @adapter: board private structure24702470+ * @status_err: receive descriptor status and error fields24712471+ * @csum: receive descriptor csum field24722472+ * @sk_buff: socket buffer with received data27762473 **/2777247427782475static inline void27792476e1000_rx_checksum(struct e1000_adapter *adapter,27802780- struct e1000_rx_desc *rx_desc,27812781- struct sk_buff *skb)24772477+ uint32_t status_err, uint32_t csum,24782478+ struct sk_buff *skb)27822479{24802480+ uint16_t status = (uint16_t)status_err;24812481+ uint8_t errors = (uint8_t)(status_err >> 24);24822482+ skb->ip_summed = CHECKSUM_NONE;24832483+27832484 /* 82543 or newer only */27842784- if(unlikely((adapter->hw.mac_type < e1000_82543) ||24852485+ if(unlikely(adapter->hw.mac_type < e1000_82543)) return;27852486 /* Ignore Checksum bit is set */27862786- (rx_desc->status & E1000_RXD_STAT_IXSM) ||27872787- /* TCP Checksum has not been calculated */27882788- (!(rx_desc->status & E1000_RXD_STAT_TCPCS)))) {27892789- skb->ip_summed = CHECKSUM_NONE;24872487+ if(unlikely(status & E1000_RXD_STAT_IXSM)) return;24882488+ /* TCP/UDP checksum error bit is set */24892489+ if(unlikely(errors & E1000_RXD_ERR_TCPE)) {24902490+ /* let the stack verify checksum errors */24912491+ adapter->hw_csum_err++;27902492 return;27912493 }27922792-27932793- /* At this point we know the hardware did the TCP checksum */27942794- /* now look at the TCP checksum error bit */27952795- if(rx_desc->errors & E1000_RXD_ERR_TCPE) {27962796- /* let the stack verify checksum errors */27972797- skb->ip_summed = CHECKSUM_NONE;27982798- adapter->hw_csum_err++;24942494+ /* TCP/UDP Checksum has not been calculated */24952495+ if(adapter->hw.mac_type <= e1000_82547_rev_2) {24962496+ if(!(status & E1000_RXD_STAT_TCPCS))24972497+ return;27992498 } else {24992499+ if(!(status & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS)))25002500+ return;25012501+ }25022502+ /* It must be a TCP or UDP packet with a valid checksum */25032503+ if (likely(status & E1000_RXD_STAT_TCPCS)) {28002504 /* TCP checksum is good */28012505 skb->ip_summed = CHECKSUM_UNNECESSARY;28022802- adapter->hw_csum_good++;25062506+ } else if (adapter->hw.mac_type > e1000_82547_rev_2) {25072507+ /* IP fragment with UDP payload */25082508+ /* Hardware complements the payload checksum, so we undo it25092509+ * and then put the value in host order for further stack use.25102510+ */25112511+ csum = ntohl(csum ^ 0xFFFF);25122512+ skb->csum = csum;25132513+ skb->ip_summed = CHECKSUM_HW;28032514 }25152515+ adapter->hw_csum_good++;28042516}2805251728062518/**28072807- * e1000_clean_rx_irq - Send received data up the network stack25192519+ * e1000_clean_rx_irq - Send received data up the network stack; legacy28082520 * @adapter: board private structure28092521 **/28102522···29012513 if(unlikely(!(rx_desc->status & E1000_RXD_STAT_EOP))) {29022514 /* All receives must fit into a single buffer */29032515 E1000_DBG("%s: Receive packet consumed multiple"29042904- " buffers\n", netdev->name);25162516+ " buffers\n", netdev->name);29052517 dev_kfree_skb_irq(skb);29062518 goto next_desc;29072519 }···29272539 skb_put(skb, length - ETHERNET_FCS_SIZE);2928254029292541 /* Receive Checksum Offload */29302930- e1000_rx_checksum(adapter, rx_desc, skb);29312931-25422542+ e1000_rx_checksum(adapter,25432543+ (uint32_t)(rx_desc->status) |25442544+ ((uint32_t)(rx_desc->errors) << 24),25452545+ rx_desc->csum, skb);29322546 skb->protocol = eth_type_trans(skb, netdev);29332547#ifdef CONFIG_E1000_NAPI29342548 if(unlikely(adapter->vlgrp &&29352549 (rx_desc->status & E1000_RXD_STAT_VP))) {29362550 vlan_hwaccel_receive_skb(skb, adapter->vlgrp,29372937- le16_to_cpu(rx_desc->special) &29382938- E1000_RXD_SPC_VLAN_MASK);25512551+ le16_to_cpu(rx_desc->special) &25522552+ E1000_RXD_SPC_VLAN_MASK);29392553 } else {29402554 netif_receive_skb(skb);29412555 }···2960257029612571 rx_desc = E1000_RX_DESC(*rx_ring, i);29622572 }29632963-29642573 rx_ring->next_to_clean = i;29652965-29662966- e1000_alloc_rx_buffers(adapter);25742574+ adapter->alloc_rx_buf(adapter);2967257529682576 return cleaned;29692577}2970257829712579/**29722972- * e1000_alloc_rx_buffers - Replace used receive buffers25802580+ * e1000_clean_rx_irq_ps - Send received data up the network stack; packet split25812581+ * @adapter: board private structure25822582+ **/25832583+25842584+static boolean_t25852585+#ifdef CONFIG_E1000_NAPI25862586+e1000_clean_rx_irq_ps(struct e1000_adapter *adapter, int *work_done,25872587+ int work_to_do)25882588+#else25892589+e1000_clean_rx_irq_ps(struct e1000_adapter *adapter)25902590+#endif25912591+{25922592+ struct e1000_desc_ring *rx_ring = &adapter->rx_ring;25932593+ union e1000_rx_desc_packet_split *rx_desc;25942594+ struct net_device *netdev = adapter->netdev;25952595+ struct pci_dev *pdev = adapter->pdev;25962596+ struct e1000_buffer *buffer_info;25972597+ struct e1000_ps_page *ps_page;25982598+ struct e1000_ps_page_dma *ps_page_dma;25992599+ struct sk_buff *skb;26002600+ unsigned int i, j;26012601+ uint32_t length, staterr;26022602+ boolean_t cleaned = FALSE;26032603+26042604+ i = rx_ring->next_to_clean;26052605+ rx_desc = E1000_RX_DESC_PS(*rx_ring, i);26062606+ staterr = rx_desc->wb.middle.status_error;26072607+26082608+ while(staterr & E1000_RXD_STAT_DD) {26092609+ buffer_info = &rx_ring->buffer_info[i];26102610+ ps_page = &rx_ring->ps_page[i];26112611+ ps_page_dma = &rx_ring->ps_page_dma[i];26122612+#ifdef CONFIG_E1000_NAPI26132613+ if(unlikely(*work_done >= work_to_do))26142614+ break;26152615+ (*work_done)++;26162616+#endif26172617+ cleaned = TRUE;26182618+ pci_unmap_single(pdev, buffer_info->dma,26192619+ buffer_info->length,26202620+ PCI_DMA_FROMDEVICE);26212621+26222622+ skb = buffer_info->skb;26232623+26242624+ if(unlikely(!(staterr & E1000_RXD_STAT_EOP))) {26252625+ E1000_DBG("%s: Packet Split buffers didn't pick up"26262626+ " the full packet\n", netdev->name);26272627+ dev_kfree_skb_irq(skb);26282628+ goto next_desc;26292629+ }26302630+26312631+ if(unlikely(staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK)) {26322632+ dev_kfree_skb_irq(skb);26332633+ goto next_desc;26342634+ }26352635+26362636+ length = le16_to_cpu(rx_desc->wb.middle.length0);26372637+26382638+ if(unlikely(!length)) {26392639+ E1000_DBG("%s: Last part of the packet spanning"26402640+ " multiple descriptors\n", netdev->name);26412641+ dev_kfree_skb_irq(skb);26422642+ goto next_desc;26432643+ }26442644+26452645+ /* Good Receive */26462646+ skb_put(skb, length);26472647+26482648+ for(j = 0; j < PS_PAGE_BUFFERS; j++) {26492649+ if(!(length = le16_to_cpu(rx_desc->wb.upper.length[j])))26502650+ break;26512651+26522652+ pci_unmap_page(pdev, ps_page_dma->ps_page_dma[j],26532653+ PAGE_SIZE, PCI_DMA_FROMDEVICE);26542654+ ps_page_dma->ps_page_dma[j] = 0;26552655+ skb_shinfo(skb)->frags[j].page =26562656+ ps_page->ps_page[j];26572657+ ps_page->ps_page[j] = NULL;26582658+ skb_shinfo(skb)->frags[j].page_offset = 0;26592659+ skb_shinfo(skb)->frags[j].size = length;26602660+ skb_shinfo(skb)->nr_frags++;26612661+ skb->len += length;26622662+ skb->data_len += length;26632663+ }26642664+26652665+ e1000_rx_checksum(adapter, staterr,26662666+ rx_desc->wb.lower.hi_dword.csum_ip.csum, skb);26672667+ skb->protocol = eth_type_trans(skb, netdev);26682668+26692669+#ifdef HAVE_RX_ZERO_COPY26702670+ if(likely(rx_desc->wb.upper.header_status &26712671+ E1000_RXDPS_HDRSTAT_HDRSP))26722672+ skb_shinfo(skb)->zero_copy = TRUE;26732673+#endif26742674+#ifdef CONFIG_E1000_NAPI26752675+ if(unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {26762676+ vlan_hwaccel_receive_skb(skb, adapter->vlgrp,26772677+ le16_to_cpu(rx_desc->wb.middle.vlan &26782678+ E1000_RXD_SPC_VLAN_MASK));26792679+ } else {26802680+ netif_receive_skb(skb);26812681+ }26822682+#else /* CONFIG_E1000_NAPI */26832683+ if(unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {26842684+ vlan_hwaccel_rx(skb, adapter->vlgrp,26852685+ le16_to_cpu(rx_desc->wb.middle.vlan &26862686+ E1000_RXD_SPC_VLAN_MASK));26872687+ } else {26882688+ netif_rx(skb);26892689+ }26902690+#endif /* CONFIG_E1000_NAPI */26912691+ netdev->last_rx = jiffies;26922692+26932693+next_desc:26942694+ rx_desc->wb.middle.status_error &= ~0xFF;26952695+ buffer_info->skb = NULL;26962696+ if(unlikely(++i == rx_ring->count)) i = 0;26972697+26982698+ rx_desc = E1000_RX_DESC_PS(*rx_ring, i);26992699+ staterr = rx_desc->wb.middle.status_error;27002700+ }27012701+ rx_ring->next_to_clean = i;27022702+ adapter->alloc_rx_buf(adapter);27032703+27042704+ return cleaned;27052705+}27062706+27072707+/**27082708+ * e1000_alloc_rx_buffers - Replace used receive buffers; legacy & extended29732709 * @adapter: address of board private structure29742710 **/29752711···31082592 struct e1000_rx_desc *rx_desc;31092593 struct e1000_buffer *buffer_info;31102594 struct sk_buff *skb;31113111- unsigned int i, bufsz;25952595+ unsigned int i;25962596+ unsigned int bufsz = adapter->rx_buffer_len + NET_IP_ALIGN;3112259731132598 i = rx_ring->next_to_use;31142599 buffer_info = &rx_ring->buffer_info[i];3115260031162601 while(!buffer_info->skb) {31173117- bufsz = adapter->rx_buffer_len + NET_IP_ALIGN;31183118-31192602 skb = dev_alloc_skb(bufsz);26032603+31202604 if(unlikely(!skb)) {31212605 /* Better luck next round */31222606 break;31232607 }3124260831253125- /* fix for errata 23, cant cross 64kB boundary */26092609+ /* Fix for errata 23, can't cross 64kB boundary */31262610 if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {31272611 struct sk_buff *oldskb = skb;31283128- DPRINTK(RX_ERR,ERR,31293129- "skb align check failed: %u bytes at %p\n",31303130- bufsz, skb->data);31313131- /* try again, without freeing the previous */26122612+ DPRINTK(RX_ERR, ERR, "skb align check failed: %u bytes "26132613+ "at %p\n", bufsz, skb->data);26142614+ /* Try again, without freeing the previous */31322615 skb = dev_alloc_skb(bufsz);26162616+ /* Failed allocation, critical failure */31332617 if (!skb) {31342618 dev_kfree_skb(oldskb);31352619 break;31362620 }26212621+31372622 if (!e1000_check_64k_bound(adapter, skb->data, bufsz)) {31382623 /* give up */31392624 dev_kfree_skb(skb);31402625 dev_kfree_skb(oldskb);31412626 break; /* while !buffer_info->skb */31422627 } else {31433143- /* move on with the new one */26282628+ /* Use new allocation */31442629 dev_kfree_skb(oldskb);31452630 }31462631 }31473147-31482632 /* Make buffer alignment 2 beyond a 16 byte boundary31492633 * this will result in a 16 byte aligned IP header after31502634 * the 14 byte MAC header is removed···31602644 adapter->rx_buffer_len,31612645 PCI_DMA_FROMDEVICE);3162264631633163- /* fix for errata 23, cant cross 64kB boundary */31643164- if(!e1000_check_64k_bound(adapter,31653165- (void *)(unsigned long)buffer_info->dma,31663166- adapter->rx_buffer_len)) {31673167- DPRINTK(RX_ERR,ERR,31683168- "dma align check failed: %u bytes at %ld\n",31693169- adapter->rx_buffer_len, (unsigned long)buffer_info->dma);31703170-26472647+ /* Fix for errata 23, can't cross 64kB boundary */26482648+ if (!e1000_check_64k_bound(adapter,26492649+ (void *)(unsigned long)buffer_info->dma,26502650+ adapter->rx_buffer_len)) {26512651+ DPRINTK(RX_ERR, ERR,26522652+ "dma align check failed: %u bytes at %p\n",26532653+ adapter->rx_buffer_len,26542654+ (void *)(unsigned long)buffer_info->dma);31712655 dev_kfree_skb(skb);31722656 buffer_info->skb = NULL;3173265731743174- pci_unmap_single(pdev,31753175- buffer_info->dma,26582658+ pci_unmap_single(pdev, buffer_info->dma,31762659 adapter->rx_buffer_len,31772660 PCI_DMA_FROMDEVICE);3178266131792662 break; /* while !buffer_info->skb */31802663 }31813181-31822664 rx_desc = E1000_RX_DESC(*rx_ring, i);31832665 rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);31842666···31862672 * applicable for weak-ordered memory model archs,31872673 * such as IA-64). */31882674 wmb();31893189-31902675 E1000_WRITE_REG(&adapter->hw, RDT, i);31912676 }31922677···31932680 buffer_info = &rx_ring->buffer_info[i];31942681 }3195268226832683+ rx_ring->next_to_use = i;26842684+}26852685+26862686+/**26872687+ * e1000_alloc_rx_buffers_ps - Replace used receive buffers; packet split26882688+ * @adapter: address of board private structure26892689+ **/26902690+26912691+static void26922692+e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter)26932693+{26942694+ struct e1000_desc_ring *rx_ring = &adapter->rx_ring;26952695+ struct net_device *netdev = adapter->netdev;26962696+ struct pci_dev *pdev = adapter->pdev;26972697+ union e1000_rx_desc_packet_split *rx_desc;26982698+ struct e1000_buffer *buffer_info;26992699+ struct e1000_ps_page *ps_page;27002700+ struct e1000_ps_page_dma *ps_page_dma;27012701+ struct sk_buff *skb;27022702+ unsigned int i, j;27032703+27042704+ i = rx_ring->next_to_use;27052705+ buffer_info = &rx_ring->buffer_info[i];27062706+ ps_page = &rx_ring->ps_page[i];27072707+ ps_page_dma = &rx_ring->ps_page_dma[i];27082708+27092709+ while(!buffer_info->skb) {27102710+ rx_desc = E1000_RX_DESC_PS(*rx_ring, i);27112711+27122712+ for(j = 0; j < PS_PAGE_BUFFERS; j++) {27132713+ if(unlikely(!ps_page->ps_page[j])) {27142714+ ps_page->ps_page[j] =27152715+ alloc_page(GFP_ATOMIC);27162716+ if(unlikely(!ps_page->ps_page[j]))27172717+ goto no_buffers;27182718+ ps_page_dma->ps_page_dma[j] =27192719+ pci_map_page(pdev,27202720+ ps_page->ps_page[j],27212721+ 0, PAGE_SIZE,27222722+ PCI_DMA_FROMDEVICE);27232723+ }27242724+ /* Refresh the desc even if buffer_addrs didn't27252725+ * change because each write-back erases this info.27262726+ */27272727+ rx_desc->read.buffer_addr[j+1] =27282728+ cpu_to_le64(ps_page_dma->ps_page_dma[j]);27292729+ }27302730+27312731+ skb = dev_alloc_skb(adapter->rx_ps_bsize0 + NET_IP_ALIGN);27322732+27332733+ if(unlikely(!skb))27342734+ break;27352735+27362736+ /* Make buffer alignment 2 beyond a 16 byte boundary27372737+ * this will result in a 16 byte aligned IP header after27382738+ * the 14 byte MAC header is removed27392739+ */27402740+ skb_reserve(skb, NET_IP_ALIGN);27412741+27422742+ skb->dev = netdev;27432743+27442744+ buffer_info->skb = skb;27452745+ buffer_info->length = adapter->rx_ps_bsize0;27462746+ buffer_info->dma = pci_map_single(pdev, skb->data,27472747+ adapter->rx_ps_bsize0,27482748+ PCI_DMA_FROMDEVICE);27492749+27502750+ rx_desc->read.buffer_addr[0] = cpu_to_le64(buffer_info->dma);27512751+27522752+ if(unlikely((i & ~(E1000_RX_BUFFER_WRITE - 1)) == i)) {27532753+ /* Force memory writes to complete before letting h/w27542754+ * know there are new descriptors to fetch. (Only27552755+ * applicable for weak-ordered memory model archs,27562756+ * such as IA-64). */27572757+ wmb();27582758+ /* Hardware increments by 16 bytes, but packet split27592759+ * descriptors are 32 bytes...so we increment tail27602760+ * twice as much.27612761+ */27622762+ E1000_WRITE_REG(&adapter->hw, RDT, i<<1);27632763+ }27642764+27652765+ if(unlikely(++i == rx_ring->count)) i = 0;27662766+ buffer_info = &rx_ring->buffer_info[i];27672767+ ps_page = &rx_ring->ps_page[i];27682768+ ps_page_dma = &rx_ring->ps_page_dma[i];27692769+ }27702770+27712771+no_buffers:31962772 rx_ring->next_to_use = i;31972773}31982774···34582856e1000_pci_set_mwi(struct e1000_hw *hw)34592857{34602858 struct e1000_adapter *adapter = hw->back;28592859+ int ret_val = pci_set_mwi(adapter->pdev);3461286034623462- int ret;34633463- ret = pci_set_mwi(adapter->pdev);28612861+ if(ret_val)28622862+ DPRINTK(PROBE, ERR, "Error in setting MWI\n");34642863}3465286434662865void···35202917 rctl |= E1000_RCTL_VFE;35212918 rctl &= ~E1000_RCTL_CFIEN;35222919 E1000_WRITE_REG(&adapter->hw, RCTL, rctl);29202920+ e1000_update_mng_vlan(adapter);35232921 } else {35242922 /* disable VLAN tag insert/strip */35252923 ctrl = E1000_READ_REG(&adapter->hw, CTRL);···35312927 rctl = E1000_READ_REG(&adapter->hw, RCTL);35322928 rctl &= ~E1000_RCTL_VFE;35332929 E1000_WRITE_REG(&adapter->hw, RCTL, rctl);29302930+ if(adapter->mng_vlan_id != (uint16_t)E1000_MNG_VLAN_NONE) {29312931+ e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);29322932+ adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;29332933+ }35342934 }3535293535362936 e1000_irq_enable(adapter);···35452937{35462938 struct e1000_adapter *adapter = netdev->priv;35472939 uint32_t vfta, index;35483548-29402940+ if((adapter->hw.mng_cookie.status &29412941+ E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&29422942+ (vid == adapter->mng_vlan_id))29432943+ return;35492944 /* add VID to filter table */35502945 index = (vid >> 5) & 0x7F;35512946 vfta = E1000_READ_REG_ARRAY(&adapter->hw, VFTA, index);···3569295835702959 e1000_irq_enable(adapter);3571296029612961+ if((adapter->hw.mng_cookie.status &29622962+ E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&29632963+ (vid == adapter->mng_vlan_id))29642964+ return;35722965 /* remove VID from filter table */35732966 index = (vid >> 5) & 0x7F;35742967 vfta = E1000_READ_REG_ARRAY(&adapter->hw, VFTA, index);···36193004 break;36203005 case SPEED_1000 + DUPLEX_HALF: /* not supported */36213006 default:36223622- DPRINTK(PROBE, ERR, 36233623- "Unsupported Speed/Duplexity configuration\n");30073007+ DPRINTK(PROBE, ERR, "Unsupported Speed/Duplex configuration\n");36243008 return -EINVAL;36253009 }36263010 return 0;···36473033{36483034 struct net_device *netdev = pci_get_drvdata(pdev);36493035 struct e1000_adapter *adapter = netdev->priv;36503650- uint32_t ctrl, ctrl_ext, rctl, manc, status;30363036+ uint32_t ctrl, ctrl_ext, rctl, manc, status, swsm;36513037 uint32_t wufc = adapter->wol;3652303836533039 netif_device_detach(netdev);···36893075 E1000_WRITE_REG(&adapter->hw, CTRL_EXT, ctrl_ext);36903076 }3691307730783078+ /* Allow time for pending master requests to run */30793079+ e1000_disable_pciex_master(&adapter->hw);30803080+36923081 E1000_WRITE_REG(&adapter->hw, WUC, E1000_WUC_PME_EN);36933082 E1000_WRITE_REG(&adapter->hw, WUFC, wufc);36943083 pci_enable_wake(pdev, 3, 1);···37163099 }37173100 }3718310131023102+ switch(adapter->hw.mac_type) {31033103+ case e1000_82573:31043104+ swsm = E1000_READ_REG(&adapter->hw, SWSM);31053105+ E1000_WRITE_REG(&adapter->hw, SWSM,31063106+ swsm & ~E1000_SWSM_DRV_LOAD);31073107+ break;31083108+ default:31093109+ break;31103110+ }31113111+37193112 pci_disable_device(pdev);3720311337213114 state = (state > 0) ? 3 : 0;···37403113{37413114 struct net_device *netdev = pci_get_drvdata(pdev);37423115 struct e1000_adapter *adapter = netdev->priv;37433743- uint32_t manc, ret;31163116+ uint32_t manc, ret, swsm;3744311737453118 pci_set_power_state(pdev, 0);37463119 pci_restore_state(pdev);37473120 ret = pci_enable_device(pdev);37483748- if (pdev->is_busmaster)37493749- pci_set_master(pdev);31213121+ pci_set_master(pdev);3750312237513123 pci_enable_wake(pdev, 3, 0);37523124 pci_enable_wake(pdev, 4, 0); /* 4 == D3 cold */···37653139 E1000_WRITE_REG(&adapter->hw, MANC, manc);37663140 }3767314131423142+ switch(adapter->hw.mac_type) {31433143+ case e1000_82573:31443144+ swsm = E1000_READ_REG(&adapter->hw, SWSM);31453145+ E1000_WRITE_REG(&adapter->hw, SWSM,31463146+ swsm | E1000_SWSM_DRV_LOAD);31473147+ break;31483148+ default:31493149+ break;31503150+ }31513151+37683152 return 0;37693153}37703154#endif37713771-37723155#ifdef CONFIG_NET_POLL_CONTROLLER37733156/*37743157 * Polling 'interrupt' - used by things like netconsole to send skbs···37853150 * the interrupt routine is executing.37863151 */37873152static void37883788-e1000_netpoll (struct net_device *netdev)31533153+e1000_netpoll(struct net_device *netdev)37893154{37903155 struct e1000_adapter *adapter = netdev->priv;37913156 disable_irq(adapter->pdev->irq);
+30-2
drivers/net/e1000/e1000_osdep.h
···11/*******************************************************************************223344- Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.44+ Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.5566 This program is free software; you can redistribute it and/or modify it 77 under the terms of the GNU General Public License as published by the Free ···4242#include <linux/sched.h>43434444#ifndef msec_delay4545-#define msec_delay(x) msleep(x)4545+#define msec_delay(x) do { if(in_interrupt()) { \4646+ /* Don't mdelay in interrupt context! */ \4747+ BUG(); \4848+ } else { \4949+ msleep(x); \5050+ } } while(0)46514752/* Some workarounds require millisecond delays and are run during interrupt4853 * context. Most notably, when establishing link, the phy may need tweaking···10095 readl((a)->hw_addr + \10196 (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \10297 ((offset) << 2)))9898+9999+#define E1000_READ_REG_ARRAY_DWORD E1000_READ_REG_ARRAY100100+#define E1000_WRITE_REG_ARRAY_DWORD E1000_WRITE_REG_ARRAY101101+102102+#define E1000_WRITE_REG_ARRAY_WORD(a, reg, offset, value) ( \103103+ writew((value), ((a)->hw_addr + \104104+ (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \105105+ ((offset) << 1))))106106+107107+#define E1000_READ_REG_ARRAY_WORD(a, reg, offset) ( \108108+ readw((a)->hw_addr + \109109+ (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \110110+ ((offset) << 1)))111111+112112+#define E1000_WRITE_REG_ARRAY_BYTE(a, reg, offset, value) ( \113113+ writeb((value), ((a)->hw_addr + \114114+ (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \115115+ (offset))))116116+117117+#define E1000_READ_REG_ARRAY_BYTE(a, reg, offset) ( \118118+ readb((a)->hw_addr + \119119+ (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \120120+ (offset)))103121104122#define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, STATUS)105123
+1-2
drivers/net/e1000/e1000_param.c
···11/*******************************************************************************223344- Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.44+ Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.5566 This program is free software; you can redistribute it and/or modify it 77 under the terms of the GNU General Public License as published by the Free ···478478 DPRINTK(PROBE, INFO, "%s set to dynamic mode\n", 479479 opt.name);480480 break;481481- case -1:482481 default:483482 e1000_validate_option(&adapter->itr, &opt, 484483 adapter);
+1-1
drivers/net/ixgb/ixgb.h
···110110#define IXGB_TX_QUEUE_WAKE 16111111112112/* How many Rx Buffers do we bundle into one write to the hardware ? */113113-#define IXGB_RX_BUFFER_WRITE 16 /* Must be power of 2 */113113+#define IXGB_RX_BUFFER_WRITE 4 /* Must be power of 2 */114114115115/* only works for sizes that are powers of 2 */116116#define IXGB_ROUNDUP(i, size) ((i) = (((i) + (size) - 1) & ~((size) - 1)))