if_em.c (197078) | if_em.c (200243) |
---|---|
1/****************************************************************************** 2 3 Copyright (c) 2001-2009, Intel Corporation 4 All rights reserved. 5 6 Redistribution and use in source and binary forms, with or without 7 modification, are permitted provided that the following conditions are met: 8 --- 16 unchanged lines hidden (view full) --- 25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 POSSIBILITY OF SUCH DAMAGE. 31 32******************************************************************************/ | 1/****************************************************************************** 2 3 Copyright (c) 2001-2009, Intel Corporation 4 All rights reserved. 5 6 Redistribution and use in source and binary forms, with or without 7 modification, are permitted provided that the following conditions are met: 8 --- 16 unchanged lines hidden (view full) --- 25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 POSSIBILITY OF SUCH DAMAGE. 31 32******************************************************************************/ |
33/*$FreeBSD: head/sys/dev/e1000/if_em.c 197078 2009-09-10 21:14:55Z jfv $*/ | 33/*$FreeBSD: head/sys/dev/e1000/if_em.c 200243 2009-12-08 01:07:44Z jfv $*/ |
34 35#ifdef HAVE_KERNEL_OPTION_HEADERS 36#include "opt_device_polling.h" 37#include "opt_inet.h" 38#endif 39 40#include <sys/param.h> 41#include <sys/systm.h> --- 47 unchanged lines hidden (view full) --- 89/********************************************************************* 90 * Set this to one to display debug statistics 91 *********************************************************************/ 92int em_display_debug_stats = 0; 93 94/********************************************************************* 95 * Driver version: 96 *********************************************************************/ | 34 35#ifdef HAVE_KERNEL_OPTION_HEADERS 36#include "opt_device_polling.h" 37#include "opt_inet.h" 38#endif 39 40#include <sys/param.h> 41#include <sys/systm.h> --- 47 unchanged lines hidden (view full) --- 89/********************************************************************* 90 * Set this to one to display debug statistics 91 *********************************************************************/ 92int em_display_debug_stats = 0; 93 94/********************************************************************* 95 * Driver version: 96 *********************************************************************/ |
97char em_driver_version[] = "6.9.14"; | 97char em_driver_version[] = "6.9.24"; |
98 99 100/********************************************************************* 101 * PCI Device ID Table 102 * 103 * Used by probe to select devices to load on 104 * Last field stores an index into e1000_strings 105 * Last entry must be all 0s --- 83 unchanged lines hidden (view full) --- 189 PCI_ANY_ID, PCI_ANY_ID, 0}, 190 { 0x8086, E1000_DEV_ID_ICH8_IGP_M_AMT, PCI_ANY_ID, PCI_ANY_ID, 0}, 191 { 0x8086, E1000_DEV_ID_ICH8_IGP_AMT, PCI_ANY_ID, PCI_ANY_ID, 0}, 192 { 0x8086, E1000_DEV_ID_ICH8_IGP_C, PCI_ANY_ID, PCI_ANY_ID, 0}, 193 { 0x8086, E1000_DEV_ID_ICH8_IFE, PCI_ANY_ID, PCI_ANY_ID, 0}, 194 { 0x8086, E1000_DEV_ID_ICH8_IFE_GT, PCI_ANY_ID, PCI_ANY_ID, 0}, 195 { 0x8086, E1000_DEV_ID_ICH8_IFE_G, PCI_ANY_ID, PCI_ANY_ID, 0}, 196 { 0x8086, E1000_DEV_ID_ICH8_IGP_M, PCI_ANY_ID, PCI_ANY_ID, 0}, | 98 99 100/********************************************************************* 101 * PCI Device ID Table 102 * 103 * Used by probe to select devices to load on 104 * Last field stores an index into e1000_strings 105 * Last entry must be all 0s --- 83 unchanged lines hidden (view full) --- 189 PCI_ANY_ID, PCI_ANY_ID, 0}, 190 { 0x8086, E1000_DEV_ID_ICH8_IGP_M_AMT, PCI_ANY_ID, PCI_ANY_ID, 0}, 191 { 0x8086, E1000_DEV_ID_ICH8_IGP_AMT, PCI_ANY_ID, PCI_ANY_ID, 0}, 192 { 0x8086, E1000_DEV_ID_ICH8_IGP_C, PCI_ANY_ID, PCI_ANY_ID, 0}, 193 { 0x8086, E1000_DEV_ID_ICH8_IFE, PCI_ANY_ID, PCI_ANY_ID, 0}, 194 { 0x8086, E1000_DEV_ID_ICH8_IFE_GT, PCI_ANY_ID, PCI_ANY_ID, 0}, 195 { 0x8086, E1000_DEV_ID_ICH8_IFE_G, PCI_ANY_ID, PCI_ANY_ID, 0}, 196 { 0x8086, E1000_DEV_ID_ICH8_IGP_M, PCI_ANY_ID, PCI_ANY_ID, 0}, |
197 | 197 { 0x8086, E1000_DEV_ID_ICH8_82567V_3, PCI_ANY_ID, PCI_ANY_ID, 0}, |
198 { 0x8086, E1000_DEV_ID_ICH9_IGP_M_AMT, PCI_ANY_ID, PCI_ANY_ID, 0}, 199 { 0x8086, E1000_DEV_ID_ICH9_IGP_AMT, PCI_ANY_ID, PCI_ANY_ID, 0}, 200 { 0x8086, E1000_DEV_ID_ICH9_IGP_C, PCI_ANY_ID, PCI_ANY_ID, 0}, 201 { 0x8086, E1000_DEV_ID_ICH9_IGP_M, PCI_ANY_ID, PCI_ANY_ID, 0}, 202 { 0x8086, E1000_DEV_ID_ICH9_IGP_M_V, PCI_ANY_ID, PCI_ANY_ID, 0}, 203 { 0x8086, E1000_DEV_ID_ICH9_IFE, PCI_ANY_ID, PCI_ANY_ID, 0}, 204 { 0x8086, E1000_DEV_ID_ICH9_IFE_GT, PCI_ANY_ID, PCI_ANY_ID, 0}, 205 { 0x8086, E1000_DEV_ID_ICH9_IFE_G, PCI_ANY_ID, PCI_ANY_ID, 0}, 206 { 0x8086, E1000_DEV_ID_ICH9_BM, PCI_ANY_ID, PCI_ANY_ID, 0}, 207 { 0x8086, E1000_DEV_ID_82574L, PCI_ANY_ID, PCI_ANY_ID, 0}, 208 { 0x8086, E1000_DEV_ID_82574LA, PCI_ANY_ID, PCI_ANY_ID, 0}, 209 { 0x8086, E1000_DEV_ID_ICH10_R_BM_LM, PCI_ANY_ID, PCI_ANY_ID, 0}, 210 { 0x8086, E1000_DEV_ID_ICH10_R_BM_LF, PCI_ANY_ID, PCI_ANY_ID, 0}, 211 { 0x8086, E1000_DEV_ID_ICH10_R_BM_V, PCI_ANY_ID, PCI_ANY_ID, 0}, 212 { 0x8086, E1000_DEV_ID_ICH10_D_BM_LM, PCI_ANY_ID, PCI_ANY_ID, 0}, 213 { 0x8086, E1000_DEV_ID_ICH10_D_BM_LF, PCI_ANY_ID, PCI_ANY_ID, 0}, | 198 { 0x8086, E1000_DEV_ID_ICH9_IGP_M_AMT, PCI_ANY_ID, PCI_ANY_ID, 0}, 199 { 0x8086, E1000_DEV_ID_ICH9_IGP_AMT, PCI_ANY_ID, PCI_ANY_ID, 0}, 200 { 0x8086, E1000_DEV_ID_ICH9_IGP_C, PCI_ANY_ID, PCI_ANY_ID, 0}, 201 { 0x8086, E1000_DEV_ID_ICH9_IGP_M, PCI_ANY_ID, PCI_ANY_ID, 0}, 202 { 0x8086, E1000_DEV_ID_ICH9_IGP_M_V, PCI_ANY_ID, PCI_ANY_ID, 0}, 203 { 0x8086, E1000_DEV_ID_ICH9_IFE, PCI_ANY_ID, PCI_ANY_ID, 0}, 204 { 0x8086, E1000_DEV_ID_ICH9_IFE_GT, PCI_ANY_ID, PCI_ANY_ID, 0}, 205 { 0x8086, E1000_DEV_ID_ICH9_IFE_G, PCI_ANY_ID, PCI_ANY_ID, 0}, 206 { 0x8086, E1000_DEV_ID_ICH9_BM, PCI_ANY_ID, PCI_ANY_ID, 0}, 207 { 0x8086, E1000_DEV_ID_82574L, PCI_ANY_ID, PCI_ANY_ID, 0}, 208 { 0x8086, E1000_DEV_ID_82574LA, PCI_ANY_ID, PCI_ANY_ID, 0}, 209 { 0x8086, E1000_DEV_ID_ICH10_R_BM_LM, PCI_ANY_ID, PCI_ANY_ID, 0}, 210 { 0x8086, E1000_DEV_ID_ICH10_R_BM_LF, PCI_ANY_ID, PCI_ANY_ID, 0}, 211 { 0x8086, E1000_DEV_ID_ICH10_R_BM_V, PCI_ANY_ID, PCI_ANY_ID, 0}, 212 { 0x8086, E1000_DEV_ID_ICH10_D_BM_LM, PCI_ANY_ID, PCI_ANY_ID, 0}, 213 { 0x8086, E1000_DEV_ID_ICH10_D_BM_LF, PCI_ANY_ID, PCI_ANY_ID, 0}, |
214 { 0x8086, E1000_DEV_ID_PCH_M_HV_LM, PCI_ANY_ID, PCI_ANY_ID, 0}, 215 { 0x8086, E1000_DEV_ID_PCH_M_HV_LC, PCI_ANY_ID, PCI_ANY_ID, 0}, 216 { 0x8086, E1000_DEV_ID_PCH_D_HV_DM, PCI_ANY_ID, PCI_ANY_ID, 0}, 217 { 0x8086, E1000_DEV_ID_PCH_D_HV_DC, PCI_ANY_ID, PCI_ANY_ID, 0}, |
|
214 /* required last entry */ 215 { 0, 0, 0, 0, 0} 216}; 217 218/********************************************************************* 219 * Table of branding strings for all supported NICs. 220 *********************************************************************/ 221 --- 13 unchanged lines hidden (view full) --- 235static void em_start(struct ifnet *); 236static void em_start_locked(struct ifnet *ifp); 237#if __FreeBSD_version >= 800000 238static int em_mq_start(struct ifnet *, struct mbuf *); 239static int em_mq_start_locked(struct ifnet *, struct mbuf *); 240static void em_qflush(struct ifnet *); 241#endif 242static int em_ioctl(struct ifnet *, u_long, caddr_t); | 218 /* required last entry */ 219 { 0, 0, 0, 0, 0} 220}; 221 222/********************************************************************* 223 * Table of branding strings for all supported NICs. 224 *********************************************************************/ 225 --- 13 unchanged lines hidden (view full) --- 239static void em_start(struct ifnet *); 240static void em_start_locked(struct ifnet *ifp); 241#if __FreeBSD_version >= 800000 242static int em_mq_start(struct ifnet *, struct mbuf *); 243static int em_mq_start_locked(struct ifnet *, struct mbuf *); 244static void em_qflush(struct ifnet *); 245#endif 246static int em_ioctl(struct ifnet *, u_long, caddr_t); |
243static void em_watchdog(struct adapter *); | |
244static void em_init(void *); 245static void em_init_locked(struct adapter *); 246static void em_stop(void *); 247static void em_media_status(struct ifnet *, struct ifmediareq *); 248static int em_media_change(struct ifnet *); 249static void em_identify_hardware(struct adapter *); 250static int em_allocate_pci_resources(struct adapter *); 251static int em_allocate_legacy(struct adapter *adapter); --- 58 unchanged lines hidden (view full) --- 310static int em_sysctl_int_delay(SYSCTL_HANDLER_ARGS); 311static void em_add_int_delay_sysctl(struct adapter *, const char *, 312 const char *, struct em_int_delay_info *, int, int); 313/* Management and WOL Support */ 314static void em_init_manageability(struct adapter *); 315static void em_release_manageability(struct adapter *); 316static void em_get_hw_control(struct adapter *); 317static void em_release_hw_control(struct adapter *); | 247static void em_init(void *); 248static void em_init_locked(struct adapter *); 249static void em_stop(void *); 250static void em_media_status(struct ifnet *, struct ifmediareq *); 251static int em_media_change(struct ifnet *); 252static void em_identify_hardware(struct adapter *); 253static int em_allocate_pci_resources(struct adapter *); 254static int em_allocate_legacy(struct adapter *adapter); --- 58 unchanged lines hidden (view full) --- 313static int em_sysctl_int_delay(SYSCTL_HANDLER_ARGS); 314static void em_add_int_delay_sysctl(struct adapter *, const char *, 315 const char *, struct em_int_delay_info *, int, int); 316/* Management and WOL Support */ 317static void em_init_manageability(struct adapter *); 318static void em_release_manageability(struct adapter *); 319static void em_get_hw_control(struct adapter *); 320static void em_release_hw_control(struct adapter *); |
321static void em_get_wakeup(device_t); |
|
318static void em_enable_wakeup(device_t); | 322static void em_enable_wakeup(device_t); |
323static int em_enable_phy_wakeup(struct adapter *); |
|
319 320#ifdef EM_LEGACY_IRQ 321static void em_intr(void *); 322#else /* FAST IRQ */ 323#if __FreeBSD_version < 700000 324static void em_irq_fast(void *); 325#else 326static int em_irq_fast(void *); --- 158 unchanged lines hidden (view full) --- 485 *********************************************************************/ 486 487static int 488em_attach(device_t dev) 489{ 490 struct adapter *adapter; 491 int tsize, rsize; 492 int error = 0; | 324 325#ifdef EM_LEGACY_IRQ 326static void em_intr(void *); 327#else /* FAST IRQ */ 328#if __FreeBSD_version < 700000 329static void em_irq_fast(void *); 330#else 331static int em_irq_fast(void *); --- 158 unchanged lines hidden (view full) --- 490 *********************************************************************/ 491 492static int 493em_attach(device_t dev) 494{ 495 struct adapter *adapter; 496 int tsize, rsize; 497 int error = 0; |
493 u16 eeprom_data, device_id; | |
494 495 INIT_DEBUGOUT("em_attach: begin"); 496 497 adapter = device_get_softc(dev); 498 adapter->dev = adapter->osdep.dev = dev; 499 EM_CORE_LOCK_INIT(adapter, device_get_nameunit(dev)); 500 EM_TX_LOCK_INIT(adapter, device_get_nameunit(dev)); 501 EM_RX_LOCK_INIT(adapter, device_get_nameunit(dev)); --- 24 unchanged lines hidden (view full) --- 526 527 /* 528 ** For ICH8 and family we need to 529 ** map the flash memory, and this 530 ** must happen after the MAC is 531 ** identified 532 */ 533 if ((adapter->hw.mac.type == e1000_ich8lan) || | 498 499 INIT_DEBUGOUT("em_attach: begin"); 500 501 adapter = device_get_softc(dev); 502 adapter->dev = adapter->osdep.dev = dev; 503 EM_CORE_LOCK_INIT(adapter, device_get_nameunit(dev)); 504 EM_TX_LOCK_INIT(adapter, device_get_nameunit(dev)); 505 EM_RX_LOCK_INIT(adapter, device_get_nameunit(dev)); --- 24 unchanged lines hidden (view full) --- 530 531 /* 532 ** For ICH8 and family we need to 533 ** map the flash memory, and this 534 ** must happen after the MAC is 535 ** identified 536 */ 537 if ((adapter->hw.mac.type == e1000_ich8lan) || |
538 (adapter->hw.mac.type == e1000_pchlan) || |
|
534 (adapter->hw.mac.type == e1000_ich9lan) || 535 (adapter->hw.mac.type == e1000_ich10lan)) { 536 int rid = EM_BAR_TYPE_FLASH; 537 adapter->flash = bus_alloc_resource_any(dev, 538 SYS_RES_MEMORY, &rid, RF_ACTIVE); 539 if (adapter->flash == NULL) { 540 device_printf(dev, "Mapping of Flash failed\n"); 541 error = ENXIO; --- 181 unchanged lines hidden (view full) --- 723 */ 724 if (adapter->msi > 1) /* Do MSI/X */ 725 error = em_allocate_msix(adapter); 726 else /* MSI or Legacy */ 727 error = em_allocate_legacy(adapter); 728 if (error) 729 goto err_rx_struct; 730 | 539 (adapter->hw.mac.type == e1000_ich9lan) || 540 (adapter->hw.mac.type == e1000_ich10lan)) { 541 int rid = EM_BAR_TYPE_FLASH; 542 adapter->flash = bus_alloc_resource_any(dev, 543 SYS_RES_MEMORY, &rid, RF_ACTIVE); 544 if (adapter->flash == NULL) { 545 device_printf(dev, "Mapping of Flash failed\n"); 546 error = ENXIO; --- 181 unchanged lines hidden (view full) --- 728 */ 729 if (adapter->msi > 1) /* Do MSI/X */ 730 error = em_allocate_msix(adapter); 731 else /* MSI or Legacy */ 732 error = em_allocate_legacy(adapter); 733 if (error) 734 goto err_rx_struct; 735 |
736 /* 737 * Get Wake-on-Lan and Management info for later use 738 */ 739 em_get_wakeup(dev); 740 |
|
731 /* Setup OS specific network interface */ 732 em_setup_interface(dev, adapter); 733 734 /* Initialize statistics */ 735 em_update_stats_counters(adapter); 736 737 adapter->hw.mac.get_link_status = 1; 738 em_update_link_status(adapter); 739 740 /* Indicate SOL/IDER usage */ 741 if (e1000_check_reset_block(&adapter->hw)) 742 device_printf(dev, 743 "PHY reset is blocked due to SOL/IDER session.\n"); 744 | 741 /* Setup OS specific network interface */ 742 em_setup_interface(dev, adapter); 743 744 /* Initialize statistics */ 745 em_update_stats_counters(adapter); 746 747 adapter->hw.mac.get_link_status = 1; 748 em_update_link_status(adapter); 749 750 /* Indicate SOL/IDER usage */ 751 if (e1000_check_reset_block(&adapter->hw)) 752 device_printf(dev, 753 "PHY reset is blocked due to SOL/IDER session.\n"); 754 |
745 /* Determine if we have to control management hardware */ 746 adapter->has_manage = e1000_enable_mng_pass_thru(&adapter->hw); 747 748 /* 749 * Setup Wake-on-Lan 750 */ 751 switch (adapter->hw.mac.type) { 752 753 case e1000_82542: 754 case e1000_82543: 755 break; 756 case e1000_82546: 757 case e1000_82546_rev_3: 758 case e1000_82571: 759 case e1000_80003es2lan: 760 if (adapter->hw.bus.func == 1) 761 e1000_read_nvm(&adapter->hw, 762 NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data); 763 else 764 e1000_read_nvm(&adapter->hw, 765 NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); 766 eeprom_data &= EM_EEPROM_APME; 767 break; 768 default: 769 /* APME bit in EEPROM is mapped to WUC.APME */ 770 eeprom_data = E1000_READ_REG(&adapter->hw, E1000_WUC) & 771 E1000_WUC_APME; 772 break; 773 } 774 if (eeprom_data) 775 adapter->wol = E1000_WUFC_MAG; 776 /* 777 * We have the eeprom settings, now apply the special cases 778 * where the eeprom may be wrong or the board won't support 779 * wake on lan on a particular port 780 */ 781 device_id = pci_get_device(dev); 782 switch (device_id) { 783 case E1000_DEV_ID_82546GB_PCIE: 784 adapter->wol = 0; 785 break; 786 case E1000_DEV_ID_82546EB_FIBER: 787 case E1000_DEV_ID_82546GB_FIBER: 788 case E1000_DEV_ID_82571EB_FIBER: 789 /* Wake events only supported on port A for dual fiber 790 * regardless of eeprom setting */ 791 if (E1000_READ_REG(&adapter->hw, E1000_STATUS) & 792 E1000_STATUS_FUNC_1) 793 adapter->wol = 0; 794 break; 795 case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: 796 case E1000_DEV_ID_82571EB_QUAD_COPPER: 797 case E1000_DEV_ID_82571EB_QUAD_FIBER: 798 case E1000_DEV_ID_82571EB_QUAD_COPPER_LP: 799 /* if quad port adapter, disable WoL on all but port A */ 800 if (global_quad_port_a != 0) 801 adapter->wol = 0; 802 /* Reset for multiple quad port adapters */ 803 if (++global_quad_port_a == 4) 804 global_quad_port_a = 0; 805 break; 806 } 807 | |
808 /* Do we need workaround for 82544 PCI-X adapter? */ 809 if (adapter->hw.bus.type == e1000_bus_type_pcix && 810 adapter->hw.mac.type == e1000_82544) 811 adapter->pcix_82544 = TRUE; 812 else 813 adapter->pcix_82544 = FALSE; 814 815#if __FreeBSD_version >= 700029 816 /* Register for VLAN events */ 817 adapter->vlan_attach = EVENTHANDLER_REGISTER(vlan_config, 818 em_register_vlan, adapter, EVENTHANDLER_PRI_FIRST); 819 adapter->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig, 820 em_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST); 821#endif 822 | 755 /* Do we need workaround for 82544 PCI-X adapter? */ 756 if (adapter->hw.bus.type == e1000_bus_type_pcix && 757 adapter->hw.mac.type == e1000_82544) 758 adapter->pcix_82544 = TRUE; 759 else 760 adapter->pcix_82544 = FALSE; 761 762#if __FreeBSD_version >= 700029 763 /* Register for VLAN events */ 764 adapter->vlan_attach = EVENTHANDLER_REGISTER(vlan_config, 765 em_register_vlan, adapter, EVENTHANDLER_PRI_FIRST); 766 adapter->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig, 767 em_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST); 768#endif 769 |
770 /* Non-AMT based hardware can now take control from firmware */ 771 if (adapter->has_manage && !adapter->has_amt) 772 em_get_hw_control(adapter); 773 |
|
823 /* Tell the stack that the interface is not active */ 824 adapter->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 825 826 INIT_DEBUGOUT("em_attach: end"); 827 828 return (0); 829 830err_rx_struct: --- 50 unchanged lines hidden (view full) --- 881 EM_CORE_LOCK(adapter); 882 EM_TX_LOCK(adapter); 883 adapter->in_detach = 1; 884 em_stop(adapter); 885 e1000_phy_hw_reset(&adapter->hw); 886 887 em_release_manageability(adapter); 888 | 774 /* Tell the stack that the interface is not active */ 775 adapter->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 776 777 INIT_DEBUGOUT("em_attach: end"); 778 779 return (0); 780 781err_rx_struct: --- 50 unchanged lines hidden (view full) --- 832 EM_CORE_LOCK(adapter); 833 EM_TX_LOCK(adapter); 834 adapter->in_detach = 1; 835 em_stop(adapter); 836 e1000_phy_hw_reset(&adapter->hw); 837 838 em_release_manageability(adapter); 839 |
889 if (((adapter->hw.mac.type == e1000_82573) || 890 (adapter->hw.mac.type == e1000_82583) || 891 (adapter->hw.mac.type == e1000_ich8lan) || 892 (adapter->hw.mac.type == e1000_ich10lan) || 893 (adapter->hw.mac.type == e1000_ich9lan)) && 894 e1000_check_mng_mode(&adapter->hw)) 895 em_release_hw_control(adapter); 896 897 if (adapter->wol) { 898 E1000_WRITE_REG(&adapter->hw, E1000_WUC, E1000_WUC_PME_EN); 899 E1000_WRITE_REG(&adapter->hw, E1000_WUFC, adapter->wol); 900 em_enable_wakeup(dev); 901 } 902 | |
903 EM_TX_UNLOCK(adapter); 904 EM_CORE_UNLOCK(adapter); 905 906#if __FreeBSD_version >= 700029 907 /* Unregister VLAN events */ 908 if (adapter->vlan_attach != NULL) 909 EVENTHANDLER_DEREGISTER(vlan_config, adapter->vlan_attach); 910 if (adapter->vlan_detach != NULL) --- 18 unchanged lines hidden (view full) --- 929 } 930 931 /* Free Receive Descriptor ring */ 932 if (adapter->rx_desc_base) { 933 em_dma_free(adapter, &adapter->rxdma); 934 adapter->rx_desc_base = NULL; 935 } 936 | 840 EM_TX_UNLOCK(adapter); 841 EM_CORE_UNLOCK(adapter); 842 843#if __FreeBSD_version >= 700029 844 /* Unregister VLAN events */ 845 if (adapter->vlan_attach != NULL) 846 EVENTHANDLER_DEREGISTER(vlan_config, adapter->vlan_attach); 847 if (adapter->vlan_detach != NULL) --- 18 unchanged lines hidden (view full) --- 866 } 867 868 /* Free Receive Descriptor ring */ 869 if (adapter->rx_desc_base) { 870 em_dma_free(adapter, &adapter->rxdma); 871 adapter->rx_desc_base = NULL; 872 } 873 |
874 em_release_hw_control(adapter); |
|
937 EM_TX_LOCK_DESTROY(adapter); 938 EM_RX_LOCK_DESTROY(adapter); 939 EM_CORE_LOCK_DESTROY(adapter); 940 941 return (0); 942} 943 944/********************************************************************* --- 13 unchanged lines hidden (view full) --- 958 */ 959static int 960em_suspend(device_t dev) 961{ 962 struct adapter *adapter = device_get_softc(dev); 963 964 EM_CORE_LOCK(adapter); 965 | 875 EM_TX_LOCK_DESTROY(adapter); 876 EM_RX_LOCK_DESTROY(adapter); 877 EM_CORE_LOCK_DESTROY(adapter); 878 879 return (0); 880} 881 882/********************************************************************* --- 13 unchanged lines hidden (view full) --- 896 */ 897static int 898em_suspend(device_t dev) 899{ 900 struct adapter *adapter = device_get_softc(dev); 901 902 EM_CORE_LOCK(adapter); 903 |
966 EM_TX_LOCK(adapter); 967 em_stop(adapter); 968 EM_TX_UNLOCK(adapter); 969 | |
970 em_release_manageability(adapter); | 904 em_release_manageability(adapter); |
905 em_release_hw_control(adapter); 906 em_enable_wakeup(dev); |
|
971 | 907 |
972 if (((adapter->hw.mac.type == e1000_82573) || 973 (adapter->hw.mac.type == e1000_82583) || 974 (adapter->hw.mac.type == e1000_ich8lan) || 975 (adapter->hw.mac.type == e1000_ich10lan) || 976 (adapter->hw.mac.type == e1000_ich9lan)) && 977 e1000_check_mng_mode(&adapter->hw)) 978 em_release_hw_control(adapter); 979 980 if (adapter->wol) { 981 E1000_WRITE_REG(&adapter->hw, E1000_WUC, E1000_WUC_PME_EN); 982 E1000_WRITE_REG(&adapter->hw, E1000_WUFC, adapter->wol); 983 em_enable_wakeup(dev); 984 } 985 | |
986 EM_CORE_UNLOCK(adapter); 987 988 return bus_generic_suspend(dev); 989} 990 991static int 992em_resume(device_t dev) 993{ --- 36 unchanged lines hidden (view full) --- 1030 if (((ifp->if_drv_flags & (IFF_DRV_RUNNING|IFF_DRV_OACTIVE)) != 1031 IFF_DRV_RUNNING) 1032 || (!adapter->link_active)) { 1033 error = drbr_enqueue(ifp, adapter->br, m); 1034 return (error); 1035 } else if (drbr_empty(ifp, adapter->br) && 1036 (adapter->num_tx_desc_avail > EM_TX_OP_THRESHOLD)) { 1037 if ((error = em_xmit(adapter, &m)) != 0) { | 908 EM_CORE_UNLOCK(adapter); 909 910 return bus_generic_suspend(dev); 911} 912 913static int 914em_resume(device_t dev) 915{ --- 36 unchanged lines hidden (view full) --- 952 if (((ifp->if_drv_flags & (IFF_DRV_RUNNING|IFF_DRV_OACTIVE)) != 953 IFF_DRV_RUNNING) 954 || (!adapter->link_active)) { 955 error = drbr_enqueue(ifp, adapter->br, m); 956 return (error); 957 } else if (drbr_empty(ifp, adapter->br) && 958 (adapter->num_tx_desc_avail > EM_TX_OP_THRESHOLD)) { 959 if ((error = em_xmit(adapter, &m)) != 0) { |
1038 if (m != NULL) | 960 if (m) |
1039 error = drbr_enqueue(ifp, adapter->br, m); 1040 return (error); 1041 } else { 1042 /* 1043 * We've bypassed the buf ring so we need to update 1044 * ifp directly 1045 */ 1046 drbr_stats_update(ifp, m->m_pkthdr.len, m->m_flags); 1047 /* 1048 ** Send a copy of the frame to the BPF 1049 ** listener and set the watchdog on. 1050 */ 1051 ETHER_BPF_MTAP(ifp, m); | 961 error = drbr_enqueue(ifp, adapter->br, m); 962 return (error); 963 } else { 964 /* 965 * We've bypassed the buf ring so we need to update 966 * ifp directly 967 */ 968 drbr_stats_update(ifp, m->m_pkthdr.len, m->m_flags); 969 /* 970 ** Send a copy of the frame to the BPF 971 ** listener and set the watchdog on. 972 */ 973 ETHER_BPF_MTAP(ifp, m); |
1052 adapter->watchdog_timer = EM_TX_TIMEOUT; | 974 adapter->watchdog_check = TRUE; |
1053 } 1054 } else if ((error = drbr_enqueue(ifp, adapter->br, m)) != 0) 1055 return (error); 1056 1057process: 1058 if (drbr_empty(ifp, adapter->br)) 1059 return(error); 1060 /* Process the queue */ --- 6 unchanged lines hidden (view full) --- 1067 if ((error = em_xmit(adapter, &next)) != 0) { 1068 if (next != NULL) 1069 error = drbr_enqueue(ifp, adapter->br, next); 1070 break; 1071 } 1072 drbr_stats_update(ifp, next->m_pkthdr.len, next->m_flags); 1073 ETHER_BPF_MTAP(ifp, next); 1074 /* Set the watchdog */ | 975 } 976 } else if ((error = drbr_enqueue(ifp, adapter->br, m)) != 0) 977 return (error); 978 979process: 980 if (drbr_empty(ifp, adapter->br)) 981 return(error); 982 /* Process the queue */ --- 6 unchanged lines hidden (view full) --- 989 if ((error = em_xmit(adapter, &next)) != 0) { 990 if (next != NULL) 991 error = drbr_enqueue(ifp, adapter->br, next); 992 break; 993 } 994 drbr_stats_update(ifp, next->m_pkthdr.len, next->m_flags); 995 ETHER_BPF_MTAP(ifp, next); 996 /* Set the watchdog */ |
1075 adapter->watchdog_timer = EM_TX_TIMEOUT; | 997 adapter->watchdog_check = TRUE; |
1076 } 1077 1078 if (adapter->num_tx_desc_avail <= EM_TX_OP_THRESHOLD) 1079 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1080 1081 return (error); 1082} 1083 --- 62 unchanged lines hidden (view full) --- 1146 IFQ_DRV_PREPEND(&ifp->if_snd, m_head); 1147 break; 1148 } 1149 1150 /* Send a copy of the frame to the BPF listener */ 1151 ETHER_BPF_MTAP(ifp, m_head); 1152 1153 /* Set timeout in case hardware has problems transmitting. */ | 998 } 999 1000 if (adapter->num_tx_desc_avail <= EM_TX_OP_THRESHOLD) 1001 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1002 1003 return (error); 1004} 1005 --- 62 unchanged lines hidden (view full) --- 1068 IFQ_DRV_PREPEND(&ifp->if_snd, m_head); 1069 break; 1070 } 1071 1072 /* Send a copy of the frame to the BPF listener */ 1073 ETHER_BPF_MTAP(ifp, m_head); 1074 1075 /* Set timeout in case hardware has problems transmitting. */ |
1154 adapter->watchdog_timer = EM_TX_TIMEOUT; | 1076 adapter->watchdog_check = TRUE; |
1155 } 1156 if (adapter->num_tx_desc_avail <= EM_TX_OP_THRESHOLD) 1157 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1158 1159 return; 1160} 1161 1162static void --- 41 unchanged lines hidden (view full) --- 1204 * required. 1205 */ 1206 ifp->if_flags |= IFF_UP; 1207 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { 1208 EM_CORE_LOCK(adapter); 1209 em_init_locked(adapter); 1210 EM_CORE_UNLOCK(adapter); 1211 } | 1077 } 1078 if (adapter->num_tx_desc_avail <= EM_TX_OP_THRESHOLD) 1079 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 1080 1081 return; 1082} 1083 1084static void --- 41 unchanged lines hidden (view full) --- 1126 * required. 1127 */ 1128 ifp->if_flags |= IFF_UP; 1129 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { 1130 EM_CORE_LOCK(adapter); 1131 em_init_locked(adapter); 1132 EM_CORE_UNLOCK(adapter); 1133 } |
1212 if (!(ifp->if_flags & IFF_NOARP)) 1213 arp_ifinit(ifp, ifa); | 1134 arp_ifinit(ifp, ifa); |
1214 } else 1215#endif 1216 error = ether_ioctl(ifp, command, data); 1217 break; 1218 case SIOCSIFMTU: 1219 { 1220 int max_frame_size; 1221 u16 eeprom_data = 0; --- 17 unchanged lines hidden (view full) --- 1239 case e1000_82571: 1240 case e1000_82572: 1241 case e1000_ich9lan: 1242 case e1000_ich10lan: 1243 case e1000_82574: 1244 case e1000_80003es2lan: /* Limit Jumbo Frame size */ 1245 max_frame_size = 9234; 1246 break; | 1135 } else 1136#endif 1137 error = ether_ioctl(ifp, command, data); 1138 break; 1139 case SIOCSIFMTU: 1140 { 1141 int max_frame_size; 1142 u16 eeprom_data = 0; --- 17 unchanged lines hidden (view full) --- 1160 case e1000_82571: 1161 case e1000_82572: 1162 case e1000_ich9lan: 1163 case e1000_ich10lan: 1164 case e1000_82574: 1165 case e1000_80003es2lan: /* Limit Jumbo Frame size */ 1166 max_frame_size = 9234; 1167 break; |
1168 case e1000_pchlan: 1169 max_frame_size = 4096; 1170 break; |
|
1247 /* Adapters that do not support jumbo frames */ 1248 case e1000_82542: 1249 case e1000_82583: 1250 case e1000_ich8lan: 1251 max_frame_size = ETHER_MAX_LEN; 1252 break; 1253 default: 1254 max_frame_size = MAX_JUMBO_FRAME_SIZE; --- 99 unchanged lines hidden (view full) --- 1354 reinit = 1; 1355 } 1356#if __FreeBSD_version >= 700000 1357 if (mask & IFCAP_TSO4) { 1358 ifp->if_capenable ^= IFCAP_TSO4; 1359 reinit = 1; 1360 } 1361#endif | 1171 /* Adapters that do not support jumbo frames */ 1172 case e1000_82542: 1173 case e1000_82583: 1174 case e1000_ich8lan: 1175 max_frame_size = ETHER_MAX_LEN; 1176 break; 1177 default: 1178 max_frame_size = MAX_JUMBO_FRAME_SIZE; --- 99 unchanged lines hidden (view full) --- 1278 reinit = 1; 1279 } 1280#if __FreeBSD_version >= 700000 1281 if (mask & IFCAP_TSO4) { 1282 ifp->if_capenable ^= IFCAP_TSO4; 1283 reinit = 1; 1284 } 1285#endif |
1362 | |
1363 if (mask & IFCAP_VLAN_HWTAGGING) { 1364 ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; 1365 reinit = 1; 1366 } | 1286 if (mask & IFCAP_VLAN_HWTAGGING) { 1287 ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; 1288 reinit = 1; 1289 } |
1290 if ((mask & IFCAP_WOL) && 1291 (ifp->if_capabilities & IFCAP_WOL) != 0) { 1292 if (mask & IFCAP_WOL_MCAST) 1293 ifp->if_capenable ^= IFCAP_WOL_MCAST; 1294 if (mask & IFCAP_WOL_MAGIC) 1295 ifp->if_capenable ^= IFCAP_WOL_MAGIC; 1296 } |
|
1367 if (reinit && (ifp->if_drv_flags & IFF_DRV_RUNNING)) 1368 em_init(adapter); 1369#if __FreeBSD_version >= 700000 1370 VLAN_CAPABILITIES(ifp); 1371#endif 1372 break; 1373 } 1374 1375 default: 1376 error = ether_ioctl(ifp, command, data); 1377 break; 1378 } 1379 1380 return (error); 1381} 1382 | 1297 if (reinit && (ifp->if_drv_flags & IFF_DRV_RUNNING)) 1298 em_init(adapter); 1299#if __FreeBSD_version >= 700000 1300 VLAN_CAPABILITIES(ifp); 1301#endif 1302 break; 1303 } 1304 1305 default: 1306 error = ether_ioctl(ifp, command, data); 1307 break; 1308 } 1309 1310 return (error); 1311} 1312 |
1383/********************************************************************* 1384 * Watchdog timer: 1385 * 1386 * This routine is called from the local timer every second. 1387 * As long as transmit descriptors are being cleaned the value 1388 * is non-zero and we do nothing. Reaching 0 indicates a tx hang 1389 * and we then reset the device. 1390 * 1391 **********************************************************************/ | |
1392 | 1313 |
1393static void 1394em_watchdog(struct adapter *adapter) 1395{ 1396 1397 EM_CORE_LOCK_ASSERT(adapter); 1398 1399 /* 1400 ** The timer is set to 5 every time start queues a packet. 1401 ** Then txeof keeps resetting it as long as it cleans at 1402 ** least one descriptor. 1403 ** Finally, anytime all descriptors are clean the timer is 1404 ** set to 0. 1405 */ 1406 EM_TX_LOCK(adapter); 1407 if ((adapter->watchdog_timer == 0) || (--adapter->watchdog_timer)) { 1408 EM_TX_UNLOCK(adapter); 1409 return; 1410 } 1411 1412 /* If we are in this routine because of pause frames, then 1413 * don't reset the hardware. 1414 */ 1415 if (E1000_READ_REG(&adapter->hw, E1000_STATUS) & 1416 E1000_STATUS_TXOFF) { 1417 adapter->watchdog_timer = EM_TX_TIMEOUT; 1418 EM_TX_UNLOCK(adapter); 1419 return; 1420 } 1421 1422 if (e1000_check_for_link(&adapter->hw) == 0) 1423 device_printf(adapter->dev, "watchdog timeout -- resetting\n"); 1424 adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING; 1425 adapter->watchdog_events++; 1426 EM_TX_UNLOCK(adapter); 1427 1428 em_init_locked(adapter); 1429} 1430 | |
1431/********************************************************************* 1432 * Init entry point 1433 * 1434 * This routine is used in two ways. It is used by the stack as 1435 * init entry point in network interface structure. It is also used 1436 * by the driver as a hw/sw initialization routine to get to a 1437 * consistent state. 1438 * --- 48 unchanged lines hidden (view full) --- 1487 pba = E1000_PBA_12K; /* 12K for Rx, 20K for Tx */ 1488 break; 1489 case e1000_82574: 1490 case e1000_82583: 1491 pba = E1000_PBA_20K; /* 20K for Rx, 20K for Tx */ 1492 break; 1493 case e1000_ich9lan: 1494 case e1000_ich10lan: | 1314/********************************************************************* 1315 * Init entry point 1316 * 1317 * This routine is used in two ways. It is used by the stack as 1318 * init entry point in network interface structure. It is also used 1319 * by the driver as a hw/sw initialization routine to get to a 1320 * consistent state. 1321 * --- 48 unchanged lines hidden (view full) --- 1370 pba = E1000_PBA_12K; /* 12K for Rx, 20K for Tx */ 1371 break; 1372 case e1000_82574: 1373 case e1000_82583: 1374 pba = E1000_PBA_20K; /* 20K for Rx, 20K for Tx */ 1375 break; 1376 case e1000_ich9lan: 1377 case e1000_ich10lan: |
1378 case e1000_pchlan: 1379 pba = E1000_PBA_10K; 1380 break; |
|
1495 case e1000_ich8lan: 1496 pba = E1000_PBA_8K; 1497 break; 1498 default: 1499 /* Devices before 82547 had a Packet Buffer of 64K. */ 1500 if (adapter->max_frame_size > 8192) 1501 pba = E1000_PBA_40K; /* 40K for Rx, 24K for Tx */ 1502 else --- 106 unchanged lines hidden (view full) --- 1609 * they are off otherwise. 1610 */ 1611 if (ifp->if_capenable & IFCAP_POLLING) 1612 em_disable_intr(adapter); 1613 else 1614#endif /* DEVICE_POLLING */ 1615 em_enable_intr(adapter); 1616 | 1381 case e1000_ich8lan: 1382 pba = E1000_PBA_8K; 1383 break; 1384 default: 1385 /* Devices before 82547 had a Packet Buffer of 64K. */ 1386 if (adapter->max_frame_size > 8192) 1387 pba = E1000_PBA_40K; /* 40K for Rx, 24K for Tx */ 1388 else --- 106 unchanged lines hidden (view full) --- 1495 * they are off otherwise. 1496 */ 1497 if (ifp->if_capenable & IFCAP_POLLING) 1498 em_disable_intr(adapter); 1499 else 1500#endif /* DEVICE_POLLING */ 1501 em_enable_intr(adapter); 1502 |
1503 /* AMT based hardware can now take control from firmware */ 1504 if (adapter->has_manage && adapter->has_amt) 1505 em_get_hw_control(adapter); 1506 |
|
1617 /* Don't reset the phy next time init gets called */ 1618 adapter->hw.phy.reset_disable = TRUE; 1619} 1620 1621static void 1622em_init(void *arg) 1623{ 1624 struct adapter *adapter = arg; --- 37 unchanged lines hidden (view full) --- 1662 rx_done = em_rxeof(adapter, count); 1663 1664 EM_TX_LOCK(adapter); 1665 em_txeof(adapter); 1666#if __FreeBSD_version >= 800000 1667 if (!drbr_empty(ifp, adapter->br)) 1668 em_mq_start_locked(ifp, NULL); 1669#else | 1507 /* Don't reset the phy next time init gets called */ 1508 adapter->hw.phy.reset_disable = TRUE; 1509} 1510 1511static void 1512em_init(void *arg) 1513{ 1514 struct adapter *adapter = arg; --- 37 unchanged lines hidden (view full) --- 1552 rx_done = em_rxeof(adapter, count); 1553 1554 EM_TX_LOCK(adapter); 1555 em_txeof(adapter); 1556#if __FreeBSD_version >= 800000 1557 if (!drbr_empty(ifp, adapter->br)) 1558 em_mq_start_locked(ifp, NULL); 1559#else |
1670 if (!IFQ_DRV_IS_EMPTY(&ifp->snd)) | 1560 if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) |
1671 em_start_locked(ifp); 1672#endif 1673 EM_TX_UNLOCK(adapter); 1674 return (rx_done); 1675} 1676#endif /* DEVICE_POLLING */ 1677 1678#ifdef EM_LEGACY_IRQ --- 85 unchanged lines hidden (view full) --- 1764 taskqueue_enqueue(adapter->tq, &adapter->rxtx_task); 1765 EM_TX_LOCK(adapter); 1766 em_txeof(adapter); 1767 1768#if __FreeBSD_version >= 800000 1769 if (!drbr_empty(ifp, adapter->br)) 1770 em_mq_start_locked(ifp, NULL); 1771#else | 1561 em_start_locked(ifp); 1562#endif 1563 EM_TX_UNLOCK(adapter); 1564 return (rx_done); 1565} 1566#endif /* DEVICE_POLLING */ 1567 1568#ifdef EM_LEGACY_IRQ --- 85 unchanged lines hidden (view full) --- 1654 taskqueue_enqueue(adapter->tq, &adapter->rxtx_task); 1655 EM_TX_LOCK(adapter); 1656 em_txeof(adapter); 1657 1658#if __FreeBSD_version >= 800000 1659 if (!drbr_empty(ifp, adapter->br)) 1660 em_mq_start_locked(ifp, NULL); 1661#else |
1772 if (!IFQ_DRV_IS_EMPTY(&ifp->snd)) | 1662 if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) |
1773 em_start_locked(ifp); 1774#endif 1775 EM_TX_UNLOCK(adapter); 1776 } 1777 1778 em_enable_intr(adapter); 1779} 1780 --- 147 unchanged lines hidden (view full) --- 1928 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 1929 if (!EM_TX_TRYLOCK(adapter)) 1930 return; 1931 em_txeof(adapter); 1932#if __FreeBSD_version >= 800000 1933 if (!drbr_empty(ifp, adapter->br)) 1934 em_mq_start_locked(ifp, NULL); 1935#else | 1663 em_start_locked(ifp); 1664#endif 1665 EM_TX_UNLOCK(adapter); 1666 } 1667 1668 em_enable_intr(adapter); 1669} 1670 --- 147 unchanged lines hidden (view full) --- 1818 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 1819 if (!EM_TX_TRYLOCK(adapter)) 1820 return; 1821 em_txeof(adapter); 1822#if __FreeBSD_version >= 800000 1823 if (!drbr_empty(ifp, adapter->br)) 1824 em_mq_start_locked(ifp, NULL); 1825#else |
1936 if (!IFQ_DRV_IS_EMPTY(&ifp->snd)) | 1826 if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) |
1937 em_start_locked(ifp); 1938#endif 1939 EM_TX_UNLOCK(adapter); 1940 } 1941} 1942#endif /* EM_FAST_IRQ */ 1943 1944/********************************************************************* --- 591 unchanged lines hidden (view full) --- 2536 2537 /* Allocate temporary memory to setup array */ 2538 mta = malloc(sizeof(u8) * 2539 (ETH_ADDR_LEN * MAX_NUM_MULTICAST_ADDRESSES), 2540 M_DEVBUF, M_NOWAIT | M_ZERO); 2541 if (mta == NULL) 2542 panic("em_set_multi memory failure\n"); 2543 | 1827 em_start_locked(ifp); 1828#endif 1829 EM_TX_UNLOCK(adapter); 1830 } 1831} 1832#endif /* EM_FAST_IRQ */ 1833 1834/********************************************************************* --- 591 unchanged lines hidden (view full) --- 2426 2427 /* Allocate temporary memory to setup array */ 2428 mta = malloc(sizeof(u8) * 2429 (ETH_ADDR_LEN * MAX_NUM_MULTICAST_ADDRESSES), 2430 M_DEVBUF, M_NOWAIT | M_ZERO); 2431 if (mta == NULL) 2432 panic("em_set_multi memory failure\n"); 2433 |
2434#if __FreeBSD_version < 800000 2435 IF_ADDR_LOCK(ifp); 2436#else |
|
2544 if_maddr_rlock(ifp); | 2437 if_maddr_rlock(ifp); |
2438#endif |
|
2545 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { 2546 if (ifma->ifma_addr->sa_family != AF_LINK) 2547 continue; 2548 2549 if (mcnt == MAX_NUM_MULTICAST_ADDRESSES) 2550 break; 2551 2552 bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr), 2553 &mta[mcnt * ETH_ADDR_LEN], ETH_ADDR_LEN); 2554 mcnt++; 2555 } | 2439 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { 2440 if (ifma->ifma_addr->sa_family != AF_LINK) 2441 continue; 2442 2443 if (mcnt == MAX_NUM_MULTICAST_ADDRESSES) 2444 break; 2445 2446 bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr), 2447 &mta[mcnt * ETH_ADDR_LEN], ETH_ADDR_LEN); 2448 mcnt++; 2449 } |
2450#if __FreeBSD_version < 800000 2451 IF_ADDR_UNLOCK(ifp); 2452#else |
|
2556 if_maddr_runlock(ifp); | 2453 if_maddr_runlock(ifp); |
2557 | 2454#endif |
2558 if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES) { 2559 reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); 2560 reg_rctl |= E1000_RCTL_MPE; 2561 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl); 2562 } else 2563 e1000_update_mc_addr_list(&adapter->hw, mta, mcnt); 2564 2565 if (adapter->hw.mac.type == e1000_82542 && --- 34 unchanged lines hidden (view full) --- 2600 e1000_rar_set(&adapter->hw, adapter->hw.mac.addr, 0); 2601 2602 if (em_display_debug_stats && ifp->if_drv_flags & IFF_DRV_RUNNING) 2603 em_print_hw_stats(adapter); 2604 2605 em_smartspeed(adapter); 2606 2607 /* | 2455 if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES) { 2456 reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); 2457 reg_rctl |= E1000_RCTL_MPE; 2458 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl); 2459 } else 2460 e1000_update_mc_addr_list(&adapter->hw, mta, mcnt); 2461 2462 if (adapter->hw.mac.type == e1000_82542 && --- 34 unchanged lines hidden (view full) --- 2497 e1000_rar_set(&adapter->hw, adapter->hw.mac.addr, 0); 2498 2499 if (em_display_debug_stats && ifp->if_drv_flags & IFF_DRV_RUNNING) 2500 em_print_hw_stats(adapter); 2501 2502 em_smartspeed(adapter); 2503 2504 /* |
2608 * Each second we check the watchdog to 2609 * protect against hardware hangs. | 2505 * We check the watchdog: the time since 2506 * the last TX descriptor was cleaned. 2507 * This implies a functional TX engine. |
2610 */ | 2508 */ |
2611 em_watchdog(adapter); | 2509 if ((adapter->watchdog_check == TRUE) && 2510 (ticks - adapter->watchdog_time > EM_WATCHDOG)) 2511 goto hung; |
2612 2613 callout_reset(&adapter->timer, hz, em_local_timer, adapter); | 2512 2513 callout_reset(&adapter->timer, hz, em_local_timer, adapter); |
2614 | 2514 return; 2515hung: 2516 device_printf(adapter->dev, "Watchdog timeout -- resetting\n"); 2517 adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING; 2518 adapter->watchdog_events++; 2519 em_init_locked(adapter); |
2615} 2616 2617static void 2618em_update_link_status(struct adapter *adapter) 2619{ 2620 struct e1000_hw *hw = &adapter->hw; 2621 struct ifnet *ifp = adapter->ifp; 2622 device_t dev = adapter->dev; --- 49 unchanged lines hidden (view full) --- 2672 if_link_state_change(ifp, LINK_STATE_UP); 2673 } else if (!link_check && (adapter->link_active == 1)) { 2674 ifp->if_baudrate = adapter->link_speed = 0; 2675 adapter->link_duplex = 0; 2676 if (bootverbose) 2677 device_printf(dev, "Link is Down\n"); 2678 adapter->link_active = 0; 2679 /* Link down, disable watchdog */ | 2520} 2521 2522static void 2523em_update_link_status(struct adapter *adapter) 2524{ 2525 struct e1000_hw *hw = &adapter->hw; 2526 struct ifnet *ifp = adapter->ifp; 2527 device_t dev = adapter->dev; --- 49 unchanged lines hidden (view full) --- 2577 if_link_state_change(ifp, LINK_STATE_UP); 2578 } else if (!link_check && (adapter->link_active == 1)) { 2579 ifp->if_baudrate = adapter->link_speed = 0; 2580 adapter->link_duplex = 0; 2581 if (bootverbose) 2582 device_printf(dev, "Link is Down\n"); 2583 adapter->link_active = 0; 2584 /* Link down, disable watchdog */ |
2680 adapter->watchdog_timer = FALSE; | 2585 adapter->watchdog_check = FALSE; |
2681 if_link_state_change(ifp, LINK_STATE_DOWN); 2682 } 2683} 2684 2685/********************************************************************* 2686 * 2687 * This routine disables all traffic on the adapter by issuing a 2688 * global reset on the MAC and deallocates TX/RX buffers. --- 399 unchanged lines hidden (view full) --- 3088 device_t dev = adapter->dev; 3089 u16 rx_buffer_size; 3090 3091 INIT_DEBUGOUT("em_hardware_init: begin"); 3092 3093 /* Issue a global reset */ 3094 e1000_reset_hw(&adapter->hw); 3095 | 2586 if_link_state_change(ifp, LINK_STATE_DOWN); 2587 } 2588} 2589 2590/********************************************************************* 2591 * 2592 * This routine disables all traffic on the adapter by issuing a 2593 * global reset on the MAC and deallocates TX/RX buffers. --- 399 unchanged lines hidden (view full) --- 2993 device_t dev = adapter->dev; 2994 u16 rx_buffer_size; 2995 2996 INIT_DEBUGOUT("em_hardware_init: begin"); 2997 2998 /* Issue a global reset */ 2999 e1000_reset_hw(&adapter->hw); 3000 |
3096 /* Get control from any management/hw control */ 3097 if (((adapter->hw.mac.type == e1000_82573) || 3098 (adapter->hw.mac.type == e1000_82583) || 3099 (adapter->hw.mac.type == e1000_ich8lan) || 3100 (adapter->hw.mac.type == e1000_ich10lan) || 3101 (adapter->hw.mac.type == e1000_ich9lan)) && 3102 e1000_check_mng_mode(&adapter->hw)) 3103 em_get_hw_control(adapter); 3104 | |
3105 /* When hardware is reset, fifo_head is also reset */ 3106 adapter->tx_fifo_head = 0; 3107 3108 /* Set up smart power down as default off on newer adapters. */ 3109 if (!em_smart_pwr_down && (adapter->hw.mac.type == e1000_82571 || 3110 adapter->hw.mac.type == e1000_82572)) { 3111 u16 phy_tmp = 0; 3112 --- 33 unchanged lines hidden (view full) --- 3146 adapter->hw.fc.send_xon = TRUE; 3147 3148 /* Set Flow control, use the tunable location if sane */ 3149 if ((em_fc_setting >= 0) || (em_fc_setting < 4)) 3150 adapter->hw.fc.requested_mode = em_fc_setting; 3151 else 3152 adapter->hw.fc.requested_mode = e1000_fc_none; 3153 | 3001 /* When hardware is reset, fifo_head is also reset */ 3002 adapter->tx_fifo_head = 0; 3003 3004 /* Set up smart power down as default off on newer adapters. */ 3005 if (!em_smart_pwr_down && (adapter->hw.mac.type == e1000_82571 || 3006 adapter->hw.mac.type == e1000_82572)) { 3007 u16 phy_tmp = 0; 3008 --- 33 unchanged lines hidden (view full) --- 3042 adapter->hw.fc.send_xon = TRUE; 3043 3044 /* Set Flow control, use the tunable location if sane */ 3045 if ((em_fc_setting >= 0) || (em_fc_setting < 4)) 3046 adapter->hw.fc.requested_mode = em_fc_setting; 3047 else 3048 adapter->hw.fc.requested_mode = e1000_fc_none; 3049 |
3050 /* Override - workaround for PCHLAN issue */ 3051 if (adapter->hw.mac.type == e1000_pchlan) 3052 adapter->hw.fc.requested_mode = e1000_fc_rx_pause; |
|
3154 3155 if (e1000_init_hw(&adapter->hw) < 0) { 3156 device_printf(dev, "Hardware Initialization Failed\n"); 3157 return (EIO); 3158 } 3159 3160 e1000_check_for_link(&adapter->hw); 3161 --- 66 unchanged lines hidden (view full) --- 3228 ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header); 3229 ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU; 3230 ifp->if_capenable |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU; 3231 3232#ifdef DEVICE_POLLING 3233 ifp->if_capabilities |= IFCAP_POLLING; 3234#endif 3235 | 3053 3054 if (e1000_init_hw(&adapter->hw) < 0) { 3055 device_printf(dev, "Hardware Initialization Failed\n"); 3056 return (EIO); 3057 } 3058 3059 e1000_check_for_link(&adapter->hw); 3060 --- 66 unchanged lines hidden (view full) --- 3127 ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header); 3128 ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU; 3129 ifp->if_capenable |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU; 3130 3131#ifdef DEVICE_POLLING 3132 ifp->if_capabilities |= IFCAP_POLLING; 3133#endif 3134 |
3135 /* Enable All WOL methods by default */ 3136 if (adapter->wol) { 3137 ifp->if_capabilities |= IFCAP_WOL; 3138 ifp->if_capenable |= IFCAP_WOL; 3139 } 3140 |
|
3236 /* 3237 * Specify the media types supported by this adapter and register 3238 * callbacks to update media and link information 3239 */ 3240 ifmedia_init(&adapter->media, IFM_IMASK, 3241 em_media_change, em_media_status); 3242 if ((adapter->hw.phy.media_type == e1000_media_type_fiber) || 3243 (adapter->hw.phy.media_type == e1000_media_type_internal_serdes)) { --- 50 unchanged lines hidden (view full) --- 3294 e1000_read_phy_reg(&adapter->hw, 3295 PHY_1000T_CTRL, &phy_tmp); 3296 if(phy_tmp & CR_1000T_MS_ENABLE) { 3297 phy_tmp &= ~CR_1000T_MS_ENABLE; 3298 e1000_write_phy_reg(&adapter->hw, 3299 PHY_1000T_CTRL, phy_tmp); 3300 adapter->smartspeed++; 3301 if(adapter->hw.mac.autoneg && | 3141 /* 3142 * Specify the media types supported by this adapter and register 3143 * callbacks to update media and link information 3144 */ 3145 ifmedia_init(&adapter->media, IFM_IMASK, 3146 em_media_change, em_media_status); 3147 if ((adapter->hw.phy.media_type == e1000_media_type_fiber) || 3148 (adapter->hw.phy.media_type == e1000_media_type_internal_serdes)) { --- 50 unchanged lines hidden (view full) --- 3199 e1000_read_phy_reg(&adapter->hw, 3200 PHY_1000T_CTRL, &phy_tmp); 3201 if(phy_tmp & CR_1000T_MS_ENABLE) { 3202 phy_tmp &= ~CR_1000T_MS_ENABLE; 3203 e1000_write_phy_reg(&adapter->hw, 3204 PHY_1000T_CTRL, phy_tmp); 3205 adapter->smartspeed++; 3206 if(adapter->hw.mac.autoneg && |
3302 !e1000_phy_setup_autoneg(&adapter->hw) && | 3207 !e1000_copper_link_autoneg(&adapter->hw) && |
3303 !e1000_read_phy_reg(&adapter->hw, 3304 PHY_CONTROL, &phy_tmp)) { 3305 phy_tmp |= (MII_CR_AUTO_NEG_EN | 3306 MII_CR_RESTART_AUTO_NEG); 3307 e1000_write_phy_reg(&adapter->hw, 3308 PHY_CONTROL, phy_tmp); 3309 } 3310 } 3311 } 3312 return; 3313 } else if(adapter->smartspeed == EM_SMARTSPEED_DOWNSHIFT) { 3314 /* If still no link, perhaps using 2/3 pair cable */ 3315 e1000_read_phy_reg(&adapter->hw, PHY_1000T_CTRL, &phy_tmp); 3316 phy_tmp |= CR_1000T_MS_ENABLE; 3317 e1000_write_phy_reg(&adapter->hw, PHY_1000T_CTRL, phy_tmp); 3318 if(adapter->hw.mac.autoneg && | 3208 !e1000_read_phy_reg(&adapter->hw, 3209 PHY_CONTROL, &phy_tmp)) { 3210 phy_tmp |= (MII_CR_AUTO_NEG_EN | 3211 MII_CR_RESTART_AUTO_NEG); 3212 e1000_write_phy_reg(&adapter->hw, 3213 PHY_CONTROL, phy_tmp); 3214 } 3215 } 3216 } 3217 return; 3218 } else if(adapter->smartspeed == EM_SMARTSPEED_DOWNSHIFT) { 3219 /* If still no link, perhaps using 2/3 pair cable */ 3220 e1000_read_phy_reg(&adapter->hw, PHY_1000T_CTRL, &phy_tmp); 3221 phy_tmp |= CR_1000T_MS_ENABLE; 3222 e1000_write_phy_reg(&adapter->hw, PHY_1000T_CTRL, phy_tmp); 3223 if(adapter->hw.mac.autoneg && |
3319 !e1000_phy_setup_autoneg(&adapter->hw) && | 3224 !e1000_copper_link_autoneg(&adapter->hw) && |
3320 !e1000_read_phy_reg(&adapter->hw, PHY_CONTROL, &phy_tmp)) { 3321 phy_tmp |= (MII_CR_AUTO_NEG_EN | 3322 MII_CR_RESTART_AUTO_NEG); 3323 e1000_write_phy_reg(&adapter->hw, PHY_CONTROL, phy_tmp); 3324 } 3325 } 3326 /* Restart process after EM_SMARTSPEED_MAX iterations */ 3327 if(adapter->smartspeed++ == EM_SMARTSPEED_MAX) --- 642 unchanged lines hidden (view full) --- 3970 * processing the packet then free associated resources. The 3971 * tx_buffer is put back on the free queue. 3972 * 3973 **********************************************************************/ 3974static void 3975em_txeof(struct adapter *adapter) 3976{ 3977 int first, last, done, num_avail; | 3225 !e1000_read_phy_reg(&adapter->hw, PHY_CONTROL, &phy_tmp)) { 3226 phy_tmp |= (MII_CR_AUTO_NEG_EN | 3227 MII_CR_RESTART_AUTO_NEG); 3228 e1000_write_phy_reg(&adapter->hw, PHY_CONTROL, phy_tmp); 3229 } 3230 } 3231 /* Restart process after EM_SMARTSPEED_MAX iterations */ 3232 if(adapter->smartspeed++ == EM_SMARTSPEED_MAX) --- 642 unchanged lines hidden (view full) --- 3875 * processing the packet then free associated resources. The 3876 * tx_buffer is put back on the free queue. 3877 * 3878 **********************************************************************/ 3879static void 3880em_txeof(struct adapter *adapter) 3881{ 3882 int first, last, done, num_avail; |
3978 u32 cleaned = 0; | |
3979 struct em_buffer *tx_buffer; 3980 struct e1000_tx_desc *tx_desc, *eop_desc; 3981 struct ifnet *ifp = adapter->ifp; 3982 3983 EM_TX_LOCK_ASSERT(adapter); 3984 3985 if (adapter->num_tx_desc_avail == adapter->num_tx_desc) 3986 return; --- 19 unchanged lines hidden (view full) --- 4006 BUS_DMASYNC_POSTREAD); 4007 4008 while (eop_desc->upper.fields.status & E1000_TXD_STAT_DD) { 4009 /* We clean the range of the packet */ 4010 while (first != done) { 4011 tx_desc->upper.data = 0; 4012 tx_desc->lower.data = 0; 4013 tx_desc->buffer_addr = 0; | 3883 struct em_buffer *tx_buffer; 3884 struct e1000_tx_desc *tx_desc, *eop_desc; 3885 struct ifnet *ifp = adapter->ifp; 3886 3887 EM_TX_LOCK_ASSERT(adapter); 3888 3889 if (adapter->num_tx_desc_avail == adapter->num_tx_desc) 3890 return; --- 19 unchanged lines hidden (view full) --- 3910 BUS_DMASYNC_POSTREAD); 3911 3912 while (eop_desc->upper.fields.status & E1000_TXD_STAT_DD) { 3913 /* We clean the range of the packet */ 3914 while (first != done) { 3915 tx_desc->upper.data = 0; 3916 tx_desc->lower.data = 0; 3917 tx_desc->buffer_addr = 0; |
4014 ++num_avail; ++cleaned; | 3918 ++num_avail; |
4015 4016 if (tx_buffer->m_head) { 4017 ifp->if_opackets++; 4018 bus_dmamap_sync(adapter->txtag, 4019 tx_buffer->map, 4020 BUS_DMASYNC_POSTWRITE); 4021 bus_dmamap_unload(adapter->txtag, 4022 tx_buffer->map); 4023 4024 m_freem(tx_buffer->m_head); 4025 tx_buffer->m_head = NULL; 4026 } 4027 tx_buffer->next_eop = -1; | 3919 3920 if (tx_buffer->m_head) { 3921 ifp->if_opackets++; 3922 bus_dmamap_sync(adapter->txtag, 3923 tx_buffer->map, 3924 BUS_DMASYNC_POSTWRITE); 3925 bus_dmamap_unload(adapter->txtag, 3926 tx_buffer->map); 3927 3928 m_freem(tx_buffer->m_head); 3929 tx_buffer->m_head = NULL; 3930 } 3931 tx_buffer->next_eop = -1; |
3932 adapter->watchdog_time = ticks; |
|
4028 4029 if (++first == adapter->num_tx_desc) 4030 first = 0; 4031 4032 tx_buffer = &adapter->tx_buffer_area[first]; 4033 tx_desc = &adapter->tx_desc_base[first]; 4034 } 4035 /* See if we can continue to the next packet */ --- 9 unchanged lines hidden (view full) --- 4045 bus_dmamap_sync(adapter->txdma.dma_tag, adapter->txdma.dma_map, 4046 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 4047 4048 adapter->next_tx_to_clean = first; 4049 4050 /* 4051 * If we have enough room, clear IFF_DRV_OACTIVE to 4052 * tell the stack that it is OK to send packets. | 3933 3934 if (++first == adapter->num_tx_desc) 3935 first = 0; 3936 3937 tx_buffer = &adapter->tx_buffer_area[first]; 3938 tx_desc = &adapter->tx_desc_base[first]; 3939 } 3940 /* See if we can continue to the next packet */ --- 9 unchanged lines hidden (view full) --- 3950 bus_dmamap_sync(adapter->txdma.dma_tag, adapter->txdma.dma_map, 3951 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 3952 3953 adapter->next_tx_to_clean = first; 3954 3955 /* 3956 * If we have enough room, clear IFF_DRV_OACTIVE to 3957 * tell the stack that it is OK to send packets. |
4053 * If there are no pending descriptors, clear the timeout. | 3958 * If there are no pending descriptors, clear the watchdog. |
4054 */ 4055 if (num_avail > EM_TX_CLEANUP_THRESHOLD) { 4056 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 4057 if (num_avail == adapter->num_tx_desc) { | 3959 */ 3960 if (num_avail > EM_TX_CLEANUP_THRESHOLD) { 3961 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 3962 if (num_avail == adapter->num_tx_desc) { |
4058 adapter->watchdog_timer = 0; | 3963 adapter->watchdog_check = FALSE; |
4059 adapter->num_tx_desc_avail = num_avail; 4060 return; 4061 } 4062 } 4063 | 3964 adapter->num_tx_desc_avail = num_avail; 3965 return; 3966 } 3967 } 3968 |
4064 /* If any descriptors cleaned, reset the watchdog */ 4065 if (cleaned) 4066 adapter->watchdog_timer = EM_TX_TIMEOUT; | |
4067 adapter->num_tx_desc_avail = num_avail; 4068 return; 4069} 4070 4071/********************************************************************* 4072 * 4073 * When Link is lost sometimes there is work still in the TX ring | 3969 adapter->num_tx_desc_avail = num_avail; 3970 return; 3971} 3972 3973/********************************************************************* 3974 * 3975 * When Link is lost sometimes there is work still in the TX ring |
4074 * which will result in a watchdog, rather than allow that do an | 3976 * which may result in a watchdog, rather than allow that we do an |
4075 * attempted cleanup and then reinit here. Note that this has been 4076 * seens mostly with fiber adapters. 4077 * 4078 **********************************************************************/ 4079static void 4080em_tx_purge(struct adapter *adapter) 4081{ | 3977 * attempted cleanup and then reinit here. Note that this has been 3978 * seens mostly with fiber adapters. 3979 * 3980 **********************************************************************/ 3981static void 3982em_tx_purge(struct adapter *adapter) 3983{ |
4082 if ((!adapter->link_active) && (adapter->watchdog_timer)) { | 3984 if ((!adapter->link_active) && (adapter->watchdog_check)) { |
4083 EM_TX_LOCK(adapter); 4084 em_txeof(adapter); 4085 EM_TX_UNLOCK(adapter); | 3985 EM_TX_LOCK(adapter); 3986 em_txeof(adapter); 3987 EM_TX_UNLOCK(adapter); |
4086 if (adapter->watchdog_timer) { /* Still not clean? */ 4087 adapter->watchdog_timer = 0; | 3988 if (adapter->watchdog_check) /* Still outstanding? */ |
4088 em_init_locked(adapter); | 3989 em_init_locked(adapter); |
4089 } | |
4090 } 4091} 4092 4093/********************************************************************* 4094 * 4095 * Get a buffer from system mbuf buffer pool. 4096 * 4097 **********************************************************************/ --- 774 unchanged lines hidden (view full) --- 4872 if (adapter->hw.mac.type >= e1000_82571) 4873 manc &= ~E1000_MANC_EN_MNG2HOST; 4874 4875 E1000_WRITE_REG(&adapter->hw, E1000_MANC, manc); 4876 } 4877} 4878 4879/* | 3990 } 3991} 3992 3993/********************************************************************* 3994 * 3995 * Get a buffer from system mbuf buffer pool. 3996 * 3997 **********************************************************************/ --- 774 unchanged lines hidden (view full) --- 4772 if (adapter->hw.mac.type >= e1000_82571) 4773 manc &= ~E1000_MANC_EN_MNG2HOST; 4774 4775 E1000_WRITE_REG(&adapter->hw, E1000_MANC, manc); 4776 } 4777} 4778 4779/* |
4880 * em_get_hw_control sets {CTRL_EXT|FWSM}:DRV_LOAD bit. 4881 * For ASF and Pass Through versions of f/w this means that 4882 * the driver is loaded. For AMT version (only with 82573) 4883 * of the f/w this means that the network i/f is open. 4884 * | 4780 * em_get_hw_control sets the {CTRL_EXT|FWSM}:DRV_LOAD bit. 4781 * For ASF and Pass Through versions of f/w this means 4782 * that the driver is loaded. For AMT version type f/w 4783 * this means that the network i/f is open. |
4885 */ 4886static void 4887em_get_hw_control(struct adapter *adapter) 4888{ 4889 u32 ctrl_ext, swsm; 4890 | 4784 */ 4785static void 4786em_get_hw_control(struct adapter *adapter) 4787{ 4788 u32 ctrl_ext, swsm; 4789 |
4891 /* Let firmware know the driver has taken over */ 4892 switch (adapter->hw.mac.type) { 4893 case e1000_82573: | 4790 if (adapter->hw.mac.type == e1000_82573) { |
4894 swsm = E1000_READ_REG(&adapter->hw, E1000_SWSM); 4895 E1000_WRITE_REG(&adapter->hw, E1000_SWSM, 4896 swsm | E1000_SWSM_DRV_LOAD); | 4791 swsm = E1000_READ_REG(&adapter->hw, E1000_SWSM); 4792 E1000_WRITE_REG(&adapter->hw, E1000_SWSM, 4793 swsm | E1000_SWSM_DRV_LOAD); |
4897 break; 4898 case e1000_82571: 4899 case e1000_82572: 4900 case e1000_80003es2lan: 4901 case e1000_ich8lan: 4902 case e1000_ich9lan: 4903 case e1000_ich10lan: 4904 ctrl_ext = E1000_READ_REG(&adapter->hw, E1000_CTRL_EXT); 4905 E1000_WRITE_REG(&adapter->hw, E1000_CTRL_EXT, 4906 ctrl_ext | E1000_CTRL_EXT_DRV_LOAD); 4907 break; 4908 default: 4909 break; | 4794 return; |
4910 } | 4795 } |
4796 /* else */ 4797 ctrl_ext = E1000_READ_REG(&adapter->hw, E1000_CTRL_EXT); 4798 E1000_WRITE_REG(&adapter->hw, E1000_CTRL_EXT, 4799 ctrl_ext | E1000_CTRL_EXT_DRV_LOAD); 4800 return; |
|
4911} 4912 4913/* 4914 * em_release_hw_control resets {CTRL_EXT|FWSM}:DRV_LOAD bit. | 4801} 4802 4803/* 4804 * em_release_hw_control resets {CTRL_EXT|FWSM}:DRV_LOAD bit. |
4915 * For ASF and Pass Through versions of f/w this means that the 4916 * driver is no longer loaded. For AMT version (only with 82573) i 4917 * of the f/w this means that the network i/f is closed. 4918 * | 4805 * For ASF and Pass Through versions of f/w this means that 4806 * the driver is no longer loaded. For AMT versions of the 4807 * f/w this means that the network i/f is closed. |
4919 */ 4920static void 4921em_release_hw_control(struct adapter *adapter) 4922{ 4923 u32 ctrl_ext, swsm; 4924 | 4808 */ 4809static void 4810em_release_hw_control(struct adapter *adapter) 4811{ 4812 u32 ctrl_ext, swsm; 4813 |
4925 /* Let firmware taken over control of h/w */ 4926 switch (adapter->hw.mac.type) { 4927 case e1000_82573: | 4814 if (!adapter->has_manage) 4815 return; 4816 4817 if (adapter->hw.mac.type == e1000_82573) { |
4928 swsm = E1000_READ_REG(&adapter->hw, E1000_SWSM); 4929 E1000_WRITE_REG(&adapter->hw, E1000_SWSM, 4930 swsm & ~E1000_SWSM_DRV_LOAD); | 4818 swsm = E1000_READ_REG(&adapter->hw, E1000_SWSM); 4819 E1000_WRITE_REG(&adapter->hw, E1000_SWSM, 4820 swsm & ~E1000_SWSM_DRV_LOAD); |
4931 break; 4932 case e1000_82571: 4933 case e1000_82572: 4934 case e1000_80003es2lan: 4935 case e1000_ich8lan: 4936 case e1000_ich9lan: 4937 case e1000_ich10lan: 4938 ctrl_ext = E1000_READ_REG(&adapter->hw, E1000_CTRL_EXT); 4939 E1000_WRITE_REG(&adapter->hw, E1000_CTRL_EXT, 4940 ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD); 4941 break; 4942 default: 4943 break; 4944 | 4821 return; |
4945 } | 4822 } |
4823 /* else */ 4824 ctrl_ext = E1000_READ_REG(&adapter->hw, E1000_CTRL_EXT); 4825 E1000_WRITE_REG(&adapter->hw, E1000_CTRL_EXT, 4826 ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD); 4827 return; |
|
4946} 4947 4948static int 4949em_is_valid_ether_addr(u8 *addr) 4950{ 4951 char zero_addr[6] = { 0, 0, 0, 0, 0, 0 }; 4952 4953 if ((addr[0] & 1) || (!bcmp(addr, zero_addr, ETHER_ADDR_LEN))) { 4954 return (FALSE); 4955 } 4956 4957 return (TRUE); 4958} 4959 4960/* | 4828} 4829 4830static int 4831em_is_valid_ether_addr(u8 *addr) 4832{ 4833 char zero_addr[6] = { 0, 0, 0, 0, 0, 0 }; 4834 4835 if ((addr[0] & 1) || (!bcmp(addr, zero_addr, ETHER_ADDR_LEN))) { 4836 return (FALSE); 4837 } 4838 4839 return (TRUE); 4840} 4841 4842/* |
4843** Parse the interface capabilities with regard 4844** to both system management and wake-on-lan for 4845** later use. 4846*/ 4847static void 4848em_get_wakeup(device_t dev) 4849{ 4850 struct adapter *adapter = device_get_softc(dev); 4851 u16 eeprom_data = 0, device_id, apme_mask; 4852 4853 adapter->has_manage = e1000_enable_mng_pass_thru(&adapter->hw); 4854 apme_mask = EM_EEPROM_APME; 4855 4856 switch (adapter->hw.mac.type) { 4857 case e1000_82542: 4858 case e1000_82543: 4859 break; 4860 case e1000_82544: 4861 e1000_read_nvm(&adapter->hw, 4862 NVM_INIT_CONTROL2_REG, 1, &eeprom_data); 4863 apme_mask = EM_82544_APME; 4864 break; 4865 case e1000_82573: 4866 case e1000_82583: 4867 adapter->has_amt = TRUE; 4868 /* Falls thru */ 4869 case e1000_82546: 4870 case e1000_82546_rev_3: 4871 case e1000_82571: 4872 case e1000_82572: 4873 case e1000_80003es2lan: 4874 if (adapter->hw.bus.func == 1) { 4875 e1000_read_nvm(&adapter->hw, 4876 NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data); 4877 break; 4878 } else 4879 e1000_read_nvm(&adapter->hw, 4880 NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); 4881 break; 4882 case e1000_ich8lan: 4883 case e1000_ich9lan: 4884 case e1000_ich10lan: 4885 case e1000_pchlan: 4886 apme_mask = E1000_WUC_APME; 4887 adapter->has_amt = TRUE; 4888 eeprom_data = E1000_READ_REG(&adapter->hw, E1000_WUC); 4889 break; 4890 default: 4891 e1000_read_nvm(&adapter->hw, 4892 NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); 4893 break; 4894 } 4895 if (eeprom_data & apme_mask) 4896 adapter->wol = (E1000_WUFC_MAG | E1000_WUFC_MC); 4897 /* 4898 * We have the eeprom settings, now apply the special cases 4899 * where the eeprom may be wrong or the board won't support 4900 * wake on lan on a particular port 4901 */ 4902 device_id = pci_get_device(dev); 4903 switch (device_id) { 4904 case E1000_DEV_ID_82546GB_PCIE: 4905 adapter->wol = 0; 4906 break; 4907 case E1000_DEV_ID_82546EB_FIBER: 4908 case E1000_DEV_ID_82546GB_FIBER: 4909 case E1000_DEV_ID_82571EB_FIBER: 4910 /* Wake events only supported on port A for dual fiber 4911 * regardless of eeprom setting */ 4912 if (E1000_READ_REG(&adapter->hw, E1000_STATUS) & 4913 E1000_STATUS_FUNC_1) 4914 adapter->wol = 0; 4915 break; 4916 case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: 4917 case E1000_DEV_ID_82571EB_QUAD_COPPER: 4918 case E1000_DEV_ID_82571EB_QUAD_FIBER: 4919 case E1000_DEV_ID_82571EB_QUAD_COPPER_LP: 4920 /* if quad port adapter, disable WoL on all but port A */ 4921 if (global_quad_port_a != 0) 4922 adapter->wol = 0; 4923 /* Reset for multiple quad port adapters */ 4924 if (++global_quad_port_a == 4) 4925 global_quad_port_a = 0; 4926 break; 4927 } 4928 return; 4929} 4930 4931 4932/* |
|
4961 * Enable PCI Wake On Lan capability 4962 */ 4963void 4964em_enable_wakeup(device_t dev) 4965{ | 4933 * Enable PCI Wake On Lan capability 4934 */ 4935void 4936em_enable_wakeup(device_t dev) 4937{ |
4966 u16 cap, status; 4967 u8 id; | 4938 struct adapter *adapter = device_get_softc(dev); 4939 struct ifnet *ifp = adapter->ifp; 4940 u32 pmc, ctrl, ctrl_ext, rctl; 4941 u16 status; |
4968 | 4942 |
4969 /* First find the capabilities pointer*/ 4970 cap = pci_read_config(dev, PCIR_CAP_PTR, 2); 4971 /* Read the PM Capabilities */ 4972 id = pci_read_config(dev, cap, 1); 4973 if (id != PCIY_PMG) /* Something wrong */ | 4943 if ((pci_find_extcap(dev, PCIY_PMG, &pmc) != 0)) |
4974 return; | 4944 return; |
4975 /* OK, we have the power capabilities, so 4976 now get the status register */ 4977 cap += PCIR_POWER_STATUS; 4978 status = pci_read_config(dev, cap, 2); 4979 status |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE; 4980 pci_write_config(dev, cap, status, 2); | 4945 4946 /* Advertise the wakeup capability */ 4947 ctrl = E1000_READ_REG(&adapter->hw, E1000_CTRL); 4948 ctrl |= (E1000_CTRL_SWDPIN2 | E1000_CTRL_SWDPIN3); 4949 E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl); 4950 E1000_WRITE_REG(&adapter->hw, E1000_WUC, E1000_WUC_PME_EN); 4951 4952 /* ICH workaround code */ 4953 if ((adapter->hw.mac.type == e1000_ich8lan) || 4954 (adapter->hw.mac.type == e1000_pchlan) || 4955 (adapter->hw.mac.type == e1000_ich9lan) || 4956 (adapter->hw.mac.type == e1000_ich10lan)) { 4957 e1000_disable_gig_wol_ich8lan(&adapter->hw); 4958 e1000_hv_phy_powerdown_workaround_ich8lan(&adapter->hw); 4959 } 4960 4961 /* Keep the laser running on Fiber adapters */ 4962 if (adapter->hw.phy.media_type == e1000_media_type_fiber || 4963 adapter->hw.phy.media_type == e1000_media_type_internal_serdes) { 4964 ctrl_ext = E1000_READ_REG(&adapter->hw, E1000_CTRL_EXT); 4965 ctrl_ext |= E1000_CTRL_EXT_SDP3_DATA; 4966 E1000_WRITE_REG(&adapter->hw, E1000_CTRL_EXT, ctrl_ext); 4967 } 4968 4969 /* 4970 ** Determine type of Wakeup: note that wol 4971 ** is set with all bits on by default. 4972 */ 4973 if ((ifp->if_capenable & IFCAP_WOL_MAGIC) == 0) 4974 adapter->wol &= ~E1000_WUFC_MAG; 4975 4976 if ((ifp->if_capenable & IFCAP_WOL_MCAST) == 0) 4977 adapter->wol &= ~E1000_WUFC_MC; 4978 else { 4979 rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); 4980 rctl |= E1000_RCTL_MPE; 4981 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl); 4982 } 4983 4984 if (adapter->hw.mac.type == e1000_pchlan) { 4985 if (em_enable_phy_wakeup(adapter)) 4986 return; 4987 } else { 4988 E1000_WRITE_REG(&adapter->hw, E1000_WUC, E1000_WUC_PME_EN); 4989 E1000_WRITE_REG(&adapter->hw, E1000_WUFC, adapter->wol); 4990 } 4991 4992 if (adapter->hw.phy.type == e1000_phy_igp_3) 4993 e1000_igp3_phy_powerdown_workaround_ich8lan(&adapter->hw); 4994 4995 /* Request PME */ 4996 status = pci_read_config(dev, pmc + PCIR_POWER_STATUS, 2); 4997 status &= ~(PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE); 4998 if (ifp->if_capenable & IFCAP_WOL) 4999 status |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE; 5000 pci_write_config(dev, pmc + PCIR_POWER_STATUS, status, 2); 5001 |
4981 return; 4982} 4983 | 5002 return; 5003} 5004 |
5005/* 5006** WOL in the newer chipset interfaces (pchlan) 5007** require thing to be copied into the phy 5008*/ 5009static int 5010em_enable_phy_wakeup(struct adapter *adapter) 5011{ 5012 struct e1000_hw *hw = &adapter->hw; 5013 u32 mreg, ret = 0; 5014 u16 preg; |
|
4984 | 5015 |
5016 /* copy MAC RARs to PHY RARs */ 5017 for (int i = 0; i < adapter->hw.mac.rar_entry_count; i++) { 5018 mreg = E1000_READ_REG(hw, E1000_RAL(i)); 5019 e1000_write_phy_reg(hw, BM_RAR_L(i), (u16)(mreg & 0xFFFF)); 5020 e1000_write_phy_reg(hw, BM_RAR_M(i), 5021 (u16)((mreg >> 16) & 0xFFFF)); 5022 mreg = E1000_READ_REG(hw, E1000_RAH(i)); 5023 e1000_write_phy_reg(hw, BM_RAR_H(i), (u16)(mreg & 0xFFFF)); 5024 e1000_write_phy_reg(hw, BM_RAR_CTRL(i), 5025 (u16)((mreg >> 16) & 0xFFFF)); 5026 } 5027 5028 /* copy MAC MTA to PHY MTA */ 5029 for (int i = 0; i < adapter->hw.mac.mta_reg_count; i++) { 5030 mreg = E1000_READ_REG_ARRAY(hw, E1000_MTA, i); 5031 e1000_write_phy_reg(hw, BM_MTA(i), (u16)(mreg & 0xFFFF)); 5032 e1000_write_phy_reg(hw, BM_MTA(i) + 1, 5033 (u16)((mreg >> 16) & 0xFFFF)); 5034 } 5035 5036 /* configure PHY Rx Control register */ 5037 e1000_read_phy_reg(&adapter->hw, BM_RCTL, &preg); 5038 mreg = E1000_READ_REG(hw, E1000_RCTL); 5039 if (mreg & E1000_RCTL_UPE) 5040 preg |= BM_RCTL_UPE; 5041 if (mreg & E1000_RCTL_MPE) 5042 preg |= BM_RCTL_MPE; 5043 preg &= ~(BM_RCTL_MO_MASK); 5044 if (mreg & E1000_RCTL_MO_3) 5045 preg |= (((mreg & E1000_RCTL_MO_3) >> E1000_RCTL_MO_SHIFT) 5046 << BM_RCTL_MO_SHIFT); 5047 if (mreg & E1000_RCTL_BAM) 5048 preg |= BM_RCTL_BAM; 5049 if (mreg & E1000_RCTL_PMCF) 5050 preg |= BM_RCTL_PMCF; 5051 mreg = E1000_READ_REG(hw, E1000_CTRL); 5052 if (mreg & E1000_CTRL_RFCE) 5053 preg |= BM_RCTL_RFCE; 5054 e1000_write_phy_reg(&adapter->hw, BM_RCTL, preg); 5055 5056 /* enable PHY wakeup in MAC register */ 5057 E1000_WRITE_REG(hw, E1000_WUC, 5058 E1000_WUC_PHY_WAKE | E1000_WUC_PME_EN); 5059 E1000_WRITE_REG(hw, E1000_WUFC, adapter->wol); 5060 5061 /* configure and enable PHY wakeup in PHY registers */ 5062 e1000_write_phy_reg(&adapter->hw, BM_WUFC, adapter->wol); 5063 e1000_write_phy_reg(&adapter->hw, BM_WUC, E1000_WUC_PME_EN); 5064 5065 /* activate PHY wakeup */ 5066 ret = hw->phy.ops.acquire(hw); 5067 if (ret) { 5068 printf("Could not acquire PHY\n"); 5069 return ret; 5070 } 5071 e1000_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, 5072 (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT)); 5073 ret = e1000_read_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, &preg); 5074 if (ret) { 5075 printf("Could not read PHY page 769\n"); 5076 goto out; 5077 } 5078 preg |= BM_WUC_ENABLE_BIT | BM_WUC_HOST_WU_BIT; 5079 ret = e1000_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, preg); 5080 if (ret) 5081 printf("Could not set PHY Host Wakeup bit\n"); 5082out: 5083 hw->phy.ops.release(hw); 5084 5085 return ret; 5086} 5087 5088 |
|
4985/********************************************************************* 4986* 82544 Coexistence issue workaround. 4987* There are 2 issues. 4988* 1. Transmit Hang issue. 4989* To detect this issue, following equation can be used... 4990* SIZE[3:0] + ADDR[2:0] = SUM[3:0]. 4991* If SUM[3:0] is in between 1 to 4, we will have this issue. 4992* --- 401 unchanged lines hidden --- | 5089/********************************************************************* 5090* 82544 Coexistence issue workaround. 5091* There are 2 issues. 5092* 1. Transmit Hang issue. 5093* To detect this issue, following equation can be used... 5094* SIZE[3:0] + ADDR[2:0] = SUM[3:0]. 5095* If SUM[3:0] is in between 1 to 4, we will have this issue. 5096* --- 401 unchanged lines hidden --- |