mirror of https://gitee.com/openkylin/linux.git
ixgbe: disable link when adapter goes down
This patch fixes an issue with the 82599 adapter where it can potentially keep link lights up when the adapter has gone down. The patch adds a function which ensures link is disabled, and calls this function when the adapter transitions to a down state. Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
cc328deac5
commit
f4f1040ae6
|
@ -49,6 +49,7 @@ static s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
|
|||
static s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw,
|
||||
ixgbe_link_speed speed,
|
||||
bool autoneg_wait_to_complete);
|
||||
static void ixgbe_stop_mac_link_on_d3_82599(struct ixgbe_hw *hw);
|
||||
static s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw,
|
||||
bool autoneg_wait_to_complete);
|
||||
static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,
|
||||
|
@ -431,6 +432,24 @@ static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
|
|||
return media_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_stop_mac_link_on_d3_82599 - Disables link on D3
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Disables link, should be called during D3 power down sequence.
|
||||
*
|
||||
*/
|
||||
static void ixgbe_stop_mac_link_on_d3_82599(struct ixgbe_hw *hw)
|
||||
{
|
||||
u32 autoc2_reg;
|
||||
|
||||
if (!hw->mng_fw_enabled && !hw->wol_enabled) {
|
||||
autoc2_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC2);
|
||||
autoc2_reg |= IXGBE_AUTOC2_LINK_DISABLE_ON_D3_MASK;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2_reg);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_start_mac_link_82599 - Setup MAC link settings
|
||||
* @hw: pointer to hardware structure
|
||||
|
@ -2477,6 +2496,7 @@ static struct ixgbe_mac_operations mac_ops_82599 = {
|
|||
.set_lan_id = &ixgbe_set_lan_id_multi_port_pcie,
|
||||
.read_analog_reg8 = &ixgbe_read_analog_reg8_82599,
|
||||
.write_analog_reg8 = &ixgbe_write_analog_reg8_82599,
|
||||
.stop_link_on_d3 = &ixgbe_stop_mac_link_on_d3_82599,
|
||||
.setup_link = &ixgbe_setup_mac_link_82599,
|
||||
.set_rxpba = &ixgbe_set_rxpba_generic,
|
||||
.check_link = &ixgbe_check_mac_link_generic,
|
||||
|
|
|
@ -5292,6 +5292,9 @@ static int __ixgbe_shutdown(struct pci_dev *pdev, bool *enable_wake)
|
|||
return retval;
|
||||
|
||||
#endif
|
||||
if (hw->mac.ops.stop_link_on_d3)
|
||||
hw->mac.ops.stop_link_on_d3(hw);
|
||||
|
||||
if (wufc) {
|
||||
ixgbe_set_rx_mode(netdev);
|
||||
|
||||
|
|
|
@ -1596,6 +1596,7 @@ enum {
|
|||
#define IXGBE_AUTOC2_10G_KR (0x0 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT)
|
||||
#define IXGBE_AUTOC2_10G_XFI (0x1 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT)
|
||||
#define IXGBE_AUTOC2_10G_SFI (0x2 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT)
|
||||
#define IXGBE_AUTOC2_LINK_DISABLE_ON_D3_MASK 0x50000000
|
||||
#define IXGBE_AUTOC2_LINK_DISABLE_MASK 0x70000000
|
||||
|
||||
#define IXGBE_MACC_FLU 0x00000001
|
||||
|
@ -2847,6 +2848,7 @@ struct ixgbe_mac_operations {
|
|||
void (*disable_tx_laser)(struct ixgbe_hw *);
|
||||
void (*enable_tx_laser)(struct ixgbe_hw *);
|
||||
void (*flap_tx_laser)(struct ixgbe_hw *);
|
||||
void (*stop_link_on_d3)(struct ixgbe_hw *);
|
||||
s32 (*setup_link)(struct ixgbe_hw *, ixgbe_link_speed, bool);
|
||||
s32 (*check_link)(struct ixgbe_hw *, ixgbe_link_speed *, bool *, bool);
|
||||
s32 (*get_link_capabilities)(struct ixgbe_hw *, ixgbe_link_speed *,
|
||||
|
|
Loading…
Reference in New Issue