]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/net/spider_net.c
[NET]: Make NAPI polling independent of struct net_device objects.
[net-next-2.6.git] / drivers / net / spider_net.c
index 82d837ab4db9bd54840d548d694fea291e5791ae..6d8f2bb7e0f9febb13627293ce1e74e339008ff6 100644 (file)
@@ -1278,34 +1278,26 @@ bad_desc:
  * (using netif_receive_skb). If all/enough packets are up, the driver
  * reenables interrupts and returns 0. If not, 1 is returned.
  */
-static int
-spider_net_poll(struct net_device *netdev, int *budget)
+static int spider_net_poll(struct napi_struct *napi, int budget)
 {
-       struct spider_net_card *card = netdev_priv(netdev);
-       int packets_to_do, packets_done = 0;
-       int no_more_packets = 0;
-
-       packets_to_do = min(*budget, netdev->quota);
-
-       while (packets_to_do) {
-               if (spider_net_decode_one_descr(card)) {
-                       packets_done++;
-                       packets_to_do--;
-               } else {
-                       /* no more packets for the stack */
-                       no_more_packets = 1;
+       struct spider_net_card *card = container_of(napi, struct spider_net_card, napi);
+       struct net_device *netdev = card->netdev;
+       int packets_done = 0;
+
+       while (packets_done < budget) {
+               if (!spider_net_decode_one_descr(card))
                        break;
-               }
+
+               packets_done++;
        }
 
        if ((packets_done == 0) && (card->num_rx_ints != 0)) {
-               no_more_packets = spider_net_resync_tail_ptr(card);
+               if (!spider_net_resync_tail_ptr(card))
+                       packets_done = budget;
                spider_net_resync_head_ptr(card);
        }
        card->num_rx_ints = 0;
 
-       netdev->quota -= packets_done;
-       *budget -= packets_done;
        spider_net_refill_rx_chain(card);
        spider_net_enable_rxdmac(card);
 
@@ -1313,14 +1305,13 @@ spider_net_poll(struct net_device *netdev, int *budget)
 
        /* if all packets are in the stack, enable interrupts and return 0 */
        /* if not, return 1 */
-       if (no_more_packets) {
-               netif_rx_complete(netdev);
+       if (packets_done < budget) {
+               netif_rx_complete(netdev, napi);
                spider_net_rx_irq_on(card);
                card->ignore_rx_ramfull = 0;
-               return 0;
        }
 
-       return 1;
+       return packets_done;
 }
 
 /**
@@ -1560,7 +1551,8 @@ spider_net_handle_error_irq(struct spider_net_card *card, u32 status_reg)
                        spider_net_refill_rx_chain(card);
                        spider_net_enable_rxdmac(card);
                        card->num_rx_ints ++;
-                       netif_rx_schedule(card->netdev);
+                       netif_rx_schedule(card->netdev,
+                                         &card->napi);
                }
                show_error = 0;
                break;
@@ -1580,7 +1572,8 @@ spider_net_handle_error_irq(struct spider_net_card *card, u32 status_reg)
                spider_net_refill_rx_chain(card);
                spider_net_enable_rxdmac(card);
                card->num_rx_ints ++;
-               netif_rx_schedule(card->netdev);
+               netif_rx_schedule(card->netdev,
+                                 &card->napi);
                show_error = 0;
                break;
 
@@ -1594,7 +1587,8 @@ spider_net_handle_error_irq(struct spider_net_card *card, u32 status_reg)
                spider_net_refill_rx_chain(card);
                spider_net_enable_rxdmac(card);
                card->num_rx_ints ++;
-               netif_rx_schedule(card->netdev);
+               netif_rx_schedule(card->netdev,
+                                 &card->napi);
                show_error = 0;
                break;
 
@@ -1686,11 +1680,11 @@ spider_net_interrupt(int irq, void *ptr)
 
        if (status_reg & SPIDER_NET_RXINT ) {
                spider_net_rx_irq_off(card);
-               netif_rx_schedule(netdev);
+               netif_rx_schedule(netdev, &card->napi);
                card->num_rx_ints ++;
        }
        if (status_reg & SPIDER_NET_TXINT)
-               netif_rx_schedule(netdev);
+               netif_rx_schedule(netdev, &card->napi);
 
        if (status_reg & SPIDER_NET_LINKINT)
                spider_net_link_reset(netdev);
@@ -2034,7 +2028,7 @@ spider_net_open(struct net_device *netdev)
 
        netif_start_queue(netdev);
        netif_carrier_on(netdev);
-       netif_poll_enable(netdev);
+       napi_enable(&card->napi);
 
        spider_net_enable_interrupts(card);
 
@@ -2204,7 +2198,7 @@ spider_net_stop(struct net_device *netdev)
 {
        struct spider_net_card *card = netdev_priv(netdev);
 
-       netif_poll_disable(netdev);
+       napi_disable(&card->napi);
        netif_carrier_off(netdev);
        netif_stop_queue(netdev);
        del_timer_sync(&card->tx_timer);
@@ -2304,9 +2298,6 @@ spider_net_setup_netdev_ops(struct net_device *netdev)
        /* tx watchdog */
        netdev->tx_timeout = &spider_net_tx_timeout;
        netdev->watchdog_timeo = SPIDER_NET_WATCHDOG_TIMEOUT;
-       /* NAPI */
-       netdev->poll = &spider_net_poll;
-       netdev->weight = SPIDER_NET_NAPI_WEIGHT;
        /* HW VLAN */
 #ifdef CONFIG_NET_POLL_CONTROLLER
        /* poll controller */
@@ -2351,6 +2342,9 @@ spider_net_setup_netdev(struct spider_net_card *card)
 
        card->options.rx_csum = SPIDER_NET_RX_CSUM_DEFAULT;
 
+       netif_napi_add(netdev, &card->napi,
+                      spider_net_poll, SPIDER_NET_NAPI_WEIGHT);
+
        spider_net_setup_netdev_ops(netdev);
 
        netdev->features = NETIF_F_IP_CSUM | NETIF_F_LLTX;