Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
This commit is contained in:
commit
a319726af9
|
@ -764,6 +764,7 @@ static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw)
|
||||||
{
|
{
|
||||||
u32 ctrl;
|
u32 ctrl;
|
||||||
s32 ret_val;
|
s32 ret_val;
|
||||||
|
u16 kum_reg_data;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prevent the PCI-E bus from sticking if there is no TLP connection
|
* Prevent the PCI-E bus from sticking if there is no TLP connection
|
||||||
|
@ -789,6 +790,13 @@ static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw)
|
||||||
ew32(CTRL, ctrl | E1000_CTRL_RST);
|
ew32(CTRL, ctrl | E1000_CTRL_RST);
|
||||||
e1000_release_phy_80003es2lan(hw);
|
e1000_release_phy_80003es2lan(hw);
|
||||||
|
|
||||||
|
/* Disable IBIST slave mode (far-end loopback) */
|
||||||
|
e1000_read_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_INBAND_PARAM,
|
||||||
|
&kum_reg_data);
|
||||||
|
kum_reg_data |= E1000_KMRNCTRLSTA_IBIST_DISABLE;
|
||||||
|
e1000_write_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_INBAND_PARAM,
|
||||||
|
kum_reg_data);
|
||||||
|
|
||||||
ret_val = e1000e_get_auto_rd_done(hw);
|
ret_val = e1000e_get_auto_rd_done(hw);
|
||||||
if (ret_val)
|
if (ret_val)
|
||||||
/* We don't want to continue accessing MAC registers. */
|
/* We don't want to continue accessing MAC registers. */
|
||||||
|
|
|
@ -2062,7 +2062,8 @@ const struct e1000_info e1000_82574_info = {
|
||||||
| FLAG_HAS_CTRLEXT_ON_LOAD,
|
| FLAG_HAS_CTRLEXT_ON_LOAD,
|
||||||
.flags2 = FLAG2_CHECK_PHY_HANG
|
.flags2 = FLAG2_CHECK_PHY_HANG
|
||||||
| FLAG2_DISABLE_ASPM_L0S
|
| FLAG2_DISABLE_ASPM_L0S
|
||||||
| FLAG2_NO_DISABLE_RX,
|
| FLAG2_NO_DISABLE_RX
|
||||||
|
| FLAG2_DMA_BURST,
|
||||||
.pba = 32,
|
.pba = 32,
|
||||||
.max_hw_frame_size = DEFAULT_JUMBO,
|
.max_hw_frame_size = DEFAULT_JUMBO,
|
||||||
.get_variants = e1000_get_variants_82571,
|
.get_variants = e1000_get_variants_82571,
|
||||||
|
|
|
@ -735,9 +735,46 @@ static inline u32 __er32(struct e1000_hw *hw, unsigned long reg)
|
||||||
return readl(hw->hw_addr + reg);
|
return readl(hw->hw_addr + reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define er32(reg) __er32(hw, E1000_##reg)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __ew32_prepare - prepare to write to MAC CSR register on certain parts
|
||||||
|
* @hw: pointer to the HW structure
|
||||||
|
*
|
||||||
|
* When updating the MAC CSR registers, the Manageability Engine (ME) could
|
||||||
|
* be accessing the registers at the same time. Normally, this is handled in
|
||||||
|
* h/w by an arbiter but on some parts there is a bug that acknowledges Host
|
||||||
|
* accesses later than it should which could result in the register to have
|
||||||
|
* an incorrect value. Workaround this by checking the FWSM register which
|
||||||
|
* has bit 24 set while ME is accessing MAC CSR registers, wait if it is set
|
||||||
|
* and try again a number of times.
|
||||||
|
**/
|
||||||
|
static inline s32 __ew32_prepare(struct e1000_hw *hw)
|
||||||
|
{
|
||||||
|
s32 i = E1000_ICH_FWSM_PCIM2PCI_COUNT;
|
||||||
|
|
||||||
|
while ((er32(FWSM) & E1000_ICH_FWSM_PCIM2PCI) && --i)
|
||||||
|
udelay(50);
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void __ew32(struct e1000_hw *hw, unsigned long reg, u32 val)
|
static inline void __ew32(struct e1000_hw *hw, unsigned long reg, u32 val)
|
||||||
{
|
{
|
||||||
|
if (hw->adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA)
|
||||||
|
__ew32_prepare(hw);
|
||||||
|
|
||||||
writel(val, hw->hw_addr + reg);
|
writel(val, hw->hw_addr + reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ew32(reg, val) __ew32(hw, E1000_##reg, (val))
|
||||||
|
|
||||||
|
#define e1e_flush() er32(STATUS)
|
||||||
|
|
||||||
|
#define E1000_WRITE_REG_ARRAY(a, reg, offset, value) \
|
||||||
|
(__ew32((a), (reg + ((offset) << 2)), (value)))
|
||||||
|
|
||||||
|
#define E1000_READ_REG_ARRAY(a, reg, offset) \
|
||||||
|
(readl((a)->hw_addr + reg + ((offset) << 2)))
|
||||||
|
|
||||||
#endif /* _E1000_H_ */
|
#endif /* _E1000_H_ */
|
||||||
|
|
|
@ -36,16 +36,6 @@ struct e1000_adapter;
|
||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
|
||||||
#define er32(reg) __er32(hw, E1000_##reg)
|
|
||||||
#define ew32(reg,val) __ew32(hw, E1000_##reg, (val))
|
|
||||||
#define e1e_flush() er32(STATUS)
|
|
||||||
|
|
||||||
#define E1000_WRITE_REG_ARRAY(a, reg, offset, value) \
|
|
||||||
(writel((value), ((a)->hw_addr + reg + ((offset) << 2))))
|
|
||||||
|
|
||||||
#define E1000_READ_REG_ARRAY(a, reg, offset) \
|
|
||||||
(readl((a)->hw_addr + reg + ((offset) << 2)))
|
|
||||||
|
|
||||||
enum e1e_registers {
|
enum e1e_registers {
|
||||||
E1000_CTRL = 0x00000, /* Device Control - RW */
|
E1000_CTRL = 0x00000, /* Device Control - RW */
|
||||||
E1000_STATUS = 0x00008, /* Device Status - RO */
|
E1000_STATUS = 0x00008, /* Device Status - RO */
|
||||||
|
|
|
@ -135,6 +135,7 @@
|
||||||
|
|
||||||
/* PHY Power Management Control */
|
/* PHY Power Management Control */
|
||||||
#define HV_PM_CTRL PHY_REG(770, 17)
|
#define HV_PM_CTRL PHY_REG(770, 17)
|
||||||
|
#define HV_PM_CTRL_PLL_STOP_IN_K1_GIGA 0x100
|
||||||
|
|
||||||
/* PHY Low Power Idle Control */
|
/* PHY Low Power Idle Control */
|
||||||
#define I82579_LPI_CTRL PHY_REG(772, 20)
|
#define I82579_LPI_CTRL PHY_REG(772, 20)
|
||||||
|
@ -1708,8 +1709,18 @@ static s32 e1000_k1_workaround_lv(struct e1000_hw *hw)
|
||||||
return ret_val;
|
return ret_val;
|
||||||
|
|
||||||
if (status_reg & HV_M_STATUS_SPEED_1000) {
|
if (status_reg & HV_M_STATUS_SPEED_1000) {
|
||||||
|
u16 pm_phy_reg;
|
||||||
|
|
||||||
mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_8USEC;
|
mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_8USEC;
|
||||||
phy_reg &= ~I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT;
|
phy_reg &= ~I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT;
|
||||||
|
/* LV 1G Packet drop issue wa */
|
||||||
|
ret_val = e1e_rphy(hw, HV_PM_CTRL, &pm_phy_reg);
|
||||||
|
if (ret_val)
|
||||||
|
return ret_val;
|
||||||
|
pm_phy_reg &= ~HV_PM_CTRL_PLL_STOP_IN_K1_GIGA;
|
||||||
|
ret_val = e1e_wphy(hw, HV_PM_CTRL, pm_phy_reg);
|
||||||
|
if (ret_val)
|
||||||
|
return ret_val;
|
||||||
} else {
|
} else {
|
||||||
mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_16USEC;
|
mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_16USEC;
|
||||||
phy_reg |= I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT;
|
phy_reg |= I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT;
|
||||||
|
|
|
@ -538,43 +538,15 @@ static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
|
||||||
adapter->hw_csum_good++;
|
adapter->hw_csum_good++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* e1000e_update_tail_wa - helper function for e1000e_update_[rt]dt_wa()
|
|
||||||
* @hw: pointer to the HW structure
|
|
||||||
* @tail: address of tail descriptor register
|
|
||||||
* @i: value to write to tail descriptor register
|
|
||||||
*
|
|
||||||
* When updating the tail register, the ME could be accessing Host CSR
|
|
||||||
* registers at the same time. Normally, this is handled in h/w by an
|
|
||||||
* arbiter but on some parts there is a bug that acknowledges Host accesses
|
|
||||||
* later than it should which could result in the descriptor register to
|
|
||||||
* have an incorrect value. Workaround this by checking the FWSM register
|
|
||||||
* which has bit 24 set while ME is accessing Host CSR registers, wait
|
|
||||||
* if it is set and try again a number of times.
|
|
||||||
**/
|
|
||||||
static inline s32 e1000e_update_tail_wa(struct e1000_hw *hw, void __iomem *tail,
|
|
||||||
unsigned int i)
|
|
||||||
{
|
|
||||||
unsigned int j = 0;
|
|
||||||
|
|
||||||
while ((j++ < E1000_ICH_FWSM_PCIM2PCI_COUNT) &&
|
|
||||||
(er32(FWSM) & E1000_ICH_FWSM_PCIM2PCI))
|
|
||||||
udelay(50);
|
|
||||||
|
|
||||||
writel(i, tail);
|
|
||||||
|
|
||||||
if ((j == E1000_ICH_FWSM_PCIM2PCI_COUNT) && (i != readl(tail)))
|
|
||||||
return E1000_ERR_SWFW_SYNC;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void e1000e_update_rdt_wa(struct e1000_ring *rx_ring, unsigned int i)
|
static void e1000e_update_rdt_wa(struct e1000_ring *rx_ring, unsigned int i)
|
||||||
{
|
{
|
||||||
struct e1000_adapter *adapter = rx_ring->adapter;
|
struct e1000_adapter *adapter = rx_ring->adapter;
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
|
s32 ret_val = __ew32_prepare(hw);
|
||||||
|
|
||||||
if (e1000e_update_tail_wa(hw, rx_ring->tail, i)) {
|
writel(i, rx_ring->tail);
|
||||||
|
|
||||||
|
if (unlikely(!ret_val && (i != readl(rx_ring->tail)))) {
|
||||||
u32 rctl = er32(RCTL);
|
u32 rctl = er32(RCTL);
|
||||||
ew32(RCTL, rctl & ~E1000_RCTL_EN);
|
ew32(RCTL, rctl & ~E1000_RCTL_EN);
|
||||||
e_err("ME firmware caused invalid RDT - resetting\n");
|
e_err("ME firmware caused invalid RDT - resetting\n");
|
||||||
|
@ -586,8 +558,11 @@ static void e1000e_update_tdt_wa(struct e1000_ring *tx_ring, unsigned int i)
|
||||||
{
|
{
|
||||||
struct e1000_adapter *adapter = tx_ring->adapter;
|
struct e1000_adapter *adapter = tx_ring->adapter;
|
||||||
struct e1000_hw *hw = &adapter->hw;
|
struct e1000_hw *hw = &adapter->hw;
|
||||||
|
s32 ret_val = __ew32_prepare(hw);
|
||||||
|
|
||||||
if (e1000e_update_tail_wa(hw, tx_ring->tail, i)) {
|
writel(i, tx_ring->tail);
|
||||||
|
|
||||||
|
if (unlikely(!ret_val && (i != readl(tx_ring->tail)))) {
|
||||||
u32 tctl = er32(TCTL);
|
u32 tctl = er32(TCTL);
|
||||||
ew32(TCTL, tctl & ~E1000_TCTL_EN);
|
ew32(TCTL, tctl & ~E1000_TCTL_EN);
|
||||||
e_err("ME firmware caused invalid TDT - resetting\n");
|
e_err("ME firmware caused invalid TDT - resetting\n");
|
||||||
|
@ -1646,6 +1621,9 @@ static void e1000_clean_rx_ring(struct e1000_ring *rx_ring)
|
||||||
adapter->flags2 &= ~FLAG2_IS_DISCARDING;
|
adapter->flags2 &= ~FLAG2_IS_DISCARDING;
|
||||||
|
|
||||||
writel(0, rx_ring->head);
|
writel(0, rx_ring->head);
|
||||||
|
if (rx_ring->adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA)
|
||||||
|
e1000e_update_rdt_wa(rx_ring, 0);
|
||||||
|
else
|
||||||
writel(0, rx_ring->tail);
|
writel(0, rx_ring->tail);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2319,6 +2297,9 @@ static void e1000_clean_tx_ring(struct e1000_ring *tx_ring)
|
||||||
tx_ring->next_to_clean = 0;
|
tx_ring->next_to_clean = 0;
|
||||||
|
|
||||||
writel(0, tx_ring->head);
|
writel(0, tx_ring->head);
|
||||||
|
if (tx_ring->adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA)
|
||||||
|
e1000e_update_tdt_wa(tx_ring, 0);
|
||||||
|
else
|
||||||
writel(0, tx_ring->tail);
|
writel(0, tx_ring->tail);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1715,6 +1715,13 @@ void igb_reset(struct igb_adapter *adapter)
|
||||||
if (hw->mac.ops.init_hw(hw))
|
if (hw->mac.ops.init_hw(hw))
|
||||||
dev_err(&pdev->dev, "Hardware Error\n");
|
dev_err(&pdev->dev, "Hardware Error\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flow control settings reset on hardware reset, so guarantee flow
|
||||||
|
* control is off when forcing speed.
|
||||||
|
*/
|
||||||
|
if (!hw->mac.autoneg)
|
||||||
|
igb_force_mac_fc(hw);
|
||||||
|
|
||||||
igb_init_dmac(adapter, pba);
|
igb_init_dmac(adapter, pba);
|
||||||
if (!netif_running(adapter->netdev))
|
if (!netif_running(adapter->netdev))
|
||||||
igb_power_down_link(adapter);
|
igb_power_down_link(adapter);
|
||||||
|
|
|
@ -600,6 +600,8 @@ extern void ixgbe_disable_rx_queue(struct ixgbe_adapter *adapter,
|
||||||
struct ixgbe_ring *);
|
struct ixgbe_ring *);
|
||||||
extern void ixgbe_update_stats(struct ixgbe_adapter *adapter);
|
extern void ixgbe_update_stats(struct ixgbe_adapter *adapter);
|
||||||
extern int ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter);
|
extern int ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter);
|
||||||
|
extern int ixgbe_wol_supported(struct ixgbe_adapter *adapter, u16 device_id,
|
||||||
|
u16 subdevice_id);
|
||||||
extern void ixgbe_clear_interrupt_scheme(struct ixgbe_adapter *adapter);
|
extern void ixgbe_clear_interrupt_scheme(struct ixgbe_adapter *adapter);
|
||||||
extern netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *,
|
extern netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *,
|
||||||
struct ixgbe_adapter *,
|
struct ixgbe_adapter *,
|
||||||
|
|
|
@ -1969,53 +1969,12 @@ static int ixgbe_wol_exclusion(struct ixgbe_adapter *adapter,
|
||||||
struct ethtool_wolinfo *wol)
|
struct ethtool_wolinfo *wol)
|
||||||
{
|
{
|
||||||
struct ixgbe_hw *hw = &adapter->hw;
|
struct ixgbe_hw *hw = &adapter->hw;
|
||||||
int retval = 1;
|
int retval = 0;
|
||||||
u16 wol_cap = adapter->eeprom_cap & IXGBE_DEVICE_CAPS_WOL_MASK;
|
|
||||||
|
|
||||||
/* WOL not supported except for the following */
|
/* WOL not supported for all devices */
|
||||||
switch(hw->device_id) {
|
if (!ixgbe_wol_supported(adapter, hw->device_id,
|
||||||
case IXGBE_DEV_ID_82599_SFP:
|
hw->subsystem_device_id)) {
|
||||||
/* Only these subdevices could supports WOL */
|
retval = 1;
|
||||||
switch (hw->subsystem_device_id) {
|
|
||||||
case IXGBE_SUBDEV_ID_82599_560FLR:
|
|
||||||
/* only support first port */
|
|
||||||
if (hw->bus.func != 0) {
|
|
||||||
wol->supported = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case IXGBE_SUBDEV_ID_82599_SFP:
|
|
||||||
retval = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
wol->supported = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case IXGBE_DEV_ID_82599_COMBO_BACKPLANE:
|
|
||||||
/* All except this subdevice support WOL */
|
|
||||||
if (hw->subsystem_device_id ==
|
|
||||||
IXGBE_SUBDEV_ID_82599_KX4_KR_MEZZ) {
|
|
||||||
wol->supported = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
retval = 0;
|
|
||||||
break;
|
|
||||||
case IXGBE_DEV_ID_82599_KX4:
|
|
||||||
retval = 0;
|
|
||||||
break;
|
|
||||||
case IXGBE_DEV_ID_X540T:
|
|
||||||
/* check eeprom to see if enabled wol */
|
|
||||||
if ((wol_cap == IXGBE_DEVICE_CAPS_WOL_PORT0_1) ||
|
|
||||||
((wol_cap == IXGBE_DEVICE_CAPS_WOL_PORT0) &&
|
|
||||||
(hw->bus.func == 0))) {
|
|
||||||
retval = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* All others not supported */
|
|
||||||
wol->supported = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
wol->supported = 0;
|
wol->supported = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6785,6 +6785,57 @@ static void __devinit ixgbe_probe_vf(struct ixgbe_adapter *adapter,
|
||||||
#endif /* CONFIG_PCI_IOV */
|
#endif /* CONFIG_PCI_IOV */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ixgbe_wol_supported - Check whether device supports WoL
|
||||||
|
* @hw: hw specific details
|
||||||
|
* @device_id: the device ID
|
||||||
|
* @subdev_id: the subsystem device ID
|
||||||
|
*
|
||||||
|
* This function is used by probe and ethtool to determine
|
||||||
|
* which devices have WoL support
|
||||||
|
*
|
||||||
|
**/
|
||||||
|
int ixgbe_wol_supported(struct ixgbe_adapter *adapter, u16 device_id,
|
||||||
|
u16 subdevice_id)
|
||||||
|
{
|
||||||
|
struct ixgbe_hw *hw = &adapter->hw;
|
||||||
|
u16 wol_cap = adapter->eeprom_cap & IXGBE_DEVICE_CAPS_WOL_MASK;
|
||||||
|
int is_wol_supported = 0;
|
||||||
|
|
||||||
|
switch (device_id) {
|
||||||
|
case IXGBE_DEV_ID_82599_SFP:
|
||||||
|
/* Only these subdevices could supports WOL */
|
||||||
|
switch (subdevice_id) {
|
||||||
|
case IXGBE_SUBDEV_ID_82599_560FLR:
|
||||||
|
/* only support first port */
|
||||||
|
if (hw->bus.func != 0)
|
||||||
|
break;
|
||||||
|
case IXGBE_SUBDEV_ID_82599_SFP:
|
||||||
|
is_wol_supported = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IXGBE_DEV_ID_82599_COMBO_BACKPLANE:
|
||||||
|
/* All except this subdevice support WOL */
|
||||||
|
if (subdevice_id != IXGBE_SUBDEV_ID_82599_KX4_KR_MEZZ)
|
||||||
|
is_wol_supported = 1;
|
||||||
|
break;
|
||||||
|
case IXGBE_DEV_ID_82599_KX4:
|
||||||
|
is_wol_supported = 1;
|
||||||
|
break;
|
||||||
|
case IXGBE_DEV_ID_X540T:
|
||||||
|
/* check eeprom to see if enabled wol */
|
||||||
|
if ((wol_cap == IXGBE_DEVICE_CAPS_WOL_PORT0_1) ||
|
||||||
|
((wol_cap == IXGBE_DEVICE_CAPS_WOL_PORT0) &&
|
||||||
|
(hw->bus.func == 0))) {
|
||||||
|
is_wol_supported = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return is_wol_supported;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ixgbe_probe - Device Initialization Routine
|
* ixgbe_probe - Device Initialization Routine
|
||||||
* @pdev: PCI device information struct
|
* @pdev: PCI device information struct
|
||||||
|
@ -6811,7 +6862,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
|
||||||
u16 device_caps;
|
u16 device_caps;
|
||||||
#endif
|
#endif
|
||||||
u32 eec;
|
u32 eec;
|
||||||
u16 wol_cap;
|
|
||||||
|
|
||||||
/* Catch broken hardware that put the wrong VF device ID in
|
/* Catch broken hardware that put the wrong VF device ID in
|
||||||
* the PCIe SR-IOV capability.
|
* the PCIe SR-IOV capability.
|
||||||
|
@ -7075,40 +7125,12 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
|
||||||
netdev->features &= ~NETIF_F_RXHASH;
|
netdev->features &= ~NETIF_F_RXHASH;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* WOL not supported for all but the following */
|
/* WOL not supported for all devices */
|
||||||
adapter->wol = 0;
|
adapter->wol = 0;
|
||||||
switch (pdev->device) {
|
|
||||||
case IXGBE_DEV_ID_82599_SFP:
|
|
||||||
/* Only these subdevice supports WOL */
|
|
||||||
switch (pdev->subsystem_device) {
|
|
||||||
case IXGBE_SUBDEV_ID_82599_560FLR:
|
|
||||||
/* only support first port */
|
|
||||||
if (hw->bus.func != 0)
|
|
||||||
break;
|
|
||||||
case IXGBE_SUBDEV_ID_82599_SFP:
|
|
||||||
adapter->wol = IXGBE_WUFC_MAG;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case IXGBE_DEV_ID_82599_COMBO_BACKPLANE:
|
|
||||||
/* All except this subdevice support WOL */
|
|
||||||
if (pdev->subsystem_device != IXGBE_SUBDEV_ID_82599_KX4_KR_MEZZ)
|
|
||||||
adapter->wol = IXGBE_WUFC_MAG;
|
|
||||||
break;
|
|
||||||
case IXGBE_DEV_ID_82599_KX4:
|
|
||||||
adapter->wol = IXGBE_WUFC_MAG;
|
|
||||||
break;
|
|
||||||
case IXGBE_DEV_ID_X540T:
|
|
||||||
/* Check eeprom to see if it is enabled */
|
|
||||||
hw->eeprom.ops.read(hw, 0x2c, &adapter->eeprom_cap);
|
hw->eeprom.ops.read(hw, 0x2c, &adapter->eeprom_cap);
|
||||||
wol_cap = adapter->eeprom_cap & IXGBE_DEVICE_CAPS_WOL_MASK;
|
if (ixgbe_wol_supported(adapter, pdev->device, pdev->subsystem_device))
|
||||||
|
|
||||||
if ((wol_cap == IXGBE_DEVICE_CAPS_WOL_PORT0_1) ||
|
|
||||||
((wol_cap == IXGBE_DEVICE_CAPS_WOL_PORT0) &&
|
|
||||||
(hw->bus.func == 0)))
|
|
||||||
adapter->wol = IXGBE_WUFC_MAG;
|
adapter->wol = IXGBE_WUFC_MAG;
|
||||||
break;
|
|
||||||
}
|
|
||||||
device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
|
device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
|
||||||
|
|
||||||
/* save off EEPROM version number */
|
/* save off EEPROM version number */
|
||||||
|
|
Loading…
Reference in New Issue