On 2016/06/13 11:46, Netanel Belgazal wrote:
[...]
> +
> +static int ena_set_coalesce(struct net_device *net_dev,
> +                         struct ethtool_coalesce *coalesce)
> +{
> +     struct ena_adapter *adapter = netdev_priv(net_dev);
> +     struct ena_com_dev *ena_dev = adapter->ena_dev;
> +     int rc;
> +
> +     if (!ena_com_interrupt_moderation_supported(ena_dev)) {
> +             /* the devie doesn't support interrupt moderation */
> +             return -EOPNOTSUPP;
> +     }
> +
> +     /* Note, adaptive coalescing settings are updated through sysfs */

I believe the usual approach is to use ethtool for these kinds of
settings, extending the interface if necessary.

> +     if (coalesce->rx_coalesce_usecs_irq ||
> +         coalesce->rx_max_coalesced_frames ||
> +         coalesce->rx_max_coalesced_frames_irq ||
> +         coalesce->tx_coalesce_usecs_irq ||
> +         coalesce->tx_max_coalesced_frames ||
> +         coalesce->tx_max_coalesced_frames_irq ||
> +         coalesce->stats_block_coalesce_usecs ||
> +         coalesce->use_adaptive_tx_coalesce ||
> +         coalesce->pkt_rate_low ||
> +         coalesce->rx_coalesce_usecs_low ||
> +         coalesce->rx_max_coalesced_frames_low ||
> +         coalesce->tx_coalesce_usecs_low ||
> +         coalesce->tx_max_coalesced_frames_low ||
> +         coalesce->pkt_rate_high ||
> +         coalesce->rx_coalesce_usecs_high ||
> +         coalesce->rx_max_coalesced_frames_high ||
> +         coalesce->tx_coalesce_usecs_high ||
> +         coalesce->tx_max_coalesced_frames_high ||
> +         coalesce->rate_sample_interval)
> +             return -EINVAL;
> +

[...]

> +
> +static ssize_t ena_store_small_copy_len(struct device *dev,
> +                                     struct device_attribute *attr,
> +                                     const char *buf, size_t len)
> +{
> +     struct ena_adapter *adapter = dev_get_drvdata(dev);
> +     unsigned long small_copy_len;
> +     struct ena_ring *rx_ring;
> +     int err, i;
> +
> +     err = kstrtoul(buf, 10, &small_copy_len);
> +     if (err < 0)
> +             return err;
> +
> +     err = ena_validate_small_copy_len(adapter, small_copy_len);
> +     if (err)
> +             return err;
> +
> +     rtnl_lock();
> +     adapter->small_copy_len = small_copy_len;
> +
> +     for (i = 0; i < adapter->num_queues; i++) {
> +             rx_ring = &adapter->rx_ring[i];
> +             rx_ring->rx_small_copy_len = small_copy_len;
> +     }
> +     rtnl_unlock();
> +
> +     return len;
> +}
> +
> +static ssize_t ena_show_small_copy_len(struct device *dev,
> +                                    struct device_attribute *attr, char *buf)
> +{
> +     struct ena_adapter *adapter = dev_get_drvdata(dev);
> +
> +     return sprintf(buf, "%d\n", adapter->small_copy_len);
> +}
> +
> +static DEVICE_ATTR(small_copy_len, S_IRUGO | S_IWUSR, 
> ena_show_small_copy_len,
> +                ena_store_small_copy_len);

This is what many other drivers call (rx_)copybreak. Perhaps it's time
to add it to ethtool as well?

Reply via email to