|
@@ -1980,15 +1980,15 @@ static void e1000_irq_enable(struct e1000_adapter *adapter)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * e1000_get_hw_control - get control of the h/w from f/w
|
|
|
+ * e1000e_get_hw_control - get control of the h/w from f/w
|
|
|
* @adapter: address of board private structure
|
|
|
*
|
|
|
- * e1000_get_hw_control sets {CTRL_EXT|SWSM}:DRV_LOAD bit.
|
|
|
+ * e1000e_get_hw_control sets {CTRL_EXT|SWSM}:DRV_LOAD bit.
|
|
|
* For ASF and Pass Through versions of f/w this means that
|
|
|
* the driver is loaded. For AMT version (only with 82573)
|
|
|
* of the f/w this means that the network i/f is open.
|
|
|
**/
|
|
|
-static void e1000_get_hw_control(struct e1000_adapter *adapter)
|
|
|
+void e1000e_get_hw_control(struct e1000_adapter *adapter)
|
|
|
{
|
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
|
u32 ctrl_ext;
|
|
@@ -2005,16 +2005,16 @@ static void e1000_get_hw_control(struct e1000_adapter *adapter)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * e1000_release_hw_control - release control of the h/w to f/w
|
|
|
+ * e1000e_release_hw_control - release control of the h/w to f/w
|
|
|
* @adapter: address of board private structure
|
|
|
*
|
|
|
- * e1000_release_hw_control resets {CTRL_EXT|SWSM}:DRV_LOAD bit.
|
|
|
+ * e1000e_release_hw_control resets {CTRL_EXT|SWSM}:DRV_LOAD bit.
|
|
|
* For ASF and Pass Through versions of f/w this means that the
|
|
|
* driver is no longer loaded. For AMT version (only with 82573) i
|
|
|
* of the f/w this means that the network i/f is closed.
|
|
|
*
|
|
|
**/
|
|
|
-static void e1000_release_hw_control(struct e1000_adapter *adapter)
|
|
|
+void e1000e_release_hw_control(struct e1000_adapter *adapter)
|
|
|
{
|
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
|
u32 ctrl_ext;
|
|
@@ -2445,7 +2445,7 @@ static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
|
|
|
E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
|
|
|
(vid == adapter->mng_vlan_id)) {
|
|
|
/* release control to f/w */
|
|
|
- e1000_release_hw_control(adapter);
|
|
|
+ e1000e_release_hw_control(adapter);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -3187,7 +3187,6 @@ void e1000e_reset(struct e1000_adapter *adapter)
|
|
|
ew32(PBA, pba);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/*
|
|
|
* flow control settings
|
|
|
*
|
|
@@ -3275,7 +3274,7 @@ void e1000e_reset(struct e1000_adapter *adapter)
|
|
|
* that the network interface is in control
|
|
|
*/
|
|
|
if (adapter->flags & FLAG_HAS_AMT)
|
|
|
- e1000_get_hw_control(adapter);
|
|
|
+ e1000e_get_hw_control(adapter);
|
|
|
|
|
|
ew32(WUC, 0);
|
|
|
|
|
@@ -3288,6 +3287,13 @@ void e1000e_reset(struct e1000_adapter *adapter)
|
|
|
ew32(VET, ETH_P_8021Q);
|
|
|
|
|
|
e1000e_reset_adaptive(hw);
|
|
|
+
|
|
|
+ if (!netif_running(adapter->netdev) &&
|
|
|
+ !test_bit(__E1000_TESTING, &adapter->state)) {
|
|
|
+ e1000_power_down_phy(adapter);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
e1000_get_phy_info(hw);
|
|
|
|
|
|
if ((adapter->flags & FLAG_HAS_SMART_POWER_DOWN) &&
|
|
@@ -3573,7 +3579,7 @@ static int e1000_open(struct net_device *netdev)
|
|
|
* interface is now open and reset the part to a known state.
|
|
|
*/
|
|
|
if (adapter->flags & FLAG_HAS_AMT) {
|
|
|
- e1000_get_hw_control(adapter);
|
|
|
+ e1000e_get_hw_control(adapter);
|
|
|
e1000e_reset(adapter);
|
|
|
}
|
|
|
|
|
@@ -3637,7 +3643,7 @@ static int e1000_open(struct net_device *netdev)
|
|
|
return 0;
|
|
|
|
|
|
err_req_irq:
|
|
|
- e1000_release_hw_control(adapter);
|
|
|
+ e1000e_release_hw_control(adapter);
|
|
|
e1000_power_down_phy(adapter);
|
|
|
e1000e_free_rx_resources(adapter);
|
|
|
err_setup_rx:
|
|
@@ -3692,8 +3698,9 @@ static int e1000_close(struct net_device *netdev)
|
|
|
* If AMT is enabled, let the firmware know that the network
|
|
|
* interface is now closed
|
|
|
*/
|
|
|
- if (adapter->flags & FLAG_HAS_AMT)
|
|
|
- e1000_release_hw_control(adapter);
|
|
|
+ if ((adapter->flags & FLAG_HAS_AMT) &&
|
|
|
+ !test_bit(__E1000_TESTING, &adapter->state))
|
|
|
+ e1000e_release_hw_control(adapter);
|
|
|
|
|
|
if ((adapter->flags & FLAG_HAS_ERT) ||
|
|
|
(adapter->hw.mac.type == e1000_pch2lan))
|
|
@@ -5212,7 +5219,7 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake,
|
|
|
* Release control of h/w to f/w. If f/w is AMT enabled, this
|
|
|
* would have already happened in close and is redundant.
|
|
|
*/
|
|
|
- e1000_release_hw_control(adapter);
|
|
|
+ e1000e_release_hw_control(adapter);
|
|
|
|
|
|
pci_disable_device(pdev);
|
|
|
|
|
@@ -5369,7 +5376,7 @@ static int __e1000_resume(struct pci_dev *pdev)
|
|
|
* under the control of the driver.
|
|
|
*/
|
|
|
if (!(adapter->flags & FLAG_HAS_AMT))
|
|
|
- e1000_get_hw_control(adapter);
|
|
|
+ e1000e_get_hw_control(adapter);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -5616,7 +5623,7 @@ static void e1000_io_resume(struct pci_dev *pdev)
|
|
|
* under the control of the driver.
|
|
|
*/
|
|
|
if (!(adapter->flags & FLAG_HAS_AMT))
|
|
|
- e1000_get_hw_control(adapter);
|
|
|
+ e1000e_get_hw_control(adapter);
|
|
|
|
|
|
}
|
|
|
|
|
@@ -5966,7 +5973,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
|
|
|
* under the control of the driver.
|
|
|
*/
|
|
|
if (!(adapter->flags & FLAG_HAS_AMT))
|
|
|
- e1000_get_hw_control(adapter);
|
|
|
+ e1000e_get_hw_control(adapter);
|
|
|
|
|
|
strncpy(netdev->name, "eth%d", sizeof(netdev->name) - 1);
|
|
|
err = register_netdev(netdev);
|
|
@@ -5985,12 +5992,11 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
|
|
|
|
|
|
err_register:
|
|
|
if (!(adapter->flags & FLAG_HAS_AMT))
|
|
|
- e1000_release_hw_control(adapter);
|
|
|
+ e1000e_release_hw_control(adapter);
|
|
|
err_eeprom:
|
|
|
if (!e1000_check_reset_block(&adapter->hw))
|
|
|
e1000_phy_hw_reset(&adapter->hw);
|
|
|
err_hw_init:
|
|
|
-
|
|
|
kfree(adapter->tx_ring);
|
|
|
kfree(adapter->rx_ring);
|
|
|
err_sw_init:
|
|
@@ -6056,7 +6062,7 @@ static void __devexit e1000_remove(struct pci_dev *pdev)
|
|
|
* Release control of h/w to f/w. If f/w is AMT enabled, this
|
|
|
* would have already happened in close and is redundant.
|
|
|
*/
|
|
|
- e1000_release_hw_control(adapter);
|
|
|
+ e1000e_release_hw_control(adapter);
|
|
|
|
|
|
e1000e_reset_interrupt_capability(adapter);
|
|
|
kfree(adapter->tx_ring);
|