Re: [net-next v4 4/6] net: marvell: prestera: Add ethtool interface support

From: Andy Shevchenko
Date: Mon Jul 27 2020 - 09:17:25 EST


On Mon, Jul 27, 2020 at 3:23 PM Vadym Kochan <vadym.kochan@xxxxxxxxxxx> wrote:
>
> The ethtool API provides support for the configuration of the following
> features: speed and duplex, auto-negotiation, MDI-x, forward error
> correction, port media type. The API also provides information about the
> port status, hardware and software statistic. The following limitation
> exists:
>
> - port media type should be configured before speed setting
> - ethtool -m option is not supported
> - ethtool -p option is not supported
> - ethtool -r option is supported for RJ45 port only
> - the following combination of parameters is not supported:
>
> ethtool -s sw1pX port XX autoneg on
>
> - forward error correction feature is supported only on SFP ports, 10G
> speed
>
> - auto-negotiation and MDI-x features are not supported on
> Copper-to-Fiber SFP module

...

> + if (new_mode < PRESTERA_LINK_MODE_MAX)
> + err = prestera_hw_port_link_mode_set(port, new_mode);
> + else
> + err = -EINVAL;
> +
> + if (!err) {
> + port->caps.type = type;
> + port->autoneg = false;
> + }
> +
> + return err;

Again

if (new_mode >= ...)
return -EINVAL;

err = ...
if (err)
return err;

...
return 0;

...

> + ecmd->base.speed = !err ? speed : SPEED_UNKNOWN;

Why not positive conditional?

...

> + if (!prestera_hw_port_duplex_get(port, &duplex)) {

Ditto.

...

> +static int
> +prestera_ethtool_set_link_ksettings(struct net_device *dev,
> + const struct ethtool_link_ksettings *ecmd)
> +{
> + struct prestera_port *port = netdev_priv(dev);

> + u64 adver_modes = 0;
> + u8 adver_fec = 0;

Redundant assignments?

> + int err;
> +
> + err = prestera_port_type_set(ecmd, port);
> + if (err)
> + return err;
> +
> + if (port->caps.transceiver == PRESTERA_PORT_TCVR_COPPER) {
> + err = prestera_port_mdix_set(ecmd, port);
> + if (err)
> + return err;
> + }
> +
> + prestera_modes_from_eth(ecmd->link_modes.advertising, &adver_modes,
> + &adver_fec, port->caps.type);

> + return 0;
> +}

...

> + struct prestera_msg_port_attr_req req = {
> + .attr = PRESTERA_CMD_PORT_ATTR_REMOTE_CAPABILITY,
> + .port = port->hw_id,
> + .dev = port->dev_id

+ comma

> + };

...

> + struct prestera_msg_port_attr_req req = {
> + .attr = PRESTERA_CMD_PORT_ATTR_REMOTE_FC,
> + .port = port->hw_id,
> + .dev = port->dev_id

Ditto.

> + };

...

> + switch (resp.param.fc) {
> + case PRESTERA_FC_SYMMETRIC:
> + *pause = true;
> + *asym_pause = false;
> + break;
> + case PRESTERA_FC_ASYMMETRIC:
> + *pause = false;
> + *asym_pause = true;
> + break;
> + case PRESTERA_FC_SYMM_ASYMM:
> + *pause = true;
> + *asym_pause = true;
> + break;
> + default:
> + *pause = false;
> + *asym_pause = false;
> + }
> +
> + return err;

return 0;

...

> +int prestera_hw_port_type_get(const struct prestera_port *port, u8 *type)
> +{

> + struct prestera_msg_port_attr_req req = {
> + .attr = PRESTERA_CMD_PORT_ATTR_TYPE,
> + .port = port->hw_id,
> + .dev = port->dev_id
> + };

> + return err;

Same comments as above.
And seems more code needs the same.

> +}

...

> +static u8 prestera_hw_mdix_to_eth(u8 mode)
> +{
> + switch (mode) {
> + case PRESTERA_PORT_TP_MDI:
> + return ETH_TP_MDI;
> + case PRESTERA_PORT_TP_MDIX:
> + return ETH_TP_MDI_X;
> + case PRESTERA_PORT_TP_AUTO:
> + return ETH_TP_MDI_AUTO;
> + }
> +
> + return ETH_TP_MDI_INVALID;

Use the default case.

> +}
> +
> +static u8 prestera_hw_mdix_from_eth(u8 mode)
> +{
> + switch (mode) {
> + case ETH_TP_MDI:
> + return PRESTERA_PORT_TP_MDI;
> + case ETH_TP_MDI_X:
> + return PRESTERA_PORT_TP_MDIX;
> + case ETH_TP_MDI_AUTO:
> + return PRESTERA_PORT_TP_AUTO;
> + }
> +
> + return PRESTERA_PORT_TP_NA;

Ditto.

> +}

--
With Best Regards,
Andy Shevchenko