Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
a319726a
Commit
a319726a
authored
Apr 28, 2012
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
parents
62ecc379
8e2813f5
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
143 additions
and
125 deletions
+143
-125
drivers/net/ethernet/intel/e1000e/80003es2lan.c
drivers/net/ethernet/intel/e1000e/80003es2lan.c
+8
-0
drivers/net/ethernet/intel/e1000e/82571.c
drivers/net/ethernet/intel/e1000e/82571.c
+2
-1
drivers/net/ethernet/intel/e1000e/e1000.h
drivers/net/ethernet/intel/e1000e/e1000.h
+37
-0
drivers/net/ethernet/intel/e1000e/hw.h
drivers/net/ethernet/intel/e1000e/hw.h
+0
-10
drivers/net/ethernet/intel/e1000e/ich8lan.c
drivers/net/ethernet/intel/e1000e/ich8lan.c
+11
-0
drivers/net/ethernet/intel/e1000e/netdev.c
drivers/net/ethernet/intel/e1000e/netdev.c
+16
-35
drivers/net/ethernet/intel/igb/igb_main.c
drivers/net/ethernet/intel/igb/igb_main.c
+7
-0
drivers/net/ethernet/intel/ixgbe/ixgbe.h
drivers/net/ethernet/intel/ixgbe/ixgbe.h
+2
-0
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
+5
-46
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+55
-33
No files found.
drivers/net/ethernet/intel/e1000e/80003es2lan.c
View file @
a319726a
...
@@ -764,6 +764,7 @@ static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw)
...
@@ -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)
...
@@ -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. */
...
...
drivers/net/ethernet/intel/e1000e/82571.c
View file @
a319726a
...
@@ -2062,7 +2062,8 @@ const struct e1000_info e1000_82574_info = {
...
@@ -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
,
...
...
drivers/net/ethernet/intel/e1000e/e1000.h
View file @
a319726a
...
@@ -735,9 +735,46 @@ static inline u32 __er32(struct e1000_hw *hw, unsigned long reg)
...
@@ -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_ */
drivers/net/ethernet/intel/e1000e/hw.h
View file @
a319726a
...
@@ -36,16 +36,6 @@ struct e1000_adapter;
...
@@ -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 */
...
...
drivers/net/ethernet/intel/e1000e/ich8lan.c
View file @
a319726a
...
@@ -135,6 +135,7 @@
...
@@ -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)
...
@@ -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
;
...
...
drivers/net/ethernet/intel/e1000e/netdev.c
View file @
a319726a
...
@@ -538,43 +538,15 @@ static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
...
@@ -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
);
writel
(
i
,
rx_ring
->
tail
);
if
(
e1000e_update_tail_wa
(
hw
,
rx_ring
->
tail
,
i
))
{
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)
...
@@ -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,7 +1621,10 @@ static void e1000_clean_rx_ring(struct e1000_ring *rx_ring)
...
@@ -1646,7 +1621,10 @@ 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
);
writel
(
0
,
rx_ring
->
tail
);
if
(
rx_ring
->
adapter
->
flags2
&
FLAG2_PCIM2PCI_ARBITER_WA
)
e1000e_update_rdt_wa
(
rx_ring
,
0
);
else
writel
(
0
,
rx_ring
->
tail
);
}
}
static
void
e1000e_downshift_workaround
(
struct
work_struct
*
work
)
static
void
e1000e_downshift_workaround
(
struct
work_struct
*
work
)
...
@@ -2319,7 +2297,10 @@ static void e1000_clean_tx_ring(struct e1000_ring *tx_ring)
...
@@ -2319,7 +2297,10 @@ 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
);
writel
(
0
,
tx_ring
->
tail
);
if
(
tx_ring
->
adapter
->
flags2
&
FLAG2_PCIM2PCI_ARBITER_WA
)
e1000e_update_tdt_wa
(
tx_ring
,
0
);
else
writel
(
0
,
tx_ring
->
tail
);
}
}
/**
/**
...
...
drivers/net/ethernet/intel/igb/igb_main.c
View file @
a319726a
...
@@ -1715,6 +1715,13 @@ void igb_reset(struct igb_adapter *adapter)
...
@@ -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
);
...
...
drivers/net/ethernet/intel/ixgbe/ixgbe.h
View file @
a319726a
...
@@ -600,6 +600,8 @@ extern void ixgbe_disable_rx_queue(struct ixgbe_adapter *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
*
,
...
...
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
View file @
a319726a
...
@@ -1969,53 +1969,12 @@ static int ixgbe_wol_exclusion(struct ixgbe_adapter *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 */
switch
(
hw
->
device_id
)
{
case
IXGBE_DEV_ID_82599_SFP
:
/* Only these subdevices could supports WOL */
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 not supported for all devices
*/
wol
->
supported
=
0
;
if
(
!
ixgbe_wol_supported
(
adapter
,
hw
->
device_id
,
break
;
hw
->
subsystem_device_id
))
{
default:
retval
=
1
;
wol
->
supported
=
0
;
wol
->
supported
=
0
;
}
}
...
...
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
View file @
a319726a
...
@@ -6598,7 +6598,7 @@ static netdev_features_t ixgbe_fix_features(struct net_device *netdev,
...
@@ -6598,7 +6598,7 @@ static netdev_features_t ixgbe_fix_features(struct net_device *netdev,
/* Turn off LRO if not RSC capable */
/* Turn off LRO if not RSC capable */
if
(
!
(
adapter
->
flags2
&
IXGBE_FLAG2_RSC_CAPABLE
))
if
(
!
(
adapter
->
flags2
&
IXGBE_FLAG2_RSC_CAPABLE
))
features
&=
~
NETIF_F_LRO
;
features
&=
~
NETIF_F_LRO
;
return
features
;
return
features
;
}
}
...
@@ -6785,6 +6785,57 @@ static void __devinit ixgbe_probe_vf(struct ixgbe_adapter *adapter,
...
@@ -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,
...
@@ -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,
...
@@ -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
)
{
hw
->
eeprom
.
ops
.
read
(
hw
,
0x2c
,
&
adapter
->
eeprom_cap
);
case
IXGBE_DEV_ID_82599_SFP
:
if
(
ixgbe_wol_supported
(
adapter
,
pdev
->
device
,
pdev
->
subsystem_device
))
/* 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
;
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
);
wol_cap
=
adapter
->
eeprom_cap
&
IXGBE_DEVICE_CAPS_WOL_MASK
;
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
;
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 */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment