diff options
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/3c59x.c | 10 | ||||
| -rw-r--r-- | drivers/net/atlx/atl1.c | 11 | ||||
| -rw-r--r-- | drivers/net/e1000e/hw.h | 1 | ||||
| -rw-r--r-- | drivers/net/e1000e/ich8lan.c | 197 | ||||
| -rw-r--r-- | drivers/net/e1000e/netdev.c | 29 | ||||
| -rw-r--r-- | drivers/net/ibm_newemac/core.c | 4 | ||||
| -rw-r--r-- | drivers/net/netxen/netxen_nic_init.c | 3 | ||||
| -rw-r--r-- | drivers/net/qlcnic/qlcnic_init.c | 7 | ||||
| -rw-r--r-- | drivers/net/rionet.c | 2 | ||||
| -rw-r--r-- | drivers/net/sgiseeq.c | 2 | ||||
| -rw-r--r-- | drivers/net/smsc911x.c | 1 | ||||
| -rw-r--r-- | drivers/net/tulip/de2104x.c | 43 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 5 |
13 files changed, 252 insertions, 63 deletions
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index fa42103b2874..179871d9e71f 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c | |||
| @@ -2942,6 +2942,9 @@ static void vortex_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) | |||
| 2942 | { | 2942 | { |
| 2943 | struct vortex_private *vp = netdev_priv(dev); | 2943 | struct vortex_private *vp = netdev_priv(dev); |
| 2944 | 2944 | ||
| 2945 | if (!VORTEX_PCI(vp)) | ||
| 2946 | return; | ||
| 2947 | |||
| 2945 | wol->supported = WAKE_MAGIC; | 2948 | wol->supported = WAKE_MAGIC; |
| 2946 | 2949 | ||
| 2947 | wol->wolopts = 0; | 2950 | wol->wolopts = 0; |
| @@ -2952,6 +2955,10 @@ static void vortex_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) | |||
| 2952 | static int vortex_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) | 2955 | static int vortex_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) |
| 2953 | { | 2956 | { |
| 2954 | struct vortex_private *vp = netdev_priv(dev); | 2957 | struct vortex_private *vp = netdev_priv(dev); |
| 2958 | |||
| 2959 | if (!VORTEX_PCI(vp)) | ||
| 2960 | return -EOPNOTSUPP; | ||
| 2961 | |||
| 2955 | if (wol->wolopts & ~WAKE_MAGIC) | 2962 | if (wol->wolopts & ~WAKE_MAGIC) |
| 2956 | return -EINVAL; | 2963 | return -EINVAL; |
| 2957 | 2964 | ||
| @@ -3201,6 +3208,9 @@ static void acpi_set_WOL(struct net_device *dev) | |||
| 3201 | return; | 3208 | return; |
| 3202 | } | 3209 | } |
| 3203 | 3210 | ||
| 3211 | if (VORTEX_PCI(vp)->current_state < PCI_D3hot) | ||
| 3212 | return; | ||
| 3213 | |||
| 3204 | /* Change the power state to D3; RxEnable doesn't take effect. */ | 3214 | /* Change the power state to D3; RxEnable doesn't take effect. */ |
| 3205 | pci_set_power_state(VORTEX_PCI(vp), PCI_D3hot); | 3215 | pci_set_power_state(VORTEX_PCI(vp), PCI_D3hot); |
| 3206 | } | 3216 | } |
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c index 63b9ba0cc67e..c73be2848319 100644 --- a/drivers/net/atlx/atl1.c +++ b/drivers/net/atlx/atl1.c | |||
| @@ -1251,6 +1251,12 @@ static void atl1_free_ring_resources(struct atl1_adapter *adapter) | |||
| 1251 | 1251 | ||
| 1252 | rrd_ring->desc = NULL; | 1252 | rrd_ring->desc = NULL; |
| 1253 | rrd_ring->dma = 0; | 1253 | rrd_ring->dma = 0; |
| 1254 | |||
| 1255 | adapter->cmb.dma = 0; | ||
| 1256 | adapter->cmb.cmb = NULL; | ||
| 1257 | |||
| 1258 | adapter->smb.dma = 0; | ||
| 1259 | adapter->smb.smb = NULL; | ||
| 1254 | } | 1260 | } |
| 1255 | 1261 | ||
| 1256 | static void atl1_setup_mac_ctrl(struct atl1_adapter *adapter) | 1262 | static void atl1_setup_mac_ctrl(struct atl1_adapter *adapter) |
| @@ -2847,10 +2853,11 @@ static int atl1_resume(struct pci_dev *pdev) | |||
| 2847 | pci_enable_wake(pdev, PCI_D3cold, 0); | 2853 | pci_enable_wake(pdev, PCI_D3cold, 0); |
| 2848 | 2854 | ||
| 2849 | atl1_reset_hw(&adapter->hw); | 2855 | atl1_reset_hw(&adapter->hw); |
| 2850 | adapter->cmb.cmb->int_stats = 0; | ||
| 2851 | 2856 | ||
| 2852 | if (netif_running(netdev)) | 2857 | if (netif_running(netdev)) { |
| 2858 | adapter->cmb.cmb->int_stats = 0; | ||
| 2853 | atl1_up(adapter); | 2859 | atl1_up(adapter); |
| 2860 | } | ||
| 2854 | netif_device_attach(netdev); | 2861 | netif_device_attach(netdev); |
| 2855 | 2862 | ||
| 2856 | return 0; | 2863 | return 0; |
diff --git a/drivers/net/e1000e/hw.h b/drivers/net/e1000e/hw.h index 66ed08f726fb..ba302a5c2c30 100644 --- a/drivers/net/e1000e/hw.h +++ b/drivers/net/e1000e/hw.h | |||
| @@ -57,6 +57,7 @@ enum e1e_registers { | |||
| 57 | E1000_SCTL = 0x00024, /* SerDes Control - RW */ | 57 | E1000_SCTL = 0x00024, /* SerDes Control - RW */ |
| 58 | E1000_FCAL = 0x00028, /* Flow Control Address Low - RW */ | 58 | E1000_FCAL = 0x00028, /* Flow Control Address Low - RW */ |
| 59 | E1000_FCAH = 0x0002C, /* Flow Control Address High -RW */ | 59 | E1000_FCAH = 0x0002C, /* Flow Control Address High -RW */ |
| 60 | E1000_FEXTNVM4 = 0x00024, /* Future Extended NVM 4 - RW */ | ||
| 60 | E1000_FEXTNVM = 0x00028, /* Future Extended NVM - RW */ | 61 | E1000_FEXTNVM = 0x00028, /* Future Extended NVM - RW */ |
| 61 | E1000_FCT = 0x00030, /* Flow Control Type - RW */ | 62 | E1000_FCT = 0x00030, /* Flow Control Type - RW */ |
| 62 | E1000_VET = 0x00038, /* VLAN Ether Type - RW */ | 63 | E1000_VET = 0x00038, /* VLAN Ether Type - RW */ |
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index 63930d12711c..57b5435599ab 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
| @@ -105,6 +105,10 @@ | |||
| 105 | #define E1000_FEXTNVM_SW_CONFIG 1 | 105 | #define E1000_FEXTNVM_SW_CONFIG 1 |
| 106 | #define E1000_FEXTNVM_SW_CONFIG_ICH8M (1 << 27) /* Bit redefined for ICH8M :/ */ | 106 | #define E1000_FEXTNVM_SW_CONFIG_ICH8M (1 << 27) /* Bit redefined for ICH8M :/ */ |
| 107 | 107 | ||
| 108 | #define E1000_FEXTNVM4_BEACON_DURATION_MASK 0x7 | ||
| 109 | #define E1000_FEXTNVM4_BEACON_DURATION_8USEC 0x7 | ||
| 110 | #define E1000_FEXTNVM4_BEACON_DURATION_16USEC 0x3 | ||
| 111 | |||
| 108 | #define PCIE_ICH8_SNOOP_ALL PCIE_NO_SNOOP_ALL | 112 | #define PCIE_ICH8_SNOOP_ALL PCIE_NO_SNOOP_ALL |
| 109 | 113 | ||
| 110 | #define E1000_ICH_RAR_ENTRIES 7 | 114 | #define E1000_ICH_RAR_ENTRIES 7 |
| @@ -125,6 +129,7 @@ | |||
| 125 | 129 | ||
| 126 | /* SMBus Address Phy Register */ | 130 | /* SMBus Address Phy Register */ |
| 127 | #define HV_SMB_ADDR PHY_REG(768, 26) | 131 | #define HV_SMB_ADDR PHY_REG(768, 26) |
| 132 | #define HV_SMB_ADDR_MASK 0x007F | ||
| 128 | #define HV_SMB_ADDR_PEC_EN 0x0200 | 133 | #define HV_SMB_ADDR_PEC_EN 0x0200 |
| 129 | #define HV_SMB_ADDR_VALID 0x0080 | 134 | #define HV_SMB_ADDR_VALID 0x0080 |
| 130 | 135 | ||
| @@ -237,6 +242,8 @@ static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link); | |||
| 237 | static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw); | 242 | static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw); |
| 238 | static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw); | 243 | static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw); |
| 239 | static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw); | 244 | static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw); |
| 245 | static s32 e1000_k1_workaround_lv(struct e1000_hw *hw); | ||
| 246 | static void e1000_gate_hw_phy_config_ich8lan(struct e1000_hw *hw, bool gate); | ||
| 240 | 247 | ||
| 241 | static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg) | 248 | static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg) |
| 242 | { | 249 | { |
| @@ -272,7 +279,7 @@ static inline void __ew32flash(struct e1000_hw *hw, unsigned long reg, u32 val) | |||
| 272 | static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw) | 279 | static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw) |
| 273 | { | 280 | { |
| 274 | struct e1000_phy_info *phy = &hw->phy; | 281 | struct e1000_phy_info *phy = &hw->phy; |
| 275 | u32 ctrl; | 282 | u32 ctrl, fwsm; |
| 276 | s32 ret_val = 0; | 283 | s32 ret_val = 0; |
| 277 | 284 | ||
| 278 | phy->addr = 1; | 285 | phy->addr = 1; |
| @@ -294,7 +301,8 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw) | |||
| 294 | * disabled, then toggle the LANPHYPC Value bit to force | 301 | * disabled, then toggle the LANPHYPC Value bit to force |
| 295 | * the interconnect to PCIe mode. | 302 | * the interconnect to PCIe mode. |
| 296 | */ | 303 | */ |
| 297 | if (!(er32(FWSM) & E1000_ICH_FWSM_FW_VALID)) { | 304 | fwsm = er32(FWSM); |
| 305 | if (!(fwsm & E1000_ICH_FWSM_FW_VALID)) { | ||
| 298 | ctrl = er32(CTRL); | 306 | ctrl = er32(CTRL); |
| 299 | ctrl |= E1000_CTRL_LANPHYPC_OVERRIDE; | 307 | ctrl |= E1000_CTRL_LANPHYPC_OVERRIDE; |
| 300 | ctrl &= ~E1000_CTRL_LANPHYPC_VALUE; | 308 | ctrl &= ~E1000_CTRL_LANPHYPC_VALUE; |
| @@ -303,6 +311,13 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw) | |||
| 303 | ctrl &= ~E1000_CTRL_LANPHYPC_OVERRIDE; | 311 | ctrl &= ~E1000_CTRL_LANPHYPC_OVERRIDE; |
| 304 | ew32(CTRL, ctrl); | 312 | ew32(CTRL, ctrl); |
| 305 | msleep(50); | 313 | msleep(50); |
| 314 | |||
| 315 | /* | ||
| 316 | * Gate automatic PHY configuration by hardware on | ||
| 317 | * non-managed 82579 | ||
| 318 | */ | ||
| 319 | if (hw->mac.type == e1000_pch2lan) | ||
| 320 | e1000_gate_hw_phy_config_ich8lan(hw, true); | ||
| 306 | } | 321 | } |
| 307 | 322 | ||
| 308 | /* | 323 | /* |
| @@ -315,6 +330,13 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw) | |||
| 315 | if (ret_val) | 330 | if (ret_val) |
| 316 | goto out; | 331 | goto out; |
| 317 | 332 | ||
| 333 | /* Ungate automatic PHY configuration on non-managed 82579 */ | ||
| 334 | if ((hw->mac.type == e1000_pch2lan) && | ||
| 335 | !(fwsm & E1000_ICH_FWSM_FW_VALID)) { | ||
| 336 | msleep(10); | ||
| 337 | e1000_gate_hw_phy_config_ich8lan(hw, false); | ||
| 338 | } | ||
| 339 | |||
| 318 | phy->id = e1000_phy_unknown; | 340 | phy->id = e1000_phy_unknown; |
| 319 | ret_val = e1000e_get_phy_id(hw); | 341 | ret_val = e1000e_get_phy_id(hw); |
| 320 | if (ret_val) | 342 | if (ret_val) |
| @@ -561,13 +583,10 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_adapter *adapter) | |||
| 561 | if (mac->type == e1000_ich8lan) | 583 | if (mac->type == e1000_ich8lan) |
| 562 | e1000e_set_kmrn_lock_loss_workaround_ich8lan(hw, true); | 584 | e1000e_set_kmrn_lock_loss_workaround_ich8lan(hw, true); |
| 563 | 585 | ||
| 564 | /* Disable PHY configuration by hardware, config by software */ | 586 | /* Gate automatic PHY configuration by hardware on managed 82579 */ |
| 565 | if (mac->type == e1000_pch2lan) { | 587 | if ((mac->type == e1000_pch2lan) && |
| 566 | u32 extcnf_ctrl = er32(EXTCNF_CTRL); | 588 | (er32(FWSM) & E1000_ICH_FWSM_FW_VALID)) |
| 567 | 589 | e1000_gate_hw_phy_config_ich8lan(hw, true); | |
| 568 | extcnf_ctrl |= E1000_EXTCNF_CTRL_GATE_PHY_CFG; | ||
| 569 | ew32(EXTCNF_CTRL, extcnf_ctrl); | ||
| 570 | } | ||
| 571 | 590 | ||
| 572 | return 0; | 591 | return 0; |
| 573 | } | 592 | } |
| @@ -652,6 +671,12 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw) | |||
| 652 | goto out; | 671 | goto out; |
| 653 | } | 672 | } |
| 654 | 673 | ||
| 674 | if (hw->mac.type == e1000_pch2lan) { | ||
| 675 | ret_val = e1000_k1_workaround_lv(hw); | ||
| 676 | if (ret_val) | ||
| 677 | goto out; | ||
| 678 | } | ||
| 679 | |||
| 655 | /* | 680 | /* |
| 656 | * Check if there was DownShift, must be checked | 681 | * Check if there was DownShift, must be checked |
| 657 | * immediately after link-up | 682 | * immediately after link-up |
| @@ -895,6 +920,34 @@ static s32 e1000_check_reset_block_ich8lan(struct e1000_hw *hw) | |||
| 895 | } | 920 | } |
| 896 | 921 | ||
| 897 | /** | 922 | /** |
| 923 | * e1000_write_smbus_addr - Write SMBus address to PHY needed during Sx states | ||
| 924 | * @hw: pointer to the HW structure | ||
| 925 | * | ||
| 926 | * Assumes semaphore already acquired. | ||
| 927 | * | ||
| 928 | **/ | ||
| 929 | static s32 e1000_write_smbus_addr(struct e1000_hw *hw) | ||
| 930 | { | ||
| 931 | u16 phy_data; | ||
| 932 | u32 strap = er32(STRAP); | ||
| 933 | s32 ret_val = 0; | ||
| 934 | |||
| 935 | strap &= E1000_STRAP_SMBUS_ADDRESS_MASK; | ||
| 936 | |||
| 937 | ret_val = e1000_read_phy_reg_hv_locked(hw, HV_SMB_ADDR, &phy_data); | ||
| 938 | if (ret_val) | ||
| 939 | goto out; | ||
| 940 | |||
| 941 | phy_data &= ~HV_SMB_ADDR_MASK; | ||
| 942 | phy_data |= (strap >> E1000_STRAP_SMBUS_ADDRESS_SHIFT); | ||
| 943 | phy_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID; | ||
| 944 | ret_val = e1000_write_phy_reg_hv_locked(hw, HV_SMB_ADDR, phy_data); | ||
| 945 | |||
| 946 | out: | ||
| 947 | return ret_val; | ||
| 948 | } | ||
| 949 | |||
| 950 | /** | ||
| 898 | * e1000_sw_lcd_config_ich8lan - SW-based LCD Configuration | 951 | * e1000_sw_lcd_config_ich8lan - SW-based LCD Configuration |
| 899 | * @hw: pointer to the HW structure | 952 | * @hw: pointer to the HW structure |
| 900 | * | 953 | * |
| @@ -903,7 +956,6 @@ static s32 e1000_check_reset_block_ich8lan(struct e1000_hw *hw) | |||
| 903 | **/ | 956 | **/ |
| 904 | static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw) | 957 | static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw) |
| 905 | { | 958 | { |
| 906 | struct e1000_adapter *adapter = hw->adapter; | ||
| 907 | struct e1000_phy_info *phy = &hw->phy; | 959 | struct e1000_phy_info *phy = &hw->phy; |
| 908 | u32 i, data, cnf_size, cnf_base_addr, sw_cfg_mask; | 960 | u32 i, data, cnf_size, cnf_base_addr, sw_cfg_mask; |
| 909 | s32 ret_val = 0; | 961 | s32 ret_val = 0; |
| @@ -921,7 +973,8 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw) | |||
| 921 | if (phy->type != e1000_phy_igp_3) | 973 | if (phy->type != e1000_phy_igp_3) |
| 922 | return ret_val; | 974 | return ret_val; |
| 923 | 975 | ||
| 924 | if (adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_AMT) { | 976 | if ((hw->adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_AMT) || |
| 977 | (hw->adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_C)) { | ||
| 925 | sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG; | 978 | sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG; |
| 926 | break; | 979 | break; |
| 927 | } | 980 | } |
| @@ -961,21 +1014,16 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw) | |||
| 961 | cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK; | 1014 | cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK; |
| 962 | cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT; | 1015 | cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT; |
| 963 | 1016 | ||
| 964 | if (!(data & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE) && | 1017 | if ((!(data & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE) && |
| 965 | ((hw->mac.type == e1000_pchlan) || | 1018 | (hw->mac.type == e1000_pchlan)) || |
| 966 | (hw->mac.type == e1000_pch2lan))) { | 1019 | (hw->mac.type == e1000_pch2lan)) { |
| 967 | /* | 1020 | /* |
| 968 | * HW configures the SMBus address and LEDs when the | 1021 | * HW configures the SMBus address and LEDs when the |
| 969 | * OEM and LCD Write Enable bits are set in the NVM. | 1022 | * OEM and LCD Write Enable bits are set in the NVM. |
| 970 | * When both NVM bits are cleared, SW will configure | 1023 | * When both NVM bits are cleared, SW will configure |
| 971 | * them instead. | 1024 | * them instead. |
| 972 | */ | 1025 | */ |
| 973 | data = er32(STRAP); | 1026 | ret_val = e1000_write_smbus_addr(hw); |
| 974 | data &= E1000_STRAP_SMBUS_ADDRESS_MASK; | ||
| 975 | reg_data = data >> E1000_STRAP_SMBUS_ADDRESS_SHIFT; | ||
| 976 | reg_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID; | ||
| 977 | ret_val = e1000_write_phy_reg_hv_locked(hw, HV_SMB_ADDR, | ||
| 978 | reg_data); | ||
| 979 | if (ret_val) | 1027 | if (ret_val) |
| 980 | goto out; | 1028 | goto out; |
| 981 | 1029 | ||
| @@ -1440,10 +1488,6 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable) | |||
| 1440 | goto out; | 1488 | goto out; |
| 1441 | 1489 | ||
| 1442 | /* Enable jumbo frame workaround in the PHY */ | 1490 | /* Enable jumbo frame workaround in the PHY */ |
| 1443 | e1e_rphy(hw, PHY_REG(769, 20), &data); | ||
| 1444 | ret_val = e1e_wphy(hw, PHY_REG(769, 20), data & ~(1 << 14)); | ||
| 1445 | if (ret_val) | ||
| 1446 | goto out; | ||
| 1447 | e1e_rphy(hw, PHY_REG(769, 23), &data); | 1491 | e1e_rphy(hw, PHY_REG(769, 23), &data); |
| 1448 | data &= ~(0x7F << 5); | 1492 | data &= ~(0x7F << 5); |
| 1449 | data |= (0x37 << 5); | 1493 | data |= (0x37 << 5); |
| @@ -1452,7 +1496,6 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable) | |||
| 1452 | goto out; | 1496 | goto out; |
| 1453 | e1e_rphy(hw, PHY_REG(769, 16), &data); | 1497 | e1e_rphy(hw, PHY_REG(769, 16), &data); |
| 1454 | data &= ~(1 << 13); | 1498 | data &= ~(1 << 13); |
| 1455 | data |= (1 << 12); | ||
| 1456 | ret_val = e1e_wphy(hw, PHY_REG(769, 16), data); | 1499 | ret_val = e1e_wphy(hw, PHY_REG(769, 16), data); |
| 1457 | if (ret_val) | 1500 | if (ret_val) |
| 1458 | goto out; | 1501 | goto out; |
| @@ -1477,7 +1520,7 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable) | |||
| 1477 | 1520 | ||
| 1478 | mac_reg = er32(RCTL); | 1521 | mac_reg = er32(RCTL); |
| 1479 | mac_reg &= ~E1000_RCTL_SECRC; | 1522 | mac_reg &= ~E1000_RCTL_SECRC; |
| 1480 | ew32(FFLT_DBG, mac_reg); | 1523 | ew32(RCTL, mac_reg); |
| 1481 | 1524 | ||
| 1482 | ret_val = e1000e_read_kmrn_reg(hw, | 1525 | ret_val = e1000e_read_kmrn_reg(hw, |
| 1483 | E1000_KMRNCTRLSTA_CTRL_OFFSET, | 1526 | E1000_KMRNCTRLSTA_CTRL_OFFSET, |
| @@ -1503,17 +1546,12 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable) | |||
| 1503 | goto out; | 1546 | goto out; |
| 1504 | 1547 | ||
| 1505 | /* Write PHY register values back to h/w defaults */ | 1548 | /* Write PHY register values back to h/w defaults */ |
| 1506 | e1e_rphy(hw, PHY_REG(769, 20), &data); | ||
| 1507 | ret_val = e1e_wphy(hw, PHY_REG(769, 20), data & ~(1 << 14)); | ||
| 1508 | if (ret_val) | ||
| 1509 | goto out; | ||
| 1510 | e1e_rphy(hw, PHY_REG(769, 23), &data); | 1549 | e1e_rphy(hw, PHY_REG(769, 23), &data); |
| 1511 | data &= ~(0x7F << 5); | 1550 | data &= ~(0x7F << 5); |
| 1512 | ret_val = e1e_wphy(hw, PHY_REG(769, 23), data); | 1551 | ret_val = e1e_wphy(hw, PHY_REG(769, 23), data); |
| 1513 | if (ret_val) | 1552 | if (ret_val) |
| 1514 | goto out; | 1553 | goto out; |
| 1515 | e1e_rphy(hw, PHY_REG(769, 16), &data); | 1554 | e1e_rphy(hw, PHY_REG(769, 16), &data); |
| 1516 | data &= ~(1 << 12); | ||
| 1517 | data |= (1 << 13); | 1555 | data |= (1 << 13); |
| 1518 | ret_val = e1e_wphy(hw, PHY_REG(769, 16), data); | 1556 | ret_val = e1e_wphy(hw, PHY_REG(769, 16), data); |
| 1519 | if (ret_val) | 1557 | if (ret_val) |
| @@ -1559,6 +1597,69 @@ out: | |||
| 1559 | } | 1597 | } |
| 1560 | 1598 | ||
| 1561 | /** | 1599 | /** |
| 1600 | * e1000_k1_gig_workaround_lv - K1 Si workaround | ||
| 1601 | * @hw: pointer to the HW structure | ||
| 1602 | * | ||
| 1603 | * Workaround to set the K1 beacon duration for 82579 parts | ||
| 1604 | **/ | ||
| 1605 | static s32 e1000_k1_workaround_lv(struct e1000_hw *hw) | ||
| 1606 | { | ||
| 1607 | s32 ret_val = 0; | ||
| 1608 | u16 status_reg = 0; | ||
| 1609 | u32 mac_reg; | ||
| 1610 | |||
| 1611 | if (hw->mac.type != e1000_pch2lan) | ||
| 1612 | goto out; | ||
| 1613 | |||
| 1614 | /* Set K1 beacon duration based on 1Gbps speed or otherwise */ | ||
| 1615 | ret_val = e1e_rphy(hw, HV_M_STATUS, &status_reg); | ||
| 1616 | if (ret_val) | ||
| 1617 | goto out; | ||
| 1618 | |||
| 1619 | if ((status_reg & (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) | ||
| 1620 | == (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) { | ||
| 1621 | mac_reg = er32(FEXTNVM4); | ||
| 1622 | mac_reg &= ~E1000_FEXTNVM4_BEACON_DURATION_MASK; | ||
| 1623 | |||
| 1624 | if (status_reg & HV_M_STATUS_SPEED_1000) | ||
| 1625 | mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_8USEC; | ||
| 1626 | else | ||
| 1627 | mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_16USEC; | ||
| 1628 | |||
| 1629 | ew32(FEXTNVM4, mac_reg); | ||
| 1630 | } | ||
| 1631 | |||
| 1632 | out: | ||
| 1633 | return ret_val; | ||
| 1634 | } | ||
| 1635 | |||
| 1636 | /** | ||
| 1637 | * e1000_gate_hw_phy_config_ich8lan - disable PHY config via hardware | ||
| 1638 | * @hw: pointer to the HW structure | ||
| 1639 | * @gate: boolean set to true to gate, false to ungate | ||
| 1640 | * | ||
| 1641 | * Gate/ungate the automatic PHY configuration via hardware; perform | ||
| 1642 | * the configuration via software instead. | ||
| 1643 | **/ | ||
| 1644 | static void e1000_gate_hw_phy_config_ich8lan(struct e1000_hw *hw, bool gate) | ||
| 1645 | { | ||
| 1646 | u32 extcnf_ctrl; | ||
| 1647 | |||
| 1648 | if (hw->mac.type != e1000_pch2lan) | ||
| 1649 | return; | ||
| 1650 | |||
| 1651 | extcnf_ctrl = er32(EXTCNF_CTRL); | ||
| 1652 | |||
| 1653 | if (gate) | ||
| 1654 | extcnf_ctrl |= E1000_EXTCNF_CTRL_GATE_PHY_CFG; | ||
| 1655 | else | ||
| 1656 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_GATE_PHY_CFG; | ||
| 1657 | |||
| 1658 | ew32(EXTCNF_CTRL, extcnf_ctrl); | ||
| 1659 | return; | ||
| 1660 | } | ||
| 1661 | |||
| 1662 | /** | ||
| 1562 | * e1000_lan_init_done_ich8lan - Check for PHY config completion | 1663 | * e1000_lan_init_done_ich8lan - Check for PHY config completion |
| 1563 | * @hw: pointer to the HW structure | 1664 | * @hw: pointer to the HW structure |
| 1564 | * | 1665 | * |
| @@ -1602,6 +1703,9 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw) | |||
| 1602 | if (e1000_check_reset_block(hw)) | 1703 | if (e1000_check_reset_block(hw)) |
| 1603 | goto out; | 1704 | goto out; |
| 1604 | 1705 | ||
| 1706 | /* Allow time for h/w to get to quiescent state after reset */ | ||
| 1707 | msleep(10); | ||
| 1708 | |||
| 1605 | /* Perform any necessary post-reset workarounds */ | 1709 | /* Perform any necessary post-reset workarounds */ |
| 1606 | switch (hw->mac.type) { | 1710 | switch (hw->mac.type) { |
| 1607 | case e1000_pchlan: | 1711 | case e1000_pchlan: |
| @@ -1630,6 +1734,13 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw) | |||
| 1630 | /* Configure the LCD with the OEM bits in NVM */ | 1734 | /* Configure the LCD with the OEM bits in NVM */ |
| 1631 | ret_val = e1000_oem_bits_config_ich8lan(hw, true); | 1735 | ret_val = e1000_oem_bits_config_ich8lan(hw, true); |
| 1632 | 1736 | ||
| 1737 | /* Ungate automatic PHY configuration on non-managed 82579 */ | ||
| 1738 | if ((hw->mac.type == e1000_pch2lan) && | ||
| 1739 | !(er32(FWSM) & E1000_ICH_FWSM_FW_VALID)) { | ||
| 1740 | msleep(10); | ||
| 1741 | e1000_gate_hw_phy_config_ich8lan(hw, false); | ||
| 1742 | } | ||
| 1743 | |||
| 1633 | out: | 1744 | out: |
| 1634 | return ret_val; | 1745 | return ret_val; |
| 1635 | } | 1746 | } |
| @@ -1646,6 +1757,11 @@ static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw) | |||
| 1646 | { | 1757 | { |
| 1647 | s32 ret_val = 0; | 1758 | s32 ret_val = 0; |
| 1648 | 1759 | ||
| 1760 | /* Gate automatic PHY configuration by hardware on non-managed 82579 */ | ||
| 1761 | if ((hw->mac.type == e1000_pch2lan) && | ||
| 1762 | !(er32(FWSM) & E1000_ICH_FWSM_FW_VALID)) | ||
| 1763 | e1000_gate_hw_phy_config_ich8lan(hw, true); | ||
| 1764 | |||
| 1649 | ret_val = e1000e_phy_hw_reset_generic(hw); | 1765 | ret_val = e1000e_phy_hw_reset_generic(hw); |
| 1650 | if (ret_val) | 1766 | if (ret_val) |
| 1651 | goto out; | 1767 | goto out; |
| @@ -2910,6 +3026,14 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) | |||
| 2910 | * external PHY is reset. | 3026 | * external PHY is reset. |
| 2911 | */ | 3027 | */ |
| 2912 | ctrl |= E1000_CTRL_PHY_RST; | 3028 | ctrl |= E1000_CTRL_PHY_RST; |
| 3029 | |||
| 3030 | /* | ||
| 3031 | * Gate automatic PHY configuration by hardware on | ||
| 3032 | * non-managed 82579 | ||
| 3033 | */ | ||
| 3034 | if ((hw->mac.type == e1000_pch2lan) && | ||
| 3035 | !(er32(FWSM) & E1000_ICH_FWSM_FW_VALID)) | ||
| 3036 | e1000_gate_hw_phy_config_ich8lan(hw, true); | ||
| 2913 | } | 3037 | } |
| 2914 | ret_val = e1000_acquire_swflag_ich8lan(hw); | 3038 | ret_val = e1000_acquire_swflag_ich8lan(hw); |
| 2915 | e_dbg("Issuing a global reset to ich8lan\n"); | 3039 | e_dbg("Issuing a global reset to ich8lan\n"); |
| @@ -3460,13 +3584,20 @@ void e1000e_gig_downshift_workaround_ich8lan(struct e1000_hw *hw) | |||
| 3460 | void e1000e_disable_gig_wol_ich8lan(struct e1000_hw *hw) | 3584 | void e1000e_disable_gig_wol_ich8lan(struct e1000_hw *hw) |
| 3461 | { | 3585 | { |
| 3462 | u32 phy_ctrl; | 3586 | u32 phy_ctrl; |
| 3587 | s32 ret_val; | ||
| 3463 | 3588 | ||
| 3464 | phy_ctrl = er32(PHY_CTRL); | 3589 | phy_ctrl = er32(PHY_CTRL); |
| 3465 | phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU | E1000_PHY_CTRL_GBE_DISABLE; | 3590 | phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU | E1000_PHY_CTRL_GBE_DISABLE; |
| 3466 | ew32(PHY_CTRL, phy_ctrl); | 3591 | ew32(PHY_CTRL, phy_ctrl); |
| 3467 | 3592 | ||
| 3468 | if (hw->mac.type >= e1000_pchlan) | 3593 | if (hw->mac.type >= e1000_pchlan) { |
| 3469 | e1000_phy_hw_reset_ich8lan(hw); | 3594 | e1000_oem_bits_config_ich8lan(hw, true); |
| 3595 | ret_val = hw->phy.ops.acquire(hw); | ||
| 3596 | if (ret_val) | ||
| 3597 | return; | ||
| 3598 | e1000_write_smbus_addr(hw); | ||
| 3599 | hw->phy.ops.release(hw); | ||
| 3600 | } | ||
| 3470 | } | 3601 | } |
| 3471 | 3602 | ||
| 3472 | /** | 3603 | /** |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 2b8ef44bd2b1..e561d15c3eb1 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
| @@ -2704,6 +2704,16 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter) | |||
| 2704 | u32 psrctl = 0; | 2704 | u32 psrctl = 0; |
| 2705 | u32 pages = 0; | 2705 | u32 pages = 0; |
| 2706 | 2706 | ||
| 2707 | /* Workaround Si errata on 82579 - configure jumbo frame flow */ | ||
| 2708 | if (hw->mac.type == e1000_pch2lan) { | ||
| 2709 | s32 ret_val; | ||
| 2710 | |||
| 2711 | if (adapter->netdev->mtu > ETH_DATA_LEN) | ||
| 2712 | ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, true); | ||
| 2713 | else | ||
| 2714 | ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, false); | ||
| 2715 | } | ||
| 2716 | |||
| 2707 | /* Program MC offset vector base */ | 2717 | /* Program MC offset vector base */ |
| 2708 | rctl = er32(RCTL); | 2718 | rctl = er32(RCTL); |
| 2709 | rctl &= ~(3 << E1000_RCTL_MO_SHIFT); | 2719 | rctl &= ~(3 << E1000_RCTL_MO_SHIFT); |
| @@ -2744,16 +2754,6 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter) | |||
| 2744 | e1e_wphy(hw, 22, phy_data); | 2754 | e1e_wphy(hw, 22, phy_data); |
| 2745 | } | 2755 | } |
| 2746 | 2756 | ||
| 2747 | /* Workaround Si errata on 82579 - configure jumbo frame flow */ | ||
| 2748 | if (hw->mac.type == e1000_pch2lan) { | ||
| 2749 | s32 ret_val; | ||
| 2750 | |||
| 2751 | if (rctl & E1000_RCTL_LPE) | ||
| 2752 | ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, true); | ||
| 2753 | else | ||
| 2754 | ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, false); | ||
| 2755 | } | ||
| 2756 | |||
| 2757 | /* Setup buffer sizes */ | 2757 | /* Setup buffer sizes */ |
| 2758 | rctl &= ~E1000_RCTL_SZ_4096; | 2758 | rctl &= ~E1000_RCTL_SZ_4096; |
| 2759 | rctl |= E1000_RCTL_BSEX; | 2759 | rctl |= E1000_RCTL_BSEX; |
| @@ -4833,6 +4833,15 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) | |||
| 4833 | return -EINVAL; | 4833 | return -EINVAL; |
| 4834 | } | 4834 | } |
| 4835 | 4835 | ||
| 4836 | /* Jumbo frame workaround on 82579 requires CRC be stripped */ | ||
| 4837 | if ((adapter->hw.mac.type == e1000_pch2lan) && | ||
| 4838 | !(adapter->flags2 & FLAG2_CRC_STRIPPING) && | ||
| 4839 | (new_mtu > ETH_DATA_LEN)) { | ||
| 4840 | e_err("Jumbo Frames not supported on 82579 when CRC " | ||
| 4841 | "stripping is disabled.\n"); | ||
| 4842 | return -EINVAL; | ||
| 4843 | } | ||
| 4844 | |||
| 4836 | /* 82573 Errata 17 */ | 4845 | /* 82573 Errata 17 */ |
| 4837 | if (((adapter->hw.mac.type == e1000_82573) || | 4846 | if (((adapter->hw.mac.type == e1000_82573) || |
| 4838 | (adapter->hw.mac.type == e1000_82574)) && | 4847 | (adapter->hw.mac.type == e1000_82574)) && |
diff --git a/drivers/net/ibm_newemac/core.c b/drivers/net/ibm_newemac/core.c index 3506fd6ad726..519e19e23955 100644 --- a/drivers/net/ibm_newemac/core.c +++ b/drivers/net/ibm_newemac/core.c | |||
| @@ -2928,7 +2928,7 @@ static int __devinit emac_probe(struct platform_device *ofdev, | |||
| 2928 | if (dev->emac_irq != NO_IRQ) | 2928 | if (dev->emac_irq != NO_IRQ) |
| 2929 | irq_dispose_mapping(dev->emac_irq); | 2929 | irq_dispose_mapping(dev->emac_irq); |
| 2930 | err_free: | 2930 | err_free: |
| 2931 | kfree(ndev); | 2931 | free_netdev(ndev); |
| 2932 | err_gone: | 2932 | err_gone: |
| 2933 | /* if we were on the bootlist, remove us as we won't show up and | 2933 | /* if we were on the bootlist, remove us as we won't show up and |
| 2934 | * wake up all waiters to notify them in case they were waiting | 2934 | * wake up all waiters to notify them in case they were waiting |
| @@ -2971,7 +2971,7 @@ static int __devexit emac_remove(struct platform_device *ofdev) | |||
| 2971 | if (dev->emac_irq != NO_IRQ) | 2971 | if (dev->emac_irq != NO_IRQ) |
| 2972 | irq_dispose_mapping(dev->emac_irq); | 2972 | irq_dispose_mapping(dev->emac_irq); |
| 2973 | 2973 | ||
| 2974 | kfree(dev->ndev); | 2974 | free_netdev(dev->ndev); |
| 2975 | 2975 | ||
| 2976 | return 0; | 2976 | return 0; |
| 2977 | } | 2977 | } |
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index cabae7bb1fc6..b075a35b85d4 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
| @@ -1540,7 +1540,6 @@ netxen_process_rcv(struct netxen_adapter *adapter, | |||
| 1540 | if (pkt_offset) | 1540 | if (pkt_offset) |
| 1541 | skb_pull(skb, pkt_offset); | 1541 | skb_pull(skb, pkt_offset); |
| 1542 | 1542 | ||
| 1543 | skb->truesize = skb->len + sizeof(struct sk_buff); | ||
| 1544 | skb->protocol = eth_type_trans(skb, netdev); | 1543 | skb->protocol = eth_type_trans(skb, netdev); |
| 1545 | 1544 | ||
| 1546 | napi_gro_receive(&sds_ring->napi, skb); | 1545 | napi_gro_receive(&sds_ring->napi, skb); |
| @@ -1602,8 +1601,6 @@ netxen_process_lro(struct netxen_adapter *adapter, | |||
| 1602 | 1601 | ||
| 1603 | skb_put(skb, lro_length + data_offset); | 1602 | skb_put(skb, lro_length + data_offset); |
| 1604 | 1603 | ||
| 1605 | skb->truesize = skb->len + sizeof(struct sk_buff) + skb_headroom(skb); | ||
| 1606 | |||
| 1607 | skb_pull(skb, l2_hdr_offset); | 1604 | skb_pull(skb, l2_hdr_offset); |
| 1608 | skb->protocol = eth_type_trans(skb, netdev); | 1605 | skb->protocol = eth_type_trans(skb, netdev); |
| 1609 | 1606 | ||
diff --git a/drivers/net/qlcnic/qlcnic_init.c b/drivers/net/qlcnic/qlcnic_init.c index 75ba744b173c..2c7cf0b64811 100644 --- a/drivers/net/qlcnic/qlcnic_init.c +++ b/drivers/net/qlcnic/qlcnic_init.c | |||
| @@ -1316,7 +1316,7 @@ qlcnic_alloc_rx_skb(struct qlcnic_adapter *adapter, | |||
| 1316 | return -ENOMEM; | 1316 | return -ENOMEM; |
| 1317 | } | 1317 | } |
| 1318 | 1318 | ||
| 1319 | skb_reserve(skb, 2); | 1319 | skb_reserve(skb, NET_IP_ALIGN); |
| 1320 | 1320 | ||
| 1321 | dma = pci_map_single(pdev, skb->data, | 1321 | dma = pci_map_single(pdev, skb->data, |
| 1322 | rds_ring->dma_size, PCI_DMA_FROMDEVICE); | 1322 | rds_ring->dma_size, PCI_DMA_FROMDEVICE); |
| @@ -1404,7 +1404,6 @@ qlcnic_process_rcv(struct qlcnic_adapter *adapter, | |||
| 1404 | if (pkt_offset) | 1404 | if (pkt_offset) |
| 1405 | skb_pull(skb, pkt_offset); | 1405 | skb_pull(skb, pkt_offset); |
| 1406 | 1406 | ||
| 1407 | skb->truesize = skb->len + sizeof(struct sk_buff); | ||
| 1408 | skb->protocol = eth_type_trans(skb, netdev); | 1407 | skb->protocol = eth_type_trans(skb, netdev); |
| 1409 | 1408 | ||
| 1410 | napi_gro_receive(&sds_ring->napi, skb); | 1409 | napi_gro_receive(&sds_ring->napi, skb); |
| @@ -1466,8 +1465,6 @@ qlcnic_process_lro(struct qlcnic_adapter *adapter, | |||
| 1466 | 1465 | ||
| 1467 | skb_put(skb, lro_length + data_offset); | 1466 | skb_put(skb, lro_length + data_offset); |
| 1468 | 1467 | ||
| 1469 | skb->truesize = skb->len + sizeof(struct sk_buff) + skb_headroom(skb); | ||
| 1470 | |||
| 1471 | skb_pull(skb, l2_hdr_offset); | 1468 | skb_pull(skb, l2_hdr_offset); |
| 1472 | skb->protocol = eth_type_trans(skb, netdev); | 1469 | skb->protocol = eth_type_trans(skb, netdev); |
| 1473 | 1470 | ||
| @@ -1700,8 +1697,6 @@ qlcnic_process_rcv_diag(struct qlcnic_adapter *adapter, | |||
| 1700 | if (pkt_offset) | 1697 | if (pkt_offset) |
| 1701 | skb_pull(skb, pkt_offset); | 1698 | skb_pull(skb, pkt_offset); |
| 1702 | 1699 | ||
| 1703 | skb->truesize = skb->len + sizeof(struct sk_buff); | ||
| 1704 | |||
| 1705 | if (!qlcnic_check_loopback_buff(skb->data)) | 1700 | if (!qlcnic_check_loopback_buff(skb->data)) |
| 1706 | adapter->diag_cnt++; | 1701 | adapter->diag_cnt++; |
| 1707 | 1702 | ||
diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c index 07eb884ff982..44150f2f7bfd 100644 --- a/drivers/net/rionet.c +++ b/drivers/net/rionet.c | |||
| @@ -384,7 +384,7 @@ static void rionet_remove(struct rio_dev *rdev) | |||
| 384 | free_pages((unsigned long)rionet_active, rdev->net->hport->sys_size ? | 384 | free_pages((unsigned long)rionet_active, rdev->net->hport->sys_size ? |
| 385 | __ilog2(sizeof(void *)) + 4 : 0); | 385 | __ilog2(sizeof(void *)) + 4 : 0); |
| 386 | unregister_netdev(ndev); | 386 | unregister_netdev(ndev); |
| 387 | kfree(ndev); | 387 | free_netdev(ndev); |
| 388 | 388 | ||
| 389 | list_for_each_entry_safe(peer, tmp, &rionet_peers, node) { | 389 | list_for_each_entry_safe(peer, tmp, &rionet_peers, node) { |
| 390 | list_del(&peer->node); | 390 | list_del(&peer->node); |
diff --git a/drivers/net/sgiseeq.c b/drivers/net/sgiseeq.c index cc4bd8c65f8b..9265315baa0b 100644 --- a/drivers/net/sgiseeq.c +++ b/drivers/net/sgiseeq.c | |||
| @@ -804,7 +804,7 @@ static int __devinit sgiseeq_probe(struct platform_device *pdev) | |||
| 804 | err_out_free_page: | 804 | err_out_free_page: |
| 805 | free_page((unsigned long) sp->srings); | 805 | free_page((unsigned long) sp->srings); |
| 806 | err_out_free_dev: | 806 | err_out_free_dev: |
| 807 | kfree(dev); | 807 | free_netdev(dev); |
| 808 | 808 | ||
| 809 | err_out: | 809 | err_out: |
| 810 | return err; | 810 | return err; |
diff --git a/drivers/net/smsc911x.c b/drivers/net/smsc911x.c index 0909ae934ad0..8150ba154116 100644 --- a/drivers/net/smsc911x.c +++ b/drivers/net/smsc911x.c | |||
| @@ -58,6 +58,7 @@ | |||
| 58 | 58 | ||
| 59 | MODULE_LICENSE("GPL"); | 59 | MODULE_LICENSE("GPL"); |
| 60 | MODULE_VERSION(SMSC_DRV_VERSION); | 60 | MODULE_VERSION(SMSC_DRV_VERSION); |
| 61 | MODULE_ALIAS("platform:smsc911x"); | ||
| 61 | 62 | ||
| 62 | #if USE_DEBUG > 0 | 63 | #if USE_DEBUG > 0 |
| 63 | static int debug = 16; | 64 | static int debug = 16; |
diff --git a/drivers/net/tulip/de2104x.c b/drivers/net/tulip/de2104x.c index 5efa57757a2c..6888e3d41462 100644 --- a/drivers/net/tulip/de2104x.c +++ b/drivers/net/tulip/de2104x.c | |||
| @@ -243,6 +243,7 @@ enum { | |||
| 243 | NWayState = (1 << 14) | (1 << 13) | (1 << 12), | 243 | NWayState = (1 << 14) | (1 << 13) | (1 << 12), |
| 244 | NWayRestart = (1 << 12), | 244 | NWayRestart = (1 << 12), |
| 245 | NonselPortActive = (1 << 9), | 245 | NonselPortActive = (1 << 9), |
| 246 | SelPortActive = (1 << 8), | ||
| 246 | LinkFailStatus = (1 << 2), | 247 | LinkFailStatus = (1 << 2), |
| 247 | NetCxnErr = (1 << 1), | 248 | NetCxnErr = (1 << 1), |
| 248 | }; | 249 | }; |
| @@ -363,7 +364,9 @@ static u16 t21040_csr15[] = { 0, 0, 0x0006, 0x0000, 0x0000, }; | |||
| 363 | 364 | ||
| 364 | /* 21041 transceiver register settings: TP AUTO, BNC, AUI, TP, TP FD*/ | 365 | /* 21041 transceiver register settings: TP AUTO, BNC, AUI, TP, TP FD*/ |
| 365 | static u16 t21041_csr13[] = { 0xEF01, 0xEF09, 0xEF09, 0xEF01, 0xEF09, }; | 366 | static u16 t21041_csr13[] = { 0xEF01, 0xEF09, 0xEF09, 0xEF01, 0xEF09, }; |
| 366 | static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x6F3F, 0x6F3D, }; | 367 | static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x7F3F, 0x7F3D, }; |
| 368 | /* If on-chip autonegotiation is broken, use half-duplex (FF3F) instead */ | ||
| 369 | static u16 t21041_csr14_brk[] = { 0xFF3F, 0xF7FD, 0xF7FD, 0x7F3F, 0x7F3D, }; | ||
| 367 | static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, }; | 370 | static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, }; |
| 368 | 371 | ||
| 369 | 372 | ||
| @@ -1064,6 +1067,9 @@ static void de21041_media_timer (unsigned long data) | |||
| 1064 | unsigned int carrier; | 1067 | unsigned int carrier; |
| 1065 | unsigned long flags; | 1068 | unsigned long flags; |
| 1066 | 1069 | ||
| 1070 | /* clear port active bits */ | ||
| 1071 | dw32(SIAStatus, NonselPortActive | SelPortActive); | ||
| 1072 | |||
| 1067 | carrier = (status & NetCxnErr) ? 0 : 1; | 1073 | carrier = (status & NetCxnErr) ? 0 : 1; |
| 1068 | 1074 | ||
| 1069 | if (carrier) { | 1075 | if (carrier) { |
| @@ -1158,14 +1164,29 @@ no_link_yet: | |||
| 1158 | static void de_media_interrupt (struct de_private *de, u32 status) | 1164 | static void de_media_interrupt (struct de_private *de, u32 status) |
| 1159 | { | 1165 | { |
| 1160 | if (status & LinkPass) { | 1166 | if (status & LinkPass) { |
| 1167 | /* Ignore if current media is AUI or BNC and we can't use TP */ | ||
| 1168 | if ((de->media_type == DE_MEDIA_AUI || | ||
| 1169 | de->media_type == DE_MEDIA_BNC) && | ||
| 1170 | (de->media_lock || | ||
| 1171 | !de_ok_to_advertise(de, DE_MEDIA_TP_AUTO))) | ||
| 1172 | return; | ||
| 1173 | /* If current media is not TP, change it to TP */ | ||
| 1174 | if ((de->media_type == DE_MEDIA_AUI || | ||
| 1175 | de->media_type == DE_MEDIA_BNC)) { | ||
| 1176 | de->media_type = DE_MEDIA_TP_AUTO; | ||
| 1177 | de_stop_rxtx(de); | ||
| 1178 | de_set_media(de); | ||
| 1179 | de_start_rxtx(de); | ||
| 1180 | } | ||
| 1161 | de_link_up(de); | 1181 | de_link_up(de); |
| 1162 | mod_timer(&de->media_timer, jiffies + DE_TIMER_LINK); | 1182 | mod_timer(&de->media_timer, jiffies + DE_TIMER_LINK); |
| 1163 | return; | 1183 | return; |
| 1164 | } | 1184 | } |
| 1165 | 1185 | ||
| 1166 | BUG_ON(!(status & LinkFail)); | 1186 | BUG_ON(!(status & LinkFail)); |
| 1167 | 1187 | /* Mark the link as down only if current media is TP */ | |
| 1168 | if (netif_carrier_ok(de->dev)) { | 1188 | if (netif_carrier_ok(de->dev) && de->media_type != DE_MEDIA_AUI && |
| 1189 | de->media_type != DE_MEDIA_BNC) { | ||
| 1169 | de_link_down(de); | 1190 | de_link_down(de); |
| 1170 | mod_timer(&de->media_timer, jiffies + DE_TIMER_NO_LINK); | 1191 | mod_timer(&de->media_timer, jiffies + DE_TIMER_NO_LINK); |
| 1171 | } | 1192 | } |
| @@ -1229,6 +1250,7 @@ static void de_adapter_sleep (struct de_private *de) | |||
| 1229 | if (de->de21040) | 1250 | if (de->de21040) |
| 1230 | return; | 1251 | return; |
| 1231 | 1252 | ||
| 1253 | dw32(CSR13, 0); /* Reset phy */ | ||
| 1232 | pci_read_config_dword(de->pdev, PCIPM, &pmctl); | 1254 | pci_read_config_dword(de->pdev, PCIPM, &pmctl); |
| 1233 | pmctl |= PM_Sleep; | 1255 | pmctl |= PM_Sleep; |
| 1234 | pci_write_config_dword(de->pdev, PCIPM, pmctl); | 1256 | pci_write_config_dword(de->pdev, PCIPM, pmctl); |
| @@ -1574,12 +1596,15 @@ static int __de_set_settings(struct de_private *de, struct ethtool_cmd *ecmd) | |||
| 1574 | return 0; /* nothing to change */ | 1596 | return 0; /* nothing to change */ |
| 1575 | 1597 | ||
| 1576 | de_link_down(de); | 1598 | de_link_down(de); |
| 1599 | mod_timer(&de->media_timer, jiffies + DE_TIMER_NO_LINK); | ||
| 1577 | de_stop_rxtx(de); | 1600 | de_stop_rxtx(de); |
| 1578 | 1601 | ||
| 1579 | de->media_type = new_media; | 1602 | de->media_type = new_media; |
| 1580 | de->media_lock = media_lock; | 1603 | de->media_lock = media_lock; |
| 1581 | de->media_advertise = ecmd->advertising; | 1604 | de->media_advertise = ecmd->advertising; |
| 1582 | de_set_media(de); | 1605 | de_set_media(de); |
| 1606 | if (netif_running(de->dev)) | ||
| 1607 | de_start_rxtx(de); | ||
| 1583 | 1608 | ||
| 1584 | return 0; | 1609 | return 0; |
| 1585 | } | 1610 | } |
| @@ -1911,8 +1936,14 @@ fill_defaults: | |||
| 1911 | for (i = 0; i < DE_MAX_MEDIA; i++) { | 1936 | for (i = 0; i < DE_MAX_MEDIA; i++) { |
| 1912 | if (de->media[i].csr13 == 0xffff) | 1937 | if (de->media[i].csr13 == 0xffff) |
| 1913 | de->media[i].csr13 = t21041_csr13[i]; | 1938 | de->media[i].csr13 = t21041_csr13[i]; |
| 1914 | if (de->media[i].csr14 == 0xffff) | 1939 | if (de->media[i].csr14 == 0xffff) { |
| 1915 | de->media[i].csr14 = t21041_csr14[i]; | 1940 | /* autonegotiation is broken at least on some chip |
| 1941 | revisions - rev. 0x21 works, 0x11 does not */ | ||
| 1942 | if (de->pdev->revision < 0x20) | ||
| 1943 | de->media[i].csr14 = t21041_csr14_brk[i]; | ||
| 1944 | else | ||
| 1945 | de->media[i].csr14 = t21041_csr14[i]; | ||
| 1946 | } | ||
| 1916 | if (de->media[i].csr15 == 0xffff) | 1947 | if (de->media[i].csr15 == 0xffff) |
| 1917 | de->media[i].csr15 = t21041_csr15[i]; | 1948 | de->media[i].csr15 = t21041_csr15[i]; |
| 1918 | } | 1949 | } |
| @@ -2158,6 +2189,8 @@ static int de_resume (struct pci_dev *pdev) | |||
| 2158 | dev_err(&dev->dev, "pci_enable_device failed in resume\n"); | 2189 | dev_err(&dev->dev, "pci_enable_device failed in resume\n"); |
| 2159 | goto out; | 2190 | goto out; |
| 2160 | } | 2191 | } |
| 2192 | pci_set_master(pdev); | ||
| 2193 | de_init_rings(de); | ||
| 2161 | de_init_hw(de); | 2194 | de_init_hw(de); |
| 2162 | out_attach: | 2195 | out_attach: |
| 2163 | netif_device_attach(dev); | 2196 | netif_device_attach(dev); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index 07dbc2796448..e23c4060a0f0 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
| @@ -2613,6 +2613,11 @@ int iwl_force_reset(struct iwl_priv *priv, int mode, bool external) | |||
| 2613 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | 2613 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
| 2614 | return -EINVAL; | 2614 | return -EINVAL; |
| 2615 | 2615 | ||
| 2616 | if (test_bit(STATUS_SCANNING, &priv->status)) { | ||
| 2617 | IWL_DEBUG_INFO(priv, "scan in progress.\n"); | ||
| 2618 | return -EINVAL; | ||
| 2619 | } | ||
| 2620 | |||
| 2616 | if (mode >= IWL_MAX_FORCE_RESET) { | 2621 | if (mode >= IWL_MAX_FORCE_RESET) { |
| 2617 | IWL_DEBUG_INFO(priv, "invalid reset request.\n"); | 2622 | IWL_DEBUG_INFO(priv, "invalid reset request.\n"); |
| 2618 | return -EINVAL; | 2623 | return -EINVAL; |
