On Wed, Jun 17, 2020 at 10:13:42PM -0700, Jeff Kirsher wrote: > From: Alice Michael <alice.mich...@intel.com> > > Implement ethtool interface for the common module. > > Signed-off-by: Alice Michael <alice.mich...@intel.com> > Signed-off-by: Alan Brady <alan.br...@intel.com> > Signed-off-by: Phani Burra <phani.r.bu...@intel.com> > Signed-off-by: Joshua Hay <joshua.a....@intel.com> > Signed-off-by: Madhu Chittim <madhu.chit...@intel.com> > Signed-off-by: Pavan Kumar Linga <pavan.kumar.li...@intel.com> > Reviewed-by: Donald Skidmore <donald.c.skidm...@intel.com> > Reviewed-by: Jesse Brandeburg <jesse.brandeb...@intel.com> > Reviewed-by: Sridhar Samudrala <sridhar.samudr...@intel.com> > Signed-off-by: Jeff Kirsher <jeffrey.t.kirs...@intel.com> > --- [...] > +static int iecm_set_channels(struct net_device *netdev, > + struct ethtool_channels *ch) > +{ > + struct iecm_vport *vport = iecm_netdev_to_vport(netdev); > + int num_req_q = ch->combined_count; > + > + if (num_req_q == max(vport->num_txq, vport->num_rxq)) > + return 0; > + > + /* All of these should have already been checked by ethtool before this > + * even gets to us, but just to be sure. > + */ > + if (num_req_q <= 0 || num_req_q > IECM_MAX_Q) > + return -EINVAL; > + > + if (ch->rx_count || ch->tx_count || ch->other_count != IECM_MAX_NONQ) > + return -EINVAL;
I don't see much sense in duplicating the checks. Having the checks in common code allows us to simplify driver callbacks. > + vport->adapter->config_data.num_req_qs = num_req_q; > + > + return iecm_initiate_soft_reset(vport, __IECM_SR_Q_CHANGE); > +} [...] > +static int iecm_set_ringparam(struct net_device *netdev, > + struct ethtool_ringparam *ring) > +{ > + struct iecm_vport *vport = iecm_netdev_to_vport(netdev); > + u32 new_rx_count, new_tx_count; > + > + if (ring->rx_mini_pending || ring->rx_jumbo_pending) > + return -EINVAL; > + > + new_tx_count = clamp_t(u32, ring->tx_pending, > + IECM_MIN_TXQ_DESC, > + IECM_MAX_TXQ_DESC); > + new_tx_count = ALIGN(new_tx_count, IECM_REQ_DESC_MULTIPLE); > + > + new_rx_count = clamp_t(u32, ring->rx_pending, > + IECM_MIN_RXQ_DESC, > + IECM_MAX_RXQ_DESC); > + new_rx_count = ALIGN(new_rx_count, IECM_REQ_DESC_MULTIPLE); Same here. This is actually a bit misleading as it seems that count exceeding maximum would be silently clamped to it but such value would be rejected by common code. > + /* if nothing to do return success */ > + if (new_tx_count == vport->txq_desc_count && > + new_rx_count == vport->rxq_desc_count) > + return 0; > + > + vport->adapter->config_data.num_req_txq_desc = new_tx_count; > + vport->adapter->config_data.num_req_rxq_desc = new_rx_count; > + > + return iecm_initiate_soft_reset(vport, __IECM_SR_Q_DESC_CHANGE); > +} [...] > +/* For now we have one and only one private flag and it is only defined > + * when we have support for the SKIP_CPU_SYNC DMA attribute. Instead > + * of leaving all this code sitting around empty we will strip it unless > + * our one private flag is actually available. > + */ The code below will always return 1 for ETH_SS_PRIV_FLAGS in iecm_get_sset_count() and an array of one string in iecm_get_strings(). This would e.g. result in "ethtool -i" saying "supports-priv-flags: yes" but then "ethtool --show-priv-flags" failing with -EOPNOTSUPP. IMHO you should not return bogus string set if private flags are not implemented. Michal > +struct iecm_priv_flags { > + char flag_string[ETH_GSTRING_LEN]; > + bool read_only; > + u32 flag; > +}; > + > +#define IECM_PRIV_FLAG(_name, _flag, _read_only) { \ > + .read_only = _read_only, \ > + .flag_string = _name, \ > + .flag = _flag, \ > +} > + > +static const struct iecm_priv_flags iecm_gstrings_priv_flags[] = { > + IECM_PRIV_FLAG("", 0, 0), > +}; > + > +#define IECM_PRIV_FLAGS_STR_LEN ARRAY_SIZE(iecm_gstrings_priv_flags) [...] > +static void iecm_get_priv_flag_strings(struct net_device *netdev, u8 *data) > +{ > + unsigned int i; > + > + for (i = 0; i < IECM_PRIV_FLAGS_STR_LEN; i++) { > + snprintf((char *)data, ETH_GSTRING_LEN, "%s", > + iecm_gstrings_priv_flags[i].flag_string); > + data += ETH_GSTRING_LEN; > + } > +}