diff options
Diffstat (limited to 'drivers/net/ethernet/amazon/ena/ena_ethtool.c')
-rw-r--r-- | drivers/net/ethernet/amazon/ena/ena_ethtool.c | 107 |
1 files changed, 37 insertions, 70 deletions
diff --git a/drivers/net/ethernet/amazon/ena/ena_ethtool.c b/drivers/net/ethernet/amazon/ena/ena_ethtool.c index 5687a2860f01..b997c3ce9e2b 100644 --- a/drivers/net/ethernet/amazon/ena/ena_ethtool.c +++ b/drivers/net/ethernet/amazon/ena/ena_ethtool.c @@ -198,24 +198,15 @@ static void ena_get_ethtool_stats(struct net_device *netdev, ena_dev_admin_queue_stats(adapter, &data); } -static int get_stats_sset_count(struct ena_adapter *adapter) -{ - return adapter->num_queues * (ENA_STATS_ARRAY_TX + ENA_STATS_ARRAY_RX) - + ENA_STATS_ARRAY_GLOBAL + ENA_STATS_ARRAY_ENA_COM; -} - int ena_get_sset_count(struct net_device *netdev, int sset) { struct ena_adapter *adapter = netdev_priv(netdev); - switch (sset) { - case ETH_SS_STATS: - return get_stats_sset_count(adapter); - case ETH_SS_PRIV_FLAGS: - return adapter->ena_extra_properties_count; - default: + if (sset != ETH_SS_STATS) return -EOPNOTSUPP; - } + + return adapter->num_queues * (ENA_STATS_ARRAY_TX + ENA_STATS_ARRAY_RX) + + ENA_STATS_ARRAY_GLOBAL + ENA_STATS_ARRAY_ENA_COM; } static void ena_queue_strings(struct ena_adapter *adapter, u8 **data) @@ -257,54 +248,26 @@ static void ena_com_dev_strings(u8 **data) } } -static void get_stats_strings(struct ena_adapter *adapter, u8 *data) +static void ena_get_strings(struct net_device *netdev, u32 sset, u8 *data) { + struct ena_adapter *adapter = netdev_priv(netdev); const struct ena_stats *ena_stats; int i; + if (sset != ETH_SS_STATS) + return; + for (i = 0; i < ENA_STATS_ARRAY_GLOBAL; i++) { ena_stats = &ena_stats_global_strings[i]; + memcpy(data, ena_stats->name, ETH_GSTRING_LEN); data += ETH_GSTRING_LEN; } + ena_queue_strings(adapter, &data); ena_com_dev_strings(&data); } -static void get_private_flags_strings(struct ena_adapter *adapter, u8 *data) -{ - struct ena_com_dev *ena_dev = adapter->ena_dev; - u8 *strings = ena_dev->extra_properties_strings.virt_addr; - int i; - - if (unlikely(!strings)) { - adapter->ena_extra_properties_count = 0; - return; - } - - for (i = 0; i < adapter->ena_extra_properties_count; i++) { - strlcpy(data, strings + ENA_ADMIN_EXTRA_PROPERTIES_STRING_LEN * i, - ETH_GSTRING_LEN); - data += ETH_GSTRING_LEN; - } -} - -static void ena_get_strings(struct net_device *netdev, u32 sset, u8 *data) -{ - struct ena_adapter *adapter = netdev_priv(netdev); - - switch (sset) { - case ETH_SS_STATS: - get_stats_strings(adapter, data); - break; - case ETH_SS_PRIV_FLAGS: - get_private_flags_strings(adapter, data); - break; - default: - break; - } -} - static int ena_get_link_ksettings(struct net_device *netdev, struct ethtool_link_ksettings *link_ksettings) { @@ -479,20 +442,38 @@ static void ena_get_drvinfo(struct net_device *dev, strlcpy(info->version, DRV_MODULE_VERSION, sizeof(info->version)); strlcpy(info->bus_info, pci_name(adapter->pdev), sizeof(info->bus_info)); - info->n_priv_flags = adapter->ena_extra_properties_count; } static void ena_get_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring) { struct ena_adapter *adapter = netdev_priv(netdev); - struct ena_ring *tx_ring = &adapter->tx_ring[0]; - struct ena_ring *rx_ring = &adapter->rx_ring[0]; - ring->rx_max_pending = rx_ring->ring_size; - ring->tx_max_pending = tx_ring->ring_size; - ring->rx_pending = rx_ring->ring_size; - ring->tx_pending = tx_ring->ring_size; + ring->tx_max_pending = adapter->max_tx_ring_size; + ring->rx_max_pending = adapter->max_rx_ring_size; + ring->tx_pending = adapter->tx_ring[0].ring_size; + ring->rx_pending = adapter->rx_ring[0].ring_size; +} + +static int ena_set_ringparam(struct net_device *netdev, + struct ethtool_ringparam *ring) +{ + struct ena_adapter *adapter = netdev_priv(netdev); + u32 new_tx_size, new_rx_size; + + new_tx_size = ring->tx_pending < ENA_MIN_RING_SIZE ? + ENA_MIN_RING_SIZE : ring->tx_pending; + new_tx_size = rounddown_pow_of_two(new_tx_size); + + new_rx_size = ring->rx_pending < ENA_MIN_RING_SIZE ? + ENA_MIN_RING_SIZE : ring->rx_pending; + new_rx_size = rounddown_pow_of_two(new_rx_size); + + if (new_tx_size == adapter->requested_tx_ring_size && + new_rx_size == adapter->requested_rx_ring_size) + return 0; + + return ena_update_queue_sizes(adapter, new_tx_size, new_rx_size); } static u32 ena_flow_hash_to_flow_type(u16 hash_fields) @@ -837,20 +818,6 @@ static int ena_set_tunable(struct net_device *netdev, return ret; } -static u32 ena_get_priv_flags(struct net_device *netdev) -{ - struct ena_adapter *adapter = netdev_priv(netdev); - struct ena_com_dev *ena_dev = adapter->ena_dev; - struct ena_admin_get_feat_resp get_resp; - u32 rc; - - rc = ena_com_get_extra_properties_flags(ena_dev, &get_resp); - if (!rc) - return get_resp.u.extra_properties_flags.flags; - - return 0; -} - static const struct ethtool_ops ena_ethtool_ops = { .get_link_ksettings = ena_get_link_ksettings, .get_drvinfo = ena_get_drvinfo, @@ -860,6 +827,7 @@ static const struct ethtool_ops ena_ethtool_ops = { .get_coalesce = ena_get_coalesce, .set_coalesce = ena_set_coalesce, .get_ringparam = ena_get_ringparam, + .set_ringparam = ena_set_ringparam, .get_sset_count = ena_get_sset_count, .get_strings = ena_get_strings, .get_ethtool_stats = ena_get_ethtool_stats, @@ -872,7 +840,6 @@ static const struct ethtool_ops ena_ethtool_ops = { .get_channels = ena_get_channels, .get_tunable = ena_get_tunable, .set_tunable = ena_set_tunable, - .get_priv_flags = ena_get_priv_flags, }; void ena_set_ethtool_ops(struct net_device *netdev) |