Commit dbef807e authored by Yuval Mintz's avatar Yuval Mintz Committed by David S. Miller

bnx2x: 1G sfp+ module handling

Automatically lower requested link speed to 1G in case 1G SFP+
module is detected.
Signed-off-by: default avatarYuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: default avatarYaniv Rosner <yaniv.rosner@broadcom.com>
Signed-off-by: default avatarEilon Greenstein <eilong@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a351d497
...@@ -187,7 +187,8 @@ static int bnx2x_get_port_type(struct bnx2x *bp) ...@@ -187,7 +187,8 @@ static int bnx2x_get_port_type(struct bnx2x *bp)
int port_type; int port_type;
u32 phy_idx = bnx2x_get_cur_phy_idx(bp); u32 phy_idx = bnx2x_get_cur_phy_idx(bp);
switch (bp->link_params.phy[phy_idx].media_type) { switch (bp->link_params.phy[phy_idx].media_type) {
case ETH_PHY_SFP_FIBER: case ETH_PHY_SFPP_10G_FIBER:
case ETH_PHY_SFP_1G_FIBER:
case ETH_PHY_XFP_FIBER: case ETH_PHY_XFP_FIBER:
case ETH_PHY_KR: case ETH_PHY_KR:
case ETH_PHY_CX4: case ETH_PHY_CX4:
...@@ -220,6 +221,11 @@ static int bnx2x_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) ...@@ -220,6 +221,11 @@ static int bnx2x_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
(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 ==
ETH_PHY_SFP_1G_FIBER) {
cmd->supported &= ~(SUPPORTED_10000baseT_Full);
cmd->advertising &= ~(ADVERTISED_10000baseT_Full);
}
if ((bp->state == BNX2X_STATE_OPEN) && (bp->link_vars.link_up)) { if ((bp->state == BNX2X_STATE_OPEN) && (bp->link_vars.link_up)) {
if (!(bp->flags & MF_FUNC_DIS)) { if (!(bp->flags & MF_FUNC_DIS)) {
...@@ -295,7 +301,7 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) ...@@ -295,7 +301,7 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
{ {
struct bnx2x *bp = netdev_priv(dev); struct bnx2x *bp = netdev_priv(dev);
u32 advertising, cfg_idx, old_multi_phy_config, new_multi_phy_config; u32 advertising, cfg_idx, old_multi_phy_config, new_multi_phy_config;
u32 speed; u32 speed, phy_idx;
if (IS_MF_SD(bp)) if (IS_MF_SD(bp))
return 0; return 0;
...@@ -550,9 +556,11 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) ...@@ -550,9 +556,11 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
"10G half not supported\n"); "10G half not supported\n");
return -EINVAL; return -EINVAL;
} }
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 ==
ETH_PHY_SFP_1G_FIBER)) {
DP(BNX2X_MSG_ETHTOOL, DP(BNX2X_MSG_ETHTOOL,
"10G full not supported\n"); "10G full not supported\n");
return -EINVAL; return -EINVAL;
......
...@@ -168,14 +168,15 @@ struct bnx2x_phy { ...@@ -168,14 +168,15 @@ struct bnx2x_phy {
u32 supported; u32 supported;
u32 media_type; u32 media_type;
#define ETH_PHY_UNSPECIFIED 0x0 #define ETH_PHY_UNSPECIFIED 0x0
#define ETH_PHY_SFP_FIBER 0x1 #define ETH_PHY_SFPP_10G_FIBER 0x1
#define ETH_PHY_XFP_FIBER 0x2 #define ETH_PHY_XFP_FIBER 0x2
#define ETH_PHY_DA_TWINAX 0x3 #define ETH_PHY_DA_TWINAX 0x3
#define ETH_PHY_BASE_T 0x4 #define ETH_PHY_BASE_T 0x4
#define ETH_PHY_KR 0xf0 #define ETH_PHY_SFP_1G_FIBER 0x5
#define ETH_PHY_CX4 0xf1 #define ETH_PHY_KR 0xf0
#define ETH_PHY_NOT_PRESENT 0xff #define ETH_PHY_CX4 0xf1
#define ETH_PHY_NOT_PRESENT 0xff
/* The address in which version is located*/ /* The address in which version is located*/
u32 ver_addr; u32 ver_addr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment