Commit a7888596 authored by Philippe Reynes's avatar Philippe Reynes Committed by David S. Miller

net: atheros: atl2: use new api ethtool_{get|set}_link_ksettings

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

The previous implementation of set_settings was modifying
the value of advertising, but with the new API, it's not
possible. The structure ethtool_link_ksettings is defined
as const.
Signed-off-by: default avatarPhilippe Reynes <tremyfr@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1dae02b3
...@@ -1737,81 +1737,87 @@ static void atl2_write_pci_cfg(struct atl2_hw *hw, u32 reg, u16 *value) ...@@ -1737,81 +1737,87 @@ static void atl2_write_pci_cfg(struct atl2_hw *hw, u32 reg, u16 *value)
pci_write_config_word(adapter->pdev, reg, *value); pci_write_config_word(adapter->pdev, reg, *value);
} }
static int atl2_get_settings(struct net_device *netdev, static int atl2_get_link_ksettings(struct net_device *netdev,
struct ethtool_cmd *ecmd) struct ethtool_link_ksettings *cmd)
{ {
struct atl2_adapter *adapter = netdev_priv(netdev); struct atl2_adapter *adapter = netdev_priv(netdev);
struct atl2_hw *hw = &adapter->hw; struct atl2_hw *hw = &adapter->hw;
u32 supported, advertising;
ecmd->supported = (SUPPORTED_10baseT_Half | supported = (SUPPORTED_10baseT_Half |
SUPPORTED_10baseT_Full | SUPPORTED_10baseT_Full |
SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Half |
SUPPORTED_100baseT_Full | SUPPORTED_100baseT_Full |
SUPPORTED_Autoneg | SUPPORTED_Autoneg |
SUPPORTED_TP); SUPPORTED_TP);
ecmd->advertising = ADVERTISED_TP; advertising = ADVERTISED_TP;
ecmd->advertising |= ADVERTISED_Autoneg; advertising |= ADVERTISED_Autoneg;
ecmd->advertising |= hw->autoneg_advertised; advertising |= hw->autoneg_advertised;
ecmd->port = PORT_TP; cmd->base.port = PORT_TP;
ecmd->phy_address = 0; cmd->base.phy_address = 0;
ecmd->transceiver = XCVR_INTERNAL;
if (adapter->link_speed != SPEED_0) { if (adapter->link_speed != SPEED_0) {
ethtool_cmd_speed_set(ecmd, adapter->link_speed); cmd->base.speed = adapter->link_speed;
if (adapter->link_duplex == FULL_DUPLEX) if (adapter->link_duplex == FULL_DUPLEX)
ecmd->duplex = DUPLEX_FULL; cmd->base.duplex = DUPLEX_FULL;
else else
ecmd->duplex = DUPLEX_HALF; cmd->base.duplex = DUPLEX_HALF;
} else { } else {
ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN); cmd->base.speed = SPEED_UNKNOWN;
ecmd->duplex = DUPLEX_UNKNOWN; cmd->base.duplex = DUPLEX_UNKNOWN;
} }
ecmd->autoneg = AUTONEG_ENABLE; cmd->base.autoneg = AUTONEG_ENABLE;
ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
supported);
ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
advertising);
return 0; return 0;
} }
static int atl2_set_settings(struct net_device *netdev, static int atl2_set_link_ksettings(struct net_device *netdev,
struct ethtool_cmd *ecmd) const struct ethtool_link_ksettings *cmd)
{ {
struct atl2_adapter *adapter = netdev_priv(netdev); struct atl2_adapter *adapter = netdev_priv(netdev);
struct atl2_hw *hw = &adapter->hw; struct atl2_hw *hw = &adapter->hw;
u32 advertising;
ethtool_convert_link_mode_to_legacy_u32(&advertising,
cmd->link_modes.advertising);
while (test_and_set_bit(__ATL2_RESETTING, &adapter->flags)) while (test_and_set_bit(__ATL2_RESETTING, &adapter->flags))
msleep(1); msleep(1);
if (ecmd->autoneg == AUTONEG_ENABLE) { if (cmd->base.autoneg == AUTONEG_ENABLE) {
#define MY_ADV_MASK (ADVERTISE_10_HALF | \ #define MY_ADV_MASK (ADVERTISE_10_HALF | \
ADVERTISE_10_FULL | \ ADVERTISE_10_FULL | \
ADVERTISE_100_HALF| \ ADVERTISE_100_HALF| \
ADVERTISE_100_FULL) ADVERTISE_100_FULL)
if ((ecmd->advertising & MY_ADV_MASK) == MY_ADV_MASK) { if ((advertising & MY_ADV_MASK) == MY_ADV_MASK) {
hw->MediaType = MEDIA_TYPE_AUTO_SENSOR; hw->MediaType = MEDIA_TYPE_AUTO_SENSOR;
hw->autoneg_advertised = MY_ADV_MASK; hw->autoneg_advertised = MY_ADV_MASK;
} else if ((ecmd->advertising & MY_ADV_MASK) == } else if ((advertising & MY_ADV_MASK) == ADVERTISE_100_FULL) {
ADVERTISE_100_FULL) {
hw->MediaType = MEDIA_TYPE_100M_FULL; hw->MediaType = MEDIA_TYPE_100M_FULL;
hw->autoneg_advertised = ADVERTISE_100_FULL; hw->autoneg_advertised = ADVERTISE_100_FULL;
} else if ((ecmd->advertising & MY_ADV_MASK) == } else if ((advertising & MY_ADV_MASK) == ADVERTISE_100_HALF) {
ADVERTISE_100_HALF) {
hw->MediaType = MEDIA_TYPE_100M_HALF; hw->MediaType = MEDIA_TYPE_100M_HALF;
hw->autoneg_advertised = ADVERTISE_100_HALF; hw->autoneg_advertised = ADVERTISE_100_HALF;
} else if ((ecmd->advertising & MY_ADV_MASK) == } else if ((advertising & MY_ADV_MASK) == ADVERTISE_10_FULL) {
ADVERTISE_10_FULL) {
hw->MediaType = MEDIA_TYPE_10M_FULL; hw->MediaType = MEDIA_TYPE_10M_FULL;
hw->autoneg_advertised = ADVERTISE_10_FULL; hw->autoneg_advertised = ADVERTISE_10_FULL;
} else if ((ecmd->advertising & MY_ADV_MASK) == } else if ((advertising & MY_ADV_MASK) == ADVERTISE_10_HALF) {
ADVERTISE_10_HALF) {
hw->MediaType = MEDIA_TYPE_10M_HALF; hw->MediaType = MEDIA_TYPE_10M_HALF;
hw->autoneg_advertised = ADVERTISE_10_HALF; hw->autoneg_advertised = ADVERTISE_10_HALF;
} else { } else {
clear_bit(__ATL2_RESETTING, &adapter->flags); clear_bit(__ATL2_RESETTING, &adapter->flags);
return -EINVAL; return -EINVAL;
} }
ecmd->advertising = hw->autoneg_advertised | advertising = hw->autoneg_advertised |
ADVERTISED_TP | ADVERTISED_Autoneg; ADVERTISED_TP | ADVERTISED_Autoneg;
} else { } else {
clear_bit(__ATL2_RESETTING, &adapter->flags); clear_bit(__ATL2_RESETTING, &adapter->flags);
...@@ -2080,8 +2086,6 @@ static int atl2_nway_reset(struct net_device *netdev) ...@@ -2080,8 +2086,6 @@ static int atl2_nway_reset(struct net_device *netdev)
} }
static const struct ethtool_ops atl2_ethtool_ops = { static const struct ethtool_ops atl2_ethtool_ops = {
.get_settings = atl2_get_settings,
.set_settings = atl2_set_settings,
.get_drvinfo = atl2_get_drvinfo, .get_drvinfo = atl2_get_drvinfo,
.get_regs_len = atl2_get_regs_len, .get_regs_len = atl2_get_regs_len,
.get_regs = atl2_get_regs, .get_regs = atl2_get_regs,
...@@ -2094,6 +2098,8 @@ static const struct ethtool_ops atl2_ethtool_ops = { ...@@ -2094,6 +2098,8 @@ static const struct ethtool_ops atl2_ethtool_ops = {
.get_eeprom_len = atl2_get_eeprom_len, .get_eeprom_len = atl2_get_eeprom_len,
.get_eeprom = atl2_get_eeprom, .get_eeprom = atl2_get_eeprom,
.set_eeprom = atl2_set_eeprom, .set_eeprom = atl2_set_eeprom,
.get_link_ksettings = atl2_get_link_ksettings,
.set_link_ksettings = atl2_set_link_ksettings,
}; };
#define LBYTESWAP(a) ((((a) & 0x00ff00ff) << 8) | \ #define LBYTESWAP(a) ((((a) & 0x00ff00ff) << 8) | \
......
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