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+
5993static 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,
483527static 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