Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
a45d49d1
Commit
a45d49d1
authored
Mar 03, 2011
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/jkirsher/net-next-2.6
parents
e066008b
a52055e0
Changes
27
Hide whitespace changes
Inline
Side-by-side
Showing
27 changed files
with
547 additions
and
447 deletions
+547
-447
drivers/net/igb/igb_ethtool.c
drivers/net/igb/igb_ethtool.c
+8
-5
drivers/net/igb/igb_main.c
drivers/net/igb/igb_main.c
+6
-1
drivers/net/ixgbe/ixgbe.h
drivers/net/ixgbe/ixgbe.h
+1
-1
drivers/net/ixgbe/ixgbe_82598.c
drivers/net/ixgbe/ixgbe_82598.c
+40
-23
drivers/net/ixgbe/ixgbe_82599.c
drivers/net/ixgbe/ixgbe_82599.c
+73
-31
drivers/net/ixgbe/ixgbe_common.c
drivers/net/ixgbe/ixgbe_common.c
+173
-265
drivers/net/ixgbe/ixgbe_common.h
drivers/net/ixgbe/ixgbe_common.h
+1
-3
drivers/net/ixgbe/ixgbe_dcb.c
drivers/net/ixgbe/ixgbe_dcb.c
+1
-1
drivers/net/ixgbe/ixgbe_dcb.h
drivers/net/ixgbe/ixgbe_dcb.h
+1
-1
drivers/net/ixgbe/ixgbe_dcb_82598.c
drivers/net/ixgbe/ixgbe_dcb_82598.c
+1
-1
drivers/net/ixgbe/ixgbe_dcb_82598.h
drivers/net/ixgbe/ixgbe_dcb_82598.h
+1
-1
drivers/net/ixgbe/ixgbe_dcb_82599.c
drivers/net/ixgbe/ixgbe_dcb_82599.c
+1
-1
drivers/net/ixgbe/ixgbe_dcb_82599.h
drivers/net/ixgbe/ixgbe_dcb_82599.h
+1
-1
drivers/net/ixgbe/ixgbe_dcb_nl.c
drivers/net/ixgbe/ixgbe_dcb_nl.c
+1
-1
drivers/net/ixgbe/ixgbe_ethtool.c
drivers/net/ixgbe/ixgbe_ethtool.c
+1
-1
drivers/net/ixgbe/ixgbe_fcoe.c
drivers/net/ixgbe/ixgbe_fcoe.c
+1
-1
drivers/net/ixgbe/ixgbe_fcoe.h
drivers/net/ixgbe/ixgbe_fcoe.h
+1
-1
drivers/net/ixgbe/ixgbe_main.c
drivers/net/ixgbe/ixgbe_main.c
+9
-3
drivers/net/ixgbe/ixgbe_mbx.c
drivers/net/ixgbe/ixgbe_mbx.c
+1
-1
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
+174
-64
drivers/net/ixgbe/ixgbe_phy.h
drivers/net/ixgbe/ixgbe_phy.h
+1
-1
drivers/net/ixgbe/ixgbe_sriov.c
drivers/net/ixgbe/ixgbe_sriov.c
+1
-1
drivers/net/ixgbe/ixgbe_sriov.h
drivers/net/ixgbe/ixgbe_sriov.h
+1
-1
drivers/net/ixgbe/ixgbe_type.h
drivers/net/ixgbe/ixgbe_type.h
+23
-17
drivers/net/ixgbe/ixgbe_x540.c
drivers/net/ixgbe/ixgbe_x540.c
+22
-12
drivers/net/ixgbevf/ixgbevf_main.c
drivers/net/ixgbevf/ixgbevf_main.c
+2
-7
No files found.
drivers/net/igb/igb_ethtool.c
View file @
a45d49d1
...
...
@@ -727,8 +727,9 @@ static void igb_get_drvinfo(struct net_device *netdev,
char
firmware_version
[
32
];
u16
eeprom_data
;
strncpy
(
drvinfo
->
driver
,
igb_driver_name
,
32
);
strncpy
(
drvinfo
->
version
,
igb_driver_version
,
32
);
strncpy
(
drvinfo
->
driver
,
igb_driver_name
,
sizeof
(
drvinfo
->
driver
)
-
1
);
strncpy
(
drvinfo
->
version
,
igb_driver_version
,
sizeof
(
drvinfo
->
version
)
-
1
);
/* EEPROM image version # is reported as firmware version # for
* 82575 controllers */
...
...
@@ -738,8 +739,10 @@ static void igb_get_drvinfo(struct net_device *netdev,
(
eeprom_data
&
0x0FF0
)
>>
4
,
eeprom_data
&
0x000F
);
strncpy
(
drvinfo
->
fw_version
,
firmware_version
,
32
);
strncpy
(
drvinfo
->
bus_info
,
pci_name
(
adapter
->
pdev
),
32
);
strncpy
(
drvinfo
->
fw_version
,
firmware_version
,
sizeof
(
drvinfo
->
fw_version
)
-
1
);
strncpy
(
drvinfo
->
bus_info
,
pci_name
(
adapter
->
pdev
),
sizeof
(
drvinfo
->
bus_info
)
-
1
);
drvinfo
->
n_stats
=
IGB_STATS_LEN
;
drvinfo
->
testinfo_len
=
IGB_TEST_LEN
;
drvinfo
->
regdump_len
=
igb_get_regs_len
(
netdev
);
...
...
@@ -1070,7 +1073,7 @@ static bool reg_pattern_test(struct igb_adapter *adapter, u64 *data,
{
0x5A5A5A5A
,
0xA5A5A5A5
,
0x00000000
,
0xFFFFFFFF
};
for
(
pat
=
0
;
pat
<
ARRAY_SIZE
(
_test
);
pat
++
)
{
wr32
(
reg
,
(
_test
[
pat
]
&
write
));
val
=
rd32
(
reg
);
val
=
rd32
(
reg
)
&
mask
;
if
(
val
!=
(
_test
[
pat
]
&
write
&
mask
))
{
dev_err
(
&
adapter
->
pdev
->
dev
,
"pattern test reg %04X "
"failed: got 0x%08X expected 0x%08X
\n
"
,
...
...
drivers/net/igb/igb_main.c
View file @
a45d49d1
...
...
@@ -2291,7 +2291,12 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter)
switch
(
hw
->
mac
.
type
)
{
case
e1000_82576
:
case
e1000_i350
:
adapter
->
vfs_allocated_count
=
(
max_vfs
>
7
)
?
7
:
max_vfs
;
if
(
max_vfs
>
7
)
{
dev_warn
(
&
pdev
->
dev
,
"Maximum of 7 VFs per PF, using max
\n
"
);
adapter
->
vfs_allocated_count
=
7
;
}
else
adapter
->
vfs_allocated_count
=
max_vfs
;
break
;
default:
break
;
...
...
drivers/net/ixgbe/ixgbe.h
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_82598.c
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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,
...
...
@@ -627,7 +627,6 @@ static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
return
0
;
}
/**
* ixgbe_setup_mac_link_82598 - Set MAC link speed
* @hw: pointer to hardware structure
...
...
@@ -698,7 +697,6 @@ static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw,
/* Setup the PHY according to input speed */
status
=
hw
->
phy
.
ops
.
setup_link_speed
(
hw
,
speed
,
autoneg
,
autoneg_wait_to_complete
);
/* Set up MAC */
ixgbe_start_mac_link_82598
(
hw
,
autoneg_wait_to_complete
);
...
...
@@ -770,7 +768,6 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
else
if
(
phy_status
==
IXGBE_ERR_SFP_NOT_PRESENT
)
goto
no_phy_reset
;
hw
->
phy
.
ops
.
reset
(
hw
);
}
...
...
@@ -779,12 +776,9 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
* Prevent the PCI-E bus from from hanging by disabling PCI-E master
* access and verify no pending requests before reset
*/
status
=
ixgbe_disable_pcie_master
(
hw
);
if
(
status
!=
0
)
{
status
=
IXGBE_ERR_MASTER_REQUESTS_PENDING
;
hw_dbg
(
hw
,
"PCI-E Master disable polling has failed.
\n
"
);
}
ixgbe_disable_pcie_master
(
hw
);
mac_reset_top:
/*
* Issue global reset to the MAC. This needs to be a SW reset.
* If link reset is used, it might reset the MAC when mng is using it
...
...
@@ -805,6 +799,19 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
hw_dbg
(
hw
,
"Reset polling failed to complete.
\n
"
);
}
/*
* Double resets are required for recovery from certain error
* conditions. Between resets, it is necessary to stall to allow time
* for any pending HW events to complete. We use 1usec since that is
* what is needed for ixgbe_disable_pcie_master(). The second reset
* then clears out any effects of those events.
*/
if
(
hw
->
mac
.
flags
&
IXGBE_FLAGS_DOUBLE_RESET_REQUIRED
)
{
hw
->
mac
.
flags
&=
~
IXGBE_FLAGS_DOUBLE_RESET_REQUIRED
;
udelay
(
1
);
goto
mac_reset_top
;
}
msleep
(
50
);
gheccr
=
IXGBE_READ_REG
(
hw
,
IXGBE_GHECCR
);
...
...
@@ -824,15 +831,15 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
IXGBE_WRITE_REG
(
hw
,
IXGBE_AUTOC
,
hw
->
mac
.
orig_autoc
);
}
/* Store the permanent mac address */
hw
->
mac
.
ops
.
get_mac_addr
(
hw
,
hw
->
mac
.
perm_addr
);
/*
* Store MAC address from RAR0, clear receive address registers, and
* clear the multicast table
*/
hw
->
mac
.
ops
.
init_rx_addrs
(
hw
);
/* Store the permanent mac address */
hw
->
mac
.
ops
.
get_mac_addr
(
hw
,
hw
->
mac
.
perm_addr
);
reset_hw_out:
if
(
phy_status
)
status
=
phy_status
;
...
...
@@ -849,6 +856,13 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
static
s32
ixgbe_set_vmdq_82598
(
struct
ixgbe_hw
*
hw
,
u32
rar
,
u32
vmdq
)
{
u32
rar_high
;
u32
rar_entries
=
hw
->
mac
.
num_rar_entries
;
/* Make sure we are using a valid rar index range */
if
(
rar
>=
rar_entries
)
{
hw_dbg
(
hw
,
"RAR index %d is out of range.
\n
"
,
rar
);
return
IXGBE_ERR_INVALID_ARGUMENT
;
}
rar_high
=
IXGBE_READ_REG
(
hw
,
IXGBE_RAH
(
rar
));
rar_high
&=
~
IXGBE_RAH_VIND_MASK
;
...
...
@@ -868,14 +882,17 @@ static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
u32
rar_high
;
u32
rar_entries
=
hw
->
mac
.
num_rar_entries
;
if
(
rar
<
rar_entries
)
{
rar_high
=
IXGBE_READ_REG
(
hw
,
IXGBE_RAH
(
rar
));
if
(
rar_high
&
IXGBE_RAH_VIND_MASK
)
{
rar_high
&=
~
IXGBE_RAH_VIND_MASK
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_RAH
(
rar
),
rar_high
);
}
}
else
{
/* Make sure we are using a valid rar index range */
if
(
rar
>=
rar_entries
)
{
hw_dbg
(
hw
,
"RAR index %d is out of range.
\n
"
,
rar
);
return
IXGBE_ERR_INVALID_ARGUMENT
;
}
rar_high
=
IXGBE_READ_REG
(
hw
,
IXGBE_RAH
(
rar
));
if
(
rar_high
&
IXGBE_RAH_VIND_MASK
)
{
rar_high
&=
~
IXGBE_RAH_VIND_MASK
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_RAH
(
rar
),
rar_high
);
}
return
0
;
...
...
@@ -994,13 +1011,12 @@ static s32 ixgbe_write_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 val)
}
/**
* ixgbe_read_i2c_eeprom_82598 - Read 8 bit EEPROM word of an SFP+ module
* over I2C interface through an intermediate phy.
* ixgbe_read_i2c_eeprom_82598 - Reads 8 bit word over I2C interface.
* @hw: pointer to hardware structure
* @byte_offset: EEPROM byte offset to read
* @eeprom_data: value read
*
* Performs byte read operation to SFP module's EEPROM over I2C interface.
* Performs
8
byte read operation to SFP module's EEPROM over I2C interface.
**/
static
s32
ixgbe_read_i2c_eeprom_82598
(
struct
ixgbe_hw
*
hw
,
u8
byte_offset
,
u8
*
eeprom_data
)
...
...
@@ -1179,13 +1195,14 @@ static struct ixgbe_mac_operations mac_ops_82598 = {
.
set_vmdq
=
&
ixgbe_set_vmdq_82598
,
.
clear_vmdq
=
&
ixgbe_clear_vmdq_82598
,
.
init_rx_addrs
=
&
ixgbe_init_rx_addrs_generic
,
.
update_uc_addr_list
=
&
ixgbe_update_uc_addr_list_generic
,
.
update_mc_addr_list
=
&
ixgbe_update_mc_addr_list_generic
,
.
enable_mc
=
&
ixgbe_enable_mc_generic
,
.
disable_mc
=
&
ixgbe_disable_mc_generic
,
.
clear_vfta
=
&
ixgbe_clear_vfta_82598
,
.
set_vfta
=
&
ixgbe_set_vfta_82598
,
.
fc_enable
=
&
ixgbe_fc_enable_82598
,
.
acquire_swfw_sync
=
&
ixgbe_acquire_swfw_sync
,
.
release_swfw_sync
=
&
ixgbe_release_swfw_sync
,
};
static
struct
ixgbe_eeprom_operations
eeprom_ops_82598
=
{
...
...
drivers/net/ixgbe/ixgbe_82599.c
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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,
...
...
@@ -112,7 +112,8 @@ static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw)
goto
setup_sfp_out
;
/* PHY config will finish before releasing the semaphore */
ret_val
=
ixgbe_acquire_swfw_sync
(
hw
,
IXGBE_GSSR_MAC_CSR_SM
);
ret_val
=
hw
->
mac
.
ops
.
acquire_swfw_sync
(
hw
,
IXGBE_GSSR_MAC_CSR_SM
);
if
(
ret_val
!=
0
)
{
ret_val
=
IXGBE_ERR_SWFW_SYNC
;
goto
setup_sfp_out
;
...
...
@@ -329,11 +330,14 @@ static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
enum
ixgbe_media_type
media_type
;
/* 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_aq
)
{
switch
(
hw
->
phy
.
type
)
{
case
ixgbe_phy_cu_unknown
:
case
ixgbe_phy_tn
:
case
ixgbe_phy_aq
:
media_type
=
ixgbe_media_type_copper
;
goto
out
;
default:
break
;
}
switch
(
hw
->
device_id
)
{
...
...
@@ -354,6 +358,9 @@ static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
case
IXGBE_DEV_ID_82599_CX4
:
media_type
=
ixgbe_media_type_cx4
;
break
;
case
IXGBE_DEV_ID_82599_T3_LOM
:
media_type
=
ixgbe_media_type_copper
;
break
;
default:
media_type
=
ixgbe_media_type_unknown
;
break
;
...
...
@@ -411,14 +418,14 @@ static s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw,
return
status
;
}
/**
* ixgbe_disable_tx_laser_multispeed_fiber - Disable Tx laser
* @hw: pointer to hardware structure
*
* The base drivers may require better control over SFP+ module
* PHY states. This includes selectively shutting down the Tx
* laser on the PHY, effectively halting physical link.
**/
/**
* ixgbe_disable_tx_laser_multispeed_fiber - Disable Tx laser
* @hw: pointer to hardware structure
*
* The base drivers may require better control over SFP+ module
* PHY states. This includes selectively shutting down the Tx
* laser on the PHY, effectively halting physical link.
**/
static
void
ixgbe_disable_tx_laser_multispeed_fiber
(
struct
ixgbe_hw
*
hw
)
{
u32
esdp_reg
=
IXGBE_READ_REG
(
hw
,
IXGBE_ESDP
);
...
...
@@ -536,7 +543,6 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
* Section 73.10.2, we may have to wait up to 500ms if KR is
* attempted. 82599 uses the same timing for 10g SFI.
*/
for
(
i
=
0
;
i
<
5
;
i
++
)
{
/* Wait for the link partner to also set speed */
msleep
(
100
);
...
...
@@ -761,7 +767,6 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,
else
orig_autoc
=
autoc
;
if
(
link_mode
==
IXGBE_AUTOC_LMS_KX4_KX_KR
||
link_mode
==
IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN
||
link_mode
==
IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII
)
{
...
...
@@ -898,12 +903,9 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
* Prevent the PCI-E bus from from hanging by disabling PCI-E master
* access and verify no pending requests before reset
*/
status
=
ixgbe_disable_pcie_master
(
hw
);
if
(
status
!=
0
)
{
status
=
IXGBE_ERR_MASTER_REQUESTS_PENDING
;
hw_dbg
(
hw
,
"PCI-E Master disable polling has failed.
\n
"
);
}
ixgbe_disable_pcie_master
(
hw
);
mac_reset_top:
/*
* Issue global reset to the MAC. This needs to be a SW reset.
* If link reset is used, it might reset the MAC when mng is using it
...
...
@@ -924,6 +926,19 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
hw_dbg
(
hw
,
"Reset polling failed to complete.
\n
"
);
}
/*
* Double resets are required for recovery from certain error
* conditions. Between resets, it is necessary to stall to allow time
* for any pending HW events to complete. We use 1usec since that is
* what is needed for ixgbe_disable_pcie_master(). The second reset
* then clears out any effects of those events.
*/
if
(
hw
->
mac
.
flags
&
IXGBE_FLAGS_DOUBLE_RESET_REQUIRED
)
{
hw
->
mac
.
flags
&=
~
IXGBE_FLAGS_DOUBLE_RESET_REQUIRED
;
udelay
(
1
);
goto
mac_reset_top
;
}
msleep
(
50
);
/*
...
...
@@ -951,6 +966,9 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
}
}
/* Store the permanent mac address */
hw
->
mac
.
ops
.
get_mac_addr
(
hw
,
hw
->
mac
.
perm_addr
);
/*
* Store MAC address from RAR0, clear receive address registers, and
* clear the multicast table. Also reset num_rar_entries to 128,
...
...
@@ -959,9 +977,6 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
hw
->
mac
.
num_rar_entries
=
128
;
hw
->
mac
.
ops
.
init_rx_addrs
(
hw
);
/* Store the permanent mac address */
hw
->
mac
.
ops
.
get_mac_addr
(
hw
,
hw
->
mac
.
perm_addr
);
/* Store the permanent SAN mac address */
hw
->
mac
.
ops
.
get_san_mac_addr
(
hw
,
hw
->
mac
.
san_addr
);
...
...
@@ -1733,13 +1748,34 @@ static s32 ixgbe_start_hw_82599(struct ixgbe_hw *hw)
* @hw: pointer to hardware structure
*
* Determines the physical layer module found on the current adapter.
* If PHY already detected, maintains current PHY type in hw struct,
* otherwise executes the PHY detection routine.
**/
s
tatic
s
32
ixgbe_identify_phy_82599
(
struct
ixgbe_hw
*
hw
)
s32
ixgbe_identify_phy_82599
(
struct
ixgbe_hw
*
hw
)
{
s32
status
=
IXGBE_ERR_PHY_ADDR_INVALID
;
/* Detect PHY if not unknown - returns success if already detected. */
status
=
ixgbe_identify_phy_generic
(
hw
);
if
(
status
!=
0
)
status
=
ixgbe_identify_sfp_module_generic
(
hw
);
if
(
status
!=
0
)
{
/* 82599 10GBASE-T requires an external PHY */
if
(
hw
->
mac
.
ops
.
get_media_type
(
hw
)
==
ixgbe_media_type_copper
)
goto
out
;
else
status
=
ixgbe_identify_sfp_module_generic
(
hw
);
}
/* Set PHY type none if no PHY detected */
if
(
hw
->
phy
.
type
==
ixgbe_phy_unknown
)
{
hw
->
phy
.
type
=
ixgbe_phy_none
;
status
=
0
;
}
/* Return error if SFP module has been detected but is not supported */
if
(
hw
->
phy
.
type
==
ixgbe_phy_sfp_unsupported
)
status
=
IXGBE_ERR_SFP_NOT_SUPPORTED
;
out:
return
status
;
}
...
...
@@ -1763,11 +1799,12 @@ 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
)
{
switch
(
hw
->
phy
.
type
)
{
case
ixgbe_phy_tn
:
case
ixgbe_phy_aq
:
case
ixgbe_phy_cu_unknown
:
hw
->
phy
.
ops
.
read_reg
(
hw
,
MDIO_PMA_EXTABLE
,
MDIO_MMD_PMAPMD
,
&
ext_ability
);
&
ext_ability
);
if
(
ext_ability
&
MDIO_PMA_EXTABLE_10GBT
)
physical_layer
|=
IXGBE_PHYSICAL_LAYER_10GBASE_T
;
if
(
ext_ability
&
MDIO_PMA_EXTABLE_1000BT
)
...
...
@@ -1775,6 +1812,8 @@ static u32 ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw)
if
(
ext_ability
&
MDIO_PMA_EXTABLE_100BTX
)
physical_layer
|=
IXGBE_PHYSICAL_LAYER_100BASE_TX
;
goto
out
;
default:
break
;
}
switch
(
autoc
&
IXGBE_AUTOC_LMS_MASK
)
{
...
...
@@ -1886,6 +1925,7 @@ static s32 ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, u32 regval)
if
(
secrxreg
&
IXGBE_SECRXSTAT_SECRX_RDY
)
break
;
else
/* Use interrupt-safe sleep just in case */
udelay
(
10
);
}
...
...
@@ -1995,7 +2035,6 @@ static struct ixgbe_mac_operations mac_ops_82599 = {
.
set_vmdq
=
&
ixgbe_set_vmdq_generic
,
.
clear_vmdq
=
&
ixgbe_clear_vmdq_generic
,
.
init_rx_addrs
=
&
ixgbe_init_rx_addrs_generic
,
.
update_uc_addr_list
=
&
ixgbe_update_uc_addr_list_generic
,
.
update_mc_addr_list
=
&
ixgbe_update_mc_addr_list_generic
,
.
enable_mc
=
&
ixgbe_enable_mc_generic
,
.
disable_mc
=
&
ixgbe_disable_mc_generic
,
...
...
@@ -2006,6 +2045,9 @@ static struct ixgbe_mac_operations mac_ops_82599 = {
.
setup_sfp
=
&
ixgbe_setup_sfp_modules_82599
,
.
set_mac_anti_spoofing
=
&
ixgbe_set_mac_anti_spoofing
,
.
set_vlan_anti_spoofing
=
&
ixgbe_set_vlan_anti_spoofing
,
.
acquire_swfw_sync
=
&
ixgbe_acquire_swfw_sync
,
.
release_swfw_sync
=
&
ixgbe_release_swfw_sync
,
};
static
struct
ixgbe_eeprom_operations
eeprom_ops_82599
=
{
...
...
drivers/net/ixgbe/ixgbe_common.c
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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,
...
...
@@ -46,10 +46,7 @@ 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
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
);
/**
...
...
@@ -454,8 +451,7 @@ s32 ixgbe_stop_adapter_generic(struct ixgbe_hw *hw)
* Prevent the PCI-E bus from from hanging by disabling PCI-E master
* access and verify no pending requests
*/
if
(
ixgbe_disable_pcie_master
(
hw
)
!=
0
)
hw_dbg
(
hw
,
"PCI-E Master disable polling has failed.
\n
"
);
ixgbe_disable_pcie_master
(
hw
);
return
0
;
}
...
...
@@ -603,7 +599,6 @@ s32 ixgbe_write_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 data)
ixgbe_shift_out_eeprom_bits
(
hw
,
data
,
16
);
ixgbe_standby_eeprom
(
hw
);
msleep
(
hw
->
eeprom
.
semaphore_delay
);
/* Done with writing - release the EEPROM */
ixgbe_release_eeprom
(
hw
);
}
...
...
@@ -747,10 +742,10 @@ s32 ixgbe_poll_eerd_eewr_done(struct ixgbe_hw *hw, u32 ee_reg)
static
s32
ixgbe_acquire_eeprom
(
struct
ixgbe_hw
*
hw
)
{
s32
status
=
0
;
u32
eec
=
0
;
u32
eec
;
u32
i
;
if
(
ixgbe_
acquire_swfw_sync
(
hw
,
IXGBE_GSSR_EEP_SM
)
!=
0
)
if
(
hw
->
mac
.
ops
.
acquire_swfw_sync
(
hw
,
IXGBE_GSSR_EEP_SM
)
!=
0
)
status
=
IXGBE_ERR_SWFW_SYNC
;
if
(
status
==
0
)
{
...
...
@@ -773,18 +768,18 @@ static s32 ixgbe_acquire_eeprom(struct ixgbe_hw *hw)
IXGBE_WRITE_REG
(
hw
,
IXGBE_EEC
,
eec
);
hw_dbg
(
hw
,
"Could not acquire EEPROM grant
\n
"
);
ixgbe_
release_swfw_sync
(
hw
,
IXGBE_GSSR_EEP_SM
);
hw
->
mac
.
ops
.
release_swfw_sync
(
hw
,
IXGBE_GSSR_EEP_SM
);
status
=
IXGBE_ERR_EEPROM
;
}
}
/* Setup EEPROM for Read/Write */
if
(
status
==
0
)
{
/* Clear CS and SK */
eec
&=
~
(
IXGBE_EEC_CS
|
IXGBE_EEC_SK
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_EEC
,
eec
);
IXGBE_WRITE_FLUSH
(
hw
);
udelay
(
1
);
/* Setup EEPROM for Read/Write */
if
(
status
==
0
)
{
/* Clear CS and SK */
eec
&=
~
(
IXGBE_EEC_CS
|
IXGBE_EEC_SK
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_EEC
,
eec
);
IXGBE_WRITE_FLUSH
(
hw
);
udelay
(
1
);
}
}
return
status
;
}
...
...
@@ -798,13 +793,10 @@ static s32 ixgbe_acquire_eeprom(struct ixgbe_hw *hw)
static
s32
ixgbe_get_eeprom_semaphore
(
struct
ixgbe_hw
*
hw
)
{
s32
status
=
IXGBE_ERR_EEPROM
;
u32
timeout
;
u32
timeout
=
2000
;
u32
i
;
u32
swsm
;
/* Set timeout value based on size of EEPROM */
timeout
=
hw
->
eeprom
.
word_size
+
1
;
/* Get SMBI software semaphore between device drivers first */
for
(
i
=
0
;
i
<
timeout
;
i
++
)
{
/*
...
...
@@ -816,7 +808,7 @@ static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw)
status
=
0
;
break
;
}
msleep
(
1
);
udelay
(
50
);
}
/* Now get the semaphore between SW/FW through the SWESMBI bit */
...
...
@@ -844,11 +836,14 @@ static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw)
* was not granted because we don't have access to the EEPROM
*/
if
(
i
>=
timeout
)
{
hw_dbg
(
hw
,
"
Driver can't access the Eeprom - S
emaphore "
hw_dbg
(
hw
,
"
SWESMBI Software EEPROM s
emaphore "
"not granted.
\n
"
);
ixgbe_release_eeprom_semaphore
(
hw
);
status
=
IXGBE_ERR_EEPROM
;
}
}
else
{
hw_dbg
(
hw
,
"Software semaphore SMBI between device drivers "
"not granted.
\n
"
);
}
return
status
;
...
...
@@ -1081,10 +1076,13 @@ static void ixgbe_release_eeprom(struct ixgbe_hw *hw)
IXGBE_WRITE_REG
(
hw
,
IXGBE_EEC
,
eec
);
ixgbe_release_swfw_sync
(
hw
,
IXGBE_GSSR_EEP_SM
);
/* Delay before attempt to obtain semaphore again to allow FW access */
msleep
(
hw
->
eeprom
.
semaphore_delay
);
}
/**
* ixgbe_calc_eeprom_checksum - Calculates and returns the checksum
* ixgbe_calc_eeprom_checksum
_generic
- Calculates and returns the checksum
* @hw: pointer to hardware structure
**/
u16
ixgbe_calc_eeprom_checksum_generic
(
struct
ixgbe_hw
*
hw
)
...
...
@@ -1190,7 +1188,7 @@ s32 ixgbe_update_eeprom_checksum_generic(struct ixgbe_hw *hw)
if
(
status
==
0
)
{
checksum
=
hw
->
eeprom
.
ops
.
calc_checksum
(
hw
);
status
=
hw
->
eeprom
.
ops
.
write
(
hw
,
IXGBE_EEPROM_CHECKSUM
,
checksum
);
checksum
);
}
else
{
hw_dbg
(
hw
,
"EEPROM read failed
\n
"
);
}
...
...
@@ -1238,37 +1236,37 @@ s32 ixgbe_set_rar_generic(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq,
u32
rar_low
,
rar_high
;
u32
rar_entries
=
hw
->
mac
.
num_rar_entries
;
/* Make sure we are using a valid rar index range */
if
(
index
>=
rar_entries
)
{
hw_dbg
(
hw
,
"RAR index %d is out of range.
\n
"
,
index
);
return
IXGBE_ERR_INVALID_ARGUMENT
;
}
/* setup VMDq pool selection before this RAR gets enabled */
hw
->
mac
.
ops
.
set_vmdq
(
hw
,
index
,
vmdq
);
/* Make sure we are using a valid rar index range */
if
(
index
<
rar_entries
)
{
/*
* HW expects these in little endian so we reverse the byte
* order from network order (big endian) to little endian
*/
rar_low
=
((
u32
)
addr
[
0
]
|
((
u32
)
addr
[
1
]
<<
8
)
|
((
u32
)
addr
[
2
]
<<
16
)
|
((
u32
)
addr
[
3
]
<<
24
));
/*
* Some parts put the VMDq setting in the extra RAH bits,
* so save everything except the lower 16 bits that hold part
* of the address and the address valid bit.
*/
rar_high
=
IXGBE_READ_REG
(
hw
,
IXGBE_RAH
(
index
));
rar_high
&=
~
(
0x0000FFFF
|
IXGBE_RAH_AV
);
rar_high
|=
((
u32
)
addr
[
4
]
|
((
u32
)
addr
[
5
]
<<
8
));
/*
* HW expects these in little endian so we reverse the byte
* order from network order (big endian) to little endian
*/
rar_low
=
((
u32
)
addr
[
0
]
|
((
u32
)
addr
[
1
]
<<
8
)
|
((
u32
)
addr
[
2
]
<<
16
)
|
((
u32
)
addr
[
3
]
<<
24
));
/*
* Some parts put the VMDq setting in the extra RAH bits,
* so save everything except the lower 16 bits that hold part
* of the address and the address valid bit.
*/
rar_high
=
IXGBE_READ_REG
(
hw
,
IXGBE_RAH
(
index
));
rar_high
&=
~
(
0x0000FFFF
|
IXGBE_RAH_AV
);
rar_high
|=
((
u32
)
addr
[
4
]
|
((
u32
)
addr
[
5
]
<<
8
));
if
(
enable_addr
!=
0
)
rar_high
|=
IXGBE_RAH_AV
;
if
(
enable_addr
!=
0
)
rar_high
|=
IXGBE_RAH_AV
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_RAL
(
index
),
rar_low
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_RAH
(
index
),
rar_high
);
}
else
{
hw_dbg
(
hw
,
"RAR index %d is out of range.
\n
"
,
index
);
return
IXGBE_ERR_RAR_INDEX
;
}
IXGBE_WRITE_REG
(
hw
,
IXGBE_RAL
(
index
),
rar_low
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_RAH
(
index
),
rar_high
);
return
0
;
}
...
...
@@ -1286,58 +1284,26 @@ s32 ixgbe_clear_rar_generic(struct ixgbe_hw *hw, u32 index)
u32
rar_entries
=
hw
->
mac
.
num_rar_entries
;
/* Make sure we are using a valid rar index range */
if
(
index
<
rar_entries
)
{
/*
* Some parts put the VMDq setting in the extra RAH bits,
* so save everything except the lower 16 bits that hold part
* of the address and the address valid bit.
*/
rar_high
=
IXGBE_READ_REG
(
hw
,
IXGBE_RAH
(
index
));
rar_high
&=
~
(
0x0000FFFF
|
IXGBE_RAH_AV
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_RAL
(
index
),
0
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_RAH
(
index
),
rar_high
);
}
else
{
if
(
index
>=
rar_entries
)
{
hw_dbg
(
hw
,
"RAR index %d is out of range.
\n
"
,
index
);
return
IXGBE_ERR_
RAR_INDEX
;
return
IXGBE_ERR_
INVALID_ARGUMENT
;
}
/* clear VMDq pool/queue selection for this RAR */
hw
->
mac
.
ops
.
clear_vmdq
(
hw
,
index
,
IXGBE_CLEAR_VMDQ_ALL
);
return
0
;
}
/**
* ixgbe_enable_rar - Enable Rx address register
* @hw: pointer to hardware structure
* @index: index into the RAR table
*
* Enables the select receive address register.
**/
static
void
ixgbe_enable_rar
(
struct
ixgbe_hw
*
hw
,
u32
index
)
{
u32
rar_high
;
/*
* Some parts put the VMDq setting in the extra RAH bits,
* so save everything except the lower 16 bits that hold part
* of the address and the address valid bit.
*/
rar_high
=
IXGBE_READ_REG
(
hw
,
IXGBE_RAH
(
index
));
rar_high
|=
IXGBE_RAH_AV
;
rar_high
&=
~
(
0x0000FFFF
|
IXGBE_RAH_AV
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_RAL
(
index
),
0
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_RAH
(
index
),
rar_high
);
}
/**
* ixgbe_disable_rar - Disable Rx address register
* @hw: pointer to hardware structure
* @index: index into the RAR table
*
* Disables the select receive address register.
**/
static
void
ixgbe_disable_rar
(
struct
ixgbe_hw
*
hw
,
u32
index
)
{
u32
rar_high
;
/* clear VMDq pool/queue selection for this RAR */
hw
->
mac
.
ops
.
clear_vmdq
(
hw
,
index
,
IXGBE_CLEAR_VMDQ_ALL
);
rar_high
=
IXGBE_READ_REG
(
hw
,
IXGBE_RAH
(
index
));
rar_high
&=
(
~
IXGBE_RAH_AV
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_RAH
(
index
),
rar_high
);
return
0
;
}
/**
...
...
@@ -1386,7 +1352,6 @@ s32 ixgbe_init_rx_addrs_generic(struct ixgbe_hw *hw)
}
/* Clear the MTA */
hw
->
addr_ctrl
.
mc_addr_in_rar_count
=
0
;
hw
->
addr_ctrl
.
mta_in_use
=
0
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_MCSTCTRL
,
hw
->
mac
.
mc_filter_type
);
...
...
@@ -1400,105 +1365,6 @@ s32 ixgbe_init_rx_addrs_generic(struct ixgbe_hw *hw)
return
0
;
}
/**
* ixgbe_add_uc_addr - Adds a secondary unicast address.
* @hw: pointer to hardware structure
* @addr: new address
*
* Adds it to unused receive address register or goes into promiscuous mode.
**/
static
void
ixgbe_add_uc_addr
(
struct
ixgbe_hw
*
hw
,
u8
*
addr
,
u32
vmdq
)
{
u32
rar_entries
=
hw
->
mac
.
num_rar_entries
;
u32
rar
;
hw_dbg
(
hw
,
" UC Addr = %.2X %.2X %.2X %.2X %.2X %.2X
\n
"
,
addr
[
0
],
addr
[
1
],
addr
[
2
],
addr
[
3
],
addr
[
4
],
addr
[
5
]);
/*
* Place this address in the RAR if there is room,
* else put the controller into promiscuous mode
*/
if
(
hw
->
addr_ctrl
.
rar_used_count
<
rar_entries
)
{
rar
=
hw
->
addr_ctrl
.
rar_used_count
-
hw
->
addr_ctrl
.
mc_addr_in_rar_count
;
hw
->
mac
.
ops
.
set_rar
(
hw
,
rar
,
addr
,
vmdq
,
IXGBE_RAH_AV
);
hw_dbg
(
hw
,
"Added a secondary address to RAR[%d]
\n
"
,
rar
);
hw
->
addr_ctrl
.
rar_used_count
++
;
}
else
{
hw
->
addr_ctrl
.
overflow_promisc
++
;
}
hw_dbg
(
hw
,
"ixgbe_add_uc_addr Complete
\n
"
);
}
/**
* ixgbe_update_uc_addr_list_generic - Updates MAC list of secondary addresses
* @hw: pointer to hardware structure
* @netdev: pointer to net device structure
*
* The given list replaces any existing list. Clears the secondary addrs from
* receive address registers. Uses unused receive address registers for the
* first secondary addresses, and falls back to promiscuous mode as needed.
*
* Drivers using secondary unicast addresses must set user_set_promisc when
* manually putting the device into promiscuous mode.
**/
s32
ixgbe_update_uc_addr_list_generic
(
struct
ixgbe_hw
*
hw
,
struct
net_device
*
netdev
)
{
u32
i
;
u32
old_promisc_setting
=
hw
->
addr_ctrl
.
overflow_promisc
;
u32
uc_addr_in_use
;
u32
fctrl
;
struct
netdev_hw_addr
*
ha
;
/*
* Clear accounting of old secondary address list,
* don't count RAR[0]
*/
uc_addr_in_use
=
hw
->
addr_ctrl
.
rar_used_count
-
1
;
hw
->
addr_ctrl
.
rar_used_count
-=
uc_addr_in_use
;
hw
->
addr_ctrl
.
overflow_promisc
=
0
;
/* Zero out the other receive addresses */
hw_dbg
(
hw
,
"Clearing RAR[1-%d]
\n
"
,
uc_addr_in_use
+
1
);
for
(
i
=
0
;
i
<
uc_addr_in_use
;
i
++
)
{
IXGBE_WRITE_REG
(
hw
,
IXGBE_RAL
(
1
+
i
),
0
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_RAH
(
1
+
i
),
0
);
}
/* Add the new addresses */
netdev_for_each_uc_addr
(
ha
,
netdev
)
{
hw_dbg
(
hw
,
" Adding the secondary addresses:
\n
"
);
ixgbe_add_uc_addr
(
hw
,
ha
->
addr
,
0
);
}
if
(
hw
->
addr_ctrl
.
overflow_promisc
)
{
/* enable promisc if not already in overflow or set by user */
if
(
!
old_promisc_setting
&&
!
hw
->
addr_ctrl
.
user_set_promisc
)
{
hw_dbg
(
hw
,
" Entering address overflow promisc mode
\n
"
);
fctrl
=
IXGBE_READ_REG
(
hw
,
IXGBE_FCTRL
);
fctrl
|=
IXGBE_FCTRL_UPE
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCTRL
,
fctrl
);
hw
->
addr_ctrl
.
uc_set_promisc
=
true
;
}
}
else
{
/* only disable if set by overflow, not by user */
if
((
old_promisc_setting
&&
hw
->
addr_ctrl
.
uc_set_promisc
)
&&
!
(
hw
->
addr_ctrl
.
user_set_promisc
))
{
hw_dbg
(
hw
,
" Leaving address overflow promisc mode
\n
"
);
fctrl
=
IXGBE_READ_REG
(
hw
,
IXGBE_FCTRL
);
fctrl
&=
~
IXGBE_FCTRL_UPE
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_FCTRL
,
fctrl
);
hw
->
addr_ctrl
.
uc_set_promisc
=
false
;
}
}
hw_dbg
(
hw
,
"ixgbe_update_uc_addr_list_generic Complete
\n
"
);
return
0
;
}
/**
* ixgbe_mta_vector - Determines bit-vector in multicast table to set
* @hw: pointer to hardware structure
...
...
@@ -1550,7 +1416,6 @@ static void ixgbe_set_mta(struct ixgbe_hw *hw, u8 *mc_addr)
u32
vector
;
u32
vector_bit
;
u32
vector_reg
;
u32
mta_reg
;
hw
->
addr_ctrl
.
mta_in_use
++
;
...
...
@@ -1568,9 +1433,7 @@ static void ixgbe_set_mta(struct ixgbe_hw *hw, u8 *mc_addr)
*/
vector_reg
=
(
vector
>>
5
)
&
0x7F
;
vector_bit
=
vector
&
0x1F
;
mta_reg
=
IXGBE_READ_REG
(
hw
,
IXGBE_MTA
(
vector_reg
));
mta_reg
|=
(
1
<<
vector_bit
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_MTA
(
vector_reg
),
mta_reg
);
hw
->
mac
.
mta_shadow
[
vector_reg
]
|=
(
1
<<
vector_bit
);
}
/**
...
...
@@ -1596,18 +1459,21 @@ s32 ixgbe_update_mc_addr_list_generic(struct ixgbe_hw *hw,
hw
->
addr_ctrl
.
num_mc_addrs
=
netdev_mc_count
(
netdev
);
hw
->
addr_ctrl
.
mta_in_use
=
0
;
/* Clear
the MTA
*/
/* Clear
mta_shadow
*/
hw_dbg
(
hw
,
" Clearing MTA
\n
"
);
for
(
i
=
0
;
i
<
hw
->
mac
.
mcft_size
;
i
++
)
IXGBE_WRITE_REG
(
hw
,
IXGBE_MTA
(
i
),
0
);
memset
(
&
hw
->
mac
.
mta_shadow
,
0
,
sizeof
(
hw
->
mac
.
mta_shadow
));
/*
Add the new addresses
*/
/*
Update mta shadow
*/
netdev_for_each_mc_addr
(
ha
,
netdev
)
{
hw_dbg
(
hw
,
" Adding the multicast addresses:
\n
"
);
ixgbe_set_mta
(
hw
,
ha
->
addr
);
}
/* Enable mta */
for
(
i
=
0
;
i
<
hw
->
mac
.
mcft_size
;
i
++
)
IXGBE_WRITE_REG_ARRAY
(
hw
,
IXGBE_MTA
(
0
),
i
,
hw
->
mac
.
mta_shadow
[
i
]);
if
(
hw
->
addr_ctrl
.
mta_in_use
>
0
)
IXGBE_WRITE_REG
(
hw
,
IXGBE_MCSTCTRL
,
IXGBE_MCSTCTRL_MFE
|
hw
->
mac
.
mc_filter_type
);
...
...
@@ -1624,15 +1490,8 @@ s32 ixgbe_update_mc_addr_list_generic(struct ixgbe_hw *hw,
**/
s32
ixgbe_enable_mc_generic
(
struct
ixgbe_hw
*
hw
)
{
u32
i
;
u32
rar_entries
=
hw
->
mac
.
num_rar_entries
;
struct
ixgbe_addr_filter_info
*
a
=
&
hw
->
addr_ctrl
;
if
(
a
->
mc_addr_in_rar_count
>
0
)
for
(
i
=
(
rar_entries
-
a
->
mc_addr_in_rar_count
);
i
<
rar_entries
;
i
++
)
ixgbe_enable_rar
(
hw
,
i
);
if
(
a
->
mta_in_use
>
0
)
IXGBE_WRITE_REG
(
hw
,
IXGBE_MCSTCTRL
,
IXGBE_MCSTCTRL_MFE
|
hw
->
mac
.
mc_filter_type
);
...
...
@@ -1648,15 +1507,8 @@ s32 ixgbe_enable_mc_generic(struct ixgbe_hw *hw)
**/
s32
ixgbe_disable_mc_generic
(
struct
ixgbe_hw
*
hw
)
{
u32
i
;
u32
rar_entries
=
hw
->
mac
.
num_rar_entries
;
struct
ixgbe_addr_filter_info
*
a
=
&
hw
->
addr_ctrl
;
if
(
a
->
mc_addr_in_rar_count
>
0
)
for
(
i
=
(
rar_entries
-
a
->
mc_addr_in_rar_count
);
i
<
rar_entries
;
i
++
)
ixgbe_disable_rar
(
hw
,
i
);
if
(
a
->
mta_in_use
>
0
)
IXGBE_WRITE_REG
(
hw
,
IXGBE_MCSTCTRL
,
hw
->
mac
.
mc_filter_type
);
...
...
@@ -1703,7 +1555,9 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw, s32 packetbuf_num)
* 2: Tx flow control is enabled (we can send pause frames but
* we do not support receiving pause frames).
* 3: Both Rx and Tx flow control (symmetric) are enabled.
#ifdef CONFIG_DCB
* 4: Priority Flow Control is enabled.
#endif
* other: Invalid.
*/
switch
(
hw
->
fc
.
current_mode
)
{
...
...
@@ -2159,10 +2013,16 @@ static s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num)
**/
s32
ixgbe_disable_pcie_master
(
struct
ixgbe_hw
*
hw
)
{
struct
ixgbe_adapter
*
adapter
=
hw
->
back
;
u32
i
;
u32
reg_val
;
u32
number_of_queues
;
s32
status
=
IXGBE_ERR_MASTER_REQUESTS_PENDING
;
s32
status
=
0
;
u16
dev_status
=
0
;
/* Just jump out if bus mastering is already disabled */
if
(
!
(
IXGBE_READ_REG
(
hw
,
IXGBE_STATUS
)
&
IXGBE_STATUS_GIO
))
goto
out
;
/* Disable the receive unit by stopping each queue */
number_of_queues
=
hw
->
mac
.
max_rx_queues
;
...
...
@@ -2179,13 +2039,43 @@ s32 ixgbe_disable_pcie_master(struct ixgbe_hw *hw)
IXGBE_WRITE_REG
(
hw
,
IXGBE_CTRL
,
reg_val
);
for
(
i
=
0
;
i
<
IXGBE_PCI_MASTER_DISABLE_TIMEOUT
;
i
++
)
{
if
(
!
(
IXGBE_READ_REG
(
hw
,
IXGBE_STATUS
)
&
IXGBE_STATUS_GIO
))
{
status
=
0
;
if
(
!
(
IXGBE_READ_REG
(
hw
,
IXGBE_STATUS
)
&
IXGBE_STATUS_GIO
))
goto
check_device_status
;
udelay
(
100
);
}
hw_dbg
(
hw
,
"GIO Master Disable bit didn't clear - requesting resets
\n
"
);
status
=
IXGBE_ERR_MASTER_REQUESTS_PENDING
;
/*
* Before proceeding, make sure that the PCIe block does not have
* transactions pending.
*/
check_device_status:
for
(
i
=
0
;
i
<
IXGBE_PCI_MASTER_DISABLE_TIMEOUT
;
i
++
)
{
pci_read_config_word
(
adapter
->
pdev
,
IXGBE_PCI_DEVICE_STATUS
,
&
dev_status
);
if
(
!
(
dev_status
&
IXGBE_PCI_DEVICE_STATUS_TRANSACTION_PENDING
))
break
;
}
udelay
(
100
);
}
if
(
i
==
IXGBE_PCI_MASTER_DISABLE_TIMEOUT
)
hw_dbg
(
hw
,
"PCIe transaction pending bit also did not clear.
\n
"
);
else
goto
out
;
/*
* Two consecutive resets are required via CTRL.RST per datasheet
* 5.2.5.3.2 Master Disable. We set a flag to inform the reset routine
* of this need. The first reset prevents new master requests from
* being issued by our device. We then must wait 1usec for any
* remaining completions from the PCIe bus to trickle in, and then reset
* again to clear out any effects they may have had on our device.
*/
hw
->
mac
.
flags
|=
IXGBE_FLAGS_DOUBLE_RESET_REQUIRED
;
out:
return
status
;
}
...
...
@@ -2206,6 +2096,10 @@ s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u16 mask)
s32
timeout
=
200
;
while
(
timeout
)
{
/*
* SW EEPROM semaphore bit is used for access to all
* SW_FW_SYNC/GSSR bits (not just EEPROM)
*/
if
(
ixgbe_get_eeprom_semaphore
(
hw
))
return
IXGBE_ERR_SWFW_SYNC
;
...
...
@@ -2223,7 +2117,7 @@ s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u16 mask)
}
if
(
!
timeout
)
{
hw_dbg
(
hw
,
"Driver can't access resource,
GSSR
timeout.
\n
"
);
hw_dbg
(
hw
,
"Driver can't access resource,
SW_FW_SYNC
timeout.
\n
"
);
return
IXGBE_ERR_SWFW_SYNC
;
}
...
...
@@ -2427,37 +2321,38 @@ s32 ixgbe_clear_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
u32
mpsar_lo
,
mpsar_hi
;
u32
rar_entries
=
hw
->
mac
.
num_rar_entries
;
if
(
rar
<
rar_entries
)
{
mpsar_lo
=
IXGBE_READ_REG
(
hw
,
IXGBE_MPSAR_LO
(
rar
));
mpsar_hi
=
IXGBE_READ_REG
(
hw
,
IXGBE_MPSAR_HI
(
rar
));
/* Make sure we are using a valid rar index range */
if
(
rar
>=
rar_entries
)
{
hw_dbg
(
hw
,
"RAR index %d is out of range.
\n
"
,
rar
);
return
IXGBE_ERR_INVALID_ARGUMENT
;
}
if
(
!
mpsar_lo
&&
!
mpsar_hi
)
goto
done
;
mpsar_lo
=
IXGBE_READ_REG
(
hw
,
IXGBE_MPSAR_LO
(
rar
));
mpsar_hi
=
IXGBE_READ_REG
(
hw
,
IXGBE_MPSAR_HI
(
rar
))
;
if
(
vmdq
==
IXGBE_CLEAR_VMDQ_ALL
)
{
if
(
mpsar_lo
)
{
IXGBE_WRITE_REG
(
hw
,
IXGBE_MPSAR_LO
(
rar
),
0
);
mpsar_lo
=
0
;
}
if
(
mpsar_hi
)
{
IXGBE_WRITE_REG
(
hw
,
IXGBE_MPSAR_HI
(
rar
),
0
);
mpsar_hi
=
0
;
}
}
else
if
(
vmdq
<
32
)
{
mpsar_lo
&=
~
(
1
<<
vmdq
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_MPSAR_LO
(
rar
),
mpsar_lo
);
}
else
{
mpsar_hi
&=
~
(
1
<<
(
vmdq
-
32
));
IXGBE_WRITE_REG
(
hw
,
IXGBE_MPSAR_HI
(
rar
),
mpsar_hi
);
}
if
(
!
mpsar_lo
&&
!
mpsar_hi
)
goto
done
;
/* was that the last pool using this rar? */
if
(
mpsar_lo
==
0
&&
mpsar_hi
==
0
&&
rar
!=
0
)
hw
->
mac
.
ops
.
clear_rar
(
hw
,
rar
);
if
(
vmdq
==
IXGBE_CLEAR_VMDQ_ALL
)
{
if
(
mpsar_lo
)
{
IXGBE_WRITE_REG
(
hw
,
IXGBE_MPSAR_LO
(
rar
),
0
);
mpsar_lo
=
0
;
}
if
(
mpsar_hi
)
{
IXGBE_WRITE_REG
(
hw
,
IXGBE_MPSAR_HI
(
rar
),
0
);
mpsar_hi
=
0
;
}
}
else
if
(
vmdq
<
32
)
{
mpsar_lo
&=
~
(
1
<<
vmdq
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_MPSAR_LO
(
rar
),
mpsar_lo
);
}
else
{
hw_dbg
(
hw
,
"RAR index %d is out of range.
\n
"
,
rar
);
mpsar_hi
&=
~
(
1
<<
(
vmdq
-
32
));
IXGBE_WRITE_REG
(
hw
,
IXGBE_MPSAR_HI
(
rar
),
mpsar_hi
);
}
/* was that the last pool using this rar? */
if
(
mpsar_lo
==
0
&&
mpsar_hi
==
0
&&
rar
!=
0
)
hw
->
mac
.
ops
.
clear_rar
(
hw
,
rar
);
done:
return
0
;
}
...
...
@@ -2473,18 +2368,20 @@ s32 ixgbe_set_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
u32
mpsar
;
u32
rar_entries
=
hw
->
mac
.
num_rar_entries
;
if
(
rar
<
rar_entries
)
{
if
(
vmdq
<
32
)
{
mpsar
=
IXGBE_READ_REG
(
hw
,
IXGBE_MPSAR_LO
(
rar
));
mpsar
|=
1
<<
vmdq
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_MPSAR_LO
(
rar
),
mpsar
);
}
else
{
mpsar
=
IXGBE_READ_REG
(
hw
,
IXGBE_MPSAR_HI
(
rar
));
mpsar
|=
1
<<
(
vmdq
-
32
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_MPSAR_HI
(
rar
),
mpsar
);
}
}
else
{
/* Make sure we are using a valid rar index range */
if
(
rar
>=
rar_entries
)
{
hw_dbg
(
hw
,
"RAR index %d is out of range.
\n
"
,
rar
);
return
IXGBE_ERR_INVALID_ARGUMENT
;
}
if
(
vmdq
<
32
)
{
mpsar
=
IXGBE_READ_REG
(
hw
,
IXGBE_MPSAR_LO
(
rar
));
mpsar
|=
1
<<
vmdq
;
IXGBE_WRITE_REG
(
hw
,
IXGBE_MPSAR_LO
(
rar
),
mpsar
);
}
else
{
mpsar
=
IXGBE_READ_REG
(
hw
,
IXGBE_MPSAR_HI
(
rar
));
mpsar
|=
1
<<
(
vmdq
-
32
);
IXGBE_WRITE_REG
(
hw
,
IXGBE_MPSAR_HI
(
rar
),
mpsar
);
}
return
0
;
}
...
...
@@ -2497,7 +2394,6 @@ s32 ixgbe_init_uta_tables_generic(struct ixgbe_hw *hw)
{
int
i
;
for
(
i
=
0
;
i
<
128
;
i
++
)
IXGBE_WRITE_REG
(
hw
,
IXGBE_UTA
(
i
),
0
);
...
...
@@ -2726,12 +2622,21 @@ s32 ixgbe_clear_vfta_generic(struct ixgbe_hw *hw)
* Reads the links register to determine if link is up and the current speed
**/
s32
ixgbe_check_mac_link_generic
(
struct
ixgbe_hw
*
hw
,
ixgbe_link_speed
*
speed
,
bool
*
link_up
,
bool
link_up_wait_to_complete
)
bool
*
link_up
,
bool
link_up_wait_to_complete
)
{
u32
links_reg
;
u32
links_reg
,
links_orig
;
u32
i
;
/* clear the old state */
links_orig
=
IXGBE_READ_REG
(
hw
,
IXGBE_LINKS
);
links_reg
=
IXGBE_READ_REG
(
hw
,
IXGBE_LINKS
);
if
(
links_orig
!=
links_reg
)
{
hw_dbg
(
hw
,
"LINKS changed from %08X to %08X
\n
"
,
links_orig
,
links_reg
);
}
if
(
link_up_wait_to_complete
)
{
for
(
i
=
0
;
i
<
IXGBE_LINK_UP_TIME
;
i
++
)
{
if
(
links_reg
&
IXGBE_LINKS_UP
)
{
...
...
@@ -2754,10 +2659,13 @@ s32 ixgbe_check_mac_link_generic(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
IXGBE_LINKS_SPEED_10G_82599
)
*
speed
=
IXGBE_LINK_SPEED_10GB_FULL
;
else
if
((
links_reg
&
IXGBE_LINKS_SPEED_82599
)
==
IXGBE_LINKS_SPEED_1G_82599
)
IXGBE_LINKS_SPEED_1G_82599
)
*
speed
=
IXGBE_LINK_SPEED_1GB_FULL
;
else
else
if
((
links_reg
&
IXGBE_LINKS_SPEED_82599
)
==
IXGBE_LINKS_SPEED_100_82599
)
*
speed
=
IXGBE_LINK_SPEED_100_FULL
;
else
*
speed
=
IXGBE_LINK_SPEED_UNKNOWN
;
/* if link is down, zero out the current_mode */
if
(
*
link_up
==
false
)
{
...
...
drivers/net/ixgbe/ixgbe_common.h
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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,
...
...
@@ -63,8 +63,6 @@ s32 ixgbe_clear_rar_generic(struct ixgbe_hw *hw, u32 index);
s32
ixgbe_init_rx_addrs_generic
(
struct
ixgbe_hw
*
hw
);
s32
ixgbe_update_mc_addr_list_generic
(
struct
ixgbe_hw
*
hw
,
struct
net_device
*
netdev
);
s32
ixgbe_update_uc_addr_list_generic
(
struct
ixgbe_hw
*
hw
,
struct
net_device
*
netdev
);
s32
ixgbe_enable_mc_generic
(
struct
ixgbe_hw
*
hw
);
s32
ixgbe_disable_mc_generic
(
struct
ixgbe_hw
*
hw
);
s32
ixgbe_enable_rx_dma_generic
(
struct
ixgbe_hw
*
hw
,
u32
regval
);
...
...
drivers/net/ixgbe/ixgbe_dcb.c
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_dcb.h
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_dcb_82598.c
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_dcb_82598.h
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_dcb_82599.c
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_dcb_82599.h
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_dcb_nl.c
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_ethtool.c
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_fcoe.c
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_fcoe.h
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_main.c
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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,
...
...
@@ -54,7 +54,8 @@ static const char ixgbe_driver_string[] =
#define DRV_VERSION "3.2.9-k2"
const
char
ixgbe_driver_version
[]
=
DRV_VERSION
;
static
char
ixgbe_copyright
[]
=
"Copyright (c) 1999-2010 Intel Corporation."
;
static
const
char
ixgbe_copyright
[]
=
"Copyright (c) 1999-2011 Intel Corporation."
;
static
const
struct
ixgbe_info
*
ixgbe_info_tbl
[]
=
{
[
board_82598
]
=
&
ixgbe_82598_info
,
...
...
@@ -2597,6 +2598,11 @@ static void ixgbe_free_irq(struct ixgbe_adapter *adapter)
i
--
;
for
(;
i
>=
0
;
i
--
)
{
/* free only the irqs that were actually requested */
if
(
!
adapter
->
q_vector
[
i
]
->
rxr_count
&&
!
adapter
->
q_vector
[
i
]
->
txr_count
)
continue
;
free_irq
(
adapter
->
msix_entries
[
i
].
vector
,
adapter
->
q_vector
[
i
]);
}
...
...
@@ -3884,7 +3890,7 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)
* If we're not hot-pluggable SFP+, we just need to configure link
* and bring it up.
*/
if
(
hw
->
phy
.
type
==
ixgbe_phy_
unknown
)
if
(
hw
->
phy
.
type
==
ixgbe_phy_
none
)
schedule_work
(
&
adapter
->
sfp_config_module_task
);
/* enable transmits */
...
...
drivers/net/ixgbe/ixgbe_mbx.c
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_mbx.h
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_phy.c
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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,
...
...
@@ -138,17 +138,51 @@ static enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id)
**/
s32
ixgbe_reset_phy_generic
(
struct
ixgbe_hw
*
hw
)
{
u32
i
;
u16
ctrl
=
0
;
s32
status
=
0
;
if
(
hw
->
phy
.
type
==
ixgbe_phy_unknown
)
status
=
ixgbe_identify_phy_generic
(
hw
);
if
(
status
!=
0
||
hw
->
phy
.
type
==
ixgbe_phy_none
)
goto
out
;
/* Don't reset PHY if it's shut down due to overtemp. */
if
(
!
hw
->
phy
.
reset_if_overtemp
&&
(
IXGBE_ERR_OVERTEMP
==
hw
->
phy
.
ops
.
check_overtemp
(
hw
)))
return
0
;
goto
out
;
/*
* Perform soft PHY reset to the PHY_XS.
* This will cause a soft reset to the PHY
*/
return
hw
->
phy
.
ops
.
write_reg
(
hw
,
MDIO_CTRL1
,
MDIO_MMD_PHYXS
,
MDIO_CTRL1_RESET
);
hw
->
phy
.
ops
.
write_reg
(
hw
,
MDIO_CTRL1
,
MDIO_MMD_PHYXS
,
MDIO_CTRL1_RESET
);
/*
* Poll for reset bit to self-clear indicating reset is complete.
* Some PHYs could take up to 3 seconds to complete and need about
* 1.7 usec delay after the reset is complete.
*/
for
(
i
=
0
;
i
<
30
;
i
++
)
{
msleep
(
100
);
hw
->
phy
.
ops
.
read_reg
(
hw
,
MDIO_CTRL1
,
MDIO_MMD_PHYXS
,
&
ctrl
);
if
(
!
(
ctrl
&
MDIO_CTRL1_RESET
))
{
udelay
(
2
);
break
;
}
}
if
(
ctrl
&
MDIO_CTRL1_RESET
)
{
status
=
IXGBE_ERR_RESET_FAILED
;
hw_dbg
(
hw
,
"PHY reset polling failed to complete.
\n
"
);
}
out:
return
status
;
}
/**
...
...
@@ -171,7 +205,7 @@ s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
else
gssr
=
IXGBE_GSSR_PHY0_SM
;
if
(
ixgbe_
acquire_swfw_sync
(
hw
,
gssr
)
!=
0
)
if
(
hw
->
mac
.
ops
.
acquire_swfw_sync
(
hw
,
gssr
)
!=
0
)
status
=
IXGBE_ERR_SWFW_SYNC
;
if
(
status
==
0
)
{
...
...
@@ -243,7 +277,7 @@ s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
}
}
ixgbe_
release_swfw_sync
(
hw
,
gssr
);
hw
->
mac
.
ops
.
release_swfw_sync
(
hw
,
gssr
);
}
return
status
;
...
...
@@ -269,7 +303,7 @@ s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
else
gssr
=
IXGBE_GSSR_PHY0_SM
;
if
(
ixgbe_
acquire_swfw_sync
(
hw
,
gssr
)
!=
0
)
if
(
hw
->
mac
.
ops
.
acquire_swfw_sync
(
hw
,
gssr
)
!=
0
)
status
=
IXGBE_ERR_SWFW_SYNC
;
if
(
status
==
0
)
{
...
...
@@ -336,7 +370,7 @@ s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
}
}
ixgbe_
release_swfw_sync
(
hw
,
gssr
);
hw
->
mac
.
ops
.
release_swfw_sync
(
hw
,
gssr
);
}
return
status
;
...
...
@@ -556,11 +590,10 @@ s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
}
/**
* ixgbe_identify_sfp_module_generic - Identifies SFP module and assigns
* the PHY type.
* ixgbe_identify_sfp_module_generic - Identifies SFP modules
* @hw: pointer to hardware structure
*
* Searches for and i
ndentifies the SFP module. Assing
s appropriate PHY type.
* Searches for and i
dentifies the SFP module and assign
s appropriate PHY type.
**/
s32
ixgbe_identify_sfp_module_generic
(
struct
ixgbe_hw
*
hw
)
{
...
...
@@ -581,41 +614,62 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
goto
out
;
}
status
=
hw
->
phy
.
ops
.
read_i2c_eeprom
(
hw
,
IXGBE_SFF_IDENTIFIER
,
status
=
hw
->
phy
.
ops
.
read_i2c_eeprom
(
hw
,
IXGBE_SFF_IDENTIFIER
,
&
identifier
);
if
(
status
==
IXGBE_ERR_SFP_NOT_PRESENT
||
status
==
IXGBE_ERR_I2C
)
{
status
=
IXGBE_ERR_SFP_NOT_PRESENT
;
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_not_present
;
if
(
hw
->
phy
.
type
!=
ixgbe_phy_nl
)
{
hw
->
phy
.
id
=
0
;
hw
->
phy
.
type
=
ixgbe_phy_unknown
;
}
goto
out
;
}
if
(
status
==
IXGBE_ERR_SWFW_SYNC
||
status
==
IXGBE_ERR_I2C
||
status
==
IXGBE_ERR_SFP_NOT_PRESENT
)
goto
err_read_i2c_eeprom
;
if
(
identifier
==
IXGBE_SFF_IDENTIFIER_SFP
)
{
hw
->
phy
.
ops
.
read_i2c_eeprom
(
hw
,
IXGBE_SFF_1GBE_COMP_CODES
,
&
comp_codes_1g
);
hw
->
phy
.
ops
.
read_i2c_eeprom
(
hw
,
IXGBE_SFF_10GBE_COMP_CODES
,
&
comp_codes_10g
);
hw
->
phy
.
ops
.
read_i2c_eeprom
(
hw
,
IXGBE_SFF_CABLE_TECHNOLOGY
,
&
cable_tech
);
/* ID Module
* =========
* 0 SFP_DA_CU
* 1 SFP_SR
* 2 SFP_LR
* 3 SFP_DA_CORE0 - 82599-specific
* 4 SFP_DA_CORE1 - 82599-specific
* 5 SFP_SR/LR_CORE0 - 82599-specific
* 6 SFP_SR/LR_CORE1 - 82599-specific
* 7 SFP_act_lmt_DA_CORE0 - 82599-specific
* 8 SFP_act_lmt_DA_CORE1 - 82599-specific
* 9 SFP_1g_cu_CORE0 - 82599-specific
* 10 SFP_1g_cu_CORE1 - 82599-specific
*/
/* LAN ID is needed for sfp_type determination */
hw
->
mac
.
ops
.
set_lan_id
(
hw
);
if
(
identifier
!=
IXGBE_SFF_IDENTIFIER_SFP
)
{
hw
->
phy
.
type
=
ixgbe_phy_sfp_unsupported
;
status
=
IXGBE_ERR_SFP_NOT_SUPPORTED
;
}
else
{
status
=
hw
->
phy
.
ops
.
read_i2c_eeprom
(
hw
,
IXGBE_SFF_1GBE_COMP_CODES
,
&
comp_codes_1g
);
if
(
status
==
IXGBE_ERR_SWFW_SYNC
||
status
==
IXGBE_ERR_I2C
||
status
==
IXGBE_ERR_SFP_NOT_PRESENT
)
goto
err_read_i2c_eeprom
;
status
=
hw
->
phy
.
ops
.
read_i2c_eeprom
(
hw
,
IXGBE_SFF_10GBE_COMP_CODES
,
&
comp_codes_10g
);
if
(
status
==
IXGBE_ERR_SWFW_SYNC
||
status
==
IXGBE_ERR_I2C
||
status
==
IXGBE_ERR_SFP_NOT_PRESENT
)
goto
err_read_i2c_eeprom
;
status
=
hw
->
phy
.
ops
.
read_i2c_eeprom
(
hw
,
IXGBE_SFF_CABLE_TECHNOLOGY
,
&
cable_tech
);
if
(
status
==
IXGBE_ERR_SWFW_SYNC
||
status
==
IXGBE_ERR_I2C
||
status
==
IXGBE_ERR_SFP_NOT_PRESENT
)
goto
err_read_i2c_eeprom
;
/* ID Module
* =========
* 0 SFP_DA_CU
* 1 SFP_SR
* 2 SFP_LR
* 3 SFP_DA_CORE0 - 82599-specific
* 4 SFP_DA_CORE1 - 82599-specific
* 5 SFP_SR/LR_CORE0 - 82599-specific
* 6 SFP_SR/LR_CORE1 - 82599-specific
* 7 SFP_act_lmt_DA_CORE0 - 82599-specific
* 8 SFP_act_lmt_DA_CORE1 - 82599-specific
* 9 SFP_1g_cu_CORE0 - 82599-specific
* 10 SFP_1g_cu_CORE1 - 82599-specific
*/
if
(
hw
->
mac
.
type
==
ixgbe_mac_82598EB
)
{
if
(
cable_tech
&
IXGBE_SFF_DA_PASSIVE_CABLE
)
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_da_cu
;
...
...
@@ -647,31 +701,27 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
ixgbe_sfp_type_da_act_lmt_core1
;
}
else
{
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_unknown
;
ixgbe_sfp_type_unknown
;
}
}
else
if
(
comp_codes_10g
&
IXGBE_SFF_10GBASESR_CAPABLE
)
}
else
if
(
comp_codes_10g
&
(
IXGBE_SFF_10GBASESR_CAPABLE
|
IXGBE_SFF_10GBASELR_CAPABLE
))
{
if
(
hw
->
bus
.
lan_id
==
0
)
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_srlr_core0
;
else
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_srlr_core1
;
else
if
(
comp_codes_10g
&
IXGBE_SFF_10GBASELR_CAPABLE
)
if
(
hw
->
bus
.
lan_id
==
0
)
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_srlr_core0
;
else
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_srlr_core1
;
else
if
(
comp_codes_1g
&
IXGBE_SFF_1GBASET_CAPABLE
)
}
else
if
(
comp_codes_1g
&
IXGBE_SFF_1GBASET_CAPABLE
)
{
if
(
hw
->
bus
.
lan_id
==
0
)
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_1g_cu_core0
;
else
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_1g_cu_core1
;
else
}
else
{
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_unknown
;
}
}
if
(
hw
->
phy
.
sfp_type
!=
stored_sfp_type
)
...
...
@@ -688,16 +738,33 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
/* Determine PHY vendor */
if
(
hw
->
phy
.
type
!=
ixgbe_phy_nl
)
{
hw
->
phy
.
id
=
identifier
;
hw
->
phy
.
ops
.
read_i2c_eeprom
(
hw
,
status
=
hw
->
phy
.
ops
.
read_i2c_eeprom
(
hw
,
IXGBE_SFF_VENDOR_OUI_BYTE0
,
&
oui_bytes
[
0
]);
hw
->
phy
.
ops
.
read_i2c_eeprom
(
hw
,
if
(
status
==
IXGBE_ERR_SWFW_SYNC
||
status
==
IXGBE_ERR_I2C
||
status
==
IXGBE_ERR_SFP_NOT_PRESENT
)
goto
err_read_i2c_eeprom
;
status
=
hw
->
phy
.
ops
.
read_i2c_eeprom
(
hw
,
IXGBE_SFF_VENDOR_OUI_BYTE1
,
&
oui_bytes
[
1
]);
hw
->
phy
.
ops
.
read_i2c_eeprom
(
hw
,
if
(
status
==
IXGBE_ERR_SWFW_SYNC
||
status
==
IXGBE_ERR_I2C
||
status
==
IXGBE_ERR_SFP_NOT_PRESENT
)
goto
err_read_i2c_eeprom
;
status
=
hw
->
phy
.
ops
.
read_i2c_eeprom
(
hw
,
IXGBE_SFF_VENDOR_OUI_BYTE2
,
&
oui_bytes
[
2
]);
if
(
status
==
IXGBE_ERR_SWFW_SYNC
||
status
==
IXGBE_ERR_I2C
||
status
==
IXGBE_ERR_SFP_NOT_PRESENT
)
goto
err_read_i2c_eeprom
;
vendor_oui
=
((
oui_bytes
[
0
]
<<
IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT
)
|
(
oui_bytes
[
1
]
<<
IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT
)
|
...
...
@@ -707,7 +774,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
case
IXGBE_SFF_VENDOR_OUI_TYCO
:
if
(
cable_tech
&
IXGBE_SFF_DA_PASSIVE_CABLE
)
hw
->
phy
.
type
=
ixgbe_phy_sfp_passive_tyco
;
ixgbe_phy_sfp_passive_tyco
;
break
;
case
IXGBE_SFF_VENDOR_OUI_FTL
:
if
(
cable_tech
&
IXGBE_SFF_DA_ACTIVE_CABLE
)
...
...
@@ -724,7 +791,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
default:
if
(
cable_tech
&
IXGBE_SFF_DA_PASSIVE_CABLE
)
hw
->
phy
.
type
=
ixgbe_phy_sfp_passive_unknown
;
ixgbe_phy_sfp_passive_unknown
;
else
if
(
cable_tech
&
IXGBE_SFF_DA_ACTIVE_CABLE
)
hw
->
phy
.
type
=
ixgbe_phy_sfp_active_unknown
;
...
...
@@ -734,7 +801,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
}
}
/* All
passive DA cables are supported
*/
/* All
ow any DA cable vendor
*/
if
(
cable_tech
&
(
IXGBE_SFF_DA_PASSIVE_CABLE
|
IXGBE_SFF_DA_ACTIVE_CABLE
))
{
status
=
0
;
...
...
@@ -776,15 +843,24 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
out:
return
status
;
err_read_i2c_eeprom:
hw
->
phy
.
sfp_type
=
ixgbe_sfp_type_not_present
;
if
(
hw
->
phy
.
type
!=
ixgbe_phy_nl
)
{
hw
->
phy
.
id
=
0
;
hw
->
phy
.
type
=
ixgbe_phy_unknown
;
}
return
IXGBE_ERR_SFP_NOT_PRESENT
;
}
/**
* ixgbe_get_sfp_init_sequence_offsets - Checks the MAC's EEPROM to see
* if it supports a given SFP+ module type, if so it returns the offsets to the
* phy init sequence block.
* ixgbe_get_sfp_init_sequence_offsets - Provides offset of PHY init sequence
* @hw: pointer to hardware structure
* @list_offset: offset to the SFP ID list
* @data_offset: offset to the SFP data block
*
* Checks the MAC's EEPROM to see if it supports a given SFP+ module type, if
* so it returns the offsets to the phy init sequence block.
**/
s32
ixgbe_get_sfp_init_sequence_offsets
(
struct
ixgbe_hw
*
hw
,
u16
*
list_offset
,
...
...
@@ -899,11 +975,22 @@ s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
u8
dev_addr
,
u8
*
data
)
{
s32
status
=
0
;
u32
max_retry
=
1
;
u32
max_retry
=
1
0
;
u32
retry
=
0
;
u16
swfw_mask
=
0
;
bool
nack
=
1
;
if
(
IXGBE_READ_REG
(
hw
,
IXGBE_STATUS
)
&
IXGBE_STATUS_LAN_ID_1
)
swfw_mask
=
IXGBE_GSSR_PHY1_SM
;
else
swfw_mask
=
IXGBE_GSSR_PHY0_SM
;
do
{
if
(
ixgbe_acquire_swfw_sync
(
hw
,
swfw_mask
)
!=
0
)
{
status
=
IXGBE_ERR_SWFW_SYNC
;
goto
read_byte_out
;
}
ixgbe_i2c_start
(
hw
);
/* Device Address and write indication */
...
...
@@ -946,6 +1033,8 @@ s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
break
;
fail:
ixgbe_release_swfw_sync
(
hw
,
swfw_mask
);
msleep
(
100
);
ixgbe_i2c_bus_clear
(
hw
);
retry
++
;
if
(
retry
<
max_retry
)
...
...
@@ -955,6 +1044,9 @@ s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
}
while
(
retry
<
max_retry
);
ixgbe_release_swfw_sync
(
hw
,
swfw_mask
);
read_byte_out:
return
status
;
}
...
...
@@ -973,6 +1065,17 @@ s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
s32
status
=
0
;
u32
max_retry
=
1
;
u32
retry
=
0
;
u16
swfw_mask
=
0
;
if
(
IXGBE_READ_REG
(
hw
,
IXGBE_STATUS
)
&
IXGBE_STATUS_LAN_ID_1
)
swfw_mask
=
IXGBE_GSSR_PHY1_SM
;
else
swfw_mask
=
IXGBE_GSSR_PHY0_SM
;
if
(
ixgbe_acquire_swfw_sync
(
hw
,
swfw_mask
)
!=
0
)
{
status
=
IXGBE_ERR_SWFW_SYNC
;
goto
write_byte_out
;
}
do
{
ixgbe_i2c_start
(
hw
);
...
...
@@ -1013,6 +1116,9 @@ s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
hw_dbg
(
hw
,
"I2C byte write error.
\n
"
);
}
while
(
retry
<
max_retry
);
ixgbe_release_swfw_sync
(
hw
,
swfw_mask
);
write_byte_out:
return
status
;
}
...
...
@@ -1331,6 +1437,8 @@ static void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)
u32
i2cctl
=
IXGBE_READ_REG
(
hw
,
IXGBE_I2CCTL
);
u32
i
;
ixgbe_i2c_start
(
hw
);
ixgbe_set_i2c_data
(
hw
,
&
i2cctl
,
1
);
for
(
i
=
0
;
i
<
9
;
i
++
)
{
...
...
@@ -1345,6 +1453,8 @@ static void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)
udelay
(
IXGBE_I2C_T_LOW
);
}
ixgbe_i2c_start
(
hw
);
/* Put the i2c bus back to default state */
ixgbe_i2c_stop
(
hw
);
}
...
...
drivers/net/ixgbe/ixgbe_phy.h
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_sriov.c
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_sriov.h
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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/ixgbe_type.h
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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,
...
...
@@ -91,7 +91,7 @@
/* General Receive Control */
#define IXGBE_GRC_MNG 0x00000001
/* Manageability Enable */
#define IXGBE_GRC_APME 0x00000002
/* A
dvanced Power Management Enable
*/
#define IXGBE_GRC_APME 0x00000002
/* A
PM enabled in EEPROM
*/
#define IXGBE_VPDDIAG0 0x10204
#define IXGBE_VPDDIAG1 0x10208
...
...
@@ -342,7 +342,7 @@
/* Wake Up Control */
#define IXGBE_WUC_PME_EN 0x00000002
/* PME Enable */
#define IXGBE_WUC_PME_STATUS 0x00000004
/* PME Status */
#define IXGBE_WUC_
ADVD3WUC 0x00000010
/* D3Cold wake up cap. enable
*/
#define IXGBE_WUC_
WKEN 0x00000010
/* Enable PE_WAKE_N pin assertion
*/
/* Wake Up Filter Control */
#define IXGBE_WUFC_LNKC 0x00000001
/* Link Status Change Wakeup Enable */
...
...
@@ -1614,6 +1614,8 @@
#define IXGBE_ALT_SAN_MAC_ADDR_CAPS_ALTWWN 0x1
/* Alt. WWN base exists */
/* PCI Bus Info */
#define IXGBE_PCI_DEVICE_STATUS 0xAA
#define IXGBE_PCI_DEVICE_STATUS_TRANSACTION_PENDING 0x0020
#define IXGBE_PCI_LINK_STATUS 0xB2
#define IXGBE_PCI_DEVICE_CONTROL2 0xC8
#define IXGBE_PCI_LINK_WIDTH 0x3F0
...
...
@@ -2242,6 +2244,7 @@ enum ixgbe_mac_type {
enum
ixgbe_phy_type
{
ixgbe_phy_unknown
=
0
,
ixgbe_phy_none
,
ixgbe_phy_tn
,
ixgbe_phy_aq
,
ixgbe_phy_cu_unknown
,
...
...
@@ -2330,32 +2333,31 @@ enum ixgbe_bus_type {
/* PCI bus speeds */
enum
ixgbe_bus_speed
{
ixgbe_bus_speed_unknown
=
0
,
ixgbe_bus_speed_33
,
ixgbe_bus_speed_66
,
ixgbe_bus_speed_100
,
ixgbe_bus_speed_120
,
ixgbe_bus_speed_133
,
ixgbe_bus_speed_2500
,
ixgbe_bus_speed_5000
,
ixgbe_bus_speed_33
=
33
,
ixgbe_bus_speed_66
=
66
,
ixgbe_bus_speed_100
=
100
,
ixgbe_bus_speed_120
=
120
,
ixgbe_bus_speed_133
=
133
,
ixgbe_bus_speed_2500
=
2500
,
ixgbe_bus_speed_5000
=
5000
,
ixgbe_bus_speed_reserved
};
/* PCI bus widths */
enum
ixgbe_bus_width
{
ixgbe_bus_width_unknown
=
0
,
ixgbe_bus_width_pcie_x1
,
ixgbe_bus_width_pcie_x2
,
ixgbe_bus_width_pcie_x1
=
1
,
ixgbe_bus_width_pcie_x2
=
2
,
ixgbe_bus_width_pcie_x4
=
4
,
ixgbe_bus_width_pcie_x8
=
8
,
ixgbe_bus_width_32
,
ixgbe_bus_width_64
,
ixgbe_bus_width_32
=
32
,
ixgbe_bus_width_64
=
64
,
ixgbe_bus_width_reserved
};
struct
ixgbe_addr_filter_info
{
u32
num_mc_addrs
;
u32
rar_used_count
;
u32
mc_addr_in_rar_count
;
u32
mta_in_use
;
u32
overflow_promisc
;
bool
uc_set_promisc
;
...
...
@@ -2493,6 +2495,8 @@ struct ixgbe_mac_operations {
s32
(
*
write_analog_reg8
)(
struct
ixgbe_hw
*
,
u32
,
u8
);
s32
(
*
setup_sfp
)(
struct
ixgbe_hw
*
);
s32
(
*
enable_rx_dma
)(
struct
ixgbe_hw
*
,
u32
);
s32
(
*
acquire_swfw_sync
)(
struct
ixgbe_hw
*
,
u16
);
void
(
*
release_swfw_sync
)(
struct
ixgbe_hw
*
,
u16
);
/* Link */
void
(
*
disable_tx_laser
)(
struct
ixgbe_hw
*
);
...
...
@@ -2515,7 +2519,6 @@ struct ixgbe_mac_operations {
s32
(
*
set_vmdq
)(
struct
ixgbe_hw
*
,
u32
,
u32
);
s32
(
*
clear_vmdq
)(
struct
ixgbe_hw
*
,
u32
,
u32
);
s32
(
*
init_rx_addrs
)(
struct
ixgbe_hw
*
);
s32
(
*
update_uc_addr_list
)(
struct
ixgbe_hw
*
,
struct
net_device
*
);
s32
(
*
update_mc_addr_list
)(
struct
ixgbe_hw
*
,
struct
net_device
*
);
s32
(
*
enable_mc
)(
struct
ixgbe_hw
*
);
s32
(
*
disable_mc
)(
struct
ixgbe_hw
*
);
...
...
@@ -2556,6 +2559,7 @@ struct ixgbe_eeprom_info {
u16
address_bits
;
};
#define IXGBE_FLAGS_DOUBLE_RESET_REQUIRED 0x01
struct
ixgbe_mac_info
{
struct
ixgbe_mac_operations
ops
;
enum
ixgbe_mac_type
type
;
...
...
@@ -2566,6 +2570,8 @@ struct ixgbe_mac_info {
u16
wwnn_prefix
;
/* prefix for World Wide Port Name (WWPN) */
u16
wwpn_prefix
;
#define IXGBE_MAX_MTA 128
u32
mta_shadow
[
IXGBE_MAX_MTA
];
s32
mc_filter_type
;
u32
mcft_size
;
u32
vft_size
;
...
...
@@ -2578,6 +2584,7 @@ struct ixgbe_mac_info {
u32
orig_autoc2
;
bool
orig_link_settings_stored
;
bool
autotry_restart
;
u8
flags
;
};
struct
ixgbe_phy_info
{
...
...
@@ -2684,7 +2691,6 @@ struct ixgbe_info {
#define IXGBE_ERR_EEPROM_VERSION -24
#define IXGBE_ERR_NO_SPACE -25
#define IXGBE_ERR_OVERTEMP -26
#define IXGBE_ERR_RAR_INDEX -27
#define IXGBE_ERR_SFP_SETUP_NOT_COMPLETE -30
#define IXGBE_ERR_PBA_SECTION -31
#define IXGBE_ERR_INVALID_ARGUMENT -32
...
...
drivers/net/ixgbe/ixgbe_x540.c
View file @
a45d49d1
/*******************************************************************************
Intel 10 Gigabit PCI Express Linux driver
Copyright(c) 1999 - 201
0
Intel Corporation.
Copyright(c) 1999 - 201
1
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,
...
...
@@ -31,7 +31,6 @@
#include "ixgbe.h"
#include "ixgbe_phy.h"
//#include "ixgbe_mbx.h"
#define IXGBE_X540_MAX_TX_QUEUES 128
#define IXGBE_X540_MAX_RX_QUEUES 128
...
...
@@ -110,12 +109,9 @@ static s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
* Prevent the PCI-E bus from from hanging by disabling PCI-E master
* access and verify no pending requests before reset
*/
status
=
ixgbe_disable_pcie_master
(
hw
);
if
(
status
!=
0
)
{
status
=
IXGBE_ERR_MASTER_REQUESTS_PENDING
;
hw_dbg
(
hw
,
"PCI-E Master disable polling has failed.
\n
"
);
}
ixgbe_disable_pcie_master
(
hw
);
mac_reset_top:
/*
* Issue global reset to the MAC. Needs to be SW reset if link is up.
* If link reset is used when link is up, it might reset the PHY when
...
...
@@ -148,6 +144,19 @@ static s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
hw_dbg
(
hw
,
"Reset polling failed to complete.
\n
"
);
}
/*
* Double resets are required for recovery from certain error
* conditions. Between resets, it is necessary to stall to allow time
* for any pending HW events to complete. We use 1usec since that is
* what is needed for ixgbe_disable_pcie_master(). The second reset
* then clears out any effects of those events.
*/
if
(
hw
->
mac
.
flags
&
IXGBE_FLAGS_DOUBLE_RESET_REQUIRED
)
{
hw
->
mac
.
flags
&=
~
IXGBE_FLAGS_DOUBLE_RESET_REQUIRED
;
udelay
(
1
);
goto
mac_reset_top
;
}
/* Clear PF Reset Done bit so PF/VF Mail Ops can work */
ctrl_ext
=
IXGBE_READ_REG
(
hw
,
IXGBE_CTRL_EXT
);
ctrl_ext
|=
IXGBE_CTRL_EXT_PFRSTD
;
...
...
@@ -191,7 +200,7 @@ static s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
* clear the multicast table. Also reset num_rar_entries to 128,
* since we modify this value when programming the SAN MAC address.
*/
hw
->
mac
.
num_rar_entries
=
128
;
hw
->
mac
.
num_rar_entries
=
IXGBE_X540_MAX_TX_QUEUES
;
hw
->
mac
.
ops
.
init_rx_addrs
(
hw
);
/* Store the permanent mac address */
...
...
@@ -278,7 +287,7 @@ static s32 ixgbe_read_eerd_X540(struct ixgbe_hw *hw, u16 offset, u16 *data)
{
s32
status
;
if
(
ixgbe_acquire_swfw_sync_X540
(
hw
,
IXGBE_GSSR_EEP_SM
)
==
0
)
if
(
hw
->
mac
.
ops
.
acquire_swfw_sync
(
hw
,
IXGBE_GSSR_EEP_SM
)
==
0
)
status
=
ixgbe_read_eerd_generic
(
hw
,
offset
,
data
);
else
status
=
IXGBE_ERR_SWFW_SYNC
;
...
...
@@ -311,7 +320,7 @@ static s32 ixgbe_write_eewr_X540(struct ixgbe_hw *hw, u16 offset, u16 data)
(
data
<<
IXGBE_EEPROM_RW_REG_DATA
)
|
IXGBE_EEPROM_RW_REG_START
;
if
(
ixgbe_acquire_swfw_sync_X540
(
hw
,
IXGBE_GSSR_EEP_SM
)
==
0
)
{
if
(
hw
->
mac
.
ops
.
acquire_swfw_sync
(
hw
,
IXGBE_GSSR_EEP_SM
)
==
0
)
{
status
=
ixgbe_poll_eerd_eewr_done
(
hw
,
IXGBE_NVM_POLL_WRITE
);
if
(
status
!=
0
)
{
hw_dbg
(
hw
,
"Eeprom write EEWR timed out
\n
"
);
...
...
@@ -676,7 +685,6 @@ static struct ixgbe_mac_operations mac_ops_X540 = {
.
set_vmdq
=
&
ixgbe_set_vmdq_generic
,
.
clear_vmdq
=
&
ixgbe_clear_vmdq_generic
,
.
init_rx_addrs
=
&
ixgbe_init_rx_addrs_generic
,
.
update_uc_addr_list
=
&
ixgbe_update_uc_addr_list_generic
,
.
update_mc_addr_list
=
&
ixgbe_update_mc_addr_list_generic
,
.
enable_mc
=
&
ixgbe_enable_mc_generic
,
.
disable_mc
=
&
ixgbe_disable_mc_generic
,
...
...
@@ -687,6 +695,8 @@ static struct ixgbe_mac_operations mac_ops_X540 = {
.
setup_sfp
=
NULL
,
.
set_mac_anti_spoofing
=
&
ixgbe_set_mac_anti_spoofing
,
.
set_vlan_anti_spoofing
=
&
ixgbe_set_vlan_anti_spoofing
,
.
acquire_swfw_sync
=
&
ixgbe_acquire_swfw_sync_X540
,
.
release_swfw_sync
=
&
ixgbe_release_swfw_sync_X540
,
};
static
struct
ixgbe_eeprom_operations
eeprom_ops_X540
=
{
...
...
@@ -702,7 +712,7 @@ static struct ixgbe_phy_operations phy_ops_X540 = {
.
identify
=
&
ixgbe_identify_phy_generic
,
.
identify_sfp
=
&
ixgbe_identify_sfp_module_generic
,
.
init
=
NULL
,
.
reset
=
&
ixgbe_reset_phy_generic
,
.
reset
=
NULL
,
.
read_reg
=
&
ixgbe_read_phy_reg_generic
,
.
write_reg
=
&
ixgbe_write_phy_reg_generic
,
.
setup_link
=
&
ixgbe_setup_phy_link_generic
,
...
...
drivers/net/ixgbevf/ixgbevf_main.c
View file @
a45d49d1
...
...
@@ -178,8 +178,6 @@ static inline bool ixgbevf_check_tx_hang(struct ixgbevf_adapter *adapter,
tx_ring
->
tx_buffer_info
[
eop
].
time_stamp
&&
time_after
(
jiffies
,
tx_ring
->
tx_buffer_info
[
eop
].
time_stamp
+
HZ
))
{
/* detected Tx unit hang */
union
ixgbe_adv_tx_desc
*
tx_desc
;
tx_desc
=
IXGBE_TX_DESC_ADV
(
*
tx_ring
,
eop
);
printk
(
KERN_ERR
"Detected Tx Unit Hang
\n
"
" Tx Queue <%d>
\n
"
" TDH, TDT <%x>, <%x>
\n
"
...
...
@@ -334,7 +332,6 @@ static void ixgbevf_receive_skb(struct ixgbevf_q_vector *q_vector,
struct
ixgbevf_adapter
*
adapter
=
q_vector
->
adapter
;
bool
is_vlan
=
(
status
&
IXGBE_RXD_STAT_VP
);
u16
tag
=
le16_to_cpu
(
rx_desc
->
wb
.
upper
.
vlan
);
int
ret
;
if
(
!
(
adapter
->
flags
&
IXGBE_FLAG_IN_NETPOLL
))
{
if
(
adapter
->
vlgrp
&&
is_vlan
)
...
...
@@ -345,9 +342,9 @@ static void ixgbevf_receive_skb(struct ixgbevf_q_vector *q_vector,
napi_gro_receive
(
&
q_vector
->
napi
,
skb
);
}
else
{
if
(
adapter
->
vlgrp
&&
is_vlan
)
ret
=
vlan_hwaccel_rx
(
skb
,
adapter
->
vlgrp
,
tag
);
vlan_hwaccel_rx
(
skb
,
adapter
->
vlgrp
,
tag
);
else
ret
=
netif_rx
(
skb
);
netif_rx
(
skb
);
}
}
...
...
@@ -3287,8 +3284,6 @@ static const struct net_device_ops ixgbe_netdev_ops = {
static
void
ixgbevf_assign_netdev_ops
(
struct
net_device
*
dev
)
{
struct
ixgbevf_adapter
*
adapter
;
adapter
=
netdev_priv
(
dev
);
dev
->
netdev_ops
=
&
ixgbe_netdev_ops
;
ixgbevf_set_ethtool_ops
(
dev
);
dev
->
watchdog_timeo
=
5
*
HZ
;
...
...
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