KS8695: fix ks8695_rx_irq() bug.
authorzeal <zealcook@gmail.com>
Mon, 16 Nov 2009 04:58:09 +0000 (04:58 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 17 Nov 2009 07:51:47 +0000 (23:51 -0800)
ks8695 rx irq is edge-level. Before arriving at irq handler, the
corresponding status bit has been clear(irq's ack).
So we should not check it after that.

Signed-off-by: zeal <zealcook@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/arm/ks8695net.c

index 0073d198715b8d376ca5276c5d2e4577ac3fe807..e15451a85107fc13e80fb985e715deb1a27b9b14 100644 (file)
@@ -433,24 +433,16 @@ ks8695_rx_irq(int irq, void *dev_id)
 {
        struct net_device *ndev = (struct net_device *)dev_id;
        struct ks8695_priv *ksp = netdev_priv(ndev);
-       unsigned long status;
-
-       unsigned long mask_bit = 1 << ks8695_get_rx_enable_bit(ksp);
 
        spin_lock(&ksp->rx_lock);
 
-       status = readl(KS8695_IRQ_VA + KS8695_INTST);
-
-       /*clean rx status bit*/
-       writel(status | mask_bit , KS8695_IRQ_VA + KS8695_INTST);
-
-       if (status & mask_bit) {
-               if (napi_schedule_prep(&ksp->napi)) {
-                       /*disable rx interrupt*/
-                       status &= ~mask_bit;
-                       writel(status , KS8695_IRQ_VA + KS8695_INTEN);
-                       __napi_schedule(&ksp->napi);
-               }
+       if (napi_schedule_prep(&ksp->napi)) {
+               unsigned long status = readl(KS8695_IRQ_VA + KS8695_INTEN);
+               unsigned long mask_bit = 1 << ks8695_get_rx_enable_bit(ksp);
+               /*disable rx interrupt*/
+               status &= ~mask_bit;
+               writel(status , KS8695_IRQ_VA + KS8695_INTEN);
+               __napi_schedule(&ksp->napi);
        }
 
        spin_unlock(&ksp->rx_lock);