Skip to content

Commit

Permalink
net: ethernet: hisilicon: hns: use new api ethtool_{get|set}_link_kse…
Browse files Browse the repository at this point in the history
…ttings

The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

Signed-off-by: Philippe Reynes <tremyfr@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Philippe Reynes authored and David S. Miller committed Sep 22, 2016
1 parent 262b38c commit d270f76
Showing 1 changed file with 58 additions and 47 deletions.
105 changes: 58 additions & 47 deletions drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,14 @@ static u32 hns_nic_get_link(struct net_device *net_dev)
}

static void hns_get_mdix_mode(struct net_device *net_dev,
struct ethtool_cmd *cmd)
struct ethtool_link_ksettings *cmd)
{
int mdix_ctrl, mdix, retval, is_resolved;
struct phy_device *phy_dev = net_dev->phydev;

if (!phy_dev || !phy_dev->mdio.bus) {
cmd->eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID;
cmd->eth_tp_mdix = ETH_TP_MDI_INVALID;
cmd->base.eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID;
cmd->base.eth_tp_mdix = ETH_TP_MDI_INVALID;
return;
}

Expand All @@ -88,42 +88,43 @@ static void hns_get_mdix_mode(struct net_device *net_dev,

switch (mdix_ctrl) {
case 0x0:
cmd->eth_tp_mdix_ctrl = ETH_TP_MDI;
cmd->base.eth_tp_mdix_ctrl = ETH_TP_MDI;
break;
case 0x1:
cmd->eth_tp_mdix_ctrl = ETH_TP_MDI_X;
cmd->base.eth_tp_mdix_ctrl = ETH_TP_MDI_X;
break;
case 0x3:
cmd->eth_tp_mdix_ctrl = ETH_TP_MDI_AUTO;
cmd->base.eth_tp_mdix_ctrl = ETH_TP_MDI_AUTO;
break;
default:
cmd->eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID;
cmd->base.eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID;
break;
}

if (!is_resolved)
cmd->eth_tp_mdix = ETH_TP_MDI_INVALID;
cmd->base.eth_tp_mdix = ETH_TP_MDI_INVALID;
else if (mdix)
cmd->eth_tp_mdix = ETH_TP_MDI_X;
cmd->base.eth_tp_mdix = ETH_TP_MDI_X;
else
cmd->eth_tp_mdix = ETH_TP_MDI;
cmd->base.eth_tp_mdix = ETH_TP_MDI;
}

/**
*hns_nic_get_settings - implement ethtool get settings
*hns_nic_get_link_ksettings - implement ethtool get link ksettings
*@net_dev: net_device
*@cmd: ethtool_cmd
*@cmd: ethtool_link_ksettings
*retuen 0 - success , negative --fail
*/
static int hns_nic_get_settings(struct net_device *net_dev,
struct ethtool_cmd *cmd)
static int hns_nic_get_link_ksettings(struct net_device *net_dev,
struct ethtool_link_ksettings *cmd)
{
struct hns_nic_priv *priv = netdev_priv(net_dev);
struct hnae_handle *h;
u32 link_stat;
int ret;
u8 duplex;
u16 speed;
u32 supported, advertising;

if (!priv || !priv->ae_handle)
return -ESRCH;
Expand All @@ -138,62 +139,71 @@ static int hns_nic_get_settings(struct net_device *net_dev,
return -EINVAL;
}

ethtool_convert_link_mode_to_legacy_u32(&supported,
cmd->link_modes.supported);
ethtool_convert_link_mode_to_legacy_u32(&advertising,
cmd->link_modes.advertising);

/* When there is no phy, autoneg is off. */
cmd->autoneg = false;
ethtool_cmd_speed_set(cmd, speed);
cmd->duplex = duplex;
cmd->base.autoneg = false;
cmd->base.cmd = speed;
cmd->base.duplex = duplex;

if (net_dev->phydev)
(void)phy_ethtool_gset(net_dev->phydev, cmd);
(void)phy_ethtool_ksettings_get(net_dev->phydev, cmd);

link_stat = hns_nic_get_link(net_dev);
if (!link_stat) {
ethtool_cmd_speed_set(cmd, (u32)SPEED_UNKNOWN);
cmd->duplex = DUPLEX_UNKNOWN;
cmd->base.speed = (u32)SPEED_UNKNOWN;
cmd->base.duplex = DUPLEX_UNKNOWN;
}

if (cmd->autoneg)
cmd->advertising |= ADVERTISED_Autoneg;
if (cmd->base.autoneg)
advertising |= ADVERTISED_Autoneg;

cmd->supported |= h->if_support;
supported |= h->if_support;
if (h->phy_if == PHY_INTERFACE_MODE_SGMII) {
cmd->supported |= SUPPORTED_TP;
cmd->advertising |= ADVERTISED_1000baseT_Full;
supported |= SUPPORTED_TP;
advertising |= ADVERTISED_1000baseT_Full;
} else if (h->phy_if == PHY_INTERFACE_MODE_XGMII) {
cmd->supported |= SUPPORTED_FIBRE;
cmd->advertising |= ADVERTISED_10000baseKR_Full;
supported |= SUPPORTED_FIBRE;
advertising |= ADVERTISED_10000baseKR_Full;
}

switch (h->media_type) {
case HNAE_MEDIA_TYPE_FIBER:
cmd->port = PORT_FIBRE;
cmd->base.port = PORT_FIBRE;
break;
case HNAE_MEDIA_TYPE_COPPER:
cmd->port = PORT_TP;
cmd->base.port = PORT_TP;
break;
case HNAE_MEDIA_TYPE_UNKNOWN:
default:
break;
}

if (!(AE_IS_VER1(priv->enet_ver) && h->port_type == HNAE_PORT_DEBUG))
cmd->supported |= SUPPORTED_Pause;
supported |= SUPPORTED_Pause;

ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
supported);
ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
advertising);

cmd->transceiver = XCVR_EXTERNAL;
cmd->mdio_support = (ETH_MDIO_SUPPORTS_C45 | ETH_MDIO_SUPPORTS_C22);
cmd->base.mdio_support = ETH_MDIO_SUPPORTS_C45 | ETH_MDIO_SUPPORTS_C22;
hns_get_mdix_mode(net_dev, cmd);

return 0;
}

/**
*hns_nic_set_settings - implement ethtool set settings
*hns_nic_set_link_settings - implement ethtool set link ksettings
*@net_dev: net_device
*@cmd: ethtool_cmd
*@cmd: ethtool_link_ksettings
*retuen 0 - success , negative --fail
*/
static int hns_nic_set_settings(struct net_device *net_dev,
struct ethtool_cmd *cmd)
static int hns_nic_set_link_ksettings(struct net_device *net_dev,
const struct ethtool_link_ksettings *cmd)
{
struct hns_nic_priv *priv = netdev_priv(net_dev);
struct hnae_handle *h;
Expand All @@ -207,32 +217,33 @@ static int hns_nic_set_settings(struct net_device *net_dev,
return -ENODEV;

h = priv->ae_handle;
speed = ethtool_cmd_speed(cmd);
speed = cmd->base.speed;

if (h->phy_if == PHY_INTERFACE_MODE_XGMII) {
if (cmd->autoneg == AUTONEG_ENABLE || speed != SPEED_10000 ||
cmd->duplex != DUPLEX_FULL)
if (cmd->base.autoneg == AUTONEG_ENABLE ||
speed != SPEED_10000 ||
cmd->base.duplex != DUPLEX_FULL)
return -EINVAL;
} else if (h->phy_if == PHY_INTERFACE_MODE_SGMII) {
if (!net_dev->phydev && cmd->autoneg == AUTONEG_ENABLE)
if (!net_dev->phydev && cmd->base.autoneg == AUTONEG_ENABLE)
return -EINVAL;

if (speed == SPEED_1000 && cmd->duplex == DUPLEX_HALF)
if (speed == SPEED_1000 && cmd->base.duplex == DUPLEX_HALF)
return -EINVAL;
if (net_dev->phydev)
return phy_ethtool_sset(net_dev->phydev, cmd);
return phy_ethtool_ksettings_set(net_dev->phydev, cmd);

if ((speed != SPEED_10 && speed != SPEED_100 &&
speed != SPEED_1000) || (cmd->duplex != DUPLEX_HALF &&
cmd->duplex != DUPLEX_FULL))
speed != SPEED_1000) || (cmd->base.duplex != DUPLEX_HALF &&
cmd->base.duplex != DUPLEX_FULL))
return -EINVAL;
} else {
netdev_err(net_dev, "Not supported!");
return -ENOTSUPP;
}

if (h->dev->ops->adjust_link) {
h->dev->ops->adjust_link(h, (int)speed, cmd->duplex);
h->dev->ops->adjust_link(h, (int)speed, cmd->base.duplex);
return 0;
}

Expand Down Expand Up @@ -1264,8 +1275,6 @@ static int hns_get_rxnfc(struct net_device *netdev,
static const struct ethtool_ops hns_ethtool_ops = {
.get_drvinfo = hns_nic_get_drvinfo,
.get_link = hns_nic_get_link,
.get_settings = hns_nic_get_settings,
.set_settings = hns_nic_set_settings,
.get_ringparam = hns_get_ringparam,
.get_pauseparam = hns_get_pauseparam,
.set_pauseparam = hns_set_pauseparam,
Expand All @@ -1285,6 +1294,8 @@ static const struct ethtool_ops hns_ethtool_ops = {
.get_rxfh = hns_get_rss,
.set_rxfh = hns_set_rss,
.get_rxnfc = hns_get_rxnfc,
.get_link_ksettings = hns_nic_get_link_ksettings,
.set_link_ksettings = hns_nic_set_link_ksettings,
};

void hns_ethtool_set_ops(struct net_device *ndev)
Expand Down

0 comments on commit d270f76

Please sign in to comment.