mac80211: fix aggregation to not require queue stop
[safe/jmp/linux-2.6] / net / core / netpoll.c
index 34f5d07..755414c 100644 (file)
@@ -58,6 +58,7 @@ static void queue_process(struct work_struct *work)
 
        while ((skb = skb_dequeue(&npinfo->txq))) {
                struct net_device *dev = skb->dev;
+               const struct net_device_ops *ops = dev->netdev_ops;
                struct netdev_queue *txq;
 
                if (!netif_device_present(dev) || !netif_running(dev)) {
@@ -71,7 +72,7 @@ static void queue_process(struct work_struct *work)
                __netif_tx_lock(txq, smp_processor_id());
                if (netif_tx_queue_stopped(txq) ||
                    netif_tx_queue_frozen(txq) ||
-                   dev->hard_start_xmit(skb, dev) != NETDEV_TX_OK) {
+                   ops->ndo_start_xmit(skb, dev) != NETDEV_TX_OK) {
                        skb_queue_head(&npinfo->txq, skb);
                        __netif_tx_unlock(txq);
                        local_irq_restore(flags);
@@ -133,9 +134,11 @@ static int poll_one_napi(struct netpoll_info *npinfo,
 
        npinfo->rx_flags |= NETPOLL_RX_DROP;
        atomic_inc(&trapped);
+       set_bit(NAPI_STATE_NPSVC, &napi->state);
 
        work = napi->poll(napi, budget);
 
+       clear_bit(NAPI_STATE_NPSVC, &napi->state);
        atomic_dec(&trapped);
        npinfo->rx_flags &= ~NETPOLL_RX_DROP;
 
@@ -172,12 +175,13 @@ static void service_arp_queue(struct netpoll_info *npi)
 void netpoll_poll(struct netpoll *np)
 {
        struct net_device *dev = np->dev;
+       const struct net_device_ops *ops = dev->netdev_ops;
 
-       if (!dev || !netif_running(dev) || !dev->poll_controller)
+       if (!dev || !netif_running(dev) || !ops->ndo_poll_controller)
                return;
 
        /* Process pending work on NIC */
-       dev->poll_controller(dev);
+       ops->ndo_poll_controller(dev);
 
        poll_napi(dev);
 
@@ -272,6 +276,7 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
        int status = NETDEV_TX_BUSY;
        unsigned long tries;
        struct net_device *dev = np->dev;
+       const struct net_device_ops *ops = dev->netdev_ops;
        struct netpoll_info *npinfo = np->dev->npinfo;
 
        if (!npinfo || !netif_running(dev) || !netif_device_present(dev)) {
@@ -292,7 +297,7 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
                     tries > 0; --tries) {
                        if (__netif_tx_trylock(txq)) {
                                if (!netif_tx_queue_stopped(txq))
-                                       status = dev->hard_start_xmit(skb, dev);
+                                       status = ops->ndo_start_xmit(skb, dev);
                                __netif_tx_unlock(txq);
 
                                if (status == NETDEV_TX_OK)
@@ -343,7 +348,7 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
        udph->check = csum_tcpudp_magic(htonl(np->local_ip),
                                        htonl(np->remote_ip),
                                        udp_len, IPPROTO_UDP,
-                                       csum_partial((unsigned char *)udph, udp_len, 0));
+                                       csum_partial(udph, udp_len, 0));
        if (udph->check == 0)
                udph->check = CSUM_MANGLED_0;
 
@@ -694,7 +699,7 @@ int netpoll_setup(struct netpoll *np)
                atomic_inc(&npinfo->refcnt);
        }
 
-       if (!ndev->poll_controller) {
+       if (!ndev->netdev_ops->ndo_poll_controller) {
                printk(KERN_ERR "%s: %s doesn't support polling, aborting.\n",
                       np->name, np->dev_name);
                err = -ENOTSUPP;