Skip to content

Commit 55054a1

Browse files
Havard Skinnemoendavem330
authored andcommitted
net/macb: clean up ring buffer logic
Instead of masking head and tail every time we increment them, just let them wrap through UINT_MAX and mask them when subscripting. Add simple accessor functions to do the subscripting properly to minimize the chances of messing this up. This makes the code slightly smaller, and hopefully faster as well. Also, doing the ring buffer management this way will simplify things a lot when making the ring sizes configurable in the future. Available number of descriptors in ring buffer function by David Laight. Signed-off-by: Havard Skinnemoen <havard@skinnemoen.net> [nicolas.ferre@atmel.com: split patch in topics, adapt to newer kernel] Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com> Tested-by: Joachim Eastwood <manabian@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent cde30a8 commit 55054a1

File tree

3 files changed

+127
-73
lines changed

3 files changed

+127
-73
lines changed

drivers/net/ethernet/cadence/at91_ether.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ static int at91ether_start(struct net_device *dev)
156156
int i;
157157

158158
lp->rx_ring = dma_alloc_coherent(&lp->pdev->dev,
159-
MAX_RX_DESCR * sizeof(struct dma_desc),
159+
MAX_RX_DESCR * sizeof(struct macb_dma_desc),
160160
&lp->rx_ring_dma, GFP_KERNEL);
161161
if (!lp->rx_ring) {
162162
netdev_err(lp->dev, "unable to alloc rx ring DMA buffer\n");
@@ -170,7 +170,7 @@ static int at91ether_start(struct net_device *dev)
170170
netdev_err(lp->dev, "unable to alloc rx data DMA buffer\n");
171171

172172
dma_free_coherent(&lp->pdev->dev,
173-
MAX_RX_DESCR * sizeof(struct dma_desc),
173+
MAX_RX_DESCR * sizeof(struct macb_dma_desc),
174174
lp->rx_ring, lp->rx_ring_dma);
175175
lp->rx_ring = NULL;
176176
return -ENOMEM;
@@ -256,7 +256,7 @@ static int at91ether_close(struct net_device *dev)
256256
netif_stop_queue(dev);
257257

258258
dma_free_coherent(&lp->pdev->dev,
259-
MAX_RX_DESCR * sizeof(struct dma_desc),
259+
MAX_RX_DESCR * sizeof(struct macb_dma_desc),
260260
lp->rx_ring, lp->rx_ring_dma);
261261
lp->rx_ring = NULL;
262262

drivers/net/ethernet/cadence/macb.c

Lines changed: 109 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -30,32 +30,66 @@
3030
#include "macb.h"
3131

3232
#define RX_BUFFER_SIZE 128
33-
#define RX_RING_SIZE 512
34-
#define RX_RING_BYTES (sizeof(struct dma_desc) * RX_RING_SIZE)
33+
#define RX_RING_SIZE 512 /* must be power of 2 */
34+
#define RX_RING_BYTES (sizeof(struct macb_dma_desc) * RX_RING_SIZE)
3535

3636
/* Make the IP header word-aligned (the ethernet header is 14 bytes) */
3737
#define RX_OFFSET 2
3838

39-
#define TX_RING_SIZE 128
40-
#define DEF_TX_RING_PENDING (TX_RING_SIZE - 1)
41-
#define TX_RING_BYTES (sizeof(struct dma_desc) * TX_RING_SIZE)
42-
43-
#define TX_RING_GAP(bp) \
44-
(TX_RING_SIZE - (bp)->tx_pending)
45-
#define TX_BUFFS_AVAIL(bp) \
46-
(((bp)->tx_tail <= (bp)->tx_head) ? \
47-
(bp)->tx_tail + (bp)->tx_pending - (bp)->tx_head : \
48-
(bp)->tx_tail - (bp)->tx_head - TX_RING_GAP(bp))
49-
#define NEXT_TX(n) (((n) + 1) & (TX_RING_SIZE - 1))
50-
51-
#define NEXT_RX(n) (((n) + 1) & (RX_RING_SIZE - 1))
39+
#define TX_RING_SIZE 128 /* must be power of 2 */
40+
#define TX_RING_BYTES (sizeof(struct macb_dma_desc) * TX_RING_SIZE)
5241

5342
/* minimum number of free TX descriptors before waking up TX process */
5443
#define MACB_TX_WAKEUP_THRESH (TX_RING_SIZE / 4)
5544

5645
#define MACB_RX_INT_FLAGS (MACB_BIT(RCOMP) | MACB_BIT(RXUBR) \
5746
| MACB_BIT(ISR_ROVR))
5847

48+
/* Ring buffer accessors */
49+
static unsigned int macb_tx_ring_wrap(unsigned int index)
50+
{
51+
return index & (TX_RING_SIZE - 1);
52+
}
53+
54+
static unsigned int macb_tx_ring_avail(struct macb *bp)
55+
{
56+
return (bp->tx_tail - bp->tx_head) & (TX_RING_SIZE - 1);
57+
}
58+
59+
static struct macb_dma_desc *macb_tx_desc(struct macb *bp, unsigned int index)
60+
{
61+
return &bp->tx_ring[macb_tx_ring_wrap(index)];
62+
}
63+
64+
static struct macb_tx_skb *macb_tx_skb(struct macb *bp, unsigned int index)
65+
{
66+
return &bp->tx_skb[macb_tx_ring_wrap(index)];
67+
}
68+
69+
static dma_addr_t macb_tx_dma(struct macb *bp, unsigned int index)
70+
{
71+
dma_addr_t offset;
72+
73+
offset = macb_tx_ring_wrap(index) * sizeof(struct macb_dma_desc);
74+
75+
return bp->tx_ring_dma + offset;
76+
}
77+
78+
static unsigned int macb_rx_ring_wrap(unsigned int index)
79+
{
80+
return index & (RX_RING_SIZE - 1);
81+
}
82+
83+
static struct macb_dma_desc *macb_rx_desc(struct macb *bp, unsigned int index)
84+
{
85+
return &bp->rx_ring[macb_rx_ring_wrap(index)];
86+
}
87+
88+
static void *macb_rx_buffer(struct macb *bp, unsigned int index)
89+
{
90+
return bp->rx_buffers + RX_BUFFER_SIZE * macb_rx_ring_wrap(index);
91+
}
92+
5993
static void __macb_set_hwaddr(struct macb *bp)
6094
{
6195
u32 bottom;
@@ -336,17 +370,18 @@ static void macb_tx(struct macb *bp)
336370
bp->tx_ring[TX_RING_SIZE - 1].ctrl |= MACB_BIT(TX_WRAP);
337371

338372
/* free transmit buffer in upper layer*/
339-
for (tail = bp->tx_tail; tail != head; tail = NEXT_TX(tail)) {
340-
struct ring_info *rp = &bp->tx_skb[tail];
341-
struct sk_buff *skb = rp->skb;
342-
343-
BUG_ON(skb == NULL);
373+
for (tail = bp->tx_tail; tail != head; tail++) {
374+
struct macb_tx_skb *tx_skb;
375+
struct sk_buff *skb;
344376

345377
rmb();
346378

347-
dma_unmap_single(&bp->pdev->dev, rp->mapping, skb->len,
348-
DMA_TO_DEVICE);
349-
rp->skb = NULL;
379+
tx_skb = macb_tx_skb(bp, tail);
380+
skb = tx_skb->skb;
381+
382+
dma_unmap_single(&bp->pdev->dev, tx_skb->mapping,
383+
skb->len, DMA_TO_DEVICE);
384+
tx_skb->skb = NULL;
350385
dev_kfree_skb_irq(skb);
351386
}
352387

@@ -366,34 +401,38 @@ static void macb_tx(struct macb *bp)
366401
return;
367402

368403
head = bp->tx_head;
369-
for (tail = bp->tx_tail; tail != head; tail = NEXT_TX(tail)) {
370-
struct ring_info *rp = &bp->tx_skb[tail];
371-
struct sk_buff *skb = rp->skb;
372-
u32 bufstat;
404+
for (tail = bp->tx_tail; tail != head; tail++) {
405+
struct macb_tx_skb *tx_skb;
406+
struct sk_buff *skb;
407+
struct macb_dma_desc *desc;
408+
u32 ctrl;
373409

374-
BUG_ON(skb == NULL);
410+
desc = macb_tx_desc(bp, tail);
375411

376412
/* Make hw descriptor updates visible to CPU */
377413
rmb();
378414

379-
bufstat = bp->tx_ring[tail].ctrl;
415+
ctrl = desc->ctrl;
380416

381-
if (!(bufstat & MACB_BIT(TX_USED)))
417+
if (!(ctrl & MACB_BIT(TX_USED)))
382418
break;
383419

420+
tx_skb = macb_tx_skb(bp, tail);
421+
skb = tx_skb->skb;
422+
384423
netdev_vdbg(bp->dev, "skb %u (data %p) TX complete\n",
385-
tail, skb->data);
386-
dma_unmap_single(&bp->pdev->dev, rp->mapping, skb->len,
424+
macb_tx_ring_wrap(tail), skb->data);
425+
dma_unmap_single(&bp->pdev->dev, tx_skb->mapping, skb->len,
387426
DMA_TO_DEVICE);
388427
bp->stats.tx_packets++;
389428
bp->stats.tx_bytes += skb->len;
390-
rp->skb = NULL;
429+
tx_skb->skb = NULL;
391430
dev_kfree_skb_irq(skb);
392431
}
393432

394433
bp->tx_tail = tail;
395-
if (netif_queue_stopped(bp->dev) &&
396-
TX_BUFFS_AVAIL(bp) > MACB_TX_WAKEUP_THRESH)
434+
if (netif_queue_stopped(bp->dev)
435+
&& macb_tx_ring_avail(bp) > MACB_TX_WAKEUP_THRESH)
397436
netif_wake_queue(bp->dev);
398437
}
399438

@@ -404,17 +443,21 @@ static int macb_rx_frame(struct macb *bp, unsigned int first_frag,
404443
unsigned int frag;
405444
unsigned int offset = 0;
406445
struct sk_buff *skb;
446+
struct macb_dma_desc *desc;
407447

408-
len = MACB_BFEXT(RX_FRMLEN, bp->rx_ring[last_frag].ctrl);
448+
desc = macb_rx_desc(bp, last_frag);
449+
len = MACB_BFEXT(RX_FRMLEN, desc->ctrl);
409450

410451
netdev_vdbg(bp->dev, "macb_rx_frame frags %u - %u (len %u)\n",
411-
first_frag, last_frag, len);
452+
macb_rx_ring_wrap(first_frag),
453+
macb_rx_ring_wrap(last_frag), len);
412454

413455
skb = netdev_alloc_skb(bp->dev, len + RX_OFFSET);
414456
if (!skb) {
415457
bp->stats.rx_dropped++;
416-
for (frag = first_frag; ; frag = NEXT_RX(frag)) {
417-
bp->rx_ring[frag].addr &= ~MACB_BIT(RX_USED);
458+
for (frag = first_frag; ; frag++) {
459+
desc = macb_rx_desc(bp, frag);
460+
desc->addr &= ~MACB_BIT(RX_USED);
418461
if (frag == last_frag)
419462
break;
420463
}
@@ -429,19 +472,18 @@ static int macb_rx_frame(struct macb *bp, unsigned int first_frag,
429472
skb_checksum_none_assert(skb);
430473
skb_put(skb, len);
431474

432-
for (frag = first_frag; ; frag = NEXT_RX(frag)) {
475+
for (frag = first_frag; ; frag++) {
433476
unsigned int frag_len = RX_BUFFER_SIZE;
434477

435478
if (offset + frag_len > len) {
436479
BUG_ON(frag != last_frag);
437480
frag_len = len - offset;
438481
}
439482
skb_copy_to_linear_data_offset(skb, offset,
440-
(bp->rx_buffers +
441-
(RX_BUFFER_SIZE * frag)),
442-
frag_len);
483+
macb_rx_buffer(bp, frag), frag_len);
443484
offset += RX_BUFFER_SIZE;
444-
bp->rx_ring[frag].addr &= ~MACB_BIT(RX_USED);
485+
desc = macb_rx_desc(bp, frag);
486+
desc->addr &= ~MACB_BIT(RX_USED);
445487

446488
if (frag == last_frag)
447489
break;
@@ -467,8 +509,10 @@ static void discard_partial_frame(struct macb *bp, unsigned int begin,
467509
{
468510
unsigned int frag;
469511

470-
for (frag = begin; frag != end; frag = NEXT_RX(frag))
471-
bp->rx_ring[frag].addr &= ~MACB_BIT(RX_USED);
512+
for (frag = begin; frag != end; frag++) {
513+
struct macb_dma_desc *desc = macb_rx_desc(bp, frag);
514+
desc->addr &= ~MACB_BIT(RX_USED);
515+
}
472516

473517
/* Make descriptor updates visible to hardware */
474518
wmb();
@@ -483,17 +527,18 @@ static void discard_partial_frame(struct macb *bp, unsigned int begin,
483527
static int macb_rx(struct macb *bp, int budget)
484528
{
485529
int received = 0;
486-
unsigned int tail = bp->rx_tail;
530+
unsigned int tail;
487531
int first_frag = -1;
488532

489-
for (; budget > 0; tail = NEXT_RX(tail)) {
533+
for (tail = bp->rx_tail; budget > 0; tail++) {
534+
struct macb_dma_desc *desc = macb_rx_desc(bp, tail);
490535
u32 addr, ctrl;
491536

492537
/* Make hw descriptor updates visible to CPU */
493538
rmb();
494539

495-
addr = bp->rx_ring[tail].addr;
496-
ctrl = bp->rx_ring[tail].ctrl;
540+
addr = desc->addr;
541+
ctrl = desc->ctrl;
497542

498543
if (!(addr & MACB_BIT(RX_USED)))
499544
break;
@@ -647,6 +692,8 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
647692
struct macb *bp = netdev_priv(dev);
648693
dma_addr_t mapping;
649694
unsigned int len, entry;
695+
struct macb_dma_desc *desc;
696+
struct macb_tx_skb *tx_skb;
650697
u32 ctrl;
651698
unsigned long flags;
652699

@@ -663,7 +710,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
663710
spin_lock_irqsave(&bp->lock, flags);
664711

665712
/* This is a hard error, log it. */
666-
if (TX_BUFFS_AVAIL(bp) < 1) {
713+
if (macb_tx_ring_avail(bp) < 1) {
667714
netif_stop_queue(dev);
668715
spin_unlock_irqrestore(&bp->lock, flags);
669716
netdev_err(bp->dev, "BUG! Tx Ring full when queue awake!\n");
@@ -672,12 +719,15 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
672719
return NETDEV_TX_BUSY;
673720
}
674721

675-
entry = bp->tx_head;
722+
entry = macb_tx_ring_wrap(bp->tx_head);
723+
bp->tx_head++;
676724
netdev_vdbg(bp->dev, "Allocated ring entry %u\n", entry);
677725
mapping = dma_map_single(&bp->pdev->dev, skb->data,
678726
len, DMA_TO_DEVICE);
679-
bp->tx_skb[entry].skb = skb;
680-
bp->tx_skb[entry].mapping = mapping;
727+
728+
tx_skb = &bp->tx_skb[entry];
729+
tx_skb->skb = skb;
730+
tx_skb->mapping = mapping;
681731
netdev_vdbg(bp->dev, "Mapped skb data %p to DMA addr %08lx\n",
682732
skb->data, (unsigned long)mapping);
683733

@@ -686,20 +736,18 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
686736
if (entry == (TX_RING_SIZE - 1))
687737
ctrl |= MACB_BIT(TX_WRAP);
688738

689-
bp->tx_ring[entry].addr = mapping;
690-
bp->tx_ring[entry].ctrl = ctrl;
739+
desc = &bp->tx_ring[entry];
740+
desc->addr = mapping;
741+
desc->ctrl = ctrl;
691742

692743
/* Make newly initialized descriptor visible to hardware */
693744
wmb();
694745

695-
entry = NEXT_TX(entry);
696-
bp->tx_head = entry;
697-
698746
skb_tx_timestamp(skb);
699747

700748
macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TSTART));
701749

702-
if (TX_BUFFS_AVAIL(bp) < 1)
750+
if (macb_tx_ring_avail(bp) < 1)
703751
netif_stop_queue(dev);
704752

705753
spin_unlock_irqrestore(&bp->lock, flags);
@@ -735,7 +783,7 @@ static int macb_alloc_consistent(struct macb *bp)
735783
{
736784
int size;
737785

738-
size = TX_RING_SIZE * sizeof(struct ring_info);
786+
size = TX_RING_SIZE * sizeof(struct macb_tx_skb);
739787
bp->tx_skb = kmalloc(size, GFP_KERNEL);
740788
if (!bp->tx_skb)
741789
goto out_err;
@@ -1412,8 +1460,6 @@ static int __init macb_probe(struct platform_device *pdev)
14121460
macb_or_gem_writel(bp, USRIO, MACB_BIT(MII));
14131461
#endif
14141462

1415-
bp->tx_pending = DEF_TX_RING_PENDING;
1416-
14171463
err = register_netdev(dev);
14181464
if (err) {
14191465
dev_err(&pdev->dev, "Cannot register net device, aborting.\n");

0 commit comments

Comments
 (0)