]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
Xilinx: Axi Ethernet Driver: Optimize BD numbers
authorMichal Simek <monstr@monstr.eu>
Sun, 2 Oct 2011 13:10:31 +0000 (15:10 +0200)
committerJohn Linn <john.linn@xilinx.com>
Wed, 30 Nov 2011 04:32:50 +0000 (20:32 -0800)
Replaced:
       lp->tx_bd_tail++;
       if (lp->tx_bd_tail >= TX_BD_NUM)
               lp->tx_bd_tail = 0;
By:
       lp->tx_bd_tail = ++lp->tx_bd_tail % TX_BD_NUM;

Because gcc generates for old implementation longer code (7 instructions
with 3 lw/sw) than should be. New one is composed with 4 instructions
(lwi, addik, andi, swi).

This code is called in loop a lot.

Signed-off-by: Michal Simek <monstr@monstr.eu>
drivers/net/xilinx_axienet.h
drivers/net/xilinx_axienet_main.c

index 34e46dc7dbc0e0988c135ee56952abbc432f72a1..f07554df5e0aa402dee134627a04e3bef80e2a7d 100755 (executable)
@@ -503,9 +503,9 @@ struct axienet_local {
        dma_addr_t tx_bd_p;
        struct axidma_bd *rx_bd_v;
        dma_addr_t rx_bd_p;
-       int tx_bd_ci;
-       int tx_bd_tail;
-       int rx_bd_ci;
+       u32 tx_bd_ci;
+       u32 tx_bd_tail;
+       u32 rx_bd_ci;
 
        int max_frm_size;
        int jumbo_support;
index bf681f4a141ef355d659c998310ccb701d3282cd..985edb8e1a624e6dd2ed54f05ed4d7020abbd647 100644 (file)
@@ -33,7 +33,7 @@
 
 #include "xilinx_axienet.h"
 
-/* Descriptors defines for Tx and Rx DMA */
+/* Descriptors defines for Tx and Rx DMA - 2^n for the best performance */
 #define TX_BD_NUM      64
 #define RX_BD_NUM      128
 
@@ -699,9 +699,7 @@ static void axienet_start_xmit_done(struct net_device *ndev)
                ndev->stats.tx_bytes += (status &
                                        XAXIDMA_BD_STS_ACTUAL_LEN_MASK);
 
-               lp->tx_bd_ci++;
-               if (lp->tx_bd_ci >= TX_BD_NUM)
-                       lp->tx_bd_ci = 0;
+               lp->tx_bd_ci = ++lp->tx_bd_ci % TX_BD_NUM;
 
                cur_p = &lp->tx_bd_v[lp->tx_bd_ci];
                status = cur_p->status;
@@ -786,10 +784,7 @@ static int axienet_start_xmit(struct sk_buff *skb, struct net_device *ndev)
        cur_p->phys = dma_map_single(ndev->dev.parent, skb->data, skb_headlen(skb),
                                     DMA_TO_DEVICE);
        for (ii = 0; ii < num_frag; ii++) {
-
-               lp->tx_bd_tail++;
-               if (lp->tx_bd_tail >= TX_BD_NUM)
-                       lp->tx_bd_tail = 0;
+               lp->tx_bd_tail = ++lp->tx_bd_tail % TX_BD_NUM;
 
                cur_p = &lp->tx_bd_v[lp->tx_bd_tail];
                frag = &skb_shinfo(skb)->frags[ii];
@@ -806,9 +801,7 @@ static int axienet_start_xmit(struct sk_buff *skb, struct net_device *ndev)
        /* Start the transfer */
        axienet_dma_out32(lp, XAXIDMA_TX_TDESC_OFFSET, tail_p);
 
-       lp->tx_bd_tail++;
-       if (lp->tx_bd_tail >= TX_BD_NUM)
-               lp->tx_bd_tail = 0;
+       lp->tx_bd_tail = ++lp->tx_bd_tail % TX_BD_NUM;
 
        return NETDEV_TX_OK;
 }
@@ -883,9 +876,7 @@ static void axienet_recv(struct net_device *ndev)
                cur_p->status = 0;
                cur_p->sw_id_offset = (u32)(new_skb);
 
-               lp->rx_bd_ci++;
-               if (lp->rx_bd_ci >= RX_BD_NUM)
-                       lp->rx_bd_ci = 0;
+               lp->rx_bd_ci = ++lp->rx_bd_ci % RX_BD_NUM;
 
                cur_p = &lp->rx_bd_v[lp->rx_bd_ci];
        }