Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
1c11a0a1
Commit
1c11a0a1
authored
Jun 20, 2012
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
parents
da557374
db018963
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
291 additions
and
143 deletions
+291
-143
drivers/net/ethernet/intel/e1000/e1000_main.c
drivers/net/ethernet/intel/e1000/e1000_main.c
+6
-6
drivers/net/ethernet/intel/igb/e1000_regs.h
drivers/net/ethernet/intel/igb/e1000_regs.h
+1
-0
drivers/net/ethernet/intel/igb/igb.h
drivers/net/ethernet/intel/igb/igb.h
+19
-6
drivers/net/ethernet/intel/igb/igb_ethtool.c
drivers/net/ethernet/intel/igb/igb_ethtool.c
+42
-10
drivers/net/ethernet/intel/igb/igb_main.c
drivers/net/ethernet/intel/igb/igb_main.c
+126
-30
drivers/net/ethernet/intel/igb/igb_ptp.c
drivers/net/ethernet/intel/igb/igb_ptp.c
+11
-1
drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c
drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c
+3
-1
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
+62
-85
drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
+19
-4
drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
+2
-0
No files found.
drivers/net/ethernet/intel/e1000/e1000_main.c
View file @
1c11a0a1
...
...
@@ -1078,18 +1078,18 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
netdev
->
priv_flags
|=
IFF_SUPP_NOFCS
;
netdev
->
features
|=
netdev
->
hw_features
;
netdev
->
hw_features
|=
NETIF_F_RXCSUM
;
netdev
->
hw_features
|=
NETIF_F_RXALL
;
netdev
->
hw_features
|=
NETIF_F_RXFCS
;
netdev
->
hw_features
|=
(
NETIF_F_RXCSUM
|
NETIF_F_RXALL
|
NETIF_F_RXFCS
)
;
if
(
pci_using_dac
)
{
netdev
->
features
|=
NETIF_F_HIGHDMA
;
netdev
->
vlan_features
|=
NETIF_F_HIGHDMA
;
}
netdev
->
vlan_features
|=
NETIF_F_TSO
;
netdev
->
vlan_features
|=
NETIF_F_HW_CSUM
;
netdev
->
vlan_features
|=
NETIF_F_SG
;
netdev
->
vlan_features
|=
(
NETIF_F_TSO
|
NETIF_F_HW_CSUM
|
NETIF_F_SG
)
;
netdev
->
priv_flags
|=
IFF_UNICAST_FLT
;
...
...
drivers/net/ethernet/intel/igb/e1000_regs.h
View file @
1c11a0a1
...
...
@@ -117,6 +117,7 @@
/* TX Rate Limit Registers */
#define E1000_RTTDQSEL 0x3604
/* Tx Desc Plane Queue Select - WO */
#define E1000_RTTBCNRM 0x3690
/* Tx BCN Rate-scheduler MMW */
#define E1000_RTTBCNRC 0x36B0
/* Tx BCN Rate-Scheduler Config - WO */
/* Split and Replication RX Control - RW */
...
...
drivers/net/ethernet/intel/igb/igb.h
View file @
1c11a0a1
...
...
@@ -65,19 +65,30 @@ struct igb_adapter;
#define MAX_Q_VECTORS 8
/* Transmit and receive queues */
#define IGB_MAX_RX_QUEUES ((adapter->vfs_allocated_count ? 2 : \
(hw->mac.type > e1000_82575 ? 8 : 4)))
#define IGB_MAX_RX_QUEUES_I210 4
#define IGB_MAX_RX_QUEUES 8
#define IGB_MAX_RX_QUEUES_82575 4
#define IGB_MAX_RX_QUEUES_I211 2
#define IGB_MAX_TX_QUEUES 16
#define IGB_MAX_TX_QUEUES_I210 4
#define IGB_MAX_TX_QUEUES_I211 2
#define IGB_MAX_TX_QUEUES 8
#define IGB_MAX_VF_MC_ENTRIES 30
#define IGB_MAX_VF_FUNCTIONS 8
#define IGB_MAX_VFTA_ENTRIES 128
#define IGB_82576_VF_DEV_ID 0x10CA
#define IGB_I350_VF_DEV_ID 0x1520
/* NVM version defines */
#define IGB_MAJOR_MASK 0xF000
#define IGB_MINOR_MASK 0x0FF0
#define IGB_BUILD_MASK 0x000F
#define IGB_COMB_VER_MASK 0x00FF
#define IGB_MAJOR_SHIFT 12
#define IGB_MINOR_SHIFT 4
#define IGB_COMB_VER_SHFT 8
#define IGB_NVM_VER_INVALID 0xFFFF
#define IGB_ETRACK_SHIFT 16
#define NVM_ETRACK_WORD 0x0042
#define NVM_COMB_VER_OFF 0x0083
#define NVM_COMB_VER_PTR 0x003d
struct
vf_data_storage
{
unsigned
char
vf_mac_addresses
[
ETH_ALEN
];
u16
vf_mc_hashes
[
IGB_MAX_VF_MC_ENTRIES
];
...
...
@@ -371,6 +382,7 @@ struct igb_adapter {
spinlock_t
tmreg_lock
;
struct
cyclecounter
cc
;
struct
timecounter
tc
;
char
fw_version
[
32
];
};
#define IGB_FLAG_HAS_MSI (1 << 0)
...
...
@@ -420,6 +432,7 @@ extern void igb_update_stats(struct igb_adapter *, struct rtnl_link_stats64 *);
extern
bool
igb_has_link
(
struct
igb_adapter
*
adapter
);
extern
void
igb_set_ethtool_ops
(
struct
net_device
*
);
extern
void
igb_power_up_link
(
struct
igb_adapter
*
);
extern
void
igb_set_fw_version
(
struct
igb_adapter
*
);
#ifdef CONFIG_IGB_PTP
extern
void
igb_ptp_init
(
struct
igb_adapter
*
adapter
);
extern
void
igb_ptp_remove
(
struct
igb_adapter
*
adapter
);
...
...
drivers/net/ethernet/intel/igb/igb_ethtool.c
View file @
1c11a0a1
...
...
@@ -710,6 +710,7 @@ static int igb_set_eeprom(struct net_device *netdev,
if
((
ret_val
==
0
)
&&
((
first_word
<=
NVM_CHECKSUM_REG
)))
hw
->
nvm
.
ops
.
update
(
hw
);
igb_set_fw_version
(
adapter
);
kfree
(
eeprom_buff
);
return
ret_val
;
}
...
...
@@ -718,20 +719,16 @@ static void igb_get_drvinfo(struct net_device *netdev,
struct
ethtool_drvinfo
*
drvinfo
)
{
struct
igb_adapter
*
adapter
=
netdev_priv
(
netdev
);
u16
eeprom_data
;
strlcpy
(
drvinfo
->
driver
,
igb_driver_name
,
sizeof
(
drvinfo
->
driver
));
strlcpy
(
drvinfo
->
version
,
igb_driver_version
,
sizeof
(
drvinfo
->
version
));
/* EEPROM image version # is reported as firmware version # for
* 82575 controllers */
adapter
->
hw
.
nvm
.
ops
.
read
(
&
adapter
->
hw
,
5
,
1
,
&
eeprom_data
);
snprintf
(
drvinfo
->
fw_version
,
sizeof
(
drvinfo
->
fw_version
),
"%d.%d-%d"
,
(
eeprom_data
&
0xF000
)
>>
12
,
(
eeprom_data
&
0x0FF0
)
>>
4
,
eeprom_data
&
0x000F
);
/*
* EEPROM image version # is reported as firmware version # for
* 82575 controllers
*/
strlcpy
(
drvinfo
->
fw_version
,
adapter
->
fw_version
,
sizeof
(
drvinfo
->
fw_version
));
strlcpy
(
drvinfo
->
bus_info
,
pci_name
(
adapter
->
pdev
),
sizeof
(
drvinfo
->
bus_info
));
drvinfo
->
n_stats
=
IGB_STATS_LEN
;
...
...
@@ -2271,6 +2268,38 @@ static void igb_ethtool_complete(struct net_device *netdev)
pm_runtime_put
(
&
adapter
->
pdev
->
dev
);
}
#ifdef CONFIG_IGB_PTP
static
int
igb_ethtool_get_ts_info
(
struct
net_device
*
dev
,
struct
ethtool_ts_info
*
info
)
{
struct
igb_adapter
*
adapter
=
netdev_priv
(
dev
);
info
->
so_timestamping
=
SOF_TIMESTAMPING_TX_HARDWARE
|
SOF_TIMESTAMPING_RX_HARDWARE
|
SOF_TIMESTAMPING_RAW_HARDWARE
;
if
(
adapter
->
ptp_clock
)
info
->
phc_index
=
ptp_clock_index
(
adapter
->
ptp_clock
);
else
info
->
phc_index
=
-
1
;
info
->
tx_types
=
(
1
<<
HWTSTAMP_TX_OFF
)
|
(
1
<<
HWTSTAMP_TX_ON
);
info
->
rx_filters
=
(
1
<<
HWTSTAMP_FILTER_NONE
)
|
(
1
<<
HWTSTAMP_FILTER_ALL
)
|
(
1
<<
HWTSTAMP_FILTER_SOME
)
|
(
1
<<
HWTSTAMP_FILTER_PTP_V1_L4_SYNC
)
|
(
1
<<
HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ
)
|
(
1
<<
HWTSTAMP_FILTER_PTP_V2_EVENT
);
return
0
;
}
#endif
static
const
struct
ethtool_ops
igb_ethtool_ops
=
{
.
get_settings
=
igb_get_settings
,
.
set_settings
=
igb_set_settings
,
...
...
@@ -2299,6 +2328,9 @@ static const struct ethtool_ops igb_ethtool_ops = {
.
set_coalesce
=
igb_set_coalesce
,
.
begin
=
igb_ethtool_begin
,
.
complete
=
igb_ethtool_complete
,
#ifdef CONFIG_IGB_PTP
.
get_ts_info
=
igb_ethtool_get_ts_info
,
#endif
};
void
igb_set_ethtool_ops
(
struct
net_device
*
netdev
)
...
...
drivers/net/ethernet/intel/igb/igb_main.c
View file @
1c11a0a1
...
...
@@ -59,9 +59,9 @@
#endif
#include "igb.h"
#define MAJ
3
#define MIN
4
#define BUILD
7
#define MAJ
4
#define MIN
0
#define BUILD
1
#define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \
__stringify(BUILD) "-k"
char
igb_driver_name
[]
=
"igb"
;
...
...
@@ -1048,11 +1048,6 @@ static int igb_set_interrupt_capability(struct igb_adapter *adapter)
if
(
!
(
adapter
->
flags
&
IGB_FLAG_QUEUE_PAIRS
))
numvecs
+=
adapter
->
num_tx_queues
;
/* i210 and i211 can only have 4 MSIX vectors for rx/tx queues. */
if
((
adapter
->
hw
.
mac
.
type
==
e1000_i210
)
||
(
adapter
->
hw
.
mac
.
type
==
e1000_i211
))
numvecs
=
4
;
/* store the number of vectors reserved for queues */
adapter
->
num_q_vectors
=
numvecs
;
...
...
@@ -1820,6 +1815,69 @@ static const struct net_device_ops igb_netdev_ops = {
.
ndo_set_features
=
igb_set_features
,
};
/**
* igb_set_fw_version - Configure version string for ethtool
* @adapter: adapter struct
*
**/
void
igb_set_fw_version
(
struct
igb_adapter
*
adapter
)
{
struct
e1000_hw
*
hw
=
&
adapter
->
hw
;
u16
eeprom_verh
,
eeprom_verl
,
comb_verh
,
comb_verl
,
comb_offset
;
u16
major
,
build
,
patch
,
fw_version
;
u32
etrack_id
;
hw
->
nvm
.
ops
.
read
(
hw
,
5
,
1
,
&
fw_version
);
if
(
adapter
->
hw
.
mac
.
type
!=
e1000_i211
)
{
hw
->
nvm
.
ops
.
read
(
hw
,
NVM_ETRACK_WORD
,
1
,
&
eeprom_verh
);
hw
->
nvm
.
ops
.
read
(
hw
,
(
NVM_ETRACK_WORD
+
1
),
1
,
&
eeprom_verl
);
etrack_id
=
(
eeprom_verh
<<
IGB_ETRACK_SHIFT
)
|
eeprom_verl
;
/* combo image version needs to be found */
hw
->
nvm
.
ops
.
read
(
hw
,
NVM_COMB_VER_PTR
,
1
,
&
comb_offset
);
if
((
comb_offset
!=
0x0
)
&&
(
comb_offset
!=
IGB_NVM_VER_INVALID
))
{
hw
->
nvm
.
ops
.
read
(
hw
,
(
NVM_COMB_VER_OFF
+
comb_offset
+
1
),
1
,
&
comb_verh
);
hw
->
nvm
.
ops
.
read
(
hw
,
(
NVM_COMB_VER_OFF
+
comb_offset
),
1
,
&
comb_verl
);
/* Only display Option Rom if it exists and is valid */
if
((
comb_verh
&&
comb_verl
)
&&
((
comb_verh
!=
IGB_NVM_VER_INVALID
)
&&
(
comb_verl
!=
IGB_NVM_VER_INVALID
)))
{
major
=
comb_verl
>>
IGB_COMB_VER_SHFT
;
build
=
(
comb_verl
<<
IGB_COMB_VER_SHFT
)
|
(
comb_verh
>>
IGB_COMB_VER_SHFT
);
patch
=
comb_verh
&
IGB_COMB_VER_MASK
;
snprintf
(
adapter
->
fw_version
,
sizeof
(
adapter
->
fw_version
),
"%d.%d%d, 0x%08x, %d.%d.%d"
,
(
fw_version
&
IGB_MAJOR_MASK
)
>>
IGB_MAJOR_SHIFT
,
(
fw_version
&
IGB_MINOR_MASK
)
>>
IGB_MINOR_SHIFT
,
(
fw_version
&
IGB_BUILD_MASK
),
etrack_id
,
major
,
build
,
patch
);
goto
out
;
}
}
snprintf
(
adapter
->
fw_version
,
sizeof
(
adapter
->
fw_version
),
"%d.%d%d, 0x%08x"
,
(
fw_version
&
IGB_MAJOR_MASK
)
>>
IGB_MAJOR_SHIFT
,
(
fw_version
&
IGB_MINOR_MASK
)
>>
IGB_MINOR_SHIFT
,
(
fw_version
&
IGB_BUILD_MASK
),
etrack_id
);
}
else
{
snprintf
(
adapter
->
fw_version
,
sizeof
(
adapter
->
fw_version
),
"%d.%d%d"
,
(
fw_version
&
IGB_MAJOR_MASK
)
>>
IGB_MAJOR_SHIFT
,
(
fw_version
&
IGB_MINOR_MASK
)
>>
IGB_MINOR_SHIFT
,
(
fw_version
&
IGB_BUILD_MASK
));
}
out:
return
;
}
/**
* igb_probe - Device Initialization Routine
* @pdev: PCI device information struct
...
...
@@ -2030,6 +2088,9 @@ static int __devinit igb_probe(struct pci_dev *pdev,
goto
err_eeprom
;
}
/* get firmware version for ethtool -i */
igb_set_fw_version
(
adapter
);
setup_timer
(
&
adapter
->
watchdog_timer
,
igb_watchdog
,
(
unsigned
long
)
adapter
);
setup_timer
(
&
adapter
->
phy_info_timer
,
igb_update_phy_info
,
...
...
@@ -2338,6 +2399,7 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter)
struct
e1000_hw
*
hw
=
&
adapter
->
hw
;
struct
net_device
*
netdev
=
adapter
->
netdev
;
struct
pci_dev
*
pdev
=
adapter
->
pdev
;
u32
max_rss_queues
;
pci_read_config_word
(
pdev
,
PCI_COMMAND
,
&
hw
->
bus
.
pci_cmd_word
);
...
...
@@ -2370,40 +2432,69 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter)
}
else
adapter
->
vfs_allocated_count
=
max_vfs
;
break
;
case
e1000_i210
:
case
e1000_i211
:
adapter
->
vfs_allocated_count
=
0
;
break
;
default:
break
;
}
#endif
/* CONFIG_PCI_IOV */
/* Determine the maximum number of RSS queues supported. */
switch
(
hw
->
mac
.
type
)
{
case
e1000_i211
:
max_rss_queues
=
IGB_MAX_RX_QUEUES_I211
;
break
;
case
e1000_82575
:
case
e1000_i210
:
adapter
->
rss_queues
=
min_t
(
u32
,
IGB_MAX_RX_QUEUES_I210
,
num_online_cpus
());
max_rss_queues
=
IGB_MAX_RX_QUEUES_82575
;
break
;
case
e1000_i350
:
/* I350 cannot do RSS and SR-IOV at the same time */
if
(
!!
adapter
->
vfs_allocated_count
)
{
max_rss_queues
=
1
;
break
;
}
/* fall through */
case
e1000_82576
:
if
(
!!
adapter
->
vfs_allocated_count
)
{
max_rss_queues
=
2
;
break
;
}
/* fall through */
case
e1000_82580
:
default:
max_rss_queues
=
IGB_MAX_RX_QUEUES
;
break
;
}
adapter
->
rss_queues
=
min_t
(
u32
,
max_rss_queues
,
num_online_cpus
());
/* Determine if we need to pair queues. */
switch
(
hw
->
mac
.
type
)
{
case
e1000_82575
:
case
e1000_i211
:
adapter
->
rss_queues
=
min_t
(
u32
,
IGB_MAX_RX_QUEUES_I211
,
num_online_cpus
());
/* Device supports enough interrupts without queue pairing. */
break
;
case
e1000_82576
:
/*
* If VFs are going to be allocated with RSS queues then we
* should pair the queues in order to conserve interrupts due
* to limited supply.
*/
if
((
adapter
->
rss_queues
>
1
)
&&
(
adapter
->
vfs_allocated_count
>
6
))
adapter
->
flags
|=
IGB_FLAG_QUEUE_PAIRS
;
/* fall through */
case
e1000_82580
:
case
e1000_i350
:
case
e1000_i210
:
default:
adapter
->
rss_queues
=
min_t
(
u32
,
IGB_MAX_RX_QUEUES
,
num_online_cpus
());
/*
* If rss_queues > half of max_rss_queues, pair the queues in
* order to conserve interrupts due to limited supply.
*/
if
(
adapter
->
rss_queues
>
(
max_rss_queues
/
2
))
adapter
->
flags
|=
IGB_FLAG_QUEUE_PAIRS
;
break
;
}
/* i350 cannot do RSS and SR-IOV at the same time */
if
(
hw
->
mac
.
type
==
e1000_i350
&&
adapter
->
vfs_allocated_count
)
adapter
->
rss_queues
=
1
;
/*
* if rss_queues > 4 or vfs are going to be allocated with rss_queues
* then we should combine the queues into a queue pair in order to
* conserve interrupts due to limited supply
*/
if
((
adapter
->
rss_queues
>
4
)
||
((
adapter
->
rss_queues
>
1
)
&&
(
adapter
->
vfs_allocated_count
>
6
)))
adapter
->
flags
|=
IGB_FLAG_QUEUE_PAIRS
;
/* Setup and initialize a copy of the hw vlan table array */
adapter
->
shadow_vfta
=
kzalloc
(
sizeof
(
u32
)
*
...
...
@@ -6997,6 +7088,11 @@ static void igb_set_vf_rate_limit(struct e1000_hw *hw, int vf, int tx_rate,
}
wr32
(
E1000_RTTDQSEL
,
vf
);
/* vf X uses queue X */
/*
* Set global transmit compensation time to the MMW_SIZE in RTTBCNRM
* register. MMW_SIZE=0x014 if 9728-byte jumbo is supported.
*/
wr32
(
E1000_RTTBCNRM
,
0x14
);
wr32
(
E1000_RTTBCNRC
,
bcnrc_val
);
}
...
...
drivers/net/ethernet/intel/igb/igb_ptp.c
View file @
1c11a0a1
...
...
@@ -330,7 +330,17 @@ void igb_ptp_init(struct igb_adapter *adapter)
void
igb_ptp_remove
(
struct
igb_adapter
*
adapter
)
{
cancel_delayed_work_sync
(
&
adapter
->
overflow_work
);
switch
(
adapter
->
hw
.
mac
.
type
)
{
case
e1000_i211
:
case
e1000_i210
:
case
e1000_i350
:
case
e1000_82580
:
case
e1000_82576
:
cancel_delayed_work_sync
(
&
adapter
->
overflow_work
);
break
;
default:
return
;
}
if
(
adapter
->
ptp_clock
)
{
ptp_clock_unregister
(
adapter
->
ptp_clock
);
...
...
drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c
View file @
1c11a0a1
...
...
@@ -241,7 +241,9 @@ static s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw,
/* Determine 1G link capabilities off of SFP+ type */
if
(
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_cu_core0
||
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_cu_core1
)
{
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_cu_core1
||
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_sx_core0
||
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_sx_core1
)
{
*
speed
=
IXGBE_LINK_SPEED_1GB_FULL
;
*
negotiation
=
true
;
goto
out
;
...
...
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
View file @
1c11a0a1
...
...
@@ -154,100 +154,60 @@ static int ixgbe_get_settings(struct net_device *netdev,
{
struct
ixgbe_adapter
*
adapter
=
netdev_priv
(
netdev
);
struct
ixgbe_hw
*
hw
=
&
adapter
->
hw
;
ixgbe_link_speed
supported_link
;
u32
link_speed
=
0
;
bool
autoneg
;
bool
link_up
;
ecmd
->
supported
=
SUPPORTED_10000baseT_Full
;
ecmd
->
autoneg
=
AUTONEG_ENABLE
;
ecmd
->
transceiver
=
XCVR_EXTERNAL
;
if
((
hw
->
phy
.
media_type
==
ixgbe_media_type_copper
)
||
(
hw
->
phy
.
multispeed_fiber
))
{
ecmd
->
supported
|=
(
SUPPORTED_1000baseT_Full
|
SUPPORTED_Autoneg
);
switch
(
hw
->
mac
.
type
)
{
case
ixgbe_mac_X540
:
ecmd
->
supported
|=
SUPPORTED_100baseT_Full
;
break
;
default:
break
;
}
ecmd
->
advertising
=
ADVERTISED_Autoneg
;
if
(
hw
->
phy
.
autoneg_advertised
)
{
if
(
hw
->
phy
.
autoneg_advertised
&
IXGBE_LINK_SPEED_100_FULL
)
ecmd
->
advertising
|=
ADVERTISED_100baseT_Full
;
if
(
hw
->
phy
.
autoneg_advertised
&
IXGBE_LINK_SPEED_10GB_FULL
)
ecmd
->
advertising
|=
ADVERTISED_10000baseT_Full
;
if
(
hw
->
phy
.
autoneg_advertised
&
IXGBE_LINK_SPEED_1GB_FULL
)
ecmd
->
advertising
|=
ADVERTISED_1000baseT_Full
;
}
else
{
/*
* Default advertised modes in case
* phy.autoneg_advertised isn't set.
*/
ecmd
->
advertising
|=
(
ADVERTISED_10000baseT_Full
|
ADVERTISED_1000baseT_Full
);
if
(
hw
->
mac
.
type
==
ixgbe_mac_X540
)
ecmd
->
advertising
|=
ADVERTISED_100baseT_Full
;
}
if
(
hw
->
phy
.
media_type
==
ixgbe_media_type_copper
)
{
ecmd
->
supported
|=
SUPPORTED_TP
;
ecmd
->
advertising
|=
ADVERTISED_TP
;
ecmd
->
port
=
PORT_TP
;
}
else
{
ecmd
->
supported
|=
SUPPORTED_FIBRE
;
ecmd
->
advertising
|=
ADVERTISED_FIBRE
;
ecmd
->
port
=
PORT_FIBRE
;
}
}
else
if
(
hw
->
phy
.
media_type
==
ixgbe_media_type_backplane
)
{
/* Set as FIBRE until SERDES defined in kernel */
if
(
hw
->
device_id
==
IXGBE_DEV_ID_82598_BX
)
{
ecmd
->
supported
=
(
SUPPORTED_1000baseT_Full
|
SUPPORTED_FIBRE
);
ecmd
->
advertising
=
(
ADVERTISED_1000baseT_Full
|
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
);
ecmd
->
advertising
=
(
ADVERTISED_10000baseT_Full
|
ADVERTISED_1000baseT_Full
|
ADVERTISED_FIBRE
);
ecmd
->
port
=
PORT_FIBRE
;
}
hw
->
mac
.
ops
.
get_link_capabilities
(
hw
,
&
supported_link
,
&
autoneg
);
/* set the supported link speeds */
if
(
supported_link
&
IXGBE_LINK_SPEED_10GB_FULL
)
ecmd
->
supported
|=
SUPPORTED_10000baseT_Full
;
if
(
supported_link
&
IXGBE_LINK_SPEED_1GB_FULL
)
ecmd
->
supported
|=
SUPPORTED_1000baseT_Full
;
if
(
supported_link
&
IXGBE_LINK_SPEED_100_FULL
)
ecmd
->
supported
|=
SUPPORTED_100baseT_Full
;
/* set the advertised speeds */
if
(
hw
->
phy
.
autoneg_advertised
)
{
if
(
hw
->
phy
.
autoneg_advertised
&
IXGBE_LINK_SPEED_100_FULL
)
ecmd
->
advertising
|=
ADVERTISED_100baseT_Full
;
if
(
hw
->
phy
.
autoneg_advertised
&
IXGBE_LINK_SPEED_10GB_FULL
)
ecmd
->
advertising
|=
ADVERTISED_10000baseT_Full
;
if
(
hw
->
phy
.
autoneg_advertised
&
IXGBE_LINK_SPEED_1GB_FULL
)
ecmd
->
advertising
|=
ADVERTISED_1000baseT_Full
;
}
else
{
ecmd
->
supported
|=
SUPPORTED_FIBRE
;
ecmd
->
advertising
=
(
ADVERTISED_10000baseT_Full
|
ADVERTISED_FIBRE
);
ecmd
->
port
=
PORT_FIBRE
;
ecmd
->
autoneg
=
AUTONEG_DISABLE
;
/* default modes in case phy.autoneg_advertised isn't set */
if
(
supported_link
&
IXGBE_LINK_SPEED_10GB_FULL
)
ecmd
->
advertising
|=
ADVERTISED_10000baseT_Full
;
if
(
supported_link
&
IXGBE_LINK_SPEED_1GB_FULL
)
ecmd
->
advertising
|=
ADVERTISED_1000baseT_Full
;
if
(
supported_link
&
IXGBE_LINK_SPEED_100_FULL
)
ecmd
->
advertising
|=
ADVERTISED_100baseT_Full
;
}
/* Get PHY type */
if
(
autoneg
)
{
ecmd
->
supported
|=
SUPPORTED_Autoneg
;
ecmd
->
advertising
|=
ADVERTISED_Autoneg
;
ecmd
->
autoneg
=
AUTONEG_ENABLE
;
}
else
ecmd
->
autoneg
=
AUTONEG_DISABLE
;
ecmd
->
transceiver
=
XCVR_EXTERNAL
;
/* Determine the remaining settings based on the PHY type. */
switch
(
adapter
->
hw
.
phy
.
type
)
{
case
ixgbe_phy_tn
:
case
ixgbe_phy_aq
:
case
ixgbe_phy_cu_unknown
:
/* Copper 10G-BASET */
ecmd
->
supported
|=
SUPPORTED_TP
;
ecmd
->
advertising
|=
ADVERTISED_TP
;
ecmd
->
port
=
PORT_TP
;
break
;
case
ixgbe_phy_qt
:
ecmd
->
supported
|=
SUPPORTED_FIBRE
;
ecmd
->
advertising
|=
ADVERTISED_FIBRE
;
ecmd
->
port
=
PORT_FIBRE
;
break
;
case
ixgbe_phy_nl
:
...
...
@@ -257,42 +217,59 @@ static int ixgbe_get_settings(struct net_device *netdev,
case
ixgbe_phy_sfp_avago
:
case
ixgbe_phy_sfp_intel
:
case
ixgbe_phy_sfp_unknown
:
switch
(
adapter
->
hw
.
phy
.
sfp_type
)
{
/* SFP+ devices, further checking needed */
switch
(
adapter
->
hw
.
phy
.
sfp_type
)
{
case
ixgbe_sfp_type_da_cu
:
case
ixgbe_sfp_type_da_cu_core0
:
case
ixgbe_sfp_type_da_cu_core1
:
ecmd
->
supported
|=
SUPPORTED_FIBRE
;
ecmd
->
advertising
|=
ADVERTISED_FIBRE
;
ecmd
->
port
=
PORT_DA
;
break
;
case
ixgbe_sfp_type_sr
:
case
ixgbe_sfp_type_lr
:
case
ixgbe_sfp_type_srlr_core0
:
case
ixgbe_sfp_type_srlr_core1
:
ecmd
->
supported
|=
SUPPORTED_FIBRE
;
ecmd
->
advertising
|=
ADVERTISED_FIBRE
;
ecmd
->
port
=
PORT_FIBRE
;
break
;
case
ixgbe_sfp_type_not_present
:
ecmd
->
supported
|=
SUPPORTED_FIBRE
;
ecmd
->
advertising
|=
ADVERTISED_FIBRE
;
ecmd
->
port
=
PORT_NONE
;
break
;
case
ixgbe_sfp_type_1g_cu_core0
:
case
ixgbe_sfp_type_1g_cu_core1
:
ecmd
->
supported
|=
SUPPORTED_TP
;
ecmd
->
advertising
|=
ADVERTISED_TP
;
ecmd
->
port
=
PORT_TP
;
ecmd
->
supported
=
SUPPORTED_TP
;
ecmd
->
advertising
=
(
ADVERTISED_1000baseT_Full
|
ADVERTISED_TP
);
break
;
case
ixgbe_sfp_type_1g_sx_core0
:
case
ixgbe_sfp_type_1g_sx_core1
:
ecmd
->
supported
|=
SUPPORTED_FIBRE
;
ecmd
->
advertising
|=
ADVERTISED_FIBRE
;
ecmd
->
port
=
PORT_FIBRE
;
break
;
case
ixgbe_sfp_type_unknown
:
default:
ecmd
->
supported
|=
SUPPORTED_FIBRE
;
ecmd
->
advertising
|=
ADVERTISED_FIBRE
;
ecmd
->
port
=
PORT_OTHER
;
break
;
}
break
;
case
ixgbe_phy_xaui
:
ecmd
->
supported
|=
SUPPORTED_FIBRE
;
ecmd
->
advertising
|=
ADVERTISED_FIBRE
;
ecmd
->
port
=
PORT_NONE
;
break
;
case
ixgbe_phy_unknown
:
case
ixgbe_phy_generic
:
case
ixgbe_phy_sfp_unsupported
:
default:
ecmd
->
supported
|=
SUPPORTED_FIBRE
;
ecmd
->
advertising
|=
ADVERTISED_FIBRE
;
ecmd
->
port
=
PORT_OTHER
;
break
;
}
...
...
drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
View file @
1c11a0a1
...
...
@@ -907,6 +907,8 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
* 8 SFP_act_lmt_DA_CORE1 - 82599-specific
* 9 SFP_1g_cu_CORE0 - 82599-specific
* 10 SFP_1g_cu_CORE1 - 82599-specific
* 11 SFP_1g_sx_CORE0 - 82599-specific
* 12 SFP_1g_sx_CORE1 - 82599-specific
*/
if
(
hw
->
mac
.
type
==
ixgbe_mac_82598EB
)
{
if
(
cable_tech
&
IXGBE_SFF_DA_PASSIVE_CABLE
)
...
...
@@ -957,6 +959,13 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
else
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_1g_cu_core1
;
}
else
if
(
comp_codes_1g
&
IXGBE_SFF_1GBASESX_CAPABLE
)
{
if
(
hw
->
bus
.
lan_id
==
0
)
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_1g_sx_core0
;
else
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_1g_sx_core1
;
}
else
{
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_unknown
;
}
...
...
@@ -1049,7 +1058,9 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
/* Verify supported 1G SFP modules */
if
(
comp_codes_10g
==
0
&&
!
(
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_cu_core1
||
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_cu_core0
))
{
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_cu_core0
||
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_sx_core0
||
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_sx_core1
))
{
hw
->
phy
.
type
=
ixgbe_phy_sfp_unsupported
;
status
=
IXGBE_ERR_SFP_NOT_SUPPORTED
;
goto
out
;
...
...
@@ -1064,7 +1075,9 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
hw
->
mac
.
ops
.
get_device_caps
(
hw
,
&
enforce_sfp
);
if
(
!
(
enforce_sfp
&
IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP
)
&&
!
((
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_cu_core0
)
||
(
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_cu_core1
)))
{
(
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_cu_core1
)
||
(
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_sx_core0
)
||
(
hw
->
phy
.
sfp_type
==
ixgbe_sfp_type_1g_sx_core1
)))
{
/* Make sure we're a supported PHY type */
if
(
hw
->
phy
.
type
==
ixgbe_phy_sfp_intel
)
{
status
=
0
;
...
...
@@ -1128,10 +1141,12 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
* SR modules
*/
if
(
sfp_type
==
ixgbe_sfp_type_da_act_lmt_core0
||
sfp_type
==
ixgbe_sfp_type_1g_cu_core0
)
sfp_type
==
ixgbe_sfp_type_1g_cu_core0
||
sfp_type
==
ixgbe_sfp_type_1g_sx_core0
)
sfp_type
=
ixgbe_sfp_type_srlr_core0
;
else
if
(
sfp_type
==
ixgbe_sfp_type_da_act_lmt_core1
||
sfp_type
==
ixgbe_sfp_type_1g_cu_core1
)
sfp_type
==
ixgbe_sfp_type_1g_cu_core1
||
sfp_type
==
ixgbe_sfp_type_1g_sx_core1
)
sfp_type
=
ixgbe_sfp_type_srlr_core1
;
/* Read offset to PHY init contents */
...
...
drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
View file @
1c11a0a1
...
...
@@ -2604,6 +2604,8 @@ enum ixgbe_sfp_type {
ixgbe_sfp_type_da_act_lmt_core1
=
8
,
ixgbe_sfp_type_1g_cu_core0
=
9
,
ixgbe_sfp_type_1g_cu_core1
=
10
,
ixgbe_sfp_type_1g_sx_core0
=
11
,
ixgbe_sfp_type_1g_sx_core1
=
12
,
ixgbe_sfp_type_not_present
=
0xFFFE
,
ixgbe_sfp_type_unknown
=
0xFFFF
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment