Skip to content

Commit 0fa9e28

Browse files
Philippe Reynesdavem330
authored andcommitted
net: nvidia: forcedeth: 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. As I don't have the hardware, I'd be very pleased if someone may test this patch. Signed-off-by: Philippe Reynes <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent af6e2b5 commit 0fa9e28

File tree

1 file changed

+50
-41
lines changed

1 file changed

+50
-41
lines changed

drivers/net/ethernet/nvidia/forcedeth.c

Lines changed: 50 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4237,14 +4237,15 @@ static int nv_set_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo)
42374237
return 0;
42384238
}
42394239

4240-
static int nv_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
4240+
static int nv_get_link_ksettings(struct net_device *dev,
4241+
struct ethtool_link_ksettings *cmd)
42414242
{
42424243
struct fe_priv *np = netdev_priv(dev);
4243-
u32 speed;
4244+
u32 speed, supported, advertising;
42444245
int adv;
42454246

42464247
spin_lock_irq(&np->lock);
4247-
ecmd->port = PORT_MII;
4248+
cmd->base.port = PORT_MII;
42484249
if (!netif_running(dev)) {
42494250
/* We do not track link speed / duplex setting if the
42504251
* interface is disabled. Force a link check */
@@ -4272,81 +4273,89 @@ static int nv_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
42724273
speed = -1;
42734274
break;
42744275
}
4275-
ecmd->duplex = DUPLEX_HALF;
4276+
cmd->base.duplex = DUPLEX_HALF;
42764277
if (np->duplex)
4277-
ecmd->duplex = DUPLEX_FULL;
4278+
cmd->base.duplex = DUPLEX_FULL;
42784279
} else {
42794280
speed = SPEED_UNKNOWN;
4280-
ecmd->duplex = DUPLEX_UNKNOWN;
4281+
cmd->base.duplex = DUPLEX_UNKNOWN;
42814282
}
4282-
ethtool_cmd_speed_set(ecmd, speed);
4283-
ecmd->autoneg = np->autoneg;
4283+
cmd->base.speed = speed;
4284+
cmd->base.autoneg = np->autoneg;
42844285

4285-
ecmd->advertising = ADVERTISED_MII;
4286+
advertising = ADVERTISED_MII;
42864287
if (np->autoneg) {
4287-
ecmd->advertising |= ADVERTISED_Autoneg;
4288+
advertising |= ADVERTISED_Autoneg;
42884289
adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ);
42894290
if (adv & ADVERTISE_10HALF)
4290-
ecmd->advertising |= ADVERTISED_10baseT_Half;
4291+
advertising |= ADVERTISED_10baseT_Half;
42914292
if (adv & ADVERTISE_10FULL)
4292-
ecmd->advertising |= ADVERTISED_10baseT_Full;
4293+
advertising |= ADVERTISED_10baseT_Full;
42934294
if (adv & ADVERTISE_100HALF)
4294-
ecmd->advertising |= ADVERTISED_100baseT_Half;
4295+
advertising |= ADVERTISED_100baseT_Half;
42954296
if (adv & ADVERTISE_100FULL)
4296-
ecmd->advertising |= ADVERTISED_100baseT_Full;
4297+
advertising |= ADVERTISED_100baseT_Full;
42974298
if (np->gigabit == PHY_GIGABIT) {
42984299
adv = mii_rw(dev, np->phyaddr, MII_CTRL1000, MII_READ);
42994300
if (adv & ADVERTISE_1000FULL)
4300-
ecmd->advertising |= ADVERTISED_1000baseT_Full;
4301+
advertising |= ADVERTISED_1000baseT_Full;
43014302
}
43024303
}
4303-
ecmd->supported = (SUPPORTED_Autoneg |
4304+
supported = (SUPPORTED_Autoneg |
43044305
SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
43054306
SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
43064307
SUPPORTED_MII);
43074308
if (np->gigabit == PHY_GIGABIT)
4308-
ecmd->supported |= SUPPORTED_1000baseT_Full;
4309+
supported |= SUPPORTED_1000baseT_Full;
43094310

4310-
ecmd->phy_address = np->phyaddr;
4311-
ecmd->transceiver = XCVR_EXTERNAL;
4311+
cmd->base.phy_address = np->phyaddr;
4312+
4313+
ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
4314+
supported);
4315+
ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
4316+
advertising);
43124317

43134318
/* ignore maxtxpkt, maxrxpkt for now */
43144319
spin_unlock_irq(&np->lock);
43154320
return 0;
43164321
}
43174322

4318-
static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
4323+
static int nv_set_link_ksettings(struct net_device *dev,
4324+
const struct ethtool_link_ksettings *cmd)
43194325
{
43204326
struct fe_priv *np = netdev_priv(dev);
4321-
u32 speed = ethtool_cmd_speed(ecmd);
4327+
u32 speed = cmd->base.speed;
4328+
u32 advertising;
43224329

4323-
if (ecmd->port != PORT_MII)
4324-
return -EINVAL;
4325-
if (ecmd->transceiver != XCVR_EXTERNAL)
4330+
ethtool_convert_link_mode_to_legacy_u32(&advertising,
4331+
cmd->link_modes.advertising);
4332+
4333+
if (cmd->base.port != PORT_MII)
43264334
return -EINVAL;
4327-
if (ecmd->phy_address != np->phyaddr) {
4335+
if (cmd->base.phy_address != np->phyaddr) {
43284336
/* TODO: support switching between multiple phys. Should be
43294337
* trivial, but not enabled due to lack of test hardware. */
43304338
return -EINVAL;
43314339
}
4332-
if (ecmd->autoneg == AUTONEG_ENABLE) {
4340+
if (cmd->base.autoneg == AUTONEG_ENABLE) {
43334341
u32 mask;
43344342

43354343
mask = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
43364344
ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full;
43374345
if (np->gigabit == PHY_GIGABIT)
43384346
mask |= ADVERTISED_1000baseT_Full;
43394347

4340-
if ((ecmd->advertising & mask) == 0)
4348+
if ((advertising & mask) == 0)
43414349
return -EINVAL;
43424350

4343-
} else if (ecmd->autoneg == AUTONEG_DISABLE) {
4351+
} else if (cmd->base.autoneg == AUTONEG_DISABLE) {
43444352
/* Note: autonegotiation disable, speed 1000 intentionally
43454353
* forbidden - no one should need that. */
43464354

43474355
if (speed != SPEED_10 && speed != SPEED_100)
43484356
return -EINVAL;
4349-
if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL)
4357+
if (cmd->base.duplex != DUPLEX_HALF &&
4358+
cmd->base.duplex != DUPLEX_FULL)
43504359
return -EINVAL;
43514360
} else {
43524361
return -EINVAL;
@@ -4376,21 +4385,21 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
43764385
netif_tx_unlock_bh(dev);
43774386
}
43784387

4379-
if (ecmd->autoneg == AUTONEG_ENABLE) {
4388+
if (cmd->base.autoneg == AUTONEG_ENABLE) {
43804389
int adv, bmcr;
43814390

43824391
np->autoneg = 1;
43834392

43844393
/* advertise only what has been requested */
43854394
adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ);
43864395
adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
4387-
if (ecmd->advertising & ADVERTISED_10baseT_Half)
4396+
if (advertising & ADVERTISED_10baseT_Half)
43884397
adv |= ADVERTISE_10HALF;
4389-
if (ecmd->advertising & ADVERTISED_10baseT_Full)
4398+
if (advertising & ADVERTISED_10baseT_Full)
43904399
adv |= ADVERTISE_10FULL;
4391-
if (ecmd->advertising & ADVERTISED_100baseT_Half)
4400+
if (advertising & ADVERTISED_100baseT_Half)
43924401
adv |= ADVERTISE_100HALF;
4393-
if (ecmd->advertising & ADVERTISED_100baseT_Full)
4402+
if (advertising & ADVERTISED_100baseT_Full)
43944403
adv |= ADVERTISE_100FULL;
43954404
if (np->pause_flags & NV_PAUSEFRAME_RX_REQ) /* for rx we set both advertisements but disable tx pause */
43964405
adv |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
@@ -4401,7 +4410,7 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
44014410
if (np->gigabit == PHY_GIGABIT) {
44024411
adv = mii_rw(dev, np->phyaddr, MII_CTRL1000, MII_READ);
44034412
adv &= ~ADVERTISE_1000FULL;
4404-
if (ecmd->advertising & ADVERTISED_1000baseT_Full)
4413+
if (advertising & ADVERTISED_1000baseT_Full)
44054414
adv |= ADVERTISE_1000FULL;
44064415
mii_rw(dev, np->phyaddr, MII_CTRL1000, adv);
44074416
}
@@ -4428,13 +4437,13 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
44284437

44294438
adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ);
44304439
adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
4431-
if (speed == SPEED_10 && ecmd->duplex == DUPLEX_HALF)
4440+
if (speed == SPEED_10 && cmd->base.duplex == DUPLEX_HALF)
44324441
adv |= ADVERTISE_10HALF;
4433-
if (speed == SPEED_10 && ecmd->duplex == DUPLEX_FULL)
4442+
if (speed == SPEED_10 && cmd->base.duplex == DUPLEX_FULL)
44344443
adv |= ADVERTISE_10FULL;
4435-
if (speed == SPEED_100 && ecmd->duplex == DUPLEX_HALF)
4444+
if (speed == SPEED_100 && cmd->base.duplex == DUPLEX_HALF)
44364445
adv |= ADVERTISE_100HALF;
4437-
if (speed == SPEED_100 && ecmd->duplex == DUPLEX_FULL)
4446+
if (speed == SPEED_100 && cmd->base.duplex == DUPLEX_FULL)
44384447
adv |= ADVERTISE_100FULL;
44394448
np->pause_flags &= ~(NV_PAUSEFRAME_AUTONEG|NV_PAUSEFRAME_RX_ENABLE|NV_PAUSEFRAME_TX_ENABLE);
44404449
if (np->pause_flags & NV_PAUSEFRAME_RX_REQ) {/* for rx we set both advertisements but disable tx pause */
@@ -5241,8 +5250,6 @@ static const struct ethtool_ops ops = {
52415250
.get_link = ethtool_op_get_link,
52425251
.get_wol = nv_get_wol,
52435252
.set_wol = nv_set_wol,
5244-
.get_settings = nv_get_settings,
5245-
.set_settings = nv_set_settings,
52465253
.get_regs_len = nv_get_regs_len,
52475254
.get_regs = nv_get_regs,
52485255
.nway_reset = nv_nway_reset,
@@ -5255,6 +5262,8 @@ static const struct ethtool_ops ops = {
52555262
.get_sset_count = nv_get_sset_count,
52565263
.self_test = nv_self_test,
52575264
.get_ts_info = ethtool_op_get_ts_info,
5265+
.get_link_ksettings = nv_get_link_ksettings,
5266+
.set_link_ksettings = nv_set_link_ksettings,
52585267
};
52595268

52605269
/* The mgmt unit and driver use a semaphore to access the phy during init */

0 commit comments

Comments
 (0)