Skip to content

Commit 7c69873

Browse files
Jakub Kicinskidavem330
authored andcommitted
nfp: add support for .set_link_ksettings()
Support setting link speed and autonegotiation through set_link_ksettings() ethtool op. If the port is reconfigured in incompatible way and reboot is required the netdev will get unregistered and not come back until user reboots the system. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Simon Horman <simon.horman@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 5a56083 commit 7c69873

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,51 @@ nfp_net_get_link_ksettings(struct net_device *netdev,
237237
return 0;
238238
}
239239

240+
static int
241+
nfp_net_set_link_ksettings(struct net_device *netdev,
242+
const struct ethtool_link_ksettings *cmd)
243+
{
244+
struct nfp_net *nn = netdev_priv(netdev);
245+
struct nfp_nsp *nsp;
246+
int err;
247+
248+
if (!nn->eth_port)
249+
return -EOPNOTSUPP;
250+
251+
if (netif_running(netdev)) {
252+
nn_warn(nn, "Changing settings not allowed on an active interface. It may cause the port to be disabled until reboot.\n");
253+
return -EBUSY;
254+
}
255+
256+
nsp = nfp_eth_config_start(nn->cpp, nn->eth_port->index);
257+
if (IS_ERR(nsp))
258+
return PTR_ERR(nsp);
259+
260+
err = __nfp_eth_set_aneg(nsp, cmd->base.autoneg == AUTONEG_ENABLE ?
261+
NFP_ANEG_AUTO : NFP_ANEG_DISABLED);
262+
if (err)
263+
goto err_bad_set;
264+
if (cmd->base.speed != SPEED_UNKNOWN) {
265+
u32 speed = cmd->base.speed / nn->eth_port->lanes;
266+
267+
err = __nfp_eth_set_speed(nsp, speed);
268+
if (err)
269+
goto err_bad_set;
270+
}
271+
272+
err = nfp_eth_config_commit_end(nsp);
273+
if (err > 0)
274+
return 0; /* no change */
275+
276+
nfp_net_refresh_port_config(nn);
277+
278+
return err;
279+
280+
err_bad_set:
281+
nfp_eth_config_cleanup_end(nsp);
282+
return err;
283+
}
284+
240285
static void nfp_net_get_ringparam(struct net_device *netdev,
241286
struct ethtool_ringparam *ring)
242287
{
@@ -879,6 +924,7 @@ static const struct ethtool_ops nfp_net_ethtool_ops = {
879924
.get_channels = nfp_net_get_channels,
880925
.set_channels = nfp_net_set_channels,
881926
.get_link_ksettings = nfp_net_get_link_ksettings,
927+
.set_link_ksettings = nfp_net_set_link_ksettings,
882928
};
883929

884930
void nfp_net_set_ethtool_ops(struct net_device *netdev)

0 commit comments

Comments
 (0)