Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
a319726a
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
a319726a
编写于
4月 28, 2012
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of
git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
上级
62ecc379
8e2813f5
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
143 addition
and
125 deletion
+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
未找到文件。
drivers/net/ethernet/intel/e1000e/80003es2lan.c
浏览文件 @
a319726a
...
...
@@ -764,6 +764,7 @@ static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw)
{
u32
ctrl
;
s32
ret_val
;
u16
kum_reg_data
;
/*
* 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
);
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
);
if
(
ret_val
)
/* We don't want to continue accessing MAC registers. */
...
...
drivers/net/ethernet/intel/e1000e/82571.c
浏览文件 @
a319726a
...
...
@@ -2062,7 +2062,8 @@ const struct e1000_info e1000_82574_info = {
|
FLAG_HAS_CTRLEXT_ON_LOAD
,
.
flags2
=
FLAG2_CHECK_PHY_HANG
|
FLAG2_DISABLE_ASPM_L0S
|
FLAG2_NO_DISABLE_RX
,
|
FLAG2_NO_DISABLE_RX
|
FLAG2_DMA_BURST
,
.
pba
=
32
,
.
max_hw_frame_size
=
DEFAULT_JUMBO
,
.
get_variants
=
e1000_get_variants_82571
,
...
...
drivers/net/ethernet/intel/e1000e/e1000.h
浏览文件 @
a319726a
...
...
@@ -735,9 +735,46 @@ static inline u32 __er32(struct e1000_hw *hw, unsigned long 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
)
{
if
(
hw
->
adapter
->
flags2
&
FLAG2_PCIM2PCI_ARBITER_WA
)
__ew32_prepare
(
hw
);
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_ */
drivers/net/ethernet/intel/e1000e/hw.h
浏览文件 @
a319726a
...
...
@@ -36,16 +36,6 @@ struct e1000_adapter;
#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
{
E1000_CTRL
=
0x00000
,
/* Device Control - RW */
E1000_STATUS
=
0x00008
,
/* Device Status - RO */
...
...
drivers/net/ethernet/intel/e1000e/ich8lan.c
浏览文件 @
a319726a
...
...
@@ -135,6 +135,7 @@
/* PHY Power Management Control */
#define HV_PM_CTRL PHY_REG(770, 17)
#define HV_PM_CTRL_PLL_STOP_IN_K1_GIGA 0x100
/* PHY Low Power Idle Control */
#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
;
if
(
status_reg
&
HV_M_STATUS_SPEED_1000
)
{
u16
pm_phy_reg
;
mac_reg
|=
E1000_FEXTNVM4_BEACON_DURATION_8USEC
;
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
{
mac_reg
|=
E1000_FEXTNVM4_BEACON_DURATION_16USEC
;
phy_reg
|=
I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT
;
...
...
drivers/net/ethernet/intel/e1000e/netdev.c
浏览文件 @
a319726a
...
...
@@ -538,43 +538,15 @@ static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
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
)
{
struct
e1000_adapter
*
adapter
=
rx_ring
->
adapter
;
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
);
ew32
(
RCTL
,
rctl
&
~
E1000_RCTL_EN
);
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_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
);
ew32
(
TCTL
,
tctl
&
~
E1000_TCTL_EN
);
e_err
(
"ME firmware caused invalid TDT - resetting
\n
"
);
...
...
@@ -1646,7 +1621,10 @@ static void e1000_clean_rx_ring(struct e1000_ring *rx_ring)
adapter
->
flags2
&=
~
FLAG2_IS_DISCARDING
;
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
)
...
...
@@ -2319,7 +2297,10 @@ static void e1000_clean_tx_ring(struct e1000_ring *tx_ring)
tx_ring
->
next_to_clean
=
0
;
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
浏览文件 @
a319726a
...
...
@@ -1715,6 +1715,13 @@ void igb_reset(struct igb_adapter *adapter)
if
(
hw
->
mac
.
ops
.
init_hw
(
hw
))
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
);
if
(
!
netif_running
(
adapter
->
netdev
))
igb_power_down_link
(
adapter
);
...
...
drivers/net/ethernet/intel/ixgbe/ixgbe.h
浏览文件 @
a319726a
...
...
@@ -600,6 +600,8 @@ extern void ixgbe_disable_rx_queue(struct ixgbe_adapter *adapter,
struct
ixgbe_ring
*
);
extern
void
ixgbe_update_stats
(
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
netdev_tx_t
ixgbe_xmit_frame_ring
(
struct
sk_buff
*
,
struct
ixgbe_adapter
*
,
...
...
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
浏览文件 @
a319726a
...
...
@@ -1969,53 +1969,12 @@ static int ixgbe_wol_exclusion(struct ixgbe_adapter *adapter,
struct
ethtool_wolinfo
*
wol
)
{
struct
ixgbe_hw
*
hw
=
&
adapter
->
hw
;
int
retval
=
1
;
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
;
}
int
retval
=
0
;
/* All others not supported
*/
wol
->
supported
=
0
;
break
;
default:
/* WOL not supported for all devices
*/
if
(
!
ixgbe_wol_supported
(
adapter
,
hw
->
device_id
,
hw
->
subsystem_device_id
))
{
retval
=
1
;
wol
->
supported
=
0
;
}
...
...
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
浏览文件 @
a319726a
...
...
@@ -6598,7 +6598,7 @@ static netdev_features_t ixgbe_fix_features(struct net_device *netdev,
/* Turn off LRO if not RSC capable */
if
(
!
(
adapter
->
flags2
&
IXGBE_FLAG2_RSC_CAPABLE
))
features
&=
~
NETIF_F_LRO
;
return
features
;
}
...
...
@@ -6785,6 +6785,57 @@ static void __devinit ixgbe_probe_vf(struct ixgbe_adapter *adapter,
#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
* @pdev: PCI device information struct
...
...
@@ -6811,7 +6862,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
u16
device_caps
;
#endif
u32
eec
;
u16
wol_cap
;
/* Catch broken hardware that put the wrong VF device ID in
* the PCIe SR-IOV capability.
...
...
@@ -7075,40 +7125,12 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
netdev
->
features
&=
~
NETIF_F_RXHASH
;
}
/* WOL not supported for all
but the following
*/
/* WOL not supported for all
devices
*/
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
:
hw
->
eeprom
.
ops
.
read
(
hw
,
0x2c
,
&
adapter
->
eeprom_cap
);
if
(
ixgbe_wol_supported
(
adapter
,
pdev
->
device
,
pdev
->
subsystem_device
))
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
);
/* save off EEPROM version number */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录