@@ -4237,14 +4237,15 @@ static int nv_set_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo)
4237
4237
return 0 ;
4238
4238
}
4239
4239
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 )
4241
4242
{
4242
4243
struct fe_priv * np = netdev_priv (dev );
4243
- u32 speed ;
4244
+ u32 speed , supported , advertising ;
4244
4245
int adv ;
4245
4246
4246
4247
spin_lock_irq (& np -> lock );
4247
- ecmd -> port = PORT_MII ;
4248
+ cmd -> base . port = PORT_MII ;
4248
4249
if (!netif_running (dev )) {
4249
4250
/* We do not track link speed / duplex setting if the
4250
4251
* interface is disabled. Force a link check */
@@ -4272,81 +4273,89 @@ static int nv_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
4272
4273
speed = -1 ;
4273
4274
break ;
4274
4275
}
4275
- ecmd -> duplex = DUPLEX_HALF ;
4276
+ cmd -> base . duplex = DUPLEX_HALF ;
4276
4277
if (np -> duplex )
4277
- ecmd -> duplex = DUPLEX_FULL ;
4278
+ cmd -> base . duplex = DUPLEX_FULL ;
4278
4279
} else {
4279
4280
speed = SPEED_UNKNOWN ;
4280
- ecmd -> duplex = DUPLEX_UNKNOWN ;
4281
+ cmd -> base . duplex = DUPLEX_UNKNOWN ;
4281
4282
}
4282
- ethtool_cmd_speed_set ( ecmd , speed ) ;
4283
- ecmd -> autoneg = np -> autoneg ;
4283
+ cmd -> base . speed = speed ;
4284
+ cmd -> base . autoneg = np -> autoneg ;
4284
4285
4285
- ecmd -> advertising = ADVERTISED_MII ;
4286
+ advertising = ADVERTISED_MII ;
4286
4287
if (np -> autoneg ) {
4287
- ecmd -> advertising |= ADVERTISED_Autoneg ;
4288
+ advertising |= ADVERTISED_Autoneg ;
4288
4289
adv = mii_rw (dev , np -> phyaddr , MII_ADVERTISE , MII_READ );
4289
4290
if (adv & ADVERTISE_10HALF )
4290
- ecmd -> advertising |= ADVERTISED_10baseT_Half ;
4291
+ advertising |= ADVERTISED_10baseT_Half ;
4291
4292
if (adv & ADVERTISE_10FULL )
4292
- ecmd -> advertising |= ADVERTISED_10baseT_Full ;
4293
+ advertising |= ADVERTISED_10baseT_Full ;
4293
4294
if (adv & ADVERTISE_100HALF )
4294
- ecmd -> advertising |= ADVERTISED_100baseT_Half ;
4295
+ advertising |= ADVERTISED_100baseT_Half ;
4295
4296
if (adv & ADVERTISE_100FULL )
4296
- ecmd -> advertising |= ADVERTISED_100baseT_Full ;
4297
+ advertising |= ADVERTISED_100baseT_Full ;
4297
4298
if (np -> gigabit == PHY_GIGABIT ) {
4298
4299
adv = mii_rw (dev , np -> phyaddr , MII_CTRL1000 , MII_READ );
4299
4300
if (adv & ADVERTISE_1000FULL )
4300
- ecmd -> advertising |= ADVERTISED_1000baseT_Full ;
4301
+ advertising |= ADVERTISED_1000baseT_Full ;
4301
4302
}
4302
4303
}
4303
- ecmd -> supported = (SUPPORTED_Autoneg |
4304
+ supported = (SUPPORTED_Autoneg |
4304
4305
SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
4305
4306
SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
4306
4307
SUPPORTED_MII );
4307
4308
if (np -> gigabit == PHY_GIGABIT )
4308
- ecmd -> supported |= SUPPORTED_1000baseT_Full ;
4309
+ supported |= SUPPORTED_1000baseT_Full ;
4309
4310
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 );
4312
4317
4313
4318
/* ignore maxtxpkt, maxrxpkt for now */
4314
4319
spin_unlock_irq (& np -> lock );
4315
4320
return 0 ;
4316
4321
}
4317
4322
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 )
4319
4325
{
4320
4326
struct fe_priv * np = netdev_priv (dev );
4321
- u32 speed = ethtool_cmd_speed (ecmd );
4327
+ u32 speed = cmd -> base .speed ;
4328
+ u32 advertising ;
4322
4329
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 )
4326
4334
return - EINVAL ;
4327
- if (ecmd -> phy_address != np -> phyaddr ) {
4335
+ if (cmd -> base . phy_address != np -> phyaddr ) {
4328
4336
/* TODO: support switching between multiple phys. Should be
4329
4337
* trivial, but not enabled due to lack of test hardware. */
4330
4338
return - EINVAL ;
4331
4339
}
4332
- if (ecmd -> autoneg == AUTONEG_ENABLE ) {
4340
+ if (cmd -> base . autoneg == AUTONEG_ENABLE ) {
4333
4341
u32 mask ;
4334
4342
4335
4343
mask = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
4336
4344
ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full ;
4337
4345
if (np -> gigabit == PHY_GIGABIT )
4338
4346
mask |= ADVERTISED_1000baseT_Full ;
4339
4347
4340
- if ((ecmd -> advertising & mask ) == 0 )
4348
+ if ((advertising & mask ) == 0 )
4341
4349
return - EINVAL ;
4342
4350
4343
- } else if (ecmd -> autoneg == AUTONEG_DISABLE ) {
4351
+ } else if (cmd -> base . autoneg == AUTONEG_DISABLE ) {
4344
4352
/* Note: autonegotiation disable, speed 1000 intentionally
4345
4353
* forbidden - no one should need that. */
4346
4354
4347
4355
if (speed != SPEED_10 && speed != SPEED_100 )
4348
4356
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 )
4350
4359
return - EINVAL ;
4351
4360
} else {
4352
4361
return - EINVAL ;
@@ -4376,21 +4385,21 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
4376
4385
netif_tx_unlock_bh (dev );
4377
4386
}
4378
4387
4379
- if (ecmd -> autoneg == AUTONEG_ENABLE ) {
4388
+ if (cmd -> base . autoneg == AUTONEG_ENABLE ) {
4380
4389
int adv , bmcr ;
4381
4390
4382
4391
np -> autoneg = 1 ;
4383
4392
4384
4393
/* advertise only what has been requested */
4385
4394
adv = mii_rw (dev , np -> phyaddr , MII_ADVERTISE , MII_READ );
4386
4395
adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM );
4387
- if (ecmd -> advertising & ADVERTISED_10baseT_Half )
4396
+ if (advertising & ADVERTISED_10baseT_Half )
4388
4397
adv |= ADVERTISE_10HALF ;
4389
- if (ecmd -> advertising & ADVERTISED_10baseT_Full )
4398
+ if (advertising & ADVERTISED_10baseT_Full )
4390
4399
adv |= ADVERTISE_10FULL ;
4391
- if (ecmd -> advertising & ADVERTISED_100baseT_Half )
4400
+ if (advertising & ADVERTISED_100baseT_Half )
4392
4401
adv |= ADVERTISE_100HALF ;
4393
- if (ecmd -> advertising & ADVERTISED_100baseT_Full )
4402
+ if (advertising & ADVERTISED_100baseT_Full )
4394
4403
adv |= ADVERTISE_100FULL ;
4395
4404
if (np -> pause_flags & NV_PAUSEFRAME_RX_REQ ) /* for rx we set both advertisements but disable tx pause */
4396
4405
adv |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM ;
@@ -4401,7 +4410,7 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
4401
4410
if (np -> gigabit == PHY_GIGABIT ) {
4402
4411
adv = mii_rw (dev , np -> phyaddr , MII_CTRL1000 , MII_READ );
4403
4412
adv &= ~ADVERTISE_1000FULL ;
4404
- if (ecmd -> advertising & ADVERTISED_1000baseT_Full )
4413
+ if (advertising & ADVERTISED_1000baseT_Full )
4405
4414
adv |= ADVERTISE_1000FULL ;
4406
4415
mii_rw (dev , np -> phyaddr , MII_CTRL1000 , adv );
4407
4416
}
@@ -4428,13 +4437,13 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
4428
4437
4429
4438
adv = mii_rw (dev , np -> phyaddr , MII_ADVERTISE , MII_READ );
4430
4439
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 )
4432
4441
adv |= ADVERTISE_10HALF ;
4433
- if (speed == SPEED_10 && ecmd -> duplex == DUPLEX_FULL )
4442
+ if (speed == SPEED_10 && cmd -> base . duplex == DUPLEX_FULL )
4434
4443
adv |= ADVERTISE_10FULL ;
4435
- if (speed == SPEED_100 && ecmd -> duplex == DUPLEX_HALF )
4444
+ if (speed == SPEED_100 && cmd -> base . duplex == DUPLEX_HALF )
4436
4445
adv |= ADVERTISE_100HALF ;
4437
- if (speed == SPEED_100 && ecmd -> duplex == DUPLEX_FULL )
4446
+ if (speed == SPEED_100 && cmd -> base . duplex == DUPLEX_FULL )
4438
4447
adv |= ADVERTISE_100FULL ;
4439
4448
np -> pause_flags &= ~(NV_PAUSEFRAME_AUTONEG |NV_PAUSEFRAME_RX_ENABLE |NV_PAUSEFRAME_TX_ENABLE );
4440
4449
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 = {
5241
5250
.get_link = ethtool_op_get_link ,
5242
5251
.get_wol = nv_get_wol ,
5243
5252
.set_wol = nv_set_wol ,
5244
- .get_settings = nv_get_settings ,
5245
- .set_settings = nv_set_settings ,
5246
5253
.get_regs_len = nv_get_regs_len ,
5247
5254
.get_regs = nv_get_regs ,
5248
5255
.nway_reset = nv_nway_reset ,
@@ -5255,6 +5262,8 @@ static const struct ethtool_ops ops = {
5255
5262
.get_sset_count = nv_get_sset_count ,
5256
5263
.self_test = nv_self_test ,
5257
5264
.get_ts_info = ethtool_op_get_ts_info ,
5265
+ .get_link_ksettings = nv_get_link_ksettings ,
5266
+ .set_link_ksettings = nv_set_link_ksettings ,
5258
5267
};
5259
5268
5260
5269
/* The mgmt unit and driver use a semaphore to access the phy during init */
0 commit comments