]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ks8695net: add GRO support
authorEric Dumazet <edumazet@google.com>
Sat, 4 Feb 2017 23:24:58 +0000 (15:24 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 5 Feb 2017 21:11:57 +0000 (16:11 -0500)
Use napi_complete_done() instead of __napi_complete() to :

1) Get support of gro_flush_timeout if opt-in
2) Not rearm interrupts for busy-polling users.
3) use standard NAPI API.

Note that rx_lock seems to be useless, NAPI logic should
not need this extra care.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/micrel/ks8695net.c

index 20cb85bc0c5f8660a259dfb8dfd7213df71373a1..d2106159473f24f576da2d965704476d1576d774 100644 (file)
@@ -519,7 +519,7 @@ static int ks8695_rx(struct ks8695_priv *ksp, int budget)
                        /* Relinquish the SKB to the network layer */
                        skb_put(skb, pktlen);
                        skb->protocol = eth_type_trans(skb, ndev);
-                       netif_receive_skb(skb);
+                       napi_gro_receive(&ksp->napi, skb);
 
                        /* Record stats */
                        ndev->stats.rx_packets++;
@@ -561,18 +561,17 @@ rx_finished:
 static int ks8695_poll(struct napi_struct *napi, int budget)
 {
        struct ks8695_priv *ksp = container_of(napi, struct ks8695_priv, napi);
-       unsigned long  work_done;
-
        unsigned long isr = readl(KS8695_IRQ_VA + KS8695_INTEN);
        unsigned long mask_bit = 1 << ks8695_get_rx_enable_bit(ksp);
+       int work_done;
 
        work_done = ks8695_rx(ksp, budget);
 
-       if (work_done < budget) {
+       if (work_done < budget && napi_complete_done(napi, work_done)) {
                unsigned long flags;
+
                spin_lock_irqsave(&ksp->rx_lock, flags);
-               __napi_complete(napi);
-               /*enable rx interrupt*/
+               /* enable rx interrupt */
                writel(isr | mask_bit, KS8695_IRQ_VA + KS8695_INTEN);
                spin_unlock_irqrestore(&ksp->rx_lock, flags);
        }