Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
a1082bfe
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
a1082bfe
编写于
11月 17, 2010
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/jkirsher/net-next-2.6
上级
9d1e5e40
147b2c8c
变更
43
展开全部
隐藏空白更改
内联
并排
Showing
43 changed file
with
2573 addition
and
1266 deletion
+2573
-1266
drivers/net/e1000e/82571.c
drivers/net/e1000e/82571.c
+123
-20
drivers/net/e1000e/defines.h
drivers/net/e1000e/defines.h
+1
-0
drivers/net/e1000e/netdev.c
drivers/net/e1000e/netdev.c
+45
-4
drivers/net/igbvf/Makefile
drivers/net/igbvf/Makefile
+1
-1
drivers/net/igbvf/defines.h
drivers/net/igbvf/defines.h
+1
-1
drivers/net/igbvf/ethtool.c
drivers/net/igbvf/ethtool.c
+1
-1
drivers/net/igbvf/igbvf.h
drivers/net/igbvf/igbvf.h
+1
-2
drivers/net/igbvf/mbx.c
drivers/net/igbvf/mbx.c
+1
-1
drivers/net/igbvf/mbx.h
drivers/net/igbvf/mbx.h
+1
-1
drivers/net/igbvf/netdev.c
drivers/net/igbvf/netdev.c
+4
-7
drivers/net/igbvf/regs.h
drivers/net/igbvf/regs.h
+1
-1
drivers/net/igbvf/vf.c
drivers/net/igbvf/vf.c
+1
-1
drivers/net/igbvf/vf.h
drivers/net/igbvf/vf.h
+1
-1
drivers/net/ixgbe/Makefile
drivers/net/ixgbe/Makefile
+1
-1
drivers/net/ixgbe/ixgbe.h
drivers/net/ixgbe/ixgbe.h
+86
-36
drivers/net/ixgbe/ixgbe_82598.c
drivers/net/ixgbe/ixgbe_82598.c
+14
-44
drivers/net/ixgbe/ixgbe_82599.c
drivers/net/ixgbe/ixgbe_82599.c
+11
-83
drivers/net/ixgbe/ixgbe_common.c
drivers/net/ixgbe/ixgbe_common.c
+61
-37
drivers/net/ixgbe/ixgbe_common.h
drivers/net/ixgbe/ixgbe_common.h
+4
-1
drivers/net/ixgbe/ixgbe_dcb.c
drivers/net/ixgbe/ixgbe_dcb.c
+13
-4
drivers/net/ixgbe/ixgbe_dcb.h
drivers/net/ixgbe/ixgbe_dcb.h
+2
-1
drivers/net/ixgbe/ixgbe_dcb_82598.c
drivers/net/ixgbe/ixgbe_dcb_82598.c
+4
-8
drivers/net/ixgbe/ixgbe_dcb_82599.c
drivers/net/ixgbe/ixgbe_dcb_82599.c
+5
-7
drivers/net/ixgbe/ixgbe_dcb_nl.c
drivers/net/ixgbe/ixgbe_dcb_nl.c
+43
-12
drivers/net/ixgbe/ixgbe_ethtool.c
drivers/net/ixgbe/ixgbe_ethtool.c
+163
-92
drivers/net/ixgbe/ixgbe_fcoe.c
drivers/net/ixgbe/ixgbe_fcoe.c
+14
-1
drivers/net/ixgbe/ixgbe_main.c
drivers/net/ixgbe/ixgbe_main.c
+1130
-865
drivers/net/ixgbe/ixgbe_mbx.c
drivers/net/ixgbe/ixgbe_mbx.c
+25
-15
drivers/net/ixgbe/ixgbe_mbx.h
drivers/net/ixgbe/ixgbe_mbx.h
+1
-1
drivers/net/ixgbe/ixgbe_phy.c
drivers/net/ixgbe/ixgbe_phy.c
+52
-0
drivers/net/ixgbe/ixgbe_phy.h
drivers/net/ixgbe/ixgbe_phy.h
+5
-0
drivers/net/ixgbe/ixgbe_sriov.c
drivers/net/ixgbe/ixgbe_sriov.c
+1
-2
drivers/net/ixgbe/ixgbe_type.h
drivers/net/ixgbe/ixgbe_type.h
+20
-0
drivers/net/ixgbe/ixgbe_x540.c
drivers/net/ixgbe/ixgbe_x540.c
+722
-0
drivers/net/ixgbevf/Makefile
drivers/net/ixgbevf/Makefile
+1
-1
drivers/net/ixgbevf/defines.h
drivers/net/ixgbevf/defines.h
+1
-1
drivers/net/ixgbevf/ixgbevf.h
drivers/net/ixgbevf/ixgbevf.h
+1
-1
drivers/net/ixgbevf/ixgbevf_main.c
drivers/net/ixgbevf/ixgbevf_main.c
+6
-7
drivers/net/ixgbevf/mbx.c
drivers/net/ixgbevf/mbx.c
+1
-1
drivers/net/ixgbevf/mbx.h
drivers/net/ixgbevf/mbx.h
+1
-1
drivers/net/ixgbevf/regs.h
drivers/net/ixgbevf/regs.h
+1
-1
drivers/net/ixgbevf/vf.c
drivers/net/ixgbevf/vf.c
+1
-1
drivers/net/ixgbevf/vf.h
drivers/net/ixgbevf/vf.h
+1
-1
未找到文件。
drivers/net/e1000e/82571.c
浏览文件 @
a1082bfe
...
...
@@ -74,6 +74,9 @@ static bool e1000_check_mng_mode_82574(struct e1000_hw *hw);
static
s32
e1000_led_on_82574
(
struct
e1000_hw
*
hw
);
static
void
e1000_put_hw_semaphore_82571
(
struct
e1000_hw
*
hw
);
static
void
e1000_power_down_phy_copper_82571
(
struct
e1000_hw
*
hw
);
static
void
e1000_put_hw_semaphore_82573
(
struct
e1000_hw
*
hw
);
static
s32
e1000_get_hw_semaphore_82574
(
struct
e1000_hw
*
hw
);
static
void
e1000_put_hw_semaphore_82574
(
struct
e1000_hw
*
hw
);
/**
* e1000_init_phy_params_82571 - Init PHY func ptrs.
...
...
@@ -107,6 +110,8 @@ static s32 e1000_init_phy_params_82571(struct e1000_hw *hw)
case
e1000_82574
:
case
e1000_82583
:
phy
->
type
=
e1000_phy_bm
;
phy
->
ops
.
acquire
=
e1000_get_hw_semaphore_82574
;
phy
->
ops
.
release
=
e1000_put_hw_semaphore_82574
;
break
;
default:
return
-
E1000_ERR_PHY
;
...
...
@@ -200,6 +205,17 @@ static s32 e1000_init_nvm_params_82571(struct e1000_hw *hw)
break
;
}
/* Function Pointers */
switch
(
hw
->
mac
.
type
)
{
case
e1000_82574
:
case
e1000_82583
:
nvm
->
ops
.
acquire
=
e1000_get_hw_semaphore_82574
;
nvm
->
ops
.
release
=
e1000_put_hw_semaphore_82574
;
break
;
default:
break
;
}
return
0
;
}
...
...
@@ -542,6 +558,94 @@ static void e1000_put_hw_semaphore_82571(struct e1000_hw *hw)
swsm
&=
~
(
E1000_SWSM_SMBI
|
E1000_SWSM_SWESMBI
);
ew32
(
SWSM
,
swsm
);
}
/**
* e1000_get_hw_semaphore_82573 - Acquire hardware semaphore
* @hw: pointer to the HW structure
*
* Acquire the HW semaphore during reset.
*
**/
static
s32
e1000_get_hw_semaphore_82573
(
struct
e1000_hw
*
hw
)
{
u32
extcnf_ctrl
;
s32
ret_val
=
0
;
s32
i
=
0
;
extcnf_ctrl
=
er32
(
EXTCNF_CTRL
);
extcnf_ctrl
|=
E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP
;
do
{
ew32
(
EXTCNF_CTRL
,
extcnf_ctrl
);
extcnf_ctrl
=
er32
(
EXTCNF_CTRL
);
if
(
extcnf_ctrl
&
E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP
)
break
;
extcnf_ctrl
|=
E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP
;
msleep
(
2
);
i
++
;
}
while
(
i
<
MDIO_OWNERSHIP_TIMEOUT
);
if
(
i
==
MDIO_OWNERSHIP_TIMEOUT
)
{
/* Release semaphores */
e1000_put_hw_semaphore_82573
(
hw
);
e_dbg
(
"Driver can't access the PHY
\n
"
);
ret_val
=
-
E1000_ERR_PHY
;
goto
out
;
}
out:
return
ret_val
;
}
/**
* e1000_put_hw_semaphore_82573 - Release hardware semaphore
* @hw: pointer to the HW structure
*
* Release hardware semaphore used during reset.
*
**/
static
void
e1000_put_hw_semaphore_82573
(
struct
e1000_hw
*
hw
)
{
u32
extcnf_ctrl
;
extcnf_ctrl
=
er32
(
EXTCNF_CTRL
);
extcnf_ctrl
&=
~
E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP
;
ew32
(
EXTCNF_CTRL
,
extcnf_ctrl
);
}
static
DEFINE_MUTEX
(
swflag_mutex
);
/**
* e1000_get_hw_semaphore_82574 - Acquire hardware semaphore
* @hw: pointer to the HW structure
*
* Acquire the HW semaphore to access the PHY or NVM.
*
**/
static
s32
e1000_get_hw_semaphore_82574
(
struct
e1000_hw
*
hw
)
{
s32
ret_val
;
mutex_lock
(
&
swflag_mutex
);
ret_val
=
e1000_get_hw_semaphore_82573
(
hw
);
if
(
ret_val
)
mutex_unlock
(
&
swflag_mutex
);
return
ret_val
;
}
/**
* e1000_put_hw_semaphore_82574 - Release hardware semaphore
* @hw: pointer to the HW structure
*
* Release hardware semaphore used to access the PHY or NVM
*
**/
static
void
e1000_put_hw_semaphore_82574
(
struct
e1000_hw
*
hw
)
{
e1000_put_hw_semaphore_82573
(
hw
);
mutex_unlock
(
&
swflag_mutex
);
}
/**
* e1000_acquire_nvm_82571 - Request for access to the EEPROM
...
...
@@ -562,8 +666,6 @@ static s32 e1000_acquire_nvm_82571(struct e1000_hw *hw)
switch
(
hw
->
mac
.
type
)
{
case
e1000_82573
:
case
e1000_82574
:
case
e1000_82583
:
break
;
default:
ret_val
=
e1000e_acquire_nvm
(
hw
);
...
...
@@ -853,9 +955,8 @@ static s32 e1000_set_d0_lplu_state_82571(struct e1000_hw *hw, bool active)
**/
static
s32
e1000_reset_hw_82571
(
struct
e1000_hw
*
hw
)
{
u32
ctrl
,
extcnf_ctrl
,
ctrl_ext
,
icr
;
u32
ctrl
,
ctrl_ext
,
icr
;
s32
ret_val
;
u16
i
=
0
;
/*
* Prevent the PCI-E bus from sticking if there is no TLP connection
...
...
@@ -880,33 +981,33 @@ static s32 e1000_reset_hw_82571(struct e1000_hw *hw)
*/
switch
(
hw
->
mac
.
type
)
{
case
e1000_82573
:
ret_val
=
e1000_get_hw_semaphore_82573
(
hw
);
break
;
case
e1000_82574
:
case
e1000_82583
:
extcnf_ctrl
=
er32
(
EXTCNF_CTRL
);
extcnf_ctrl
|=
E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP
;
do
{
ew32
(
EXTCNF_CTRL
,
extcnf_ctrl
);
extcnf_ctrl
=
er32
(
EXTCNF_CTRL
);
if
(
extcnf_ctrl
&
E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP
)
break
;
extcnf_ctrl
|=
E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP
;
msleep
(
2
);
i
++
;
}
while
(
i
<
MDIO_OWNERSHIP_TIMEOUT
);
ret_val
=
e1000_get_hw_semaphore_82574
(
hw
);
break
;
default:
break
;
}
if
(
ret_val
)
e_dbg
(
"Cannot acquire MDIO ownership
\n
"
);
ctrl
=
er32
(
CTRL
);
e_dbg
(
"Issuing a global reset to MAC
\n
"
);
ew32
(
CTRL
,
ctrl
|
E1000_CTRL_RST
);
/* Must release MDIO ownership and mutex after MAC reset. */
switch
(
hw
->
mac
.
type
)
{
case
e1000_82574
:
case
e1000_82583
:
e1000_put_hw_semaphore_82574
(
hw
);
break
;
default:
break
;
}
if
(
hw
->
nvm
.
type
==
e1000_nvm_flash_hw
)
{
udelay
(
10
);
ctrl_ext
=
er32
(
CTRL_EXT
);
...
...
@@ -1431,8 +1532,10 @@ static s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw)
* auto-negotiation in the TXCW register and disable
* forced link in the Device Control register in an
* attempt to auto-negotiate with our link partner.
* If the partner code word is null, stop forcing
* and restart auto negotiation.
*/
if
(
rxcw
&
E1000_RXCW_C
)
{
if
(
(
rxcw
&
E1000_RXCW_C
)
||
!
(
rxcw
&
E1000_RXCW_CW
))
{
/* Enable autoneg, and unforce link up */
ew32
(
TXCW
,
mac
->
txcw
);
ew32
(
CTRL
,
(
ctrl
&
~
E1000_CTRL_SLU
));
...
...
drivers/net/e1000e/defines.h
浏览文件 @
a1082bfe
...
...
@@ -516,6 +516,7 @@
#define E1000_TXCW_ANE 0x80000000
/* Auto-neg enable */
/* Receive Configuration Word */
#define E1000_RXCW_CW 0x0000ffff
/* RxConfigWord mask */
#define E1000_RXCW_IV 0x08000000
/* Receive config invalid */
#define E1000_RXCW_C 0x20000000
/* Receive config */
#define E1000_RXCW_SYNCH 0x40000000
/* Receive config synch */
...
...
drivers/net/e1000e/netdev.c
浏览文件 @
a1082bfe
...
...
@@ -5465,6 +5465,36 @@ static void e1000_shutdown(struct pci_dev *pdev)
}
#ifdef CONFIG_NET_POLL_CONTROLLER
static
irqreturn_t
e1000_intr_msix
(
int
irq
,
void
*
data
)
{
struct
net_device
*
netdev
=
data
;
struct
e1000_adapter
*
adapter
=
netdev_priv
(
netdev
);
int
vector
,
msix_irq
;
if
(
adapter
->
msix_entries
)
{
vector
=
0
;
msix_irq
=
adapter
->
msix_entries
[
vector
].
vector
;
disable_irq
(
msix_irq
);
e1000_intr_msix_rx
(
msix_irq
,
netdev
);
enable_irq
(
msix_irq
);
vector
++
;
msix_irq
=
adapter
->
msix_entries
[
vector
].
vector
;
disable_irq
(
msix_irq
);
e1000_intr_msix_tx
(
msix_irq
,
netdev
);
enable_irq
(
msix_irq
);
vector
++
;
msix_irq
=
adapter
->
msix_entries
[
vector
].
vector
;
disable_irq
(
msix_irq
);
e1000_msix_other
(
msix_irq
,
netdev
);
enable_irq
(
msix_irq
);
}
return
IRQ_HANDLED
;
}
/*
* Polling 'interrupt' - used by things like netconsole to send skbs
* without having to re-enable interrupts. It's not called while
...
...
@@ -5474,10 +5504,21 @@ static void e1000_netpoll(struct net_device *netdev)
{
struct
e1000_adapter
*
adapter
=
netdev_priv
(
netdev
);
disable_irq
(
adapter
->
pdev
->
irq
);
e1000_intr
(
adapter
->
pdev
->
irq
,
netdev
);
enable_irq
(
adapter
->
pdev
->
irq
);
switch
(
adapter
->
int_mode
)
{
case
E1000E_INT_MODE_MSIX
:
e1000_intr_msix
(
adapter
->
pdev
->
irq
,
netdev
);
break
;
case
E1000E_INT_MODE_MSI
:
disable_irq
(
adapter
->
pdev
->
irq
);
e1000_intr_msi
(
adapter
->
pdev
->
irq
,
netdev
);
enable_irq
(
adapter
->
pdev
->
irq
);
break
;
default:
/* E1000E_INT_MODE_LEGACY */
disable_irq
(
adapter
->
pdev
->
irq
);
e1000_intr
(
adapter
->
pdev
->
irq
,
netdev
);
enable_irq
(
adapter
->
pdev
->
irq
);
break
;
}
}
#endif
...
...
drivers/net/igbvf/Makefile
浏览文件 @
a1082bfe
################################################################################
#
# Intel(R) 82576 Virtual Function Linux driver
# Copyright(c) 2009 Intel Corporation.
# Copyright(c) 2009
- 2010
Intel Corporation.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms and conditions of the GNU General Public License,
...
...
drivers/net/igbvf/defines.h
浏览文件 @
a1082bfe
/*******************************************************************************
Intel(R) 82576 Virtual Function Linux driver
Copyright(c) 1999 - 20
09
Intel Corporation.
Copyright(c) 1999 - 20
10
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
drivers/net/igbvf/ethtool.c
浏览文件 @
a1082bfe
/*******************************************************************************
Intel(R) 82576 Virtual Function Linux driver
Copyright(c) 2009 Intel Corporation.
Copyright(c) 2009
- 2010
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
drivers/net/igbvf/igbvf.h
浏览文件 @
a1082bfe
/*******************************************************************************
Intel(R) 82576 Virtual Function Linux driver
Copyright(c) 2009 Intel Corporation.
Copyright(c) 2009
- 2010
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
@@ -126,7 +126,6 @@ struct igbvf_buffer {
unsigned
int
page_offset
;
};
};
struct
page
*
page
;
};
union
igbvf_desc
{
...
...
drivers/net/igbvf/mbx.c
浏览文件 @
a1082bfe
/*******************************************************************************
Intel(R) 82576 Virtual Function Linux driver
Copyright(c) 2009 Intel Corporation.
Copyright(c) 2009
- 2010
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
drivers/net/igbvf/mbx.h
浏览文件 @
a1082bfe
/*******************************************************************************
Intel(R) 82576 Virtual Function Linux driver
Copyright(c) 1999 - 20
09
Intel Corporation.
Copyright(c) 1999 - 20
10
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
drivers/net/igbvf/netdev.c
浏览文件 @
a1082bfe
/*******************************************************************************
Intel(R) 82576 Virtual Function Linux driver
Copyright(c) 2009 Intel Corporation.
Copyright(c) 2009
- 2010
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
@@ -44,12 +44,13 @@
#include "igbvf.h"
#define DRV_VERSION "1.0.
0
-k0"
#define DRV_VERSION "1.0.
8
-k0"
char
igbvf_driver_name
[]
=
"igbvf"
;
const
char
igbvf_driver_version
[]
=
DRV_VERSION
;
static
const
char
igbvf_driver_string
[]
=
"Intel(R) Virtual Function Network Driver"
;
static
const
char
igbvf_copyright
[]
=
"Copyright (c) 2009 Intel Corporation."
;
static
const
char
igbvf_copyright
[]
=
"Copyright (c) 2009 - 2010 Intel Corporation."
;
static
int
igbvf_poll
(
struct
napi_struct
*
napi
,
int
budget
);
static
void
igbvf_reset
(
struct
igbvf_adapter
*
);
...
...
@@ -1851,8 +1852,6 @@ static void igbvf_watchdog_task(struct work_struct *work)
if
(
link
)
{
if
(
!
netif_carrier_ok
(
netdev
))
{
bool
txb2b
=
1
;
mac
->
ops
.
get_link_up_info
(
&
adapter
->
hw
,
&
adapter
->
link_speed
,
&
adapter
->
link_duplex
);
...
...
@@ -1862,11 +1861,9 @@ static void igbvf_watchdog_task(struct work_struct *work)
adapter
->
tx_timeout_factor
=
1
;
switch
(
adapter
->
link_speed
)
{
case
SPEED_10
:
txb2b
=
0
;
adapter
->
tx_timeout_factor
=
16
;
break
;
case
SPEED_100
:
txb2b
=
0
;
/* maybe add some timeout factor ? */
break
;
}
...
...
drivers/net/igbvf/regs.h
浏览文件 @
a1082bfe
/*******************************************************************************
Intel(R) 82576 Virtual Function Linux driver
Copyright(c) 2009 Intel Corporation.
Copyright(c) 2009
- 2010
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
drivers/net/igbvf/vf.c
浏览文件 @
a1082bfe
/*******************************************************************************
Intel(R) 82576 Virtual Function Linux driver
Copyright(c) 2009 Intel Corporation.
Copyright(c) 2009
- 2010
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
drivers/net/igbvf/vf.h
浏览文件 @
a1082bfe
/*******************************************************************************
Intel(R) 82576 Virtual Function Linux driver
Copyright(c) 2009 Intel Corporation.
Copyright(c) 2009
- 2010
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
drivers/net/ixgbe/Makefile
浏览文件 @
a1082bfe
...
...
@@ -34,7 +34,7 @@ obj-$(CONFIG_IXGBE) += ixgbe.o
ixgbe-objs
:=
ixgbe_main.o ixgbe_common.o ixgbe_ethtool.o
\
ixgbe_82599.o ixgbe_82598.o ixgbe_phy.o ixgbe_sriov.o
\
ixgbe_mbx.o
ixgbe_mbx.o
ixgbe_x540.o
ixgbe-$(CONFIG_IXGBE_DCB)
+=
ixgbe_dcb.o ixgbe_dcb_82598.o
\
ixgbe_dcb_82599.o ixgbe_dcb_nl.o
...
...
drivers/net/ixgbe/ixgbe.h
浏览文件 @
a1082bfe
...
...
@@ -61,10 +61,8 @@
#define IXGBE_MIN_RXD 64
/* flow control */
#define IXGBE_DEFAULT_FCRTL 0x10000
#define IXGBE_MIN_FCRTL 0x40
#define IXGBE_MAX_FCRTL 0x7FF80
#define IXGBE_DEFAULT_FCRTH 0x20000
#define IXGBE_MIN_FCRTH 0x600
#define IXGBE_MAX_FCRTH 0x7FFF0
#define IXGBE_DEFAULT_FCPAUSE 0xFFFF
...
...
@@ -130,7 +128,9 @@ struct ixgbe_tx_buffer {
unsigned
long
time_stamp
;
u16
length
;
u16
next_to_watch
;
u16
mapped_as_page
;
unsigned
int
bytecount
;
u16
gso_segs
;
u8
mapped_as_page
;
};
struct
ixgbe_rx_buffer
{
...
...
@@ -146,12 +146,56 @@ struct ixgbe_queue_stats {
u64
bytes
;
};
struct
ixgbe_tx_queue_stats
{
u64
restart_queue
;
u64
tx_busy
;
u64
completed
;
u64
tx_done_old
;
};
struct
ixgbe_rx_queue_stats
{
u64
rsc_count
;
u64
rsc_flush
;
u64
non_eop_descs
;
u64
alloc_rx_page_failed
;
u64
alloc_rx_buff_failed
;
};
enum
ixbge_ring_state_t
{
__IXGBE_TX_FDIR_INIT_DONE
,
__IXGBE_TX_DETECT_HANG
,
__IXGBE_HANG_CHECK_ARMED
,
__IXGBE_RX_PS_ENABLED
,
__IXGBE_RX_RSC_ENABLED
,
};
#define ring_is_ps_enabled(ring) \
test_bit(__IXGBE_RX_PS_ENABLED, &(ring)->state)
#define set_ring_ps_enabled(ring) \
set_bit(__IXGBE_RX_PS_ENABLED, &(ring)->state)
#define clear_ring_ps_enabled(ring) \
clear_bit(__IXGBE_RX_PS_ENABLED, &(ring)->state)
#define check_for_tx_hang(ring) \
test_bit(__IXGBE_TX_DETECT_HANG, &(ring)->state)
#define set_check_for_tx_hang(ring) \
set_bit(__IXGBE_TX_DETECT_HANG, &(ring)->state)
#define clear_check_for_tx_hang(ring) \
clear_bit(__IXGBE_TX_DETECT_HANG, &(ring)->state)
#define ring_is_rsc_enabled(ring) \
test_bit(__IXGBE_RX_RSC_ENABLED, &(ring)->state)
#define set_ring_rsc_enabled(ring) \
set_bit(__IXGBE_RX_RSC_ENABLED, &(ring)->state)
#define clear_ring_rsc_enabled(ring) \
clear_bit(__IXGBE_RX_RSC_ENABLED, &(ring)->state)
struct
ixgbe_ring
{
void
*
desc
;
/* descriptor ring memory */
struct
device
*
dev
;
/* device for DMA mapping */
struct
net_device
*
netdev
;
/* netdev ring belongs to */
union
{
struct
ixgbe_tx_buffer
*
tx_buffer_info
;
struct
ixgbe_rx_buffer
*
rx_buffer_info
;
};
unsigned
long
state
;
u8
atr_sample_rate
;
u8
atr_count
;
u16
count
;
/* amount of descriptors */
...
...
@@ -160,38 +204,30 @@ struct ixgbe_ring {
u16
next_to_clean
;
u8
queue_index
;
/* needed for multiqueue queue management */
#define IXGBE_RING_RX_PS_ENABLED (u8)(1)
u8
flags
;
/* per ring feature flags */
u16
head
;
u16
tail
;
unsigned
int
total_bytes
;
unsigned
int
total_packets
;
#ifdef CONFIG_IXGBE_DCA
/* cpu for tx queue */
int
cpu
;
#endif
u16
work_limit
;
/* max work per interrupt */
u16
reg_idx
;
/* holds the special value that gets
u8
reg_idx
;
/* holds the special value that gets
* the hardware register offset
* associated with this ring, which is
* different for DCB and RSS modes
*/
u16
work_limit
;
/* max work per interrupt */
u8
__iomem
*
tail
;
unsigned
int
total_bytes
;
unsigned
int
total_packets
;
struct
ixgbe_queue_stats
stats
;
struct
u64_stats_sync
syncp
;
union
{
struct
ixgbe_tx_queue_stats
tx_stats
;
struct
ixgbe_rx_queue_stats
rx_stats
;
};
int
numa_node
;
unsigned
long
reinit_state
;
u64
rsc_count
;
/* stat for coalesced packets */
u64
rsc_flush
;
/* stats for flushed packets */
u32
restart_queue
;
/* track tx queue restarts */
u32
non_eop_descs
;
/* track hardware descriptor chaining */
unsigned
int
size
;
/* length in bytes */
dma_addr_t
dma
;
/* phys. address of descriptor ring */
struct
rcu_head
rcu
;
struct
ixgbe_q_vector
*
q_vector
;
/* back-pointer to host q_vector */
}
____cacheline_internodealigned_in_smp
;
enum
ixgbe_ring_f_enum
{
...
...
@@ -237,6 +273,9 @@ struct ixgbe_q_vector {
unsigned
int
v_idx
;
/* index of q_vector within array, also used for
* finding the bit in EICR and friends that
* represents the vector for this ring */
#ifdef CONFIG_IXGBE_DCA
int
cpu
;
/* CPU for DCA */
#endif
struct
napi_struct
napi
;
DECLARE_BITMAP
(
rxr_idx
,
MAX_RX_QUEUES
);
/* Rx ring indices */
DECLARE_BITMAP
(
txr_idx
,
MAX_TX_QUEUES
);
/* Tx ring indices */
...
...
@@ -246,6 +285,7 @@ struct ixgbe_q_vector {
u8
rx_itr
;
u32
eitr
;
cpumask_var_t
affinity_mask
;
char
name
[
IFNAMSIZ
+
9
];
};
/* Helper macros to switch between ints/sec and what the register uses.
...
...
@@ -294,7 +334,6 @@ struct ixgbe_adapter {
u16
bd_number
;
struct
work_struct
reset_task
;
struct
ixgbe_q_vector
*
q_vector
[
MAX_MSIX_Q_VECTORS
];
char
name
[
MAX_MSIX_COUNT
][
IFNAMSIZ
+
9
];
struct
ixgbe_dcb_config
dcb_cfg
;
struct
ixgbe_dcb_config
temp_dcb_cfg
;
u8
dcb_set_bitmap
;
...
...
@@ -417,6 +456,7 @@ struct ixgbe_adapter {
int
node
;
struct
work_struct
check_overtemp_task
;
u32
interrupt_event
;
char
lsc_int_name
[
IFNAMSIZ
+
9
];
/* SR-IOV */
DECLARE_BITMAP
(
active_vfs
,
IXGBE_MAX_VF_FUNCTIONS
);
...
...
@@ -428,17 +468,25 @@ enum ixbge_state_t {
__IXGBE_TESTING
,
__IXGBE_RESETTING
,
__IXGBE_DOWN
,
__IXGBE_FDIR_INIT_DONE
,
__IXGBE_SFP_MODULE_NOT_FOUND
};
struct
ixgbe_rsc_cb
{
dma_addr_t
dma
;
u16
skb_cnt
;
bool
delay_unmap
;
};
#define IXGBE_RSC_CB(skb) ((struct ixgbe_rsc_cb *)(skb)->cb)
enum
ixgbe_boards
{
board_82598
,
board_82599
,
board_X540
,
};
extern
struct
ixgbe_info
ixgbe_82598_info
;
extern
struct
ixgbe_info
ixgbe_82599_info
;
extern
struct
ixgbe_info
ixgbe_X540_info
;
#ifdef CONFIG_IXGBE_DCB
extern
const
struct
dcbnl_rtnl_ops
dcbnl_ops
;
extern
int
ixgbe_copy_dcb_cfg
(
struct
ixgbe_dcb_config
*
src_dcb_cfg
,
...
...
@@ -454,26 +502,24 @@ extern void ixgbe_down(struct ixgbe_adapter *adapter);
extern
void
ixgbe_reinit_locked
(
struct
ixgbe_adapter
*
adapter
);
extern
void
ixgbe_reset
(
struct
ixgbe_adapter
*
adapter
);
extern
void
ixgbe_set_ethtool_ops
(
struct
net_device
*
netdev
);
extern
int
ixgbe_setup_rx_resources
(
struct
ixgbe_
adapter
*
,
struct
ixgbe_
ring
*
);
extern
int
ixgbe_setup_tx_resources
(
struct
ixgbe_
adapter
*
,
struct
ixgbe_
ring
*
);
extern
void
ixgbe_free_rx_resources
(
struct
ixgbe_
adapter
*
,
struct
ixgbe_
ring
*
);
extern
void
ixgbe_free_tx_resources
(
struct
ixgbe_
adapter
*
,
struct
ixgbe_
ring
*
);
extern
int
ixgbe_setup_rx_resources
(
struct
ixgbe_ring
*
);
extern
int
ixgbe_setup_tx_resources
(
struct
ixgbe_ring
*
);
extern
void
ixgbe_free_rx_resources
(
struct
ixgbe_ring
*
);
extern
void
ixgbe_free_tx_resources
(
struct
ixgbe_ring
*
);
extern
void
ixgbe_configure_rx_ring
(
struct
ixgbe_adapter
*
,
struct
ixgbe_ring
*
);
extern
void
ixgbe_configure_tx_ring
(
struct
ixgbe_adapter
*
,
struct
ixgbe_ring
*
);
extern
void
ixgbe_update_stats
(
struct
ixgbe_adapter
*
adapter
);
extern
int
ixgbe_init_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
*
,
struct
net_device
*
,
struct
ixgbe_adapter
*
,
struct
ixgbe_ring
*
);
extern
void
ixgbe_unmap_and_free_tx_resource
(
struct
ixgbe_
adapter
*
,
extern
void
ixgbe_unmap_and_free_tx_resource
(
struct
ixgbe_
ring
*
,
struct
ixgbe_tx_buffer
*
);
extern
void
ixgbe_alloc_rx_buffers
(
struct
ixgbe_adapter
*
adapter
,
struct
ixgbe_ring
*
rx_ring
,
int
cleaned_count
);
extern
void
ixgbe_alloc_rx_buffers
(
struct
ixgbe_ring
*
,
u16
);
extern
void
ixgbe_write_eitr
(
struct
ixgbe_q_vector
*
);
extern
int
ethtool_ioctl
(
struct
ifreq
*
ifr
);
extern
u8
ixgbe_dcb_txq_to_tc
(
struct
ixgbe_adapter
*
adapter
,
u8
index
);
extern
s32
ixgbe_reinit_fdir_tables_82599
(
struct
ixgbe_hw
*
hw
);
extern
s32
ixgbe_init_fdir_signature_82599
(
struct
ixgbe_hw
*
hw
,
u32
pballoc
);
extern
s32
ixgbe_init_fdir_perfect_82599
(
struct
ixgbe_hw
*
hw
,
u32
pballoc
);
...
...
@@ -498,6 +544,10 @@ extern s32 ixgbe_atr_set_flex_byte_82599(struct ixgbe_atr_input *input,
u16
flex_byte
);
extern
s32
ixgbe_atr_set_l4type_82599
(
struct
ixgbe_atr_input
*
input
,
u8
l4type
);
extern
void
ixgbe_configure_rscctl
(
struct
ixgbe_adapter
*
adapter
,
struct
ixgbe_ring
*
ring
);
extern
void
ixgbe_clear_rscctl
(
struct
ixgbe_adapter
*
adapter
,
struct
ixgbe_ring
*
ring
);
extern
void
ixgbe_set_rx_mode
(
struct
net_device
*
netdev
);
#ifdef IXGBE_FCOE
extern
void
ixgbe_configure_fcoe
(
struct
ixgbe_adapter
*
adapter
);
...
...
drivers/net/ixgbe/ixgbe_82598.c
浏览文件 @
a1082bfe
...
...
@@ -38,9 +38,6 @@
#define IXGBE_82598_MC_TBL_SIZE 128
#define IXGBE_82598_VFT_TBL_SIZE 128
static
s32
ixgbe_get_copper_link_capabilities_82598
(
struct
ixgbe_hw
*
hw
,
ixgbe_link_speed
*
speed
,
bool
*
autoneg
);
static
s32
ixgbe_setup_copper_link_82598
(
struct
ixgbe_hw
*
hw
,
ixgbe_link_speed
speed
,
bool
autoneg
,
...
...
@@ -156,7 +153,7 @@ static s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)
if
(
mac
->
ops
.
get_media_type
(
hw
)
==
ixgbe_media_type_copper
)
{
mac
->
ops
.
setup_link
=
&
ixgbe_setup_copper_link_82598
;
mac
->
ops
.
get_link_capabilities
=
&
ixgbe_get_copper_link_capabilities_82598
;
&
ixgbe_get_copper_link_capabilities_generic
;
}
switch
(
hw
->
phy
.
type
)
{
...
...
@@ -273,37 +270,6 @@ static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,
return
status
;
}
/**
* ixgbe_get_copper_link_capabilities_82598 - Determines link capabilities
* @hw: pointer to hardware structure
* @speed: pointer to link speed
* @autoneg: boolean auto-negotiation value
*
* Determines the link capabilities by reading the AUTOC register.
**/
static
s32
ixgbe_get_copper_link_capabilities_82598
(
struct
ixgbe_hw
*
hw
,
ixgbe_link_speed
*
speed
,
bool
*
autoneg
)
{
s32
status
=
IXGBE_ERR_LINK_SETUP
;
u16
speed_ability
;
*
speed
=
0
;
*
autoneg
=
true
;
status
=
hw
->
phy
.
ops
.
read_reg
(
hw
,
MDIO_SPEED
,
MDIO_MMD_PMAPMD
,
&
speed_ability
);
if
(
status
==
0
)
{
if
(
speed_ability
&
MDIO_SPEED_10G
)
*
speed
|=
IXGBE_LINK_SPEED_10GB_FULL
;
if
(
speed_ability
&
MDIO_PMA_SPEED_1000
)
*
speed
|=
IXGBE_LINK_SPEED_1GB_FULL
;
}
return
status
;
}
/**
* ixgbe_get_media_type_82598 - Determines media type
* @hw: pointer to hardware structure
...
...
@@ -357,6 +323,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num)
u32
fctrl_reg
;
u32
rmcs_reg
;
u32
reg
;
u32
rx_pba_size
;
u32
link_speed
=
0
;
bool
link_up
;
...
...
@@ -459,16 +426,18 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num)
/* Set up and enable Rx high/low water mark thresholds, enable XON. */
if
(
hw
->
fc
.
current_mode
&
ixgbe_fc_tx_pause
)
{
if
(
hw
->
fc
.
send_xon
)
{
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCRTL
(
packetbuf_num
),
(
hw
->
fc
.
low_water
|
IXGBE_FCRTL_XONE
));
}
else
{
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCRTL
(
packetbuf_num
),
hw
->
fc
.
low_water
);
}
rx_pba_size
=
IXGBE_READ_REG
(
hw
,
IXGBE_RXPBSIZE
(
packetbuf_num
));
rx_pba_size
>>=
IXGBE_RXPBSIZE_SHIFT
;
reg
=
(
rx_pba_size
-
hw
->
fc
.
low_water
)
<<
6
;
if
(
hw
->
fc
.
send_xon
)
reg
|=
IXGBE_FCRTL_XONE
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCRTL
(
packetbuf_num
),
reg
);
reg
=
(
rx_pba_size
-
hw
->
fc
.
high_water
)
<<
10
;
reg
|=
IXGBE_FCRTH_FCEN
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCRTH
(
packetbuf_num
),
(
hw
->
fc
.
high_water
|
IXGBE_FCRTH_FCEN
));
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCRTH
(
packetbuf_num
),
reg
);
}
/* Configure pause time (2 TCs per register) */
...
...
@@ -1222,6 +1191,7 @@ static struct ixgbe_mac_operations mac_ops_82598 = {
static
struct
ixgbe_eeprom_operations
eeprom_ops_82598
=
{
.
init_params
=
&
ixgbe_init_eeprom_params_generic
,
.
read
=
&
ixgbe_read_eerd_generic
,
.
calc_checksum
=
&
ixgbe_calc_eeprom_checksum_generic
,
.
validate_checksum
=
&
ixgbe_validate_eeprom_checksum_generic
,
.
update_checksum
=
&
ixgbe_update_eeprom_checksum_generic
,
};
...
...
drivers/net/ixgbe/ixgbe_82599.c
浏览文件 @
a1082bfe
...
...
@@ -56,9 +56,6 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,
ixgbe_link_speed
speed
,
bool
autoneg
,
bool
autoneg_wait_to_complete
);
static
s32
ixgbe_get_copper_link_capabilities_82599
(
struct
ixgbe_hw
*
hw
,
ixgbe_link_speed
*
speed
,
bool
*
autoneg
);
static
s32
ixgbe_setup_copper_link_82599
(
struct
ixgbe_hw
*
hw
,
ixgbe_link_speed
speed
,
bool
autoneg
,
...
...
@@ -174,7 +171,7 @@ static s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw)
if
(
mac
->
ops
.
get_media_type
(
hw
)
==
ixgbe_media_type_copper
)
{
mac
->
ops
.
setup_link
=
&
ixgbe_setup_copper_link_82599
;
mac
->
ops
.
get_link_capabilities
=
&
ixgbe_get_copper_link_capabilities_82599
;
&
ixgbe_get_copper_link_capabilities_generic
;
}
/* Set necessary function pointers based on phy type */
...
...
@@ -184,6 +181,10 @@ static s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw)
phy
->
ops
.
get_firmware_version
=
&
ixgbe_get_phy_firmware_version_tnx
;
break
;
case
ixgbe_phy_aq
:
phy
->
ops
.
get_firmware_version
=
&
ixgbe_get_phy_firmware_version_generic
;
break
;
default:
break
;
}
...
...
@@ -289,37 +290,6 @@ static s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw,
return
status
;
}
/**
* ixgbe_get_copper_link_capabilities_82599 - Determines link capabilities
* @hw: pointer to hardware structure
* @speed: pointer to link speed
* @autoneg: boolean auto-negotiation value
*
* Determines the link capabilities by reading the AUTOC register.
**/
static
s32
ixgbe_get_copper_link_capabilities_82599
(
struct
ixgbe_hw
*
hw
,
ixgbe_link_speed
*
speed
,
bool
*
autoneg
)
{
s32
status
=
IXGBE_ERR_LINK_SETUP
;
u16
speed_ability
;
*
speed
=
0
;
*
autoneg
=
true
;
status
=
hw
->
phy
.
ops
.
read_reg
(
hw
,
MDIO_SPEED
,
MDIO_MMD_PMAPMD
,
&
speed_ability
);
if
(
status
==
0
)
{
if
(
speed_ability
&
MDIO_SPEED_10G
)
*
speed
|=
IXGBE_LINK_SPEED_10GB_FULL
;
if
(
speed_ability
&
MDIO_PMA_SPEED_1000
)
*
speed
|=
IXGBE_LINK_SPEED_1GB_FULL
;
}
return
status
;
}
/**
* ixgbe_get_media_type_82599 - Get media type
* @hw: pointer to hardware structure
...
...
@@ -332,7 +302,8 @@ static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
/* Detect if there is a copper PHY attached. */
if
(
hw
->
phy
.
type
==
ixgbe_phy_cu_unknown
||
hw
->
phy
.
type
==
ixgbe_phy_tn
)
{
hw
->
phy
.
type
==
ixgbe_phy_tn
||
hw
->
phy
.
type
==
ixgbe_phy_aq
)
{
media_type
=
ixgbe_media_type_copper
;
goto
out
;
}
...
...
@@ -1924,6 +1895,7 @@ static u32 ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw)
hw
->
phy
.
ops
.
identify
(
hw
);
if
(
hw
->
phy
.
type
==
ixgbe_phy_tn
||
hw
->
phy
.
type
==
ixgbe_phy_aq
||
hw
->
phy
.
type
==
ixgbe_phy_cu_unknown
)
{
hw
->
phy
.
ops
.
read_reg
(
hw
,
MDIO_PMA_EXTABLE
,
MDIO_MMD_PMAPMD
,
&
ext_ability
);
...
...
@@ -2125,51 +2097,6 @@ static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw)
return
status
;
}
/**
* ixgbe_get_wwn_prefix_82599 - Get alternative WWNN/WWPN prefix from
* the EEPROM
* @hw: pointer to hardware structure
* @wwnn_prefix: the alternative WWNN prefix
* @wwpn_prefix: the alternative WWPN prefix
*
* This function will read the EEPROM from the alternative SAN MAC address
* block to check the support for the alternative WWNN/WWPN prefix support.
**/
static
s32
ixgbe_get_wwn_prefix_82599
(
struct
ixgbe_hw
*
hw
,
u16
*
wwnn_prefix
,
u16
*
wwpn_prefix
)
{
u16
offset
,
caps
;
u16
alt_san_mac_blk_offset
;
/* clear output first */
*
wwnn_prefix
=
0xFFFF
;
*
wwpn_prefix
=
0xFFFF
;
/* check if alternative SAN MAC is supported */
hw
->
eeprom
.
ops
.
read
(
hw
,
IXGBE_ALT_SAN_MAC_ADDR_BLK_PTR
,
&
alt_san_mac_blk_offset
);
if
((
alt_san_mac_blk_offset
==
0
)
||
(
alt_san_mac_blk_offset
==
0xFFFF
))
goto
wwn_prefix_out
;
/* check capability in alternative san mac address block */
offset
=
alt_san_mac_blk_offset
+
IXGBE_ALT_SAN_MAC_ADDR_CAPS_OFFSET
;
hw
->
eeprom
.
ops
.
read
(
hw
,
offset
,
&
caps
);
if
(
!
(
caps
&
IXGBE_ALT_SAN_MAC_ADDR_CAPS_ALTWWN
))
goto
wwn_prefix_out
;
/* get the corresponding prefix for WWNN/WWPN */
offset
=
alt_san_mac_blk_offset
+
IXGBE_ALT_SAN_MAC_ADDR_WWNN_OFFSET
;
hw
->
eeprom
.
ops
.
read
(
hw
,
offset
,
wwnn_prefix
);
offset
=
alt_san_mac_blk_offset
+
IXGBE_ALT_SAN_MAC_ADDR_WWPN_OFFSET
;
hw
->
eeprom
.
ops
.
read
(
hw
,
offset
,
wwpn_prefix
);
wwn_prefix_out:
return
0
;
}
static
struct
ixgbe_mac_operations
mac_ops_82599
=
{
.
init_hw
=
&
ixgbe_init_hw_generic
,
.
reset_hw
=
&
ixgbe_reset_hw_82599
,
...
...
@@ -2181,7 +2108,7 @@ static struct ixgbe_mac_operations mac_ops_82599 = {
.
get_mac_addr
=
&
ixgbe_get_mac_addr_generic
,
.
get_san_mac_addr
=
&
ixgbe_get_san_mac_addr_generic
,
.
get_device_caps
=
&
ixgbe_get_device_caps_82599
,
.
get_wwn_prefix
=
&
ixgbe_get_wwn_prefix_
82599
,
.
get_wwn_prefix
=
&
ixgbe_get_wwn_prefix_
generic
,
.
stop_adapter
=
&
ixgbe_stop_adapter_generic
,
.
get_bus_info
=
&
ixgbe_get_bus_info_generic
,
.
set_lan_id
=
&
ixgbe_set_lan_id_multi_port_pcie
,
...
...
@@ -2214,6 +2141,7 @@ static struct ixgbe_eeprom_operations eeprom_ops_82599 = {
.
init_params
=
&
ixgbe_init_eeprom_params_generic
,
.
read
=
&
ixgbe_read_eerd_generic
,
.
write
=
&
ixgbe_write_eeprom_generic
,
.
calc_checksum
=
&
ixgbe_calc_eeprom_checksum_generic
,
.
validate_checksum
=
&
ixgbe_validate_eeprom_checksum_generic
,
.
update_checksum
=
&
ixgbe_update_eeprom_checksum_generic
,
};
...
...
@@ -2240,5 +2168,5 @@ struct ixgbe_info ixgbe_82599_info = {
.
mac_ops
=
&
mac_ops_82599
,
.
eeprom_ops
=
&
eeprom_ops_82599
,
.
phy_ops
=
&
phy_ops_82599
,
.
mbx_ops
=
&
mbx_ops_
82599
,
.
mbx_ops
=
&
mbx_ops_
generic
,
};
drivers/net/ixgbe/ixgbe_common.c
浏览文件 @
a1082bfe
...
...
@@ -45,14 +45,12 @@ static u16 ixgbe_shift_in_eeprom_bits(struct ixgbe_hw *hw, u16 count);
static
void
ixgbe_raise_eeprom_clk
(
struct
ixgbe_hw
*
hw
,
u32
*
eec
);
static
void
ixgbe_lower_eeprom_clk
(
struct
ixgbe_hw
*
hw
,
u32
*
eec
);
static
void
ixgbe_release_eeprom
(
struct
ixgbe_hw
*
hw
);
static
u16
ixgbe_calc_eeprom_checksum
(
struct
ixgbe_hw
*
hw
);
static
void
ixgbe_enable_rar
(
struct
ixgbe_hw
*
hw
,
u32
index
);
static
void
ixgbe_disable_rar
(
struct
ixgbe_hw
*
hw
,
u32
index
);
static
s32
ixgbe_mta_vector
(
struct
ixgbe_hw
*
hw
,
u8
*
mc_addr
);
static
void
ixgbe_add_uc_addr
(
struct
ixgbe_hw
*
hw
,
u8
*
addr
,
u32
vmdq
);
static
s32
ixgbe_setup_fc
(
struct
ixgbe_hw
*
hw
,
s32
packetbuf_num
);
static
s32
ixgbe_poll_eerd_eewr_done
(
struct
ixgbe_hw
*
hw
,
u32
ee_reg
);
/**
* ixgbe_start_hw_generic - Prepare hardware for Tx/Rx
...
...
@@ -638,7 +636,7 @@ s32 ixgbe_read_eerd_generic(struct ixgbe_hw *hw, u16 offset, u16 *data)
* Polls the status bit (bit 1) of the EERD or EEWR to determine when the
* read or write is done respectively.
**/
s
tatic
s
32
ixgbe_poll_eerd_eewr_done
(
struct
ixgbe_hw
*
hw
,
u32
ee_reg
)
s32
ixgbe_poll_eerd_eewr_done
(
struct
ixgbe_hw
*
hw
,
u32
ee_reg
)
{
u32
i
;
u32
reg
;
...
...
@@ -1009,7 +1007,7 @@ static void ixgbe_release_eeprom(struct ixgbe_hw *hw)
* ixgbe_calc_eeprom_checksum - Calculates and returns the checksum
* @hw: pointer to hardware structure
**/
static
u16
ixgbe_calc_eeprom_checksum
(
struct
ixgbe_hw
*
hw
)
u16
ixgbe_calc_eeprom_checksum_generic
(
struct
ixgbe_hw
*
hw
)
{
u16
i
;
u16
j
;
...
...
@@ -1072,7 +1070,7 @@ s32 ixgbe_validate_eeprom_checksum_generic(struct ixgbe_hw *hw,
status
=
hw
->
eeprom
.
ops
.
read
(
hw
,
0
,
&
checksum
);
if
(
status
==
0
)
{
checksum
=
ixgbe_calc_eeprom
_checksum
(
hw
);
checksum
=
hw
->
eeprom
.
ops
.
calc
_checksum
(
hw
);
hw
->
eeprom
.
ops
.
read
(
hw
,
IXGBE_EEPROM_CHECKSUM
,
&
read_checksum
);
...
...
@@ -1110,7 +1108,7 @@ s32 ixgbe_update_eeprom_checksum_generic(struct ixgbe_hw *hw)
status
=
hw
->
eeprom
.
ops
.
read
(
hw
,
0
,
&
checksum
);
if
(
status
==
0
)
{
checksum
=
ixgbe_calc_eeprom
_checksum
(
hw
);
checksum
=
hw
->
eeprom
.
ops
.
calc
_checksum
(
hw
);
status
=
hw
->
eeprom
.
ops
.
write
(
hw
,
IXGBE_EEPROM_CHECKSUM
,
checksum
);
}
else
{
...
...
@@ -1595,6 +1593,7 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw, s32 packetbuf_num)
u32
mflcn_reg
,
fccfg_reg
;
u32
reg
;
u32
rx_pba_size
;
u32
fcrtl
,
fcrth
;
#ifdef CONFIG_DCB
if
(
hw
->
fc
.
requested_mode
==
ixgbe_fc_pfc
)
...
...
@@ -1671,41 +1670,21 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw, s32 packetbuf_num)
IXGBE_WRITE_REG
(
hw
,
IXGBE_MFLCN
,
mflcn_reg
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCCFG
,
fccfg_reg
);
reg
=
IXGBE_READ_REG
(
hw
,
IXGBE_MTQC
);
/* Thresholds are different for link flow control when in DCB mode */
if
(
reg
&
IXGBE_MTQC_RT_ENA
)
{
rx_pba_size
=
IXGBE_READ_REG
(
hw
,
IXGBE_RXPBSIZE
(
packetbuf_num
));
rx_pba_size
=
IXGBE_READ_REG
(
hw
,
IXGBE_RXPBSIZE
(
packetbuf_num
));
rx_pba_size
>>=
IXGBE_RXPBSIZE_SHIFT
;
/* Always disable XON for LFC when in DCB mode */
reg
=
(
rx_pba_size
>>
5
)
&
0xFFE0
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCRTL_82599
(
packetbuf_num
),
reg
);
fcrth
=
(
rx_pba_size
-
hw
->
fc
.
high_water
)
<<
10
;
fcrtl
=
(
rx_pba_size
-
hw
->
fc
.
low_water
)
<<
10
;
reg
=
(
rx_pba_size
>>
2
)
&
0xFFE0
;
if
(
hw
->
fc
.
current_mode
&
ixgbe_fc_tx_pause
)
reg
|=
IXGBE_FCRTH_FCEN
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCRTH_82599
(
packetbuf_num
),
reg
);
}
else
{
/*
* Set up and enable Rx high/low water mark thresholds,
* enable XON.
*/
if
(
hw
->
fc
.
current_mode
&
ixgbe_fc_tx_pause
)
{
if
(
hw
->
fc
.
send_xon
)
{
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCRTL_82599
(
packetbuf_num
),
(
hw
->
fc
.
low_water
|
IXGBE_FCRTL_XONE
));
}
else
{
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCRTL_82599
(
packetbuf_num
),
hw
->
fc
.
low_water
);
}
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCRTH_82599
(
packetbuf_num
),
(
hw
->
fc
.
high_water
|
IXGBE_FCRTH_FCEN
));
}
if
(
hw
->
fc
.
current_mode
&
ixgbe_fc_tx_pause
)
{
fcrth
|=
IXGBE_FCRTH_FCEN
;
if
(
hw
->
fc
.
send_xon
)
fcrtl
|=
IXGBE_FCRTL_XONE
;
}
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCRTH_82599
(
packetbuf_num
),
fcrth
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCRTL_82599
(
packetbuf_num
),
fcrtl
);
/* Configure pause time (2 TCs per register) */
reg
=
IXGBE_READ_REG
(
hw
,
IXGBE_FCTTV
(
packetbuf_num
/
2
));
if
((
packetbuf_num
&
1
)
==
0
)
...
...
@@ -2705,3 +2684,48 @@ s32 ixgbe_check_mac_link_generic(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
return
0
;
}
/**
* ixgbe_get_wwn_prefix_generic Get alternative WWNN/WWPN prefix from
* the EEPROM
* @hw: pointer to hardware structure
* @wwnn_prefix: the alternative WWNN prefix
* @wwpn_prefix: the alternative WWPN prefix
*
* This function will read the EEPROM from the alternative SAN MAC address
* block to check the support for the alternative WWNN/WWPN prefix support.
**/
s32
ixgbe_get_wwn_prefix_generic
(
struct
ixgbe_hw
*
hw
,
u16
*
wwnn_prefix
,
u16
*
wwpn_prefix
)
{
u16
offset
,
caps
;
u16
alt_san_mac_blk_offset
;
/* clear output first */
*
wwnn_prefix
=
0xFFFF
;
*
wwpn_prefix
=
0xFFFF
;
/* check if alternative SAN MAC is supported */
hw
->
eeprom
.
ops
.
read
(
hw
,
IXGBE_ALT_SAN_MAC_ADDR_BLK_PTR
,
&
alt_san_mac_blk_offset
);
if
((
alt_san_mac_blk_offset
==
0
)
||
(
alt_san_mac_blk_offset
==
0xFFFF
))
goto
wwn_prefix_out
;
/* check capability in alternative san mac address block */
offset
=
alt_san_mac_blk_offset
+
IXGBE_ALT_SAN_MAC_ADDR_CAPS_OFFSET
;
hw
->
eeprom
.
ops
.
read
(
hw
,
offset
,
&
caps
);
if
(
!
(
caps
&
IXGBE_ALT_SAN_MAC_ADDR_CAPS_ALTWWN
))
goto
wwn_prefix_out
;
/* get the corresponding prefix for WWNN/WWPN */
offset
=
alt_san_mac_blk_offset
+
IXGBE_ALT_SAN_MAC_ADDR_WWNN_OFFSET
;
hw
->
eeprom
.
ops
.
read
(
hw
,
offset
,
wwnn_prefix
);
offset
=
alt_san_mac_blk_offset
+
IXGBE_ALT_SAN_MAC_ADDR_WWPN_OFFSET
;
hw
->
eeprom
.
ops
.
read
(
hw
,
offset
,
wwpn_prefix
);
wwn_prefix_out:
return
0
;
}
drivers/net/ixgbe/ixgbe_common.h
浏览文件 @
a1082bfe
...
...
@@ -49,9 +49,11 @@ s32 ixgbe_write_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 data);
s32
ixgbe_read_eerd_generic
(
struct
ixgbe_hw
*
hw
,
u16
offset
,
u16
*
data
);
s32
ixgbe_read_eeprom_bit_bang_generic
(
struct
ixgbe_hw
*
hw
,
u16
offset
,
u16
*
data
);
u16
ixgbe_calc_eeprom_checksum_generic
(
struct
ixgbe_hw
*
hw
);
s32
ixgbe_validate_eeprom_checksum_generic
(
struct
ixgbe_hw
*
hw
,
u16
*
checksum_val
);
s32
ixgbe_update_eeprom_checksum_generic
(
struct
ixgbe_hw
*
hw
);
s32
ixgbe_poll_eerd_eewr_done
(
struct
ixgbe_hw
*
hw
,
u32
ee_reg
);
s32
ixgbe_set_rar_generic
(
struct
ixgbe_hw
*
hw
,
u32
index
,
u8
*
addr
,
u32
vmdq
,
u32
enable_addr
);
...
...
@@ -81,7 +83,8 @@ s32 ixgbe_clear_vfta_generic(struct ixgbe_hw *hw);
s32
ixgbe_check_mac_link_generic
(
struct
ixgbe_hw
*
hw
,
ixgbe_link_speed
*
speed
,
bool
*
link_up
,
bool
link_up_wait_to_complete
);
s32
ixgbe_get_wwn_prefix_generic
(
struct
ixgbe_hw
*
hw
,
u16
*
wwnn_prefix
,
u16
*
wwpn_prefix
);
s32
ixgbe_blink_led_start_generic
(
struct
ixgbe_hw
*
hw
,
u32
index
);
s32
ixgbe_blink_led_stop_generic
(
struct
ixgbe_hw
*
hw
,
u32
index
);
...
...
drivers/net/ixgbe/ixgbe_dcb.c
浏览文件 @
a1082bfe
...
...
@@ -42,7 +42,8 @@
* It should be called only after the rules are checked by
* ixgbe_dcb_check_config().
*/
s32
ixgbe_dcb_calculate_tc_credits
(
struct
ixgbe_dcb_config
*
dcb_config
,
s32
ixgbe_dcb_calculate_tc_credits
(
struct
ixgbe_hw
*
hw
,
struct
ixgbe_dcb_config
*
dcb_config
,
int
max_frame
,
u8
direction
)
{
struct
tc_bw_alloc
*
p
;
...
...
@@ -124,7 +125,8 @@ s32 ixgbe_dcb_calculate_tc_credits(struct ixgbe_dcb_config *dcb_config,
* credit may not be enough to send out a TSO
* packet in descriptor plane arbitration.
*/
if
(
credit_max
&&
if
((
hw
->
mac
.
type
==
ixgbe_mac_82598EB
)
&&
credit_max
&&
(
credit_max
<
MINIMUM_CREDIT_FOR_TSO
))
credit_max
=
MINIMUM_CREDIT_FOR_TSO
;
...
...
@@ -150,10 +152,17 @@ s32 ixgbe_dcb_hw_config(struct ixgbe_hw *hw,
struct
ixgbe_dcb_config
*
dcb_config
)
{
s32
ret
=
0
;
if
(
hw
->
mac
.
type
==
ixgbe_mac_82598EB
)
switch
(
hw
->
mac
.
type
)
{
case
ixgbe_mac_82598EB
:
ret
=
ixgbe_dcb_hw_config_82598
(
hw
,
dcb_config
);
else
if
(
hw
->
mac
.
type
==
ixgbe_mac_82599EB
)
break
;
case
ixgbe_mac_82599EB
:
case
ixgbe_mac_X540
:
ret
=
ixgbe_dcb_hw_config_82599
(
hw
,
dcb_config
);
break
;
default:
break
;
}
return
ret
;
}
drivers/net/ixgbe/ixgbe_dcb.h
浏览文件 @
a1082bfe
...
...
@@ -150,7 +150,8 @@ struct ixgbe_dcb_config {
/* DCB driver APIs */
/* DCB credits calculation */
s32
ixgbe_dcb_calculate_tc_credits
(
struct
ixgbe_dcb_config
*
,
int
,
u8
);
s32
ixgbe_dcb_calculate_tc_credits
(
struct
ixgbe_hw
*
,
struct
ixgbe_dcb_config
*
,
int
,
u8
);
/* DCB hw initialization */
s32
ixgbe_dcb_hw_config
(
struct
ixgbe_hw
*
,
struct
ixgbe_dcb_config
*
);
...
...
drivers/net/ixgbe/ixgbe_dcb_82598.c
浏览文件 @
a1082bfe
...
...
@@ -256,21 +256,17 @@ s32 ixgbe_dcb_config_pfc_82598(struct ixgbe_hw *hw,
* for each traffic class.
*/
for
(
i
=
0
;
i
<
MAX_TRAFFIC_CLASS
;
i
++
)
{
if
(
dcb_config
->
rx_pba_cfg
==
pba_equal
)
{
rx_pba_size
=
IXGBE_RXPBSIZE_64KB
;
}
else
{
rx_pba_size
=
(
i
<
4
)
?
IXGBE_RXPBSIZE_80KB
:
IXGBE_RXPBSIZE_48KB
;
}
rx_pba_size
=
IXGBE_READ_REG
(
hw
,
IXGBE_RXPBSIZE
(
i
));
rx_pba_size
>>=
IXGBE_RXPBSIZE_SHIFT
;
reg
=
(
rx_pba_size
-
hw
->
fc
.
low_water
)
<<
10
;
reg
=
((
rx_pba_size
>>
5
)
&
0xFFF0
);
if
(
dcb_config
->
tc_config
[
i
].
dcb_pfc
==
pfc_enabled_tx
||
dcb_config
->
tc_config
[
i
].
dcb_pfc
==
pfc_enabled_full
)
reg
|=
IXGBE_FCRTL_XONE
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCRTL
(
i
),
reg
);
reg
=
(
(
rx_pba_size
>>
2
)
&
0xFFF0
)
;
reg
=
(
rx_pba_size
-
hw
->
fc
.
high_water
)
<<
10
;
if
(
dcb_config
->
tc_config
[
i
].
dcb_pfc
==
pfc_enabled_tx
||
dcb_config
->
tc_config
[
i
].
dcb_pfc
==
pfc_enabled_full
)
reg
|=
IXGBE_FCRTH_FCEN
;
...
...
drivers/net/ixgbe/ixgbe_dcb_82599.c
浏览文件 @
a1082bfe
...
...
@@ -251,19 +251,17 @@ s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw,
/* Configure PFC Tx thresholds per TC */
for
(
i
=
0
;
i
<
MAX_TRAFFIC_CLASS
;
i
++
)
{
if
(
dcb_config
->
rx_pba_cfg
==
pba_equal
)
rx_pba_size
=
IXGBE_RXPBSIZE_64KB
;
else
rx_pba_size
=
(
i
<
4
)
?
IXGBE_RXPBSIZE_80KB
:
IXGBE_RXPBSIZE_48KB
;
rx_pba_size
=
IXGBE_READ_REG
(
hw
,
IXGBE_RXPBSIZE
(
i
));
rx_pba_size
>>=
IXGBE_RXPBSIZE_SHIFT
;
reg
=
(
rx_pba_size
-
hw
->
fc
.
low_water
)
<<
10
;
reg
=
((
rx_pba_size
>>
5
)
&
0xFFE0
);
if
(
dcb_config
->
tc_config
[
i
].
dcb_pfc
==
pfc_enabled_full
||
dcb_config
->
tc_config
[
i
].
dcb_pfc
==
pfc_enabled_tx
)
reg
|=
IXGBE_FCRTL_XONE
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCRTL_82599
(
i
),
reg
);
reg
=
(
(
rx_pba_size
>>
2
)
&
0xFFE0
)
;
reg
=
(
rx_pba_size
-
hw
->
fc
.
high_water
)
<<
10
;
if
(
dcb_config
->
tc_config
[
i
].
dcb_pfc
==
pfc_enabled_full
||
dcb_config
->
tc_config
[
i
].
dcb_pfc
==
pfc_enabled_tx
)
reg
|=
IXGBE_FCRTH_FCEN
;
...
...
drivers/net/ixgbe/ixgbe_dcb_nl.c
浏览文件 @
a1082bfe
...
...
@@ -130,15 +130,21 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
netdev
->
netdev_ops
->
ndo_stop
(
netdev
);
ixgbe_clear_interrupt_scheme
(
adapter
);
if
(
adapter
->
hw
.
mac
.
type
==
ixgbe_mac_82598EB
)
{
adapter
->
flags
&=
~
IXGBE_FLAG_RSS_ENABLED
;
switch
(
adapter
->
hw
.
mac
.
type
)
{
case
ixgbe_mac_82598EB
:
adapter
->
last_lfc_mode
=
adapter
->
hw
.
fc
.
current_mode
;
adapter
->
hw
.
fc
.
requested_mode
=
ixgbe_fc_none
;
}
adapter
->
flags
&=
~
IXGBE_FLAG_RSS_ENABLED
;
if
(
adapter
->
hw
.
mac
.
type
==
ixgbe_mac_82599EB
)
{
break
;
case
ixgbe_mac_82599EB
:
case
ixgbe_mac_X540
:
adapter
->
flags
&=
~
IXGBE_FLAG_FDIR_HASH_CAPABLE
;
adapter
->
flags
&=
~
IXGBE_FLAG_FDIR_PERFECT_CAPABLE
;
break
;
default:
break
;
}
adapter
->
flags
|=
IXGBE_FLAG_DCB_ENABLED
;
ixgbe_init_interrupt_scheme
(
adapter
);
if
(
netif_running
(
netdev
))
...
...
@@ -155,8 +161,14 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
adapter
->
dcb_cfg
.
pfc_mode_enable
=
false
;
adapter
->
flags
&=
~
IXGBE_FLAG_DCB_ENABLED
;
adapter
->
flags
|=
IXGBE_FLAG_RSS_ENABLED
;
if
(
adapter
->
hw
.
mac
.
type
==
ixgbe_mac_82599EB
)
switch
(
adapter
->
hw
.
mac
.
type
)
{
case
ixgbe_mac_82599EB
:
case
ixgbe_mac_X540
:
adapter
->
flags
|=
IXGBE_FLAG_FDIR_HASH_CAPABLE
;
break
;
default:
break
;
}
ixgbe_init_interrupt_scheme
(
adapter
);
if
(
netif_running
(
netdev
))
...
...
@@ -178,9 +190,14 @@ static void ixgbe_dcbnl_get_perm_hw_addr(struct net_device *netdev,
for
(
i
=
0
;
i
<
netdev
->
addr_len
;
i
++
)
perm_addr
[
i
]
=
adapter
->
hw
.
mac
.
perm_addr
[
i
];
if
(
adapter
->
hw
.
mac
.
type
==
ixgbe_mac_82599EB
)
{
switch
(
adapter
->
hw
.
mac
.
type
)
{
case
ixgbe_mac_82599EB
:
case
ixgbe_mac_X540
:
for
(
j
=
0
;
j
<
netdev
->
addr_len
;
j
++
,
i
++
)
perm_addr
[
i
]
=
adapter
->
hw
.
mac
.
san_addr
[
j
];
break
;
default:
break
;
}
}
...
...
@@ -366,15 +383,29 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
}
if
(
adapter
->
dcb_cfg
.
pfc_mode_enable
)
{
if
((
adapter
->
hw
.
mac
.
type
!=
ixgbe_mac_82598EB
)
&&
(
adapter
->
hw
.
fc
.
current_mode
!=
ixgbe_fc_pfc
))
adapter
->
last_lfc_mode
=
adapter
->
hw
.
fc
.
current_mode
;
switch
(
adapter
->
hw
.
mac
.
type
)
{
case
ixgbe_mac_82599EB
:
case
ixgbe_mac_X540
:
if
(
adapter
->
hw
.
fc
.
current_mode
!=
ixgbe_fc_pfc
)
adapter
->
last_lfc_mode
=
adapter
->
hw
.
fc
.
current_mode
;
break
;
default:
break
;
}
adapter
->
hw
.
fc
.
requested_mode
=
ixgbe_fc_pfc
;
}
else
{
if
(
adapter
->
hw
.
mac
.
type
!=
ixgbe_mac_82598EB
)
adapter
->
hw
.
fc
.
requested_mode
=
adapter
->
last_lfc_mode
;
else
switch
(
adapter
->
hw
.
mac
.
type
)
{
case
ixgbe_mac_82598EB
:
adapter
->
hw
.
fc
.
requested_mode
=
ixgbe_fc_none
;
break
;
case
ixgbe_mac_82599EB
:
case
ixgbe_mac_X540
:
adapter
->
hw
.
fc
.
requested_mode
=
adapter
->
last_lfc_mode
;
break
;
default:
break
;
}
}
if
(
adapter
->
dcb_set_bitmap
&
BIT_RESETLINK
)
{
...
...
drivers/net/ixgbe/ixgbe_ethtool.c
浏览文件 @
a1082bfe
...
...
@@ -185,6 +185,16 @@ static int ixgbe_get_settings(struct net_device *netdev,
ADVERTISED_FIBRE
);
ecmd
->
port
=
PORT_FIBRE
;
ecmd
->
autoneg
=
AUTONEG_DISABLE
;
}
else
if
((
hw
->
device_id
==
IXGBE_DEV_ID_82599_COMBO_BACKPLANE
)
||
(
hw
->
device_id
==
IXGBE_DEV_ID_82599_KX4_MEZZ
))
{
ecmd
->
supported
|=
(
SUPPORTED_1000baseT_Full
|
SUPPORTED_Autoneg
|
SUPPORTED_FIBRE
);
ecmd
->
advertising
=
(
ADVERTISED_10000baseT_Full
|
ADVERTISED_1000baseT_Full
|
ADVERTISED_Autoneg
|
ADVERTISED_FIBRE
);
ecmd
->
port
=
PORT_FIBRE
;
}
else
{
ecmd
->
supported
|=
(
SUPPORTED_1000baseT_Full
|
SUPPORTED_FIBRE
);
...
...
@@ -204,6 +214,7 @@ static int ixgbe_get_settings(struct net_device *netdev,
/* Get PHY type */
switch
(
adapter
->
hw
.
phy
.
type
)
{
case
ixgbe_phy_tn
:
case
ixgbe_phy_aq
:
case
ixgbe_phy_cu_unknown
:
/* Copper 10G-BASET */
ecmd
->
port
=
PORT_TP
;
...
...
@@ -332,13 +343,6 @@ static void ixgbe_get_pauseparam(struct net_device *netdev,
else
pause
->
autoneg
=
1
;
#ifdef CONFIG_DCB
if
(
hw
->
fc
.
current_mode
==
ixgbe_fc_pfc
)
{
pause
->
rx_pause
=
0
;
pause
->
tx_pause
=
0
;
}
#endif
if
(
hw
->
fc
.
current_mode
==
ixgbe_fc_rx_pause
)
{
pause
->
rx_pause
=
1
;
}
else
if
(
hw
->
fc
.
current_mode
==
ixgbe_fc_tx_pause
)
{
...
...
@@ -346,6 +350,11 @@ static void ixgbe_get_pauseparam(struct net_device *netdev,
}
else
if
(
hw
->
fc
.
current_mode
==
ixgbe_fc_full
)
{
pause
->
rx_pause
=
1
;
pause
->
tx_pause
=
1
;
#ifdef CONFIG_DCB
}
else
if
(
hw
->
fc
.
current_mode
==
ixgbe_fc_pfc
)
{
pause
->
rx_pause
=
0
;
pause
->
tx_pause
=
0
;
#endif
}
}
...
...
@@ -363,7 +372,6 @@ static int ixgbe_set_pauseparam(struct net_device *netdev,
return
-
EINVAL
;
#endif
fc
=
hw
->
fc
;
if
(
pause
->
autoneg
!=
AUTONEG_ENABLE
)
...
...
@@ -412,11 +420,6 @@ static int ixgbe_set_rx_csum(struct net_device *netdev, u32 data)
else
adapter
->
flags
&=
~
IXGBE_FLAG_RX_CSUM_ENABLED
;
if
(
netif_running
(
netdev
))
ixgbe_reinit_locked
(
adapter
);
else
ixgbe_reset
(
adapter
);
return
0
;
}
...
...
@@ -428,16 +431,21 @@ static u32 ixgbe_get_tx_csum(struct net_device *netdev)
static
int
ixgbe_set_tx_csum
(
struct
net_device
*
netdev
,
u32
data
)
{
struct
ixgbe_adapter
*
adapter
=
netdev_priv
(
netdev
);
u32
feature_list
;
if
(
data
)
{
netdev
->
features
|=
(
NETIF_F_IP_CSUM
|
NETIF_F_IPV6_CSUM
);
if
(
adapter
->
hw
.
mac
.
type
==
ixgbe_mac_82599EB
)
netdev
->
features
|=
NETIF_F_SCTP_CSUM
;
}
else
{
netdev
->
features
&=
~
(
NETIF_F_IP_CSUM
|
NETIF_F_IPV6_CSUM
)
;
if
(
adapter
->
hw
.
mac
.
type
==
ixgbe_mac_82599EB
)
netdev
->
features
&=
~
NETIF_F_SCTP_CSUM
;
feature_list
=
(
NETIF_F_IP_CSUM
|
NETIF_F_IPV6_CSUM
);
switch
(
adapter
->
hw
.
mac
.
type
)
{
case
ixgbe_mac_82599EB
:
case
ixgbe_mac_X540
:
feature_list
|=
NETIF_F_SCTP_CSUM
;
break
;
default:
break
;
}
if
(
data
)
netdev
->
features
|=
feature_list
;
else
netdev
->
features
&=
~
feature_list
;
return
0
;
}
...
...
@@ -530,10 +538,20 @@ static void ixgbe_get_regs(struct net_device *netdev,
regs_buff
[
32
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_FCTTV
(
1
));
regs_buff
[
33
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_FCTTV
(
2
));
regs_buff
[
34
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_FCTTV
(
3
));
for
(
i
=
0
;
i
<
8
;
i
++
)
regs_buff
[
35
+
i
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_FCRTL
(
i
));
for
(
i
=
0
;
i
<
8
;
i
++
)
regs_buff
[
43
+
i
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_FCRTH
(
i
));
for
(
i
=
0
;
i
<
8
;
i
++
)
{
switch
(
hw
->
mac
.
type
)
{
case
ixgbe_mac_82598EB
:
regs_buff
[
35
+
i
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_FCRTL
(
i
));
regs_buff
[
43
+
i
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_FCRTH
(
i
));
break
;
case
ixgbe_mac_82599EB
:
regs_buff
[
35
+
i
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_FCRTL_82599
(
i
));
regs_buff
[
43
+
i
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_FCRTH_82599
(
i
));
break
;
default:
break
;
}
}
regs_buff
[
51
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_FCRTV
);
regs_buff
[
52
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_TFCS
);
...
...
@@ -615,6 +633,7 @@ static void ixgbe_get_regs(struct net_device *netdev,
regs_buff
[
827
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_WUPM
);
regs_buff
[
828
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_FHFT
(
0
));
/* DCB */
regs_buff
[
829
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_RMCS
);
regs_buff
[
830
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_DPMCS
);
regs_buff
[
831
]
=
IXGBE_READ_REG
(
hw
,
IXGBE_PDPMCS
);
...
...
@@ -905,13 +924,11 @@ static int ixgbe_set_ringparam(struct net_device *netdev,
memcpy
(
&
temp_tx_ring
[
i
],
adapter
->
tx_ring
[
i
],
sizeof
(
struct
ixgbe_ring
));
temp_tx_ring
[
i
].
count
=
new_tx_count
;
err
=
ixgbe_setup_tx_resources
(
adapter
,
&
temp_tx_ring
[
i
]);
err
=
ixgbe_setup_tx_resources
(
&
temp_tx_ring
[
i
]);
if
(
err
)
{
while
(
i
)
{
i
--
;
ixgbe_free_tx_resources
(
adapter
,
&
temp_tx_ring
[
i
]);
ixgbe_free_tx_resources
(
&
temp_tx_ring
[
i
]);
}
goto
clear_reset
;
}
...
...
@@ -930,13 +947,11 @@ static int ixgbe_set_ringparam(struct net_device *netdev,
memcpy
(
&
temp_rx_ring
[
i
],
adapter
->
rx_ring
[
i
],
sizeof
(
struct
ixgbe_ring
));
temp_rx_ring
[
i
].
count
=
new_rx_count
;
err
=
ixgbe_setup_rx_resources
(
adapter
,
&
temp_rx_ring
[
i
]);
err
=
ixgbe_setup_rx_resources
(
&
temp_rx_ring
[
i
]);
if
(
err
)
{
while
(
i
)
{
i
--
;
ixgbe_free_rx_resources
(
adapter
,
&
temp_rx_ring
[
i
]);
ixgbe_free_rx_resources
(
&
temp_rx_ring
[
i
]);
}
goto
err_setup
;
}
...
...
@@ -951,8 +966,7 @@ static int ixgbe_set_ringparam(struct net_device *netdev,
/* tx */
if
(
new_tx_count
!=
adapter
->
tx_ring_count
)
{
for
(
i
=
0
;
i
<
adapter
->
num_tx_queues
;
i
++
)
{
ixgbe_free_tx_resources
(
adapter
,
adapter
->
tx_ring
[
i
]);
ixgbe_free_tx_resources
(
adapter
->
tx_ring
[
i
]);
memcpy
(
adapter
->
tx_ring
[
i
],
&
temp_tx_ring
[
i
],
sizeof
(
struct
ixgbe_ring
));
}
...
...
@@ -962,8 +976,7 @@ static int ixgbe_set_ringparam(struct net_device *netdev,
/* rx */
if
(
new_rx_count
!=
adapter
->
rx_ring_count
)
{
for
(
i
=
0
;
i
<
adapter
->
num_rx_queues
;
i
++
)
{
ixgbe_free_rx_resources
(
adapter
,
adapter
->
rx_ring
[
i
]);
ixgbe_free_rx_resources
(
adapter
->
rx_ring
[
i
]);
memcpy
(
adapter
->
rx_ring
[
i
],
&
temp_rx_ring
[
i
],
sizeof
(
struct
ixgbe_ring
));
}
...
...
@@ -1237,12 +1250,20 @@ static int ixgbe_reg_test(struct ixgbe_adapter *adapter, u64 *data)
u32
value
,
before
,
after
;
u32
i
,
toggle
;
if
(
adapter
->
hw
.
mac
.
type
==
ixgbe_mac_82599EB
)
{
toggle
=
0x7FFFF30F
;
test
=
reg_test_82599
;
}
else
{
switch
(
adapter
->
hw
.
mac
.
type
)
{
case
ixgbe_mac_82598EB
:
toggle
=
0x7FFFF3FF
;
test
=
reg_test_82598
;
break
;
case
ixgbe_mac_82599EB
:
case
ixgbe_mac_X540
:
toggle
=
0x7FFFF30F
;
test
=
reg_test_82599
;
break
;
default:
*
data
=
1
;
return
1
;
break
;
}
/*
...
...
@@ -1460,16 +1481,21 @@ static void ixgbe_free_desc_rings(struct ixgbe_adapter *adapter)
reg_ctl
&=
~
IXGBE_TXDCTL_ENABLE
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_TXDCTL
(
tx_ring
->
reg_idx
),
reg_ctl
);
if
(
hw
->
mac
.
type
==
ixgbe_mac_82599EB
)
{
switch
(
hw
->
mac
.
type
)
{
case
ixgbe_mac_82599EB
:
case
ixgbe_mac_X540
:
reg_ctl
=
IXGBE_READ_REG
(
hw
,
IXGBE_DMATXCTL
);
reg_ctl
&=
~
IXGBE_DMATXCTL_TE
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_DMATXCTL
,
reg_ctl
);
break
;
default:
break
;
}
ixgbe_reset
(
adapter
);
ixgbe_free_tx_resources
(
adapter
,
&
adapter
->
test_tx_ring
);
ixgbe_free_rx_resources
(
adapter
,
&
adapter
->
test_rx_ring
);
ixgbe_free_tx_resources
(
&
adapter
->
test_tx_ring
);
ixgbe_free_rx_resources
(
&
adapter
->
test_rx_ring
);
}
static
int
ixgbe_setup_desc_rings
(
struct
ixgbe_adapter
*
adapter
)
...
...
@@ -1483,17 +1509,24 @@ static int ixgbe_setup_desc_rings(struct ixgbe_adapter *adapter)
/* Setup Tx descriptor ring and Tx buffers */
tx_ring
->
count
=
IXGBE_DEFAULT_TXD
;
tx_ring
->
queue_index
=
0
;
tx_ring
->
dev
=
&
adapter
->
pdev
->
dev
;
tx_ring
->
netdev
=
adapter
->
netdev
;
tx_ring
->
reg_idx
=
adapter
->
tx_ring
[
0
]
->
reg_idx
;
tx_ring
->
numa_node
=
adapter
->
node
;
err
=
ixgbe_setup_tx_resources
(
adapter
,
tx_ring
);
err
=
ixgbe_setup_tx_resources
(
tx_ring
);
if
(
err
)
return
1
;
if
(
adapter
->
hw
.
mac
.
type
==
ixgbe_mac_82599EB
)
{
switch
(
adapter
->
hw
.
mac
.
type
)
{
case
ixgbe_mac_82599EB
:
case
ixgbe_mac_X540
:
reg_data
=
IXGBE_READ_REG
(
&
adapter
->
hw
,
IXGBE_DMATXCTL
);
reg_data
|=
IXGBE_DMATXCTL_TE
;
IXGBE_WRITE_REG
(
&
adapter
->
hw
,
IXGBE_DMATXCTL
,
reg_data
);
break
;
default:
break
;
}
ixgbe_configure_tx_ring
(
adapter
,
tx_ring
);
...
...
@@ -1501,11 +1534,13 @@ static int ixgbe_setup_desc_rings(struct ixgbe_adapter *adapter)
/* Setup Rx Descriptor ring and Rx buffers */
rx_ring
->
count
=
IXGBE_DEFAULT_RXD
;
rx_ring
->
queue_index
=
0
;
rx_ring
->
dev
=
&
adapter
->
pdev
->
dev
;
rx_ring
->
netdev
=
adapter
->
netdev
;
rx_ring
->
reg_idx
=
adapter
->
rx_ring
[
0
]
->
reg_idx
;
rx_ring
->
rx_buf_len
=
IXGBE_RXBUFFER_2048
;
rx_ring
->
numa_node
=
adapter
->
node
;
err
=
ixgbe_setup_rx_resources
(
adapter
,
rx_ring
);
err
=
ixgbe_setup_rx_resources
(
rx_ring
);
if
(
err
)
{
ret_val
=
4
;
goto
err_nomem
;
...
...
@@ -1604,8 +1639,7 @@ static int ixgbe_check_lbtest_frame(struct sk_buff *skb,
return
13
;
}
static
u16
ixgbe_clean_test_rings
(
struct
ixgbe_adapter
*
adapter
,
struct
ixgbe_ring
*
rx_ring
,
static
u16
ixgbe_clean_test_rings
(
struct
ixgbe_ring
*
rx_ring
,
struct
ixgbe_ring
*
tx_ring
,
unsigned
int
size
)
{
...
...
@@ -1627,7 +1661,7 @@ static u16 ixgbe_clean_test_rings(struct ixgbe_adapter *adapter,
rx_buffer_info
=
&
rx_ring
->
rx_buffer_info
[
rx_ntc
];
/* unmap Rx buffer, will be remapped by alloc_rx_buffers */
dma_unmap_single
(
&
adapter
->
pdev
->
dev
,
dma_unmap_single
(
rx_ring
->
dev
,
rx_buffer_info
->
dma
,
bufsz
,
DMA_FROM_DEVICE
);
...
...
@@ -1639,7 +1673,7 @@ static u16 ixgbe_clean_test_rings(struct ixgbe_adapter *adapter,
/* unmap buffer on Tx side */
tx_buffer_info
=
&
tx_ring
->
tx_buffer_info
[
tx_ntc
];
ixgbe_unmap_and_free_tx_resource
(
adapter
,
tx_buffer_info
);
ixgbe_unmap_and_free_tx_resource
(
tx_ring
,
tx_buffer_info
);
/* increment Rx/Tx next to clean counters */
rx_ntc
++
;
...
...
@@ -1655,7 +1689,7 @@ static u16 ixgbe_clean_test_rings(struct ixgbe_adapter *adapter,
}
/* re-map buffers to ring, store next to clean values */
ixgbe_alloc_rx_buffers
(
adapter
,
rx_ring
,
count
);
ixgbe_alloc_rx_buffers
(
rx_ring
,
count
);
rx_ring
->
next_to_clean
=
rx_ntc
;
tx_ring
->
next_to_clean
=
tx_ntc
;
...
...
@@ -1699,7 +1733,6 @@ static int ixgbe_run_loopback_test(struct ixgbe_adapter *adapter)
for
(
i
=
0
;
i
<
64
;
i
++
)
{
skb_get
(
skb
);
tx_ret_val
=
ixgbe_xmit_frame_ring
(
skb
,
adapter
->
netdev
,
adapter
,
tx_ring
);
if
(
tx_ret_val
==
NETDEV_TX_OK
)
...
...
@@ -1714,8 +1747,7 @@ static int ixgbe_run_loopback_test(struct ixgbe_adapter *adapter)
/* allow 200 milliseconds for packets to go from Tx to Rx */
msleep
(
200
);
good_cnt
=
ixgbe_clean_test_rings
(
adapter
,
rx_ring
,
tx_ring
,
size
);
good_cnt
=
ixgbe_clean_test_rings
(
rx_ring
,
tx_ring
,
size
);
if
(
good_cnt
!=
64
)
{
ret_val
=
13
;
break
;
...
...
@@ -1848,6 +1880,13 @@ static int ixgbe_wol_exclusion(struct ixgbe_adapter *adapter,
int
retval
=
1
;
switch
(
hw
->
device_id
)
{
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
;
}
case
IXGBE_DEV_ID_82599_KX4
:
retval
=
0
;
break
;
...
...
@@ -1985,6 +2024,41 @@ static int ixgbe_get_coalesce(struct net_device *netdev,
return
0
;
}
/*
* this function must be called before setting the new value of
* rx_itr_setting
*/
static
bool
ixgbe_update_rsc
(
struct
ixgbe_adapter
*
adapter
,
struct
ethtool_coalesce
*
ec
)
{
struct
net_device
*
netdev
=
adapter
->
netdev
;
if
(
!
(
adapter
->
flags2
&
IXGBE_FLAG2_RSC_CAPABLE
))
return
false
;
/* if interrupt rate is too high then disable RSC */
if
(
ec
->
rx_coalesce_usecs
!=
1
&&
ec
->
rx_coalesce_usecs
<=
1000000
/
IXGBE_MAX_RSC_INT_RATE
)
{
if
(
adapter
->
flags2
&
IXGBE_FLAG2_RSC_ENABLED
)
{
e_info
(
probe
,
"rx-usecs set too low, "
"disabling RSC
\n
"
);
adapter
->
flags2
&=
~
IXGBE_FLAG2_RSC_ENABLED
;
return
true
;
}
}
else
{
/* check the feature flag value and enable RSC if necessary */
if
((
netdev
->
features
&
NETIF_F_LRO
)
&&
!
(
adapter
->
flags2
&
IXGBE_FLAG2_RSC_ENABLED
))
{
e_info
(
probe
,
"rx-usecs set to %d, "
"re-enabling RSC
\n
"
,
ec
->
rx_coalesce_usecs
);
adapter
->
flags2
|=
IXGBE_FLAG2_RSC_ENABLED
;
return
true
;
}
}
return
false
;
}
static
int
ixgbe_set_coalesce
(
struct
net_device
*
netdev
,
struct
ethtool_coalesce
*
ec
)
{
...
...
@@ -2002,17 +2076,14 @@ static int ixgbe_set_coalesce(struct net_device *netdev,
adapter
->
tx_ring
[
0
]
->
work_limit
=
ec
->
tx_max_coalesced_frames_irq
;
if
(
ec
->
rx_coalesce_usecs
>
1
)
{
u32
max_int
;
if
(
adapter
->
flags2
&
IXGBE_FLAG2_RSC_ENABLED
)
max_int
=
IXGBE_MAX_RSC_INT_RATE
;
else
max_int
=
IXGBE_MAX_INT_RATE
;
/* check the limits */
if
((
1000000
/
ec
->
rx_coalesce_usecs
>
max_int
)
||
if
((
1000000
/
ec
->
rx_coalesce_usecs
>
IXGBE_MAX_INT_RATE
)
||
(
1000000
/
ec
->
rx_coalesce_usecs
<
IXGBE_MIN_INT_RATE
))
return
-
EINVAL
;
/* check the old value and enable RSC if necessary */
need_reset
=
ixgbe_update_rsc
(
adapter
,
ec
);
/* store the value in ints/second */
adapter
->
rx_eitr_param
=
1000000
/
ec
->
rx_coalesce_usecs
;
...
...
@@ -2021,32 +2092,21 @@ static int ixgbe_set_coalesce(struct net_device *netdev,
/* clear the lower bit as its used for dynamic state */
adapter
->
rx_itr_setting
&=
~
1
;
}
else
if
(
ec
->
rx_coalesce_usecs
==
1
)
{
/* check the old value and enable RSC if necessary */
need_reset
=
ixgbe_update_rsc
(
adapter
,
ec
);
/* 1 means dynamic mode */
adapter
->
rx_eitr_param
=
20000
;
adapter
->
rx_itr_setting
=
1
;
}
else
{
/* check the old value and enable RSC if necessary */
need_reset
=
ixgbe_update_rsc
(
adapter
,
ec
);
/*
* any other value means disable eitr, which is best
* served by setting the interrupt rate very high
*/
adapter
->
rx_eitr_param
=
IXGBE_MAX_INT_RATE
;
adapter
->
rx_itr_setting
=
0
;
/*
* if hardware RSC is enabled, disable it when
* setting low latency mode, to avoid errata, assuming
* that when the user set low latency mode they want
* it at the cost of anything else
*/
if
(
adapter
->
flags2
&
IXGBE_FLAG2_RSC_ENABLED
)
{
adapter
->
flags2
&=
~
IXGBE_FLAG2_RSC_ENABLED
;
if
(
netdev
->
features
&
NETIF_F_LRO
)
{
netdev
->
features
&=
~
NETIF_F_LRO
;
e_info
(
probe
,
"rx-usecs set to 0, "
"disabling RSC
\n
"
);
}
need_reset
=
true
;
}
}
if
(
ec
->
tx_coalesce_usecs
>
1
)
{
...
...
@@ -2133,28 +2193,39 @@ static int ixgbe_set_flags(struct net_device *netdev, u32 data)
return
rc
;
/* if state changes we need to update adapter->flags and reset */
if
(
adapter
->
flags2
&
IXGBE_FLAG2_RSC_CAPABLE
)
{
/*
* cast both to bool and verify if they are set the same
* but only enable RSC if itr is non-zero, as
* itr=0 and RSC are mutually exclusive
*/
if
(((
!!
(
data
&
ETH_FLAG_LRO
))
!=
(
!!
(
adapter
->
flags2
&
IXGBE_FLAG2_RSC_ENABLED
)))
&&
adapter
->
rx_itr_setting
)
{
if
(
(
adapter
->
flags2
&
IXGBE_FLAG2_RSC_CAPABLE
)
&&
(
!!
(
data
&
ETH_FLAG_LRO
)
!=
!!
(
adapter
->
flags2
&
IXGBE_FLAG2_RSC_ENABLED
)))
{
if
((
data
&
ETH_FLAG_LRO
)
&&
(
!
adapter
->
rx_itr_setting
||
(
adapter
->
rx_itr_setting
>
IXGBE_MAX_RSC_INT_RATE
)))
{
e_info
(
probe
,
"rx-usecs set too low, "
"not enabling RSC.
\n
"
);
}
else
{
adapter
->
flags2
^=
IXGBE_FLAG2_RSC_ENABLED
;
switch
(
adapter
->
hw
.
mac
.
type
)
{
case
ixgbe_mac_82599EB
:
need_reset
=
true
;
break
;
case
ixgbe_mac_X540
:
{
int
i
;
for
(
i
=
0
;
i
<
adapter
->
num_rx_queues
;
i
++
)
{
struct
ixgbe_ring
*
ring
=
adapter
->
rx_ring
[
i
];
if
(
adapter
->
flags2
&
IXGBE_FLAG2_RSC_ENABLED
)
{
ixgbe_configure_rscctl
(
adapter
,
ring
);
}
else
{
ixgbe_clear_rscctl
(
adapter
,
ring
);
}
}
}
break
;
default:
break
;
}
}
else
if
(
!
adapter
->
rx_itr_setting
)
{
netdev
->
features
&=
~
NETIF_F_LRO
;
if
(
data
&
ETH_FLAG_LRO
)
e_info
(
probe
,
"rx-usecs set to 0, "
"LRO/RSC cannot be enabled.
\n
"
);
}
}
...
...
drivers/net/ixgbe/ixgbe_fcoe.c
浏览文件 @
a1082bfe
...
...
@@ -68,7 +68,7 @@ static inline bool ixgbe_rx_is_fcoe(union ixgbe_adv_rx_desc *rx_desc)
static
inline
void
ixgbe_fcoe_clear_ddp
(
struct
ixgbe_fcoe_ddp
*
ddp
)
{
ddp
->
len
=
0
;
ddp
->
err
=
0
;
ddp
->
err
=
1
;
ddp
->
udl
=
NULL
;
ddp
->
udp
=
0UL
;
ddp
->
sgl
=
NULL
;
...
...
@@ -92,6 +92,7 @@ int ixgbe_fcoe_ddp_put(struct net_device *netdev, u16 xid)
struct
ixgbe_fcoe
*
fcoe
;
struct
ixgbe_adapter
*
adapter
;
struct
ixgbe_fcoe_ddp
*
ddp
;
u32
fcbuff
;
if
(
!
netdev
)
goto
out_ddp_put
;
...
...
@@ -115,7 +116,14 @@ int ixgbe_fcoe_ddp_put(struct net_device *netdev, u16 xid)
IXGBE_WRITE_REG
(
&
adapter
->
hw
,
IXGBE_FCBUFF
,
0
);
IXGBE_WRITE_REG
(
&
adapter
->
hw
,
IXGBE_FCDMARW
,
(
xid
|
IXGBE_FCDMARW_WE
));
/* guaranteed to be invalidated after 100us */
IXGBE_WRITE_REG
(
&
adapter
->
hw
,
IXGBE_FCDMARW
,
(
xid
|
IXGBE_FCDMARW_RE
));
fcbuff
=
IXGBE_READ_REG
(
&
adapter
->
hw
,
IXGBE_FCBUFF
);
spin_unlock_bh
(
&
fcoe
->
lock
);
if
(
fcbuff
&
IXGBE_FCBUFF_VALID
)
udelay
(
100
);
}
if
(
ddp
->
sgl
)
pci_unmap_sg
(
adapter
->
pdev
,
ddp
->
sgl
,
ddp
->
sgc
,
...
...
@@ -168,6 +176,11 @@ int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid,
return
0
;
}
/* no DDP if we are already down or resetting */
if
(
test_bit
(
__IXGBE_DOWN
,
&
adapter
->
state
)
||
test_bit
(
__IXGBE_RESETTING
,
&
adapter
->
state
))
return
0
;
fcoe
=
&
adapter
->
fcoe
;
if
(
!
fcoe
->
pool
)
{
e_warn
(
drv
,
"xid=0x%x no ddp pool for fcoe
\n
"
,
xid
);
...
...
drivers/net/ixgbe/ixgbe_main.c
浏览文件 @
a1082bfe
此差异已折叠。
点击以展开。
drivers/net/ixgbe/ixgbe_mbx.c
浏览文件 @
a1082bfe
...
...
@@ -319,8 +319,14 @@ static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_number)
u32
vflre
=
0
;
s32
ret_val
=
IXGBE_ERR_MBX
;
if
(
hw
->
mac
.
type
==
ixgbe_mac_82599EB
)
switch
(
hw
->
mac
.
type
)
{
case
ixgbe_mac_82599EB
:
case
ixgbe_mac_X540
:
vflre
=
IXGBE_READ_REG
(
hw
,
IXGBE_VFLRE
(
reg_offset
));
break
;
default:
break
;
}
if
(
vflre
&
(
1
<<
vf_shift
))
{
ret_val
=
0
;
...
...
@@ -439,22 +445,26 @@ void ixgbe_init_mbx_params_pf(struct ixgbe_hw *hw)
{
struct
ixgbe_mbx_info
*
mbx
=
&
hw
->
mbx
;
if
(
hw
->
mac
.
type
!=
ixgbe_mac_82599EB
)
return
;
mbx
->
timeout
=
0
;
mbx
->
usec_delay
=
0
;
mbx
->
size
=
IXGBE_VFMAILBOX_SIZE
;
mbx
->
stats
.
msgs_tx
=
0
;
mbx
->
stats
.
msgs_rx
=
0
;
mbx
->
stats
.
reqs
=
0
;
mbx
->
stats
.
acks
=
0
;
mbx
->
stats
.
rsts
=
0
;
switch
(
hw
->
mac
.
type
)
{
case
ixgbe_mac_82599EB
:
case
ixgbe_mac_X540
:
mbx
->
timeout
=
0
;
mbx
->
usec_delay
=
0
;
mbx
->
size
=
IXGBE_VFMAILBOX_SIZE
;
mbx
->
stats
.
msgs_tx
=
0
;
mbx
->
stats
.
msgs_rx
=
0
;
mbx
->
stats
.
reqs
=
0
;
mbx
->
stats
.
acks
=
0
;
mbx
->
stats
.
rsts
=
0
;
break
;
default:
break
;
}
}
struct
ixgbe_mbx_operations
mbx_ops_
82599
=
{
struct
ixgbe_mbx_operations
mbx_ops_
generic
=
{
.
read
=
ixgbe_read_mbx_pf
,
.
write
=
ixgbe_write_mbx_pf
,
.
read_posted
=
ixgbe_read_posted_mbx
,
...
...
drivers/net/ixgbe/ixgbe_mbx.h
浏览文件 @
a1082bfe
...
...
@@ -88,6 +88,6 @@ s32 ixgbe_check_for_ack(struct ixgbe_hw *, u16);
s32
ixgbe_check_for_rst
(
struct
ixgbe_hw
*
,
u16
);
void
ixgbe_init_mbx_params_pf
(
struct
ixgbe_hw
*
);
extern
struct
ixgbe_mbx_operations
mbx_ops_
82599
;
extern
struct
ixgbe_mbx_operations
mbx_ops_
generic
;
#endif
/* _IXGBE_MBX_H_ */
drivers/net/ixgbe/ixgbe_phy.c
浏览文件 @
a1082bfe
...
...
@@ -115,6 +115,9 @@ static enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id)
case
TN1010_PHY_ID
:
phy_type
=
ixgbe_phy_tn
;
break
;
case
AQ1202_PHY_ID
:
phy_type
=
ixgbe_phy_aq
;
break
;
case
QT2022_PHY_ID
:
phy_type
=
ixgbe_phy_qt
;
break
;
...
...
@@ -424,6 +427,39 @@ s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
return
0
;
}
/**
* ixgbe_get_copper_link_capabilities_generic - Determines link capabilities
* @hw: pointer to hardware structure
* @speed: pointer to link speed
* @autoneg: boolean auto-negotiation value
*
* Determines the link capabilities by reading the AUTOC register.
*/
s32
ixgbe_get_copper_link_capabilities_generic
(
struct
ixgbe_hw
*
hw
,
ixgbe_link_speed
*
speed
,
bool
*
autoneg
)
{
s32
status
=
IXGBE_ERR_LINK_SETUP
;
u16
speed_ability
;
*
speed
=
0
;
*
autoneg
=
true
;
status
=
hw
->
phy
.
ops
.
read_reg
(
hw
,
MDIO_SPEED
,
MDIO_MMD_PMAPMD
,
&
speed_ability
);
if
(
status
==
0
)
{
if
(
speed_ability
&
MDIO_SPEED_10G
)
*
speed
|=
IXGBE_LINK_SPEED_10GB_FULL
;
if
(
speed_ability
&
MDIO_PMA_SPEED_1000
)
*
speed
|=
IXGBE_LINK_SPEED_1GB_FULL
;
if
(
speed_ability
&
MDIO_PMA_SPEED_100
)
*
speed
|=
IXGBE_LINK_SPEED_100_FULL
;
}
return
status
;
}
/**
* ixgbe_reset_phy_nl - Performs a PHY reset
* @hw: pointer to hardware structure
...
...
@@ -1377,6 +1413,22 @@ s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw,
return
status
;
}
/**
* ixgbe_get_phy_firmware_version_generic - Gets the PHY Firmware Version
* @hw: pointer to hardware structure
* @firmware_version: pointer to the PHY Firmware Version
**/
s32
ixgbe_get_phy_firmware_version_generic
(
struct
ixgbe_hw
*
hw
,
u16
*
firmware_version
)
{
s32
status
=
0
;
status
=
hw
->
phy
.
ops
.
read_reg
(
hw
,
AQ_FW_REV
,
MDIO_MMD_VEND1
,
firmware_version
);
return
status
;
}
/**
* ixgbe_tn_check_overtemp - Checks if an overtemp occured.
* @hw: pointer to hardware structure
...
...
drivers/net/ixgbe/ixgbe_phy.h
浏览文件 @
a1082bfe
...
...
@@ -96,6 +96,9 @@ s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
ixgbe_link_speed
speed
,
bool
autoneg
,
bool
autoneg_wait_to_complete
);
s32
ixgbe_get_copper_link_capabilities_generic
(
struct
ixgbe_hw
*
hw
,
ixgbe_link_speed
*
speed
,
bool
*
autoneg
);
/* PHY specific */
s32
ixgbe_check_phy_link_tnx
(
struct
ixgbe_hw
*
hw
,
...
...
@@ -103,6 +106,8 @@ s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw,
bool
*
link_up
);
s32
ixgbe_get_phy_firmware_version_tnx
(
struct
ixgbe_hw
*
hw
,
u16
*
firmware_version
);
s32
ixgbe_get_phy_firmware_version_generic
(
struct
ixgbe_hw
*
hw
,
u16
*
firmware_version
);
s32
ixgbe_reset_phy_nl
(
struct
ixgbe_hw
*
hw
);
s32
ixgbe_identify_sfp_module_generic
(
struct
ixgbe_hw
*
hw
);
...
...
drivers/net/ixgbe/ixgbe_sriov.c
浏览文件 @
a1082bfe
...
...
@@ -178,8 +178,7 @@ static int ixgbe_set_vf_mac(struct ixgbe_adapter *adapter,
int
ixgbe_vf_configuration
(
struct
pci_dev
*
pdev
,
unsigned
int
event_mask
)
{
unsigned
char
vf_mac_addr
[
6
];
struct
net_device
*
netdev
=
pci_get_drvdata
(
pdev
);
struct
ixgbe_adapter
*
adapter
=
netdev_priv
(
netdev
);
struct
ixgbe_adapter
*
adapter
=
pci_get_drvdata
(
pdev
);
unsigned
int
vfn
=
(
event_mask
&
0x3f
);
bool
enable
=
((
event_mask
&
0x10000000U
)
!=
0
);
...
...
drivers/net/ixgbe/ixgbe_type.h
浏览文件 @
a1082bfe
...
...
@@ -57,6 +57,8 @@
#define IXGBE_DEV_ID_82599_SFP_EM 0x1507
#define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC
#define IXGBE_DEV_ID_82599_COMBO_BACKPLANE 0x10F8
#define IXGBE_SUBDEV_ID_82599_KX4_KR_MEZZ 0x000C
#define IXGBE_DEV_ID_X540T 0x1528
/* General Registers */
#define IXGBE_CTRL 0x00000
...
...
@@ -994,8 +996,10 @@
/* PHY IDs*/
#define TN1010_PHY_ID 0x00A19410
#define TNX_FW_REV 0xB
#define AQ1202_PHY_ID 0x03A1B440
#define QT2022_PHY_ID 0x0043A400
#define ATH_PHY_ID 0x03429050
#define AQ_FW_REV 0x20
/* PHY Types */
#define IXGBE_M88E1145_E_PHY_ID 0x01410CD0
...
...
@@ -1491,6 +1495,7 @@
#define IXGBE_EEC_PRES 0x00000100
/* EEPROM Present */
#define IXGBE_EEC_ARD 0x00000200
/* EEPROM Auto Read Done */
#define IXGBE_EEC_FLUP 0x00800000
/* Flash update command */
#define IXGBE_EEC_SEC1VAL 0x02000000
/* Sector 1 Valid */
#define IXGBE_EEC_FLUDONE 0x04000000
/* Flash update done */
/* EEPROM Addressing bits based on type (0-small, 1-large) */
#define IXGBE_EEC_ADDR_SIZE 0x00000400
...
...
@@ -1505,7 +1510,9 @@
#define IXGBE_EEPROM_SUM 0xBABA
#define IXGBE_PCIE_ANALOG_PTR 0x03
#define IXGBE_ATLAS0_CONFIG_PTR 0x04
#define IXGBE_PHY_PTR 0x04
#define IXGBE_ATLAS1_CONFIG_PTR 0x05
#define IXGBE_OPTION_ROM_PTR 0x05
#define IXGBE_PCIE_GENERAL_PTR 0x06
#define IXGBE_PCIE_CONFIG0_PTR 0x07
#define IXGBE_PCIE_CONFIG1_PTR 0x08
...
...
@@ -2113,6 +2120,14 @@ typedef u32 ixgbe_physical_layer;
#define IXGBE_PHYSICAL_LAYER_10GBASE_XAUI 0x1000
#define IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA 0x2000
/* Flow Control Macros */
#define PAUSE_RTT 8
#define PAUSE_MTU(MTU) ((MTU + 1024 - 1) / 1024)
#define FC_HIGH_WATER(MTU) ((((PAUSE_RTT + PAUSE_MTU(MTU)) * 144) + 99) / 100 +\
PAUSE_MTU(MTU))
#define FC_LOW_WATER(MTU) (2 * (2 * PAUSE_MTU(MTU) + PAUSE_RTT))
/* Software ATR hash keys */
#define IXGBE_ATR_BUCKET_HASH_KEY 0xE214AD3D
#define IXGBE_ATR_SIGNATURE_HASH_KEY 0x14364D17
...
...
@@ -2164,6 +2179,7 @@ struct ixgbe_atr_input_masks {
enum
ixgbe_eeprom_type
{
ixgbe_eeprom_uninitialized
=
0
,
ixgbe_eeprom_spi
,
ixgbe_flash
,
ixgbe_eeprom_none
/* No NVM support */
};
...
...
@@ -2171,12 +2187,14 @@ enum ixgbe_mac_type {
ixgbe_mac_unknown
=
0
,
ixgbe_mac_82598EB
,
ixgbe_mac_82599EB
,
ixgbe_mac_X540
,
ixgbe_num_macs
};
enum
ixgbe_phy_type
{
ixgbe_phy_unknown
=
0
,
ixgbe_phy_tn
,
ixgbe_phy_aq
,
ixgbe_phy_cu_unknown
,
ixgbe_phy_qt
,
ixgbe_phy_xaui
,
...
...
@@ -2405,6 +2423,7 @@ struct ixgbe_eeprom_operations {
s32
(
*
write
)(
struct
ixgbe_hw
*
,
u16
,
u16
);
s32
(
*
validate_checksum
)(
struct
ixgbe_hw
*
,
u16
*
);
s32
(
*
update_checksum
)(
struct
ixgbe_hw
*
);
u16
(
*
calc_checksum
)(
struct
ixgbe_hw
*
);
};
struct
ixgbe_mac_operations
{
...
...
@@ -2574,6 +2593,7 @@ struct ixgbe_hw {
u16
subsystem_vendor_id
;
u8
revision_id
;
bool
adapter_stopped
;
bool
force_full_reset
;
};
struct
ixgbe_info
{
...
...
drivers/net/ixgbe/ixgbe_x540.c
0 → 100644
浏览文件 @
a1082bfe
此差异已折叠。
点击以展开。
drivers/net/ixgbevf/Makefile
浏览文件 @
a1082bfe
################################################################################
#
# Intel 82599 Virtual Function driver
# Copyright(c) 1999 - 20
09
Intel Corporation.
# Copyright(c) 1999 - 20
10
Intel Corporation.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms and conditions of the GNU General Public License,
...
...
drivers/net/ixgbevf/defines.h
浏览文件 @
a1082bfe
/*******************************************************************************
Intel 82599 Virtual Function driver
Copyright(c) 1999 - 20
09
Intel Corporation.
Copyright(c) 1999 - 20
10
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
drivers/net/ixgbevf/ixgbevf.h
浏览文件 @
a1082bfe
/*******************************************************************************
Intel 82599 Virtual Function driver
Copyright(c) 1999 - 20
09
Intel Corporation.
Copyright(c) 1999 - 20
10
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
drivers/net/ixgbevf/ixgbevf_main.c
浏览文件 @
a1082bfe
/*******************************************************************************
Intel 82599 Virtual Function driver
Copyright(c) 1999 - 20
09
Intel Corporation.
Copyright(c) 1999 - 20
10
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
@@ -51,9 +51,10 @@ char ixgbevf_driver_name[] = "ixgbevf";
static
const
char
ixgbevf_driver_string
[]
=
"Intel(R) 82599 Virtual Function"
;
#define DRV_VERSION "1.0.
0
-k0"
#define DRV_VERSION "1.0.
12
-k0"
const
char
ixgbevf_driver_version
[]
=
DRV_VERSION
;
static
char
ixgbevf_copyright
[]
=
"Copyright (c) 2009 Intel Corporation."
;
static
char
ixgbevf_copyright
[]
=
"Copyright (c) 2009 - 2010 Intel Corporation."
;
static
const
struct
ixgbevf_info
*
ixgbevf_info_tbl
[]
=
{
[
board_82599_vf
]
=
&
ixgbevf_vf_info
,
...
...
@@ -3424,10 +3425,6 @@ static int __devinit ixgbevf_probe(struct pci_dev *pdev,
if
(
hw
->
mac
.
ops
.
get_bus_info
)
hw
->
mac
.
ops
.
get_bus_info
(
hw
);
netif_carrier_off
(
netdev
);
netif_tx_stop_all_queues
(
netdev
);
strcpy
(
netdev
->
name
,
"eth%d"
);
err
=
register_netdev
(
netdev
);
...
...
@@ -3436,6 +3433,8 @@ static int __devinit ixgbevf_probe(struct pci_dev *pdev,
adapter
->
netdev_registered
=
true
;
netif_carrier_off
(
netdev
);
ixgbevf_init_last_counter_stats
(
adapter
);
/* print the MAC address */
...
...
drivers/net/ixgbevf/mbx.c
浏览文件 @
a1082bfe
/*******************************************************************************
Intel 82599 Virtual Function driver
Copyright(c) 1999 - 20
09
Intel Corporation.
Copyright(c) 1999 - 20
10
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
drivers/net/ixgbevf/mbx.h
浏览文件 @
a1082bfe
/*******************************************************************************
Intel 82599 Virtual Function driver
Copyright(c) 1999 - 20
09
Intel Corporation.
Copyright(c) 1999 - 20
10
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
drivers/net/ixgbevf/regs.h
浏览文件 @
a1082bfe
/*******************************************************************************
Intel 82599 Virtual Function driver
Copyright(c) 1999 - 20
09
Intel Corporation.
Copyright(c) 1999 - 20
10
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
drivers/net/ixgbevf/vf.c
浏览文件 @
a1082bfe
/*******************************************************************************
Intel 82599 Virtual Function driver
Copyright(c) 1999 - 20
09
Intel Corporation.
Copyright(c) 1999 - 20
10
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
drivers/net/ixgbevf/vf.h
浏览文件 @
a1082bfe
/*******************************************************************************
Intel 82599 Virtual Function driver
Copyright(c) 1999 - 20
09
Intel Corporation.
Copyright(c) 1999 - 20
10
Intel Corporation.
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录