Skip to content

Commit 7cafe8f

Browse files
Philippe Reynesdavem330
authored andcommitted
net: sfc: 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. Signed-off-by: Philippe Reynes <tremyfr@gmail.com> Tested-by: Bert Kenward <bkenward@solarflare.com> Acked-by: Bert Kenward <bkenward@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 99bff5e commit 7cafe8f

File tree

3 files changed

+65
-42
lines changed

3 files changed

+65
-42
lines changed

drivers/net/ethernet/sfc/ethtool.c

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -120,44 +120,53 @@ static int efx_ethtool_phys_id(struct net_device *net_dev,
120120
}
121121

122122
/* This must be called with rtnl_lock held. */
123-
static int efx_ethtool_get_settings(struct net_device *net_dev,
124-
struct ethtool_cmd *ecmd)
123+
static int
124+
efx_ethtool_get_link_ksettings(struct net_device *net_dev,
125+
struct ethtool_link_ksettings *cmd)
125126
{
126127
struct efx_nic *efx = netdev_priv(net_dev);
127128
struct efx_link_state *link_state = &efx->link_state;
129+
u32 supported;
128130

129131
mutex_lock(&efx->mac_lock);
130-
efx->phy_op->get_settings(efx, ecmd);
132+
efx->phy_op->get_link_ksettings(efx, cmd);
131133
mutex_unlock(&efx->mac_lock);
132134

133135
/* Both MACs support pause frames (bidirectional and respond-only) */
134-
ecmd->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
136+
ethtool_convert_link_mode_to_legacy_u32(&supported,
137+
cmd->link_modes.supported);
138+
139+
supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
140+
141+
ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
142+
supported);
135143

136144
if (LOOPBACK_INTERNAL(efx)) {
137-
ethtool_cmd_speed_set(ecmd, link_state->speed);
138-
ecmd->duplex = link_state->fd ? DUPLEX_FULL : DUPLEX_HALF;
145+
cmd->base.speed = link_state->speed;
146+
cmd->base.duplex = link_state->fd ? DUPLEX_FULL : DUPLEX_HALF;
139147
}
140148

141149
return 0;
142150
}
143151

144152
/* This must be called with rtnl_lock held. */
145-
static int efx_ethtool_set_settings(struct net_device *net_dev,
146-
struct ethtool_cmd *ecmd)
153+
static int
154+
efx_ethtool_set_link_ksettings(struct net_device *net_dev,
155+
const struct ethtool_link_ksettings *cmd)
147156
{
148157
struct efx_nic *efx = netdev_priv(net_dev);
149158
int rc;
150159

151160
/* GMAC does not support 1000Mbps HD */
152-
if ((ethtool_cmd_speed(ecmd) == SPEED_1000) &&
153-
(ecmd->duplex != DUPLEX_FULL)) {
161+
if ((cmd->base.speed == SPEED_1000) &&
162+
(cmd->base.duplex != DUPLEX_FULL)) {
154163
netif_dbg(efx, drv, efx->net_dev,
155164
"rejecting unsupported 1000Mbps HD setting\n");
156165
return -EINVAL;
157166
}
158167

159168
mutex_lock(&efx->mac_lock);
160-
rc = efx->phy_op->set_settings(efx, ecmd);
169+
rc = efx->phy_op->set_link_ksettings(efx, cmd);
161170
mutex_unlock(&efx->mac_lock);
162171
return rc;
163172
}
@@ -1342,8 +1351,6 @@ static int efx_ethtool_get_module_info(struct net_device *net_dev,
13421351
}
13431352

13441353
const struct ethtool_ops efx_ethtool_ops = {
1345-
.get_settings = efx_ethtool_get_settings,
1346-
.set_settings = efx_ethtool_set_settings,
13471354
.get_drvinfo = efx_ethtool_get_drvinfo,
13481355
.get_regs_len = efx_ethtool_get_regs_len,
13491356
.get_regs = efx_ethtool_get_regs,
@@ -1373,4 +1380,6 @@ const struct ethtool_ops efx_ethtool_ops = {
13731380
.get_ts_info = efx_ethtool_get_ts_info,
13741381
.get_module_info = efx_ethtool_get_module_info,
13751382
.get_module_eeprom = efx_ethtool_get_module_eeprom,
1383+
.get_link_ksettings = efx_ethtool_get_link_ksettings,
1384+
.set_link_ksettings = efx_ethtool_set_link_ksettings,
13761385
};

drivers/net/ethernet/sfc/mcdi_port.c

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -503,45 +503,59 @@ static void efx_mcdi_phy_remove(struct efx_nic *efx)
503503
kfree(phy_data);
504504
}
505505

506-
static void efx_mcdi_phy_get_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
506+
static void efx_mcdi_phy_get_link_ksettings(struct efx_nic *efx,
507+
struct ethtool_link_ksettings *cmd)
507508
{
508509
struct efx_mcdi_phy_data *phy_cfg = efx->phy_data;
509510
MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_LINK_OUT_LEN);
510511
int rc;
511-
512-
ecmd->supported =
513-
mcdi_to_ethtool_cap(phy_cfg->media, phy_cfg->supported_cap);
514-
ecmd->advertising = efx->link_advertising;
515-
ethtool_cmd_speed_set(ecmd, efx->link_state.speed);
516-
ecmd->duplex = efx->link_state.fd;
517-
ecmd->port = mcdi_to_ethtool_media(phy_cfg->media);
518-
ecmd->phy_address = phy_cfg->port;
519-
ecmd->transceiver = XCVR_INTERNAL;
520-
ecmd->autoneg = !!(efx->link_advertising & ADVERTISED_Autoneg);
521-
ecmd->mdio_support = (efx->mdio.mode_support &
512+
u32 supported, advertising, lp_advertising;
513+
514+
supported = mcdi_to_ethtool_cap(phy_cfg->media, phy_cfg->supported_cap);
515+
advertising = efx->link_advertising;
516+
cmd->base.speed = efx->link_state.speed;
517+
cmd->base.duplex = efx->link_state.fd;
518+
cmd->base.port = mcdi_to_ethtool_media(phy_cfg->media);
519+
cmd->base.phy_address = phy_cfg->port;
520+
cmd->base.autoneg = !!(efx->link_advertising & ADVERTISED_Autoneg);
521+
cmd->base.mdio_support = (efx->mdio.mode_support &
522522
(MDIO_SUPPORTS_C45 | MDIO_SUPPORTS_C22));
523523

524+
ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
525+
supported);
526+
ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
527+
advertising);
528+
524529
BUILD_BUG_ON(MC_CMD_GET_LINK_IN_LEN != 0);
525530
rc = efx_mcdi_rpc(efx, MC_CMD_GET_LINK, NULL, 0,
526531
outbuf, sizeof(outbuf), NULL);
527532
if (rc)
528533
return;
529-
ecmd->lp_advertising =
534+
lp_advertising =
530535
mcdi_to_ethtool_cap(phy_cfg->media,
531536
MCDI_DWORD(outbuf, GET_LINK_OUT_LP_CAP));
537+
538+
ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.lp_advertising,
539+
lp_advertising);
532540
}
533541

534-
static int efx_mcdi_phy_set_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
542+
static int
543+
efx_mcdi_phy_set_link_ksettings(struct efx_nic *efx,
544+
const struct ethtool_link_ksettings *cmd)
535545
{
536546
struct efx_mcdi_phy_data *phy_cfg = efx->phy_data;
537547
u32 caps;
538548
int rc;
549+
u32 advertising;
550+
551+
ethtool_convert_link_mode_to_legacy_u32(&advertising,
552+
cmd->link_modes.advertising);
539553

540-
if (ecmd->autoneg) {
541-
caps = (ethtool_to_mcdi_cap(ecmd->advertising) |
554+
if (cmd->base.autoneg) {
555+
caps = (ethtool_to_mcdi_cap(advertising) |
542556
1 << MC_CMD_PHY_CAP_AN_LBN);
543-
} else if (ecmd->duplex) {
544-
switch (ethtool_cmd_speed(ecmd)) {
557+
} else if (cmd->base.duplex) {
558+
switch (cmd->base.speed) {
545559
case 10: caps = 1 << MC_CMD_PHY_CAP_10FDX_LBN; break;
546560
case 100: caps = 1 << MC_CMD_PHY_CAP_100FDX_LBN; break;
547561
case 1000: caps = 1 << MC_CMD_PHY_CAP_1000FDX_LBN; break;
@@ -550,7 +564,7 @@ static int efx_mcdi_phy_set_settings(struct efx_nic *efx, struct ethtool_cmd *ec
550564
default: return -EINVAL;
551565
}
552566
} else {
553-
switch (ethtool_cmd_speed(ecmd)) {
567+
switch (cmd->base.speed) {
554568
case 10: caps = 1 << MC_CMD_PHY_CAP_10HDX_LBN; break;
555569
case 100: caps = 1 << MC_CMD_PHY_CAP_100HDX_LBN; break;
556570
case 1000: caps = 1 << MC_CMD_PHY_CAP_1000HDX_LBN; break;
@@ -563,9 +577,9 @@ static int efx_mcdi_phy_set_settings(struct efx_nic *efx, struct ethtool_cmd *ec
563577
if (rc)
564578
return rc;
565579

566-
if (ecmd->autoneg) {
580+
if (cmd->base.autoneg) {
567581
efx_link_set_advertising(
568-
efx, ecmd->advertising | ADVERTISED_Autoneg);
582+
efx, advertising | ADVERTISED_Autoneg);
569583
phy_cfg->forced_cap = 0;
570584
} else {
571585
efx_link_set_advertising(efx, 0);
@@ -812,8 +826,8 @@ static const struct efx_phy_operations efx_mcdi_phy_ops = {
812826
.poll = efx_mcdi_phy_poll,
813827
.fini = efx_port_dummy_op_void,
814828
.remove = efx_mcdi_phy_remove,
815-
.get_settings = efx_mcdi_phy_get_settings,
816-
.set_settings = efx_mcdi_phy_set_settings,
829+
.get_link_ksettings = efx_mcdi_phy_get_link_ksettings,
830+
.set_link_ksettings = efx_mcdi_phy_set_link_ksettings,
817831
.test_alive = efx_mcdi_phy_test_alive,
818832
.run_tests = efx_mcdi_phy_run_tests,
819833
.test_name = efx_mcdi_phy_test_name,

drivers/net/ethernet/sfc/net_driver.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -720,8 +720,8 @@ static inline bool efx_link_state_equal(const struct efx_link_state *left,
720720
* @reconfigure: Reconfigure PHY (e.g. for new link parameters)
721721
* @poll: Update @link_state and report whether it changed.
722722
* Serialised by the mac_lock.
723-
* @get_settings: Get ethtool settings. Serialised by the mac_lock.
724-
* @set_settings: Set ethtool settings. Serialised by the mac_lock.
723+
* @get_link_ksettings: Get ethtool settings. Serialised by the mac_lock.
724+
* @set_link_ksettings: Set ethtool settings. Serialised by the mac_lock.
725725
* @set_npage_adv: Set abilities advertised in (Extended) Next Page
726726
* (only needed where AN bit is set in mmds)
727727
* @test_alive: Test that PHY is 'alive' (online)
@@ -736,10 +736,10 @@ struct efx_phy_operations {
736736
void (*remove) (struct efx_nic *efx);
737737
int (*reconfigure) (struct efx_nic *efx);
738738
bool (*poll) (struct efx_nic *efx);
739-
void (*get_settings) (struct efx_nic *efx,
740-
struct ethtool_cmd *ecmd);
741-
int (*set_settings) (struct efx_nic *efx,
742-
struct ethtool_cmd *ecmd);
739+
void (*get_link_ksettings)(struct efx_nic *efx,
740+
struct ethtool_link_ksettings *cmd);
741+
int (*set_link_ksettings)(struct efx_nic *efx,
742+
const struct ethtool_link_ksettings *cmd);
743743
void (*set_npage_adv) (struct efx_nic *efx, u32);
744744
int (*test_alive) (struct efx_nic *efx);
745745
const char *(*test_name) (struct efx_nic *efx, unsigned int index);

0 commit comments

Comments
 (0)