gianfar: Fix Rx/Tx HW interrupt coalescing counter reset procedure.
authorAndy Fleming <afleming@freescale.com>
Mon, 24 Mar 2008 15:53:28 +0000 (10:53 -0500)
committerJeff Garzik <jeff@garzik.org>
Wed, 26 Mar 2008 04:44:47 +0000 (00:44 -0400)
- Fix Rx/Tx HW interrupt coalescing counter reset logic. Disabling
is required before resetting the counter.

- Update the Default both Rx and Tx coalescing timer
threshold. Formerly 4 is set which is equal to 1.5 frame at the line
rate of 1GbE interface, and it doesn't match to the coalescing frame
count which is set to 16. Threashold 21 is matched to frame count 16.

Signed-off-by: Dai Haruki <dai.haruki@freescale.com>
Signed-off-by: Andy Fleming <afleming@freescale.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/net/gianfar.c
drivers/net/gianfar.h

index a59edf7eacdccc44ad025801770525e8454dcc78..601f93e482c6ddf8ca8fc7f97fdc3337f7a8dba5 100644 (file)
@@ -1299,11 +1299,11 @@ static irqreturn_t gfar_transmit(int irq, void *dev_id)
 
        /* If we are coalescing the interrupts, reset the timer */
        /* Otherwise, clear it */
-       if (priv->txcoalescing)
+       if (likely(priv->txcoalescing)) {
+               gfar_write(&priv->regs->txic, 0);
                gfar_write(&priv->regs->txic,
                           mk_ic_value(priv->txcount, priv->txtime));
-       else
-               gfar_write(&priv->regs->txic, 0);
+       }
 
        spin_unlock(&priv->txlock);
 
@@ -1417,11 +1417,11 @@ irqreturn_t gfar_receive(int irq, void *dev_id)
 
        /* If we are coalescing interrupts, update the timer */
        /* Otherwise, clear it */
-       if (priv->rxcoalescing)
+       if (likely(priv->rxcoalescing)) {
+               gfar_write(&priv->regs->rxic, 0);
                gfar_write(&priv->regs->rxic,
                           mk_ic_value(priv->rxcount, priv->rxtime));
-       else
-               gfar_write(&priv->regs->rxic, 0);
+       }
 
        spin_unlock_irqrestore(&priv->rxlock, flags);
 #endif
@@ -1593,11 +1593,11 @@ static int gfar_poll(struct napi_struct *napi, int budget)
 
                /* If we are coalescing interrupts, update the timer */
                /* Otherwise, clear it */
-               if (priv->rxcoalescing)
+               if (likely(priv->rxcoalescing)) {
+                       gfar_write(&priv->regs->rxic, 0);
                        gfar_write(&priv->regs->rxic,
                                   mk_ic_value(priv->rxcount, priv->rxtime));
-               else
-                       gfar_write(&priv->regs->rxic, 0);
+               }
        }
 
        return howmany;
index fcfa1bd57280988f4879f55b4acfbfc6d0900fd7..ea8671f87bce565b8611dc2bcd1479111f9a07e6 100644 (file)
@@ -124,11 +124,11 @@ extern const char gfar_driver_version[];
 
 #define DEFAULT_TX_COALESCE 1
 #define DEFAULT_TXCOUNT        16
-#define DEFAULT_TXTIME 4
+#define DEFAULT_TXTIME 21
 
 #define DEFAULT_RX_COALESCE 1
 #define DEFAULT_RXCOUNT        16
-#define DEFAULT_RXTIME 4
+#define DEFAULT_RXTIME 21
 
 #define TBIPA_VALUE            0x1f
 #define MIIMCFG_INIT_VALUE     0x00000007