Skip to content

Commit f7b261b

Browse files
esbendavem330
authored andcommitted
net: ll_temac: Make RX/TX ring sizes configurable
Add support for setting the RX and TX ring sizes for this driver using ethtool. Also increase the default RX ring size as the previous default was far too low for good performance in some configurations. Signed-off-by: Esben Haabendal <esben@geanix.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 7c462a0 commit f7b261b

File tree

2 files changed

+72
-26
lines changed

2 files changed

+72
-26
lines changed

drivers/net/ethernet/xilinx/ll_temac.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,8 +369,10 @@ struct temac_local {
369369
/* Buffer descriptors */
370370
struct cdmac_bd *tx_bd_v;
371371
dma_addr_t tx_bd_p;
372+
u32 tx_bd_num;
372373
struct cdmac_bd *rx_bd_v;
373374
dma_addr_t rx_bd_p;
375+
u32 rx_bd_num;
374376
int tx_bd_ci;
375377
int tx_bd_tail;
376378
int rx_bd_ci;

drivers/net/ethernet/xilinx/ll_temac_main.c

Lines changed: 70 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,11 @@
5858

5959
#include "ll_temac.h"
6060

61-
#define TX_BD_NUM 64
62-
#define RX_BD_NUM 128
61+
/* Descriptors defines for Tx and Rx DMA */
62+
#define TX_BD_NUM_DEFAULT 64
63+
#define RX_BD_NUM_DEFAULT 1024
64+
#define TX_BD_NUM_MAX 4096
65+
#define RX_BD_NUM_MAX 4096
6366

6467
/* ---------------------------------------------------------------------
6568
* Low level register access functions
@@ -301,7 +304,7 @@ static void temac_dma_bd_release(struct net_device *ndev)
301304
/* Reset Local Link (DMA) */
302305
lp->dma_out(lp, DMA_CONTROL_REG, DMA_CONTROL_RST);
303306

304-
for (i = 0; i < RX_BD_NUM; i++) {
307+
for (i = 0; i < lp->rx_bd_num; i++) {
305308
if (!lp->rx_skb[i])
306309
break;
307310
else {
@@ -312,12 +315,12 @@ static void temac_dma_bd_release(struct net_device *ndev)
312315
}
313316
if (lp->rx_bd_v)
314317
dma_free_coherent(ndev->dev.parent,
315-
sizeof(*lp->rx_bd_v) * RX_BD_NUM,
316-
lp->rx_bd_v, lp->rx_bd_p);
318+
sizeof(*lp->rx_bd_v) * lp->rx_bd_num,
319+
lp->rx_bd_v, lp->rx_bd_p);
317320
if (lp->tx_bd_v)
318321
dma_free_coherent(ndev->dev.parent,
319-
sizeof(*lp->tx_bd_v) * TX_BD_NUM,
320-
lp->tx_bd_v, lp->tx_bd_p);
322+
sizeof(*lp->tx_bd_v) * lp->tx_bd_num,
323+
lp->tx_bd_v, lp->tx_bd_p);
321324
}
322325

323326
/**
@@ -330,33 +333,33 @@ static int temac_dma_bd_init(struct net_device *ndev)
330333
dma_addr_t skb_dma_addr;
331334
int i;
332335

333-
lp->rx_skb = devm_kcalloc(&ndev->dev, RX_BD_NUM, sizeof(*lp->rx_skb),
334-
GFP_KERNEL);
336+
lp->rx_skb = devm_kcalloc(&ndev->dev, lp->rx_bd_num,
337+
sizeof(*lp->rx_skb), GFP_KERNEL);
335338
if (!lp->rx_skb)
336339
goto out;
337340

338341
/* allocate the tx and rx ring buffer descriptors. */
339342
/* returns a virtual address and a physical address. */
340343
lp->tx_bd_v = dma_alloc_coherent(ndev->dev.parent,
341-
sizeof(*lp->tx_bd_v) * TX_BD_NUM,
344+
sizeof(*lp->tx_bd_v) * lp->tx_bd_num,
342345
&lp->tx_bd_p, GFP_KERNEL);
343346
if (!lp->tx_bd_v)
344347
goto out;
345348

346349
lp->rx_bd_v = dma_alloc_coherent(ndev->dev.parent,
347-
sizeof(*lp->rx_bd_v) * RX_BD_NUM,
350+
sizeof(*lp->rx_bd_v) * lp->rx_bd_num,
348351
&lp->rx_bd_p, GFP_KERNEL);
349352
if (!lp->rx_bd_v)
350353
goto out;
351354

352-
for (i = 0; i < TX_BD_NUM; i++) {
355+
for (i = 0; i < lp->tx_bd_num; i++) {
353356
lp->tx_bd_v[i].next = cpu_to_be32(lp->tx_bd_p
354-
+ sizeof(*lp->tx_bd_v) * ((i + 1) % TX_BD_NUM));
357+
+ sizeof(*lp->tx_bd_v) * ((i + 1) % lp->tx_bd_num));
355358
}
356359

357-
for (i = 0; i < RX_BD_NUM; i++) {
360+
for (i = 0; i < lp->rx_bd_num; i++) {
358361
lp->rx_bd_v[i].next = cpu_to_be32(lp->rx_bd_p
359-
+ sizeof(*lp->rx_bd_v) * ((i + 1) % RX_BD_NUM));
362+
+ sizeof(*lp->rx_bd_v) * ((i + 1) % lp->rx_bd_num));
360363

361364
skb = netdev_alloc_skb_ip_align(ndev,
362365
XTE_MAX_JUMBO_FRAME_SIZE);
@@ -389,7 +392,7 @@ static int temac_dma_bd_init(struct net_device *ndev)
389392
lp->tx_bd_ci = 0;
390393
lp->tx_bd_tail = 0;
391394
lp->rx_bd_ci = 0;
392-
lp->rx_bd_tail = RX_BD_NUM - 1;
395+
lp->rx_bd_tail = lp->rx_bd_num - 1;
393396

394397
/* Enable RX DMA transfers */
395398
wmb();
@@ -784,7 +787,7 @@ static void temac_start_xmit_done(struct net_device *ndev)
784787
ndev->stats.tx_bytes += be32_to_cpu(cur_p->len);
785788

786789
lp->tx_bd_ci++;
787-
if (lp->tx_bd_ci >= TX_BD_NUM)
790+
if (lp->tx_bd_ci >= lp->tx_bd_num)
788791
lp->tx_bd_ci = 0;
789792

790793
cur_p = &lp->tx_bd_v[lp->tx_bd_ci];
@@ -810,7 +813,7 @@ static inline int temac_check_tx_bd_space(struct temac_local *lp, int num_frag)
810813
return NETDEV_TX_BUSY;
811814

812815
tail++;
813-
if (tail >= TX_BD_NUM)
816+
if (tail >= lp->tx_bd_num)
814817
tail = 0;
815818

816819
cur_p = &lp->tx_bd_v[tail];
@@ -874,7 +877,7 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
874877
ptr_to_txbd((void *)skb, cur_p);
875878

876879
for (ii = 0; ii < num_frag; ii++) {
877-
if (++lp->tx_bd_tail >= TX_BD_NUM)
880+
if (++lp->tx_bd_tail >= lp->tx_bd_num)
878881
lp->tx_bd_tail = 0;
879882

880883
cur_p = &lp->tx_bd_v[lp->tx_bd_tail];
@@ -884,7 +887,7 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
884887
DMA_TO_DEVICE);
885888
if (dma_mapping_error(ndev->dev.parent, skb_dma_addr)) {
886889
if (--lp->tx_bd_tail < 0)
887-
lp->tx_bd_tail = TX_BD_NUM - 1;
890+
lp->tx_bd_tail = lp->tx_bd_num - 1;
888891
cur_p = &lp->tx_bd_v[lp->tx_bd_tail];
889892
while (--ii >= 0) {
890893
--frag;
@@ -893,7 +896,7 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
893896
skb_frag_size(frag),
894897
DMA_TO_DEVICE);
895898
if (--lp->tx_bd_tail < 0)
896-
lp->tx_bd_tail = TX_BD_NUM - 1;
899+
lp->tx_bd_tail = lp->tx_bd_num - 1;
897900
cur_p = &lp->tx_bd_v[lp->tx_bd_tail];
898901
}
899902
dma_unmap_single(ndev->dev.parent,
@@ -912,7 +915,7 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
912915

913916
tail_p = lp->tx_bd_p + sizeof(*lp->tx_bd_v) * lp->tx_bd_tail;
914917
lp->tx_bd_tail++;
915-
if (lp->tx_bd_tail >= TX_BD_NUM)
918+
if (lp->tx_bd_tail >= lp->tx_bd_num)
916919
lp->tx_bd_tail = 0;
917920

918921
skb_tx_timestamp(skb);
@@ -932,7 +935,7 @@ static int ll_temac_recv_buffers_available(struct temac_local *lp)
932935
return 0;
933936
available = 1 + lp->rx_bd_tail - lp->rx_bd_ci;
934937
if (available <= 0)
935-
available += RX_BD_NUM;
938+
available += lp->rx_bd_num;
936939
return available;
937940
}
938941

@@ -1001,7 +1004,7 @@ static void ll_temac_recv(struct net_device *ndev)
10011004
ndev->stats.rx_bytes += length;
10021005

10031006
rx_bd = lp->rx_bd_ci;
1004-
if (++lp->rx_bd_ci >= RX_BD_NUM)
1007+
if (++lp->rx_bd_ci >= lp->rx_bd_num)
10051008
lp->rx_bd_ci = 0;
10061009
} while (rx_bd != lp->rx_bd_tail);
10071010

@@ -1032,7 +1035,7 @@ static void ll_temac_recv(struct net_device *ndev)
10321035
dma_addr_t skb_dma_addr;
10331036

10341037
rx_bd = lp->rx_bd_tail + 1;
1035-
if (rx_bd >= RX_BD_NUM)
1038+
if (rx_bd >= lp->rx_bd_num)
10361039
rx_bd = 0;
10371040
bd = &lp->rx_bd_v[rx_bd];
10381041

@@ -1248,13 +1251,52 @@ static const struct attribute_group temac_attr_group = {
12481251
.attrs = temac_device_attrs,
12491252
};
12501253

1251-
/* ethtool support */
1254+
/* ---------------------------------------------------------------------
1255+
* ethtool support
1256+
*/
1257+
1258+
static void ll_temac_ethtools_get_ringparam(struct net_device *ndev,
1259+
struct ethtool_ringparam *ering)
1260+
{
1261+
struct temac_local *lp = netdev_priv(ndev);
1262+
1263+
ering->rx_max_pending = RX_BD_NUM_MAX;
1264+
ering->rx_mini_max_pending = 0;
1265+
ering->rx_jumbo_max_pending = 0;
1266+
ering->tx_max_pending = TX_BD_NUM_MAX;
1267+
ering->rx_pending = lp->rx_bd_num;
1268+
ering->rx_mini_pending = 0;
1269+
ering->rx_jumbo_pending = 0;
1270+
ering->tx_pending = lp->tx_bd_num;
1271+
}
1272+
1273+
static int ll_temac_ethtools_set_ringparam(struct net_device *ndev,
1274+
struct ethtool_ringparam *ering)
1275+
{
1276+
struct temac_local *lp = netdev_priv(ndev);
1277+
1278+
if (ering->rx_pending > RX_BD_NUM_MAX ||
1279+
ering->rx_mini_pending ||
1280+
ering->rx_jumbo_pending ||
1281+
ering->rx_pending > TX_BD_NUM_MAX)
1282+
return -EINVAL;
1283+
1284+
if (netif_running(ndev))
1285+
return -EBUSY;
1286+
1287+
lp->rx_bd_num = ering->rx_pending;
1288+
lp->tx_bd_num = ering->tx_pending;
1289+
return 0;
1290+
}
1291+
12521292
static const struct ethtool_ops temac_ethtool_ops = {
12531293
.nway_reset = phy_ethtool_nway_reset,
12541294
.get_link = ethtool_op_get_link,
12551295
.get_ts_info = ethtool_op_get_ts_info,
12561296
.get_link_ksettings = phy_ethtool_get_link_ksettings,
12571297
.set_link_ksettings = phy_ethtool_set_link_ksettings,
1298+
.get_ringparam = ll_temac_ethtools_get_ringparam,
1299+
.set_ringparam = ll_temac_ethtools_set_ringparam,
12581300
};
12591301

12601302
static int temac_probe(struct platform_device *pdev)
@@ -1298,6 +1340,8 @@ static int temac_probe(struct platform_device *pdev)
12981340
lp->ndev = ndev;
12991341
lp->dev = &pdev->dev;
13001342
lp->options = XTE_OPTION_DEFAULTS;
1343+
lp->rx_bd_num = RX_BD_NUM_DEFAULT;
1344+
lp->tx_bd_num = TX_BD_NUM_DEFAULT;
13011345
spin_lock_init(&lp->rx_lock);
13021346
INIT_DELAYED_WORK(&lp->restart_work, ll_temac_restart_work_func);
13031347

0 commit comments

Comments
 (0)