1
0
Fork 0

bnx2x: Correct speed from baseT into KR.

ethtool shows KR supported/advertised speeds incorrectly as baseT
in cases the board is in fact KR-base.

Signed-off-by: Yaniv Rosner <Yaniv.Rosner@qlogic.com>
Signed-off-by: Yuval Mintz <Yuval.Mintz@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
hifive-unleashed-5.1
Yuval Mintz 2015-06-25 15:19:22 +03:00 committed by David S. Miller
parent 1359d73c1d
commit 5d67c1c593
3 changed files with 59 additions and 19 deletions

View File

@ -257,14 +257,15 @@ static int bnx2x_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
{ {
struct bnx2x *bp = netdev_priv(dev); struct bnx2x *bp = netdev_priv(dev);
int cfg_idx = bnx2x_get_link_cfg_idx(bp); int cfg_idx = bnx2x_get_link_cfg_idx(bp);
u32 media_type;
/* Dual Media boards present all available port types */ /* Dual Media boards present all available port types */
cmd->supported = bp->port.supported[cfg_idx] | cmd->supported = bp->port.supported[cfg_idx] |
(bp->port.supported[cfg_idx ^ 1] & (bp->port.supported[cfg_idx ^ 1] &
(SUPPORTED_TP | SUPPORTED_FIBRE)); (SUPPORTED_TP | SUPPORTED_FIBRE));
cmd->advertising = bp->port.advertising[cfg_idx]; cmd->advertising = bp->port.advertising[cfg_idx];
if (bp->link_params.phy[bnx2x_get_cur_phy_idx(bp)].media_type == media_type = bp->link_params.phy[bnx2x_get_cur_phy_idx(bp)].media_type;
ETH_PHY_SFP_1G_FIBER) { if (media_type == ETH_PHY_SFP_1G_FIBER) {
cmd->supported &= ~(SUPPORTED_10000baseT_Full); cmd->supported &= ~(SUPPORTED_10000baseT_Full);
cmd->advertising &= ~(ADVERTISED_10000baseT_Full); cmd->advertising &= ~(ADVERTISED_10000baseT_Full);
} }
@ -312,12 +313,26 @@ static int bnx2x_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
cmd->lp_advertising |= ADVERTISED_100baseT_Full; cmd->lp_advertising |= ADVERTISED_100baseT_Full;
if (status & LINK_STATUS_LINK_PARTNER_1000THD_CAPABLE) if (status & LINK_STATUS_LINK_PARTNER_1000THD_CAPABLE)
cmd->lp_advertising |= ADVERTISED_1000baseT_Half; cmd->lp_advertising |= ADVERTISED_1000baseT_Half;
if (status & LINK_STATUS_LINK_PARTNER_1000TFD_CAPABLE) if (status & LINK_STATUS_LINK_PARTNER_1000TFD_CAPABLE) {
cmd->lp_advertising |= ADVERTISED_1000baseT_Full; if (media_type == ETH_PHY_KR) {
cmd->lp_advertising |=
ADVERTISED_1000baseKX_Full;
} else {
cmd->lp_advertising |=
ADVERTISED_1000baseT_Full;
}
}
if (status & LINK_STATUS_LINK_PARTNER_2500XFD_CAPABLE) if (status & LINK_STATUS_LINK_PARTNER_2500XFD_CAPABLE)
cmd->lp_advertising |= ADVERTISED_2500baseX_Full; cmd->lp_advertising |= ADVERTISED_2500baseX_Full;
if (status & LINK_STATUS_LINK_PARTNER_10GXFD_CAPABLE) if (status & LINK_STATUS_LINK_PARTNER_10GXFD_CAPABLE) {
cmd->lp_advertising |= ADVERTISED_10000baseT_Full; if (media_type == ETH_PHY_KR) {
cmd->lp_advertising |=
ADVERTISED_10000baseKR_Full;
} else {
cmd->lp_advertising |=
ADVERTISED_10000baseT_Full;
}
}
if (status & LINK_STATUS_LINK_PARTNER_20GXFD_CAPABLE) if (status & LINK_STATUS_LINK_PARTNER_20GXFD_CAPABLE)
cmd->lp_advertising |= ADVERTISED_20000baseKR2_Full; cmd->lp_advertising |= ADVERTISED_20000baseKR2_Full;
} }
@ -564,15 +579,20 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
return -EINVAL; return -EINVAL;
} }
if (!(bp->port.supported[cfg_idx] & if (bp->port.supported[cfg_idx] &
SUPPORTED_1000baseT_Full)) { SUPPORTED_1000baseT_Full) {
advertising = (ADVERTISED_1000baseT_Full |
ADVERTISED_TP);
} else if (bp->port.supported[cfg_idx] &
SUPPORTED_1000baseKX_Full) {
advertising = ADVERTISED_1000baseKX_Full;
} else {
DP(BNX2X_MSG_ETHTOOL, DP(BNX2X_MSG_ETHTOOL,
"1G full not supported\n"); "1G full not supported\n");
return -EINVAL; return -EINVAL;
} }
advertising = (ADVERTISED_1000baseT_Full |
ADVERTISED_TP);
break; break;
case SPEED_2500: case SPEED_2500:
@ -600,17 +620,22 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
return -EINVAL; return -EINVAL;
} }
phy_idx = bnx2x_get_cur_phy_idx(bp); phy_idx = bnx2x_get_cur_phy_idx(bp);
if (!(bp->port.supported[cfg_idx] if ((bp->port.supported[cfg_idx] &
& SUPPORTED_10000baseT_Full) || SUPPORTED_10000baseT_Full) &&
(bp->link_params.phy[phy_idx].media_type == (bp->link_params.phy[phy_idx].media_type !=
ETH_PHY_SFP_1G_FIBER)) { ETH_PHY_SFP_1G_FIBER)) {
advertising = (ADVERTISED_10000baseT_Full |
ADVERTISED_FIBRE);
} else if (bp->port.supported[cfg_idx] &
SUPPORTED_10000baseKR_Full) {
advertising = (ADVERTISED_10000baseKR_Full |
ADVERTISED_FIBRE);
} else {
DP(BNX2X_MSG_ETHTOOL, DP(BNX2X_MSG_ETHTOOL,
"10G full not supported\n"); "10G full not supported\n");
return -EINVAL; return -EINVAL;
} }
advertising = (ADVERTISED_10000baseT_Full |
ADVERTISED_FIBRE);
break; break;
default: default:

View File

@ -11493,7 +11493,9 @@ static const struct bnx2x_phy phy_warpcore = {
SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Half |
SUPPORTED_100baseT_Full | SUPPORTED_100baseT_Full |
SUPPORTED_1000baseT_Full | SUPPORTED_1000baseT_Full |
SUPPORTED_1000baseKX_Full |
SUPPORTED_10000baseT_Full | SUPPORTED_10000baseT_Full |
SUPPORTED_10000baseKR_Full |
SUPPORTED_20000baseKR2_Full | SUPPORTED_20000baseKR2_Full |
SUPPORTED_20000baseMLD2_Full | SUPPORTED_20000baseMLD2_Full |
SUPPORTED_FIBRE | SUPPORTED_FIBRE |
@ -11999,8 +12001,8 @@ static int bnx2x_populate_int_phy(struct bnx2x *bp, u32 shmem_base, u8 port,
break; break;
case PORT_HW_CFG_NET_SERDES_IF_KR: case PORT_HW_CFG_NET_SERDES_IF_KR:
phy->media_type = ETH_PHY_KR; phy->media_type = ETH_PHY_KR;
phy->supported &= (SUPPORTED_1000baseT_Full | phy->supported &= (SUPPORTED_1000baseKX_Full |
SUPPORTED_10000baseT_Full | SUPPORTED_10000baseKR_Full |
SUPPORTED_FIBRE | SUPPORTED_FIBRE |
SUPPORTED_Autoneg | SUPPORTED_Autoneg |
SUPPORTED_Pause | SUPPORTED_Pause |
@ -12018,8 +12020,8 @@ static int bnx2x_populate_int_phy(struct bnx2x *bp, u32 shmem_base, u8 port,
phy->media_type = ETH_PHY_KR; phy->media_type = ETH_PHY_KR;
phy->flags |= FLAGS_WC_DUAL_MODE; phy->flags |= FLAGS_WC_DUAL_MODE;
phy->supported &= (SUPPORTED_20000baseKR2_Full | phy->supported &= (SUPPORTED_20000baseKR2_Full |
SUPPORTED_10000baseT_Full | SUPPORTED_10000baseKR_Full |
SUPPORTED_1000baseT_Full | SUPPORTED_1000baseKX_Full |
SUPPORTED_Autoneg | SUPPORTED_Autoneg |
SUPPORTED_FIBRE | SUPPORTED_FIBRE |
SUPPORTED_Pause | SUPPORTED_Pause |

View File

@ -11143,6 +11143,12 @@ static void bnx2x_link_settings_requested(struct bnx2x *bp)
bp->port.advertising[idx] |= bp->port.advertising[idx] |=
(ADVERTISED_1000baseT_Full | (ADVERTISED_1000baseT_Full |
ADVERTISED_TP); ADVERTISED_TP);
} else if (bp->port.supported[idx] &
SUPPORTED_1000baseKX_Full) {
bp->link_params.req_line_speed[idx] =
SPEED_1000;
bp->port.advertising[idx] |=
ADVERTISED_1000baseKX_Full;
} else { } else {
BNX2X_ERR("NVRAM config error. Invalid link_config 0x%x speed_cap_mask 0x%x\n", BNX2X_ERR("NVRAM config error. Invalid link_config 0x%x speed_cap_mask 0x%x\n",
link_config, link_config,
@ -11175,6 +11181,13 @@ static void bnx2x_link_settings_requested(struct bnx2x *bp)
bp->port.advertising[idx] |= bp->port.advertising[idx] |=
(ADVERTISED_10000baseT_Full | (ADVERTISED_10000baseT_Full |
ADVERTISED_FIBRE); ADVERTISED_FIBRE);
} else if (bp->port.supported[idx] &
SUPPORTED_10000baseKR_Full) {
bp->link_params.req_line_speed[idx] =
SPEED_10000;
bp->port.advertising[idx] |=
(ADVERTISED_10000baseKR_Full |
ADVERTISED_FIBRE);
} else { } else {
BNX2X_ERR("NVRAM config error. Invalid link_config 0x%x speed_cap_mask 0x%x\n", BNX2X_ERR("NVRAM config error. Invalid link_config 0x%x speed_cap_mask 0x%x\n",
link_config, link_config,