|
@@ -358,49 +358,47 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
|
|
|
|
|
cfg_idx = bnx2x_get_link_cfg_idx(bp);
|
|
|
old_multi_phy_config = bp->link_params.multi_phy_config;
|
|
|
- switch (cmd->port) {
|
|
|
- case PORT_TP:
|
|
|
- if (bp->port.supported[cfg_idx] & SUPPORTED_TP)
|
|
|
- break; /* no port change */
|
|
|
-
|
|
|
- if (!(bp->port.supported[0] & SUPPORTED_TP ||
|
|
|
- bp->port.supported[1] & SUPPORTED_TP)) {
|
|
|
- DP(BNX2X_MSG_ETHTOOL, "Unsupported port type\n");
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
- bp->link_params.multi_phy_config &=
|
|
|
- ~PORT_HW_CFG_PHY_SELECTION_MASK;
|
|
|
- if (bp->link_params.multi_phy_config &
|
|
|
- PORT_HW_CFG_PHY_SWAPPED_ENABLED)
|
|
|
- bp->link_params.multi_phy_config |=
|
|
|
- PORT_HW_CFG_PHY_SELECTION_SECOND_PHY;
|
|
|
- else
|
|
|
- bp->link_params.multi_phy_config |=
|
|
|
- PORT_HW_CFG_PHY_SELECTION_FIRST_PHY;
|
|
|
- break;
|
|
|
- case PORT_FIBRE:
|
|
|
- case PORT_DA:
|
|
|
- if (bp->port.supported[cfg_idx] & SUPPORTED_FIBRE)
|
|
|
- break; /* no port change */
|
|
|
-
|
|
|
- if (!(bp->port.supported[0] & SUPPORTED_FIBRE ||
|
|
|
- bp->port.supported[1] & SUPPORTED_FIBRE)) {
|
|
|
+ if (cmd->port != bnx2x_get_port_type(bp)) {
|
|
|
+ switch (cmd->port) {
|
|
|
+ case PORT_TP:
|
|
|
+ if (!(bp->port.supported[0] & SUPPORTED_TP ||
|
|
|
+ bp->port.supported[1] & SUPPORTED_TP)) {
|
|
|
+ DP(BNX2X_MSG_ETHTOOL,
|
|
|
+ "Unsupported port type\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ bp->link_params.multi_phy_config &=
|
|
|
+ ~PORT_HW_CFG_PHY_SELECTION_MASK;
|
|
|
+ if (bp->link_params.multi_phy_config &
|
|
|
+ PORT_HW_CFG_PHY_SWAPPED_ENABLED)
|
|
|
+ bp->link_params.multi_phy_config |=
|
|
|
+ PORT_HW_CFG_PHY_SELECTION_SECOND_PHY;
|
|
|
+ else
|
|
|
+ bp->link_params.multi_phy_config |=
|
|
|
+ PORT_HW_CFG_PHY_SELECTION_FIRST_PHY;
|
|
|
+ break;
|
|
|
+ case PORT_FIBRE:
|
|
|
+ case PORT_DA:
|
|
|
+ if (!(bp->port.supported[0] & SUPPORTED_FIBRE ||
|
|
|
+ bp->port.supported[1] & SUPPORTED_FIBRE)) {
|
|
|
+ DP(BNX2X_MSG_ETHTOOL,
|
|
|
+ "Unsupported port type\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ bp->link_params.multi_phy_config &=
|
|
|
+ ~PORT_HW_CFG_PHY_SELECTION_MASK;
|
|
|
+ if (bp->link_params.multi_phy_config &
|
|
|
+ PORT_HW_CFG_PHY_SWAPPED_ENABLED)
|
|
|
+ bp->link_params.multi_phy_config |=
|
|
|
+ PORT_HW_CFG_PHY_SELECTION_FIRST_PHY;
|
|
|
+ else
|
|
|
+ bp->link_params.multi_phy_config |=
|
|
|
+ PORT_HW_CFG_PHY_SELECTION_SECOND_PHY;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
DP(BNX2X_MSG_ETHTOOL, "Unsupported port type\n");
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
- bp->link_params.multi_phy_config &=
|
|
|
- ~PORT_HW_CFG_PHY_SELECTION_MASK;
|
|
|
- if (bp->link_params.multi_phy_config &
|
|
|
- PORT_HW_CFG_PHY_SWAPPED_ENABLED)
|
|
|
- bp->link_params.multi_phy_config |=
|
|
|
- PORT_HW_CFG_PHY_SELECTION_FIRST_PHY;
|
|
|
- else
|
|
|
- bp->link_params.multi_phy_config |=
|
|
|
- PORT_HW_CFG_PHY_SELECTION_SECOND_PHY;
|
|
|
- break;
|
|
|
- default:
|
|
|
- DP(BNX2X_MSG_ETHTOOL, "Unsupported port type\n");
|
|
|
- return -EINVAL;
|
|
|
}
|
|
|
/* Save new config in case command complete successfully */
|
|
|
new_multi_phy_config = bp->link_params.multi_phy_config;
|