Skip to content

Commit c1af542

Browse files
Anton Mikaevdavem330
authored andcommitted
net: aquantia: Ethtool based ring size configuration
Implemented ring size setup, min/max validation and reconfiguration in runtime. Signed-off-by: Anton Mikaev <amikaev@aquantia.com> Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent c18a9c0 commit c1af542

File tree

7 files changed

+136
-50
lines changed

7 files changed

+136
-50
lines changed

drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "aq_ethtool.h"
1313
#include "aq_nic.h"
14+
#include "aq_vec.h"
1415

1516
static void aq_ethtool_get_regs(struct net_device *ndev,
1617
struct ethtool_regs *regs, void *p)
@@ -284,13 +285,73 @@ static int aq_ethtool_set_coalesce(struct net_device *ndev,
284285
return aq_nic_update_interrupt_moderation_settings(aq_nic);
285286
}
286287

288+
static void aq_get_ringparam(struct net_device *ndev,
289+
struct ethtool_ringparam *ring)
290+
{
291+
struct aq_nic_s *aq_nic = netdev_priv(ndev);
292+
struct aq_nic_cfg_s *aq_nic_cfg = aq_nic_get_cfg(aq_nic);
293+
294+
ring->rx_pending = aq_nic_cfg->rxds;
295+
ring->tx_pending = aq_nic_cfg->txds;
296+
297+
ring->rx_max_pending = aq_nic_cfg->aq_hw_caps->rxds_max;
298+
ring->tx_max_pending = aq_nic_cfg->aq_hw_caps->txds_max;
299+
}
300+
301+
static int aq_set_ringparam(struct net_device *ndev,
302+
struct ethtool_ringparam *ring)
303+
{
304+
int err = 0;
305+
bool ndev_running = false;
306+
struct aq_nic_s *aq_nic = netdev_priv(ndev);
307+
struct aq_nic_cfg_s *aq_nic_cfg = aq_nic_get_cfg(aq_nic);
308+
const struct aq_hw_caps_s *hw_caps = aq_nic_cfg->aq_hw_caps;
309+
310+
if (ring->rx_mini_pending || ring->rx_jumbo_pending) {
311+
err = -EOPNOTSUPP;
312+
goto err_exit;
313+
}
314+
315+
if (netif_running(ndev)) {
316+
ndev_running = true;
317+
dev_close(ndev);
318+
}
319+
320+
aq_nic_free_vectors(aq_nic);
321+
322+
aq_nic_cfg->rxds = max(ring->rx_pending, hw_caps->rxds_min);
323+
aq_nic_cfg->rxds = min(aq_nic_cfg->rxds, hw_caps->rxds_max);
324+
aq_nic_cfg->rxds = ALIGN(aq_nic_cfg->rxds, AQ_HW_RXD_MULTIPLE);
325+
326+
aq_nic_cfg->txds = max(ring->tx_pending, hw_caps->txds_min);
327+
aq_nic_cfg->txds = min(aq_nic_cfg->txds, hw_caps->txds_max);
328+
aq_nic_cfg->txds = ALIGN(aq_nic_cfg->txds, AQ_HW_TXD_MULTIPLE);
329+
330+
for (aq_nic->aq_vecs = 0; aq_nic->aq_vecs < aq_nic_cfg->vecs;
331+
aq_nic->aq_vecs++) {
332+
aq_nic->aq_vec[aq_nic->aq_vecs] =
333+
aq_vec_alloc(aq_nic, aq_nic->aq_vecs, aq_nic_cfg);
334+
if (unlikely(!aq_nic->aq_vec[aq_nic->aq_vecs])) {
335+
err = -ENOMEM;
336+
goto err_exit;
337+
}
338+
}
339+
if (ndev_running)
340+
err = dev_open(ndev);
341+
342+
err_exit:
343+
return err;
344+
}
345+
287346
const struct ethtool_ops aq_ethtool_ops = {
288347
.get_link = aq_ethtool_get_link,
289348
.get_regs_len = aq_ethtool_get_regs_len,
290349
.get_regs = aq_ethtool_get_regs,
291350
.get_drvinfo = aq_ethtool_get_drvinfo,
292351
.get_strings = aq_ethtool_get_strings,
293352
.get_rxfh_indir_size = aq_ethtool_get_rss_indir_size,
353+
.get_ringparam = aq_get_ringparam,
354+
.set_ringparam = aq_set_ringparam,
294355
.get_rxfh_key_size = aq_ethtool_get_rss_key_size,
295356
.get_rxfh = aq_ethtool_get_rss,
296357
.get_rxnfc = aq_ethtool_get_rxnfc,

drivers/net/ethernet/aquantia/atlantic/aq_hw.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ struct aq_hw_caps_s {
2424
u64 link_speed_msk;
2525
unsigned int hw_priv_flags;
2626
u32 media_type;
27-
u32 rxds;
28-
u32 txds;
27+
u32 rxds_max;
28+
u32 txds_max;
29+
u32 rxds_min;
30+
u32 txds_min;
2931
u32 txhwb_alignment;
3032
u32 irq_mask;
3133
u32 vecs;
@@ -98,6 +100,9 @@ struct aq_stats_s {
98100
#define AQ_HW_MEDIA_TYPE_TP 1U
99101
#define AQ_HW_MEDIA_TYPE_FIBRE 2U
100102

103+
#define AQ_HW_TXD_MULTIPLE 8U
104+
#define AQ_HW_RXD_MULTIPLE 8U
105+
101106
struct aq_hw_s {
102107
atomic_t flags;
103108
u8 rbl_enabled:1;

drivers/net/ethernet/aquantia/atlantic/aq_nic.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ void aq_nic_cfg_start(struct aq_nic_s *self)
8989
aq_nic_rss_init(self, cfg->num_rss_queues);
9090

9191
/*descriptors */
92-
cfg->rxds = min(cfg->aq_hw_caps->rxds, AQ_CFG_RXDS_DEF);
93-
cfg->txds = min(cfg->aq_hw_caps->txds, AQ_CFG_TXDS_DEF);
92+
cfg->rxds = min(cfg->aq_hw_caps->rxds_max, AQ_CFG_RXDS_DEF);
93+
cfg->txds = min(cfg->aq_hw_caps->txds_max, AQ_CFG_TXDS_DEF);
9494

9595
/*rss rings */
9696
cfg->vecs = min(cfg->aq_hw_caps->vecs, AQ_CFG_VECS_DEF);

drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,31 @@
1919
#include "hw_atl_a0_internal.h"
2020

2121
#define DEFAULT_A0_BOARD_BASIC_CAPABILITIES \
22-
.is_64_dma = true, \
23-
.msix_irqs = 4U, \
24-
.irq_mask = ~0U, \
25-
.vecs = HW_ATL_A0_RSS_MAX, \
26-
.tcs = HW_ATL_A0_TC_MAX, \
27-
.rxd_alignment = 1U, \
28-
.rxd_size = HW_ATL_A0_RXD_SIZE, \
29-
.rxds = 248U, \
30-
.txd_alignment = 1U, \
31-
.txd_size = HW_ATL_A0_TXD_SIZE, \
32-
.txds = 8U * 1024U, \
33-
.txhwb_alignment = 4096U, \
34-
.tx_rings = HW_ATL_A0_TX_RINGS, \
35-
.rx_rings = HW_ATL_A0_RX_RINGS, \
36-
.hw_features = NETIF_F_HW_CSUM | \
37-
NETIF_F_RXHASH | \
38-
NETIF_F_RXCSUM | \
39-
NETIF_F_SG | \
40-
NETIF_F_TSO, \
22+
.is_64_dma = true, \
23+
.msix_irqs = 4U, \
24+
.irq_mask = ~0U, \
25+
.vecs = HW_ATL_A0_RSS_MAX, \
26+
.tcs = HW_ATL_A0_TC_MAX, \
27+
.rxd_alignment = 1U, \
28+
.rxd_size = HW_ATL_A0_RXD_SIZE, \
29+
.rxds_max = HW_ATL_A0_MAX_RXD, \
30+
.rxds_min = HW_ATL_A0_MIN_RXD, \
31+
.txd_alignment = 1U, \
32+
.txd_size = HW_ATL_A0_TXD_SIZE, \
33+
.txds_max = HW_ATL_A0_MAX_TXD, \
34+
.txds_min = HW_ATL_A0_MIN_RXD, \
35+
.txhwb_alignment = 4096U, \
36+
.tx_rings = HW_ATL_A0_TX_RINGS, \
37+
.rx_rings = HW_ATL_A0_RX_RINGS, \
38+
.hw_features = NETIF_F_HW_CSUM | \
39+
NETIF_F_RXHASH | \
40+
NETIF_F_RXCSUM | \
41+
NETIF_F_SG | \
42+
NETIF_F_TSO, \
4143
.hw_priv_flags = IFF_UNICAST_FLT, \
42-
.flow_control = true, \
43-
.mtu = HW_ATL_A0_MTU_JUMBO, \
44-
.mac_regs_count = 88, \
44+
.flow_control = true, \
45+
.mtu = HW_ATL_A0_MTU_JUMBO, \
46+
.mac_regs_count = 88, \
4547
.hw_alive_check_addr = 0x10U
4648

4749
const struct aq_hw_caps_s hw_atl_a0_caps_aqc100 = {

drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0_internal.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,12 @@
8888

8989
#define HW_ATL_A0_FW_VER_EXPECTED 0x01050006U
9090

91+
#define HW_ATL_A0_MIN_RXD \
92+
(ALIGN(AQ_CFG_SKB_FRAGS_MAX + 1U, AQ_HW_RXD_MULTIPLE))
93+
#define HW_ATL_A0_MIN_TXD \
94+
(ALIGN(AQ_CFG_SKB_FRAGS_MAX + 1U, AQ_HW_TXD_MULTIPLE))
95+
96+
#define HW_ATL_A0_MAX_RXD 8184U
97+
#define HW_ATL_A0_MAX_TXD 8184U
98+
9199
#endif /* HW_ATL_A0_INTERNAL_H */

drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,30 +20,32 @@
2020
#include "hw_atl_llh_internal.h"
2121

2222
#define DEFAULT_B0_BOARD_BASIC_CAPABILITIES \
23-
.is_64_dma = true, \
24-
.msix_irqs = 4U, \
25-
.irq_mask = ~0U, \
26-
.vecs = HW_ATL_B0_RSS_MAX, \
27-
.tcs = HW_ATL_B0_TC_MAX, \
28-
.rxd_alignment = 1U, \
29-
.rxd_size = HW_ATL_B0_RXD_SIZE, \
30-
.rxds = 4U * 1024U, \
31-
.txd_alignment = 1U, \
32-
.txd_size = HW_ATL_B0_TXD_SIZE, \
33-
.txds = 8U * 1024U, \
34-
.txhwb_alignment = 4096U, \
35-
.tx_rings = HW_ATL_B0_TX_RINGS, \
36-
.rx_rings = HW_ATL_B0_RX_RINGS, \
37-
.hw_features = NETIF_F_HW_CSUM | \
38-
NETIF_F_RXCSUM | \
39-
NETIF_F_RXHASH | \
40-
NETIF_F_SG | \
41-
NETIF_F_TSO | \
42-
NETIF_F_LRO, \
43-
.hw_priv_flags = IFF_UNICAST_FLT, \
44-
.flow_control = true, \
45-
.mtu = HW_ATL_B0_MTU_JUMBO, \
46-
.mac_regs_count = 88, \
23+
.is_64_dma = true, \
24+
.msix_irqs = 4U, \
25+
.irq_mask = ~0U, \
26+
.vecs = HW_ATL_B0_RSS_MAX, \
27+
.tcs = HW_ATL_B0_TC_MAX, \
28+
.rxd_alignment = 1U, \
29+
.rxd_size = HW_ATL_B0_RXD_SIZE, \
30+
.rxds_max = HW_ATL_B0_MAX_RXD, \
31+
.rxds_min = HW_ATL_B0_MIN_RXD, \
32+
.txd_alignment = 1U, \
33+
.txd_size = HW_ATL_B0_TXD_SIZE, \
34+
.txds_max = HW_ATL_B0_MAX_TXD, \
35+
.txds_min = HW_ATL_B0_MIN_TXD, \
36+
.txhwb_alignment = 4096U, \
37+
.tx_rings = HW_ATL_B0_TX_RINGS, \
38+
.rx_rings = HW_ATL_B0_RX_RINGS, \
39+
.hw_features = NETIF_F_HW_CSUM | \
40+
NETIF_F_RXCSUM | \
41+
NETIF_F_RXHASH | \
42+
NETIF_F_SG | \
43+
NETIF_F_TSO | \
44+
NETIF_F_LRO, \
45+
.hw_priv_flags = IFF_UNICAST_FLT, \
46+
.flow_control = true, \
47+
.mtu = HW_ATL_B0_MTU_JUMBO, \
48+
.mac_regs_count = 88, \
4749
.hw_alive_check_addr = 0x10U
4850

4951
const struct aq_hw_caps_s hw_atl_b0_caps_aqc100 = {

drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0_internal.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,14 @@
142142
#define HW_ATL_INTR_MODER_MAX 0x1FF
143143
#define HW_ATL_INTR_MODER_MIN 0xFF
144144

145+
#define HW_ATL_B0_MIN_RXD \
146+
(ALIGN(AQ_CFG_SKB_FRAGS_MAX + 1U, AQ_HW_RXD_MULTIPLE))
147+
#define HW_ATL_B0_MIN_TXD \
148+
(ALIGN(AQ_CFG_SKB_FRAGS_MAX + 1U, AQ_HW_TXD_MULTIPLE))
149+
150+
#define HW_ATL_B0_MAX_RXD 8184U
151+
#define HW_ATL_B0_MAX_TXD 8184U
152+
145153
/* HW layer capabilities */
146154

147155
#endif /* HW_ATL_B0_INTERNAL_H */

0 commit comments

Comments
 (0)