cciss: read config to obtain max outstanding commands per controller
[safe/jmp/linux-2.6] / drivers / net / xen-netfront.c
index 8eeb068..d26f69b 100644 (file)
@@ -73,24 +73,13 @@ struct netfront_info {
        struct net_device *netdev;
 
        struct napi_struct napi;
-       struct net_device_stats stats;
-
-       struct xen_netif_tx_front_ring tx;
-       struct xen_netif_rx_front_ring rx;
-
-       spinlock_t   tx_lock;
-       spinlock_t   rx_lock;
 
        unsigned int evtchn;
+       struct xenbus_device *xbdev;
 
-       /* Receive-ring batched refills. */
-#define RX_MIN_TARGET 8
-#define RX_DFL_MIN_TARGET 64
-#define RX_MAX_TARGET min_t(int, NET_RX_RING_SIZE, 256)
-       unsigned rx_min_target, rx_max_target, rx_target;
-       struct sk_buff_head rx_batch;
-
-       struct timer_list rx_refill_timer;
+       spinlock_t   tx_lock;
+       struct xen_netif_tx_front_ring tx;
+       int tx_ring_ref;
 
        /*
         * {tx,rx}_skbs store outstanding skbuffs. Free tx_skb entries
@@ -109,14 +98,23 @@ struct netfront_info {
        grant_ref_t grant_tx_ref[NET_TX_RING_SIZE];
        unsigned tx_skb_freelist;
 
+       spinlock_t   rx_lock ____cacheline_aligned_in_smp;
+       struct xen_netif_rx_front_ring rx;
+       int rx_ring_ref;
+
+       /* Receive-ring batched refills. */
+#define RX_MIN_TARGET 8
+#define RX_DFL_MIN_TARGET 64
+#define RX_MAX_TARGET min_t(int, NET_RX_RING_SIZE, 256)
+       unsigned rx_min_target, rx_max_target, rx_target;
+       struct sk_buff_head rx_batch;
+
+       struct timer_list rx_refill_timer;
+
        struct sk_buff *rx_skbs[NET_RX_RING_SIZE];
        grant_ref_t gref_rx_head;
        grant_ref_t grant_rx_ref[NET_RX_RING_SIZE];
 
-       struct xenbus_device *xbdev;
-       int tx_ring_ref;
-       int rx_ring_ref;
-
        unsigned long rx_pfn_array[NET_RX_RING_SIZE];
        struct multicall_entry rx_mcl[NET_RX_RING_SIZE+1];
        struct mmu_update rx_mmu[NET_RX_RING_SIZE];
@@ -309,8 +307,6 @@ static int xennet_open(struct net_device *dev)
 {
        struct netfront_info *np = netdev_priv(dev);
 
-       memset(&np->stats, 0, sizeof(np->stats));
-
        napi_enable(&np->napi);
 
        spin_lock_bh(&np->rx_lock);
@@ -537,8 +533,8 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)
        if (notify)
                notify_remote_via_irq(np->netdev->irq);
 
-       np->stats.tx_bytes += skb->len;
-       np->stats.tx_packets++;
+       dev->stats.tx_bytes += skb->len;
+       dev->stats.tx_packets++;
 
        /* Note: It is not safe to access skb after xennet_tx_buf_gc()! */
        xennet_tx_buf_gc(dev);
@@ -551,7 +547,7 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)
        return 0;
 
  drop:
-       np->stats.tx_dropped++;
+       dev->stats.tx_dropped++;
        dev_kfree_skb(skb);
        return 0;
 }
@@ -564,12 +560,6 @@ static int xennet_close(struct net_device *dev)
        return 0;
 }
 
-static struct net_device_stats *xennet_get_stats(struct net_device *dev)
-{
-       struct netfront_info *np = netdev_priv(dev);
-       return &np->stats;
-}
-
 static void xennet_move_rx_slot(struct netfront_info *np, struct sk_buff *skb,
                                grant_ref_t ref)
 {
@@ -804,9 +794,8 @@ out:
 }
 
 static int handle_incoming_queue(struct net_device *dev,
-                                 struct sk_buff_head *rxq)
+                                struct sk_buff_head *rxq)
 {
-       struct netfront_info *np = netdev_priv(dev);
        int packets_dropped = 0;
        struct sk_buff *skb;
 
@@ -828,13 +817,13 @@ static int handle_incoming_queue(struct net_device *dev,
                        if (skb_checksum_setup(skb)) {
                                kfree_skb(skb);
                                packets_dropped++;
-                               np->stats.rx_errors++;
+                               dev->stats.rx_errors++;
                                continue;
                        }
                }
 
-               np->stats.rx_packets++;
-               np->stats.rx_bytes += skb->len;
+               dev->stats.rx_packets++;
+               dev->stats.rx_bytes += skb->len;
 
                /* Pass it up. */
                netif_receive_skb(skb);
@@ -863,11 +852,6 @@ static int xennet_poll(struct napi_struct *napi, int budget)
 
        spin_lock(&np->rx_lock);
 
-       if (unlikely(!netif_carrier_ok(dev))) {
-               spin_unlock(&np->rx_lock);
-               return 0;
-       }
-
        skb_queue_head_init(&rxq);
        skb_queue_head_init(&errq);
        skb_queue_head_init(&tmpq);
@@ -887,7 +871,7 @@ static int xennet_poll(struct napi_struct *napi, int budget)
 err:
                        while ((skb = __skb_dequeue(&tmpq)))
                                __skb_queue_tail(&errq, skb);
-                       np->stats.rx_errors++;
+                       dev->stats.rx_errors++;
                        i = np->rx.rsp_cons;
                        continue;
                }
@@ -962,8 +946,7 @@ err:
                work_done++;
        }
 
-       while ((skb = __skb_dequeue(&errq)))
-               kfree_skb(skb);
+       __skb_queue_purge(&errq);
 
        work_done -= handle_incoming_queue(dev, &rxq);
 
@@ -1089,14 +1072,13 @@ static void xennet_release_rx_bufs(struct netfront_info *np)
                if (!xen_feature(XENFEAT_auto_translated_physmap)) {
                        /* Do all the remapping work and M2P updates. */
                        MULTI_mmu_update(mcl, np->rx_mmu, mmu - np->rx_mmu,
-                                        0, DOMID_SELF);
+                                        NULL, DOMID_SELF);
                        mcl++;
                        HYPERVISOR_multicall(np->rx_mcl, mcl - np->rx_mcl);
                }
        }
 
-       while ((skb = __skb_dequeue(&free_list)) != NULL)
-               dev_kfree_skb(skb);
+       __skb_queue_purge(&free_list);
 
        spin_unlock_bh(&np->rx_lock);
 }
@@ -1169,7 +1151,6 @@ static struct net_device * __devinit xennet_create_dev(struct xenbus_device *dev
        netdev->open            = xennet_open;
        netdev->hard_start_xmit = xennet_start_xmit;
        netdev->stop            = xennet_close;
-       netdev->get_stats       = xennet_get_stats;
        netif_napi_add(netdev, &np->napi, xennet_poll, 64);
        netdev->uninit          = xennet_uninit;
        netdev->change_mtu      = xennet_change_mtu;
@@ -1538,7 +1519,7 @@ static int xennet_connect(struct net_device *dev)
 
        if (!feature_rx_copy) {
                dev_info(&dev->dev,
-                        "backend does not support copying recieve path");
+                        "backend does not support copying receive path\n");
                return -ENODEV;
        }
 
@@ -1628,11 +1609,8 @@ static void backend_changed(struct xenbus_device *dev,
 
 static struct ethtool_ops xennet_ethtool_ops =
 {
-       .get_tx_csum = ethtool_op_get_tx_csum,
        .set_tx_csum = ethtool_op_set_tx_csum,
-       .get_sg = ethtool_op_get_sg,
        .set_sg = xennet_set_sg,
-       .get_tso = ethtool_op_get_tso,
        .set_tso = xennet_set_tso,
        .get_link = ethtool_op_get_link,
 };
@@ -1823,9 +1801,11 @@ static void __exit netif_exit(void)
        if (is_initial_xendomain())
                return;
 
-       return xenbus_unregister_driver(&netfront);
+       xenbus_unregister_driver(&netfront);
 }
 module_exit(netif_exit);
 
 MODULE_DESCRIPTION("Xen virtual network device frontend");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("xen:vif");
+MODULE_ALIAS("xennet");