mirror of https://gitee.com/openkylin/linux.git
Merge branch '10GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue
Jeff Kirsher says: ==================== 10GbE Intel Wired LAN Driver Updates 2017-07-25 This series contains updates to ixgbe only. Tony provides all of the changes in the series, starting with adding a check to ensure that adding a MAC filter was successful, before setting the MACVLAN. In order to receive notifications of link configurations of the external PHY and support the configuration of the internal iXFI link on X552 devices, Tony enables LASI interrupts. Update the iXFI driver code flow, since the MAC register NW_MNG_IF_SEL fields have been redefined for X553 devices, so add MAC checks for iXFI flows. Added additional checks for flow control autonegotiation, since it is not support for X553 fiber and XFI devices. v2: removed unnecessary parens noticed by David Miller in patch 6 of the series. v3: dropped patch 6 of the original series, while we work out a more generic solution for malicious driver detection (MDD) support. v4: updated patch 1 of the series with the comments from Joe Perches which were: - switched logic to return on error - return 0 on success - declare retval as an integer ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
143f0cf963
|
@ -79,16 +79,28 @@ bool ixgbe_device_supports_autoneg_fc(struct ixgbe_hw *hw)
|
|||
|
||||
switch (hw->phy.media_type) {
|
||||
case ixgbe_media_type_fiber:
|
||||
hw->mac.ops.check_link(hw, &speed, &link_up, false);
|
||||
/* if link is down, assume supported */
|
||||
if (link_up)
|
||||
supported = speed == IXGBE_LINK_SPEED_1GB_FULL ?
|
||||
/* flow control autoneg black list */
|
||||
switch (hw->device_id) {
|
||||
case IXGBE_DEV_ID_X550EM_A_SFP:
|
||||
case IXGBE_DEV_ID_X550EM_A_SFP_N:
|
||||
supported = false;
|
||||
break;
|
||||
default:
|
||||
hw->mac.ops.check_link(hw, &speed, &link_up, false);
|
||||
/* if link is down, assume supported */
|
||||
if (link_up)
|
||||
supported = speed == IXGBE_LINK_SPEED_1GB_FULL ?
|
||||
true : false;
|
||||
else
|
||||
supported = true;
|
||||
else
|
||||
supported = true;
|
||||
}
|
||||
|
||||
break;
|
||||
case ixgbe_media_type_backplane:
|
||||
supported = true;
|
||||
if (hw->device_id == IXGBE_DEV_ID_X550EM_X_XFI)
|
||||
supported = false;
|
||||
else
|
||||
supported = true;
|
||||
break;
|
||||
case ixgbe_media_type_copper:
|
||||
/* only some copper devices support flow control autoneg */
|
||||
|
@ -111,6 +123,10 @@ bool ixgbe_device_supports_autoneg_fc(struct ixgbe_hw *hw)
|
|||
break;
|
||||
}
|
||||
|
||||
if (!supported)
|
||||
hw_dbg(hw, "Device %x does not support flow control autoneg\n",
|
||||
hw->device_id);
|
||||
|
||||
return supported;
|
||||
}
|
||||
|
||||
|
|
|
@ -386,7 +386,7 @@ u32 ixgbe_read_reg(struct ixgbe_hw *hw, u32 reg)
|
|||
if (ixgbe_removed(reg_addr))
|
||||
return IXGBE_FAILED_READ_REG;
|
||||
if (unlikely(hw->phy.nw_mng_if_sel &
|
||||
IXGBE_NW_MNG_IF_SEL_ENABLE_10_100M)) {
|
||||
IXGBE_NW_MNG_IF_SEL_SGMII_ENABLE)) {
|
||||
struct ixgbe_adapter *adapter;
|
||||
int i;
|
||||
|
||||
|
|
|
@ -679,8 +679,9 @@ static void ixgbe_clear_vf_vlans(struct ixgbe_adapter *adapter, u32 vf)
|
|||
static int ixgbe_set_vf_macvlan(struct ixgbe_adapter *adapter,
|
||||
int vf, int index, unsigned char *mac_addr)
|
||||
{
|
||||
struct list_head *pos;
|
||||
struct vf_macvlans *entry;
|
||||
struct list_head *pos;
|
||||
int retval = 0;
|
||||
|
||||
if (index <= 1) {
|
||||
list_for_each(pos, &adapter->vf_mvs.l) {
|
||||
|
@ -721,13 +722,15 @@ static int ixgbe_set_vf_macvlan(struct ixgbe_adapter *adapter,
|
|||
if (!entry || !entry->free)
|
||||
return -ENOSPC;
|
||||
|
||||
retval = ixgbe_add_mac_filter(adapter, mac_addr, vf);
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
|
||||
entry->free = false;
|
||||
entry->is_macvlan = true;
|
||||
entry->vf = vf;
|
||||
memcpy(entry->vf_macvlan, mac_addr, ETH_ALEN);
|
||||
|
||||
ixgbe_add_mac_filter(adapter, mac_addr, vf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -3778,8 +3778,8 @@ struct ixgbe_info {
|
|||
#define IXGBE_NW_MNG_IF_SEL_PHY_SPEED_1G BIT(19)
|
||||
#define IXGBE_NW_MNG_IF_SEL_PHY_SPEED_2_5G BIT(20)
|
||||
#define IXGBE_NW_MNG_IF_SEL_PHY_SPEED_10G BIT(21)
|
||||
#define IXGBE_NW_MNG_IF_SEL_ENABLE_10_100M BIT(23)
|
||||
#define IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE BIT(24)
|
||||
#define IXGBE_NW_MNG_IF_SEL_SGMII_ENABLE BIT(25)
|
||||
#define IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE BIT(24) /* X552 only */
|
||||
#define IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT 3
|
||||
#define IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD \
|
||||
(0x1F << IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT)
|
||||
|
|
|
@ -1555,9 +1555,14 @@ static s32 ixgbe_restart_an_internal_phy_x550em(struct ixgbe_hw *hw)
|
|||
**/
|
||||
static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
|
||||
{
|
||||
struct ixgbe_mac_info *mac = &hw->mac;
|
||||
s32 status;
|
||||
u32 reg_val;
|
||||
|
||||
/* iXFI is only supported with X552 */
|
||||
if (mac->type != ixgbe_mac_X550EM_x)
|
||||
return IXGBE_ERR_LINK_SETUP;
|
||||
|
||||
/* Disable AN and force speed to 10G Serial. */
|
||||
status = ixgbe_read_iosf_sb_reg_x550(hw,
|
||||
IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
|
||||
|
@ -1874,8 +1879,10 @@ static s32 ixgbe_setup_mac_link_t_X550em(struct ixgbe_hw *hw,
|
|||
else
|
||||
force_speed = IXGBE_LINK_SPEED_1GB_FULL;
|
||||
|
||||
/* If internal link mode is XFI, then setup XFI internal link. */
|
||||
if (!(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
|
||||
/* If X552 and internal link mode is XFI, then setup XFI internal link.
|
||||
*/
|
||||
if (hw->mac.type == ixgbe_mac_X550EM_x &&
|
||||
!(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
|
||||
status = ixgbe_setup_ixfi_x550em(hw, &force_speed);
|
||||
|
||||
if (status)
|
||||
|
@ -2404,17 +2411,30 @@ static s32 ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw)
|
|||
status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc);
|
||||
|
||||
/* Enable link status change alarm */
|
||||
status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
|
||||
MDIO_MMD_AN, ®);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
reg |= IXGBE_MDIO_PMA_TX_VEN_LASI_INT_EN;
|
||||
/* Enable the LASI interrupts on X552 devices to receive notifications
|
||||
* of the link configurations of the external PHY and correspondingly
|
||||
* support the configuration of the internal iXFI link, since iXFI does
|
||||
* not support auto-negotiation. This is not required for X553 devices
|
||||
* having KR support, which performs auto-negotiations and which is used
|
||||
* as the internal link to the external PHY. Hence adding a check here
|
||||
* to avoid enabling LASI interrupts for X553 devices.
|
||||
*/
|
||||
if (hw->mac.type != ixgbe_mac_x550em_a) {
|
||||
status = hw->phy.ops.read_reg(hw,
|
||||
IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
|
||||
MDIO_MMD_AN, ®);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
|
||||
MDIO_MMD_AN, reg);
|
||||
if (status)
|
||||
return status;
|
||||
reg |= IXGBE_MDIO_PMA_TX_VEN_LASI_INT_EN;
|
||||
|
||||
status = hw->phy.ops.write_reg(hw,
|
||||
IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
|
||||
MDIO_MMD_AN, reg);
|
||||
if (status)
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Enable high temperature failure and global fault alarms */
|
||||
status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK,
|
||||
|
@ -2615,7 +2635,8 @@ static s32 ixgbe_setup_internal_phy_t_x550em(struct ixgbe_hw *hw)
|
|||
if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
|
||||
return IXGBE_ERR_CONFIG;
|
||||
|
||||
if (hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE) {
|
||||
if (!(hw->mac.type == ixgbe_mac_X550EM_x &&
|
||||
!(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE))) {
|
||||
speed = IXGBE_LINK_SPEED_10GB_FULL |
|
||||
IXGBE_LINK_SPEED_1GB_FULL;
|
||||
return ixgbe_setup_kr_speed_x550em(hw, speed);
|
||||
|
@ -2822,7 +2843,7 @@ static s32 ixgbe_setup_fc_x550em(struct ixgbe_hw *hw)
|
|||
{
|
||||
bool pause, asm_dir;
|
||||
u32 reg_val;
|
||||
s32 rc;
|
||||
s32 rc = 0;
|
||||
|
||||
/* Validate the requested mode */
|
||||
if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
|
||||
|
@ -2865,32 +2886,37 @@ static s32 ixgbe_setup_fc_x550em(struct ixgbe_hw *hw)
|
|||
return IXGBE_ERR_CONFIG;
|
||||
}
|
||||
|
||||
if (hw->device_id != IXGBE_DEV_ID_X550EM_X_KR &&
|
||||
hw->device_id != IXGBE_DEV_ID_X550EM_A_KR &&
|
||||
hw->device_id != IXGBE_DEV_ID_X550EM_A_KR_L)
|
||||
return 0;
|
||||
switch (hw->device_id) {
|
||||
case IXGBE_DEV_ID_X550EM_X_KR:
|
||||
case IXGBE_DEV_ID_X550EM_A_KR:
|
||||
case IXGBE_DEV_ID_X550EM_A_KR_L:
|
||||
rc = hw->mac.ops.read_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY,
|
||||
®_val);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = hw->mac.ops.read_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY,
|
||||
®_val);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
reg_val &= ~(IXGBE_KRM_AN_CNTL_1_SYM_PAUSE |
|
||||
IXGBE_KRM_AN_CNTL_1_ASM_PAUSE);
|
||||
if (pause)
|
||||
reg_val |= IXGBE_KRM_AN_CNTL_1_SYM_PAUSE;
|
||||
if (asm_dir)
|
||||
reg_val |= IXGBE_KRM_AN_CNTL_1_ASM_PAUSE;
|
||||
rc = hw->mac.ops.write_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY,
|
||||
reg_val);
|
||||
|
||||
/* This device does not fully support AN. */
|
||||
hw->fc.disable_fc_autoneg = true;
|
||||
reg_val &= ~(IXGBE_KRM_AN_CNTL_1_SYM_PAUSE |
|
||||
IXGBE_KRM_AN_CNTL_1_ASM_PAUSE);
|
||||
if (pause)
|
||||
reg_val |= IXGBE_KRM_AN_CNTL_1_SYM_PAUSE;
|
||||
if (asm_dir)
|
||||
reg_val |= IXGBE_KRM_AN_CNTL_1_ASM_PAUSE;
|
||||
rc = hw->mac.ops.write_iosf_sb_reg(hw,
|
||||
IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
|
||||
IXGBE_SB_IOSF_TARGET_KR_PHY,
|
||||
reg_val);
|
||||
|
||||
/* This device does not fully support AN. */
|
||||
hw->fc.disable_fc_autoneg = true;
|
||||
break;
|
||||
case IXGBE_DEV_ID_X550EM_X_XFI:
|
||||
hw->fc.disable_fc_autoneg = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue