Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-2.6-microblaze.git] / drivers / net / virtio_net.c
index 263b005..21b7114 100644 (file)
@@ -63,6 +63,11 @@ static const unsigned long guest_offloads[] = {
        VIRTIO_NET_F_GUEST_CSUM
 };
 
+#define GUEST_OFFLOAD_LRO_MASK ((1ULL << VIRTIO_NET_F_GUEST_TSO4) | \
+                               (1ULL << VIRTIO_NET_F_GUEST_TSO6) | \
+                               (1ULL << VIRTIO_NET_F_GUEST_ECN)  | \
+                               (1ULL << VIRTIO_NET_F_GUEST_UFO))
+
 struct virtnet_stat_desc {
        char desc[ETH_GSTRING_LEN];
        size_t offset;
@@ -2531,7 +2536,8 @@ static int virtnet_set_features(struct net_device *dev,
                if (features & NETIF_F_LRO)
                        offloads = vi->guest_offloads_capable;
                else
-                       offloads = 0;
+                       offloads = vi->guest_offloads_capable &
+                                  ~GUEST_OFFLOAD_LRO_MASK;
 
                err = virtnet_set_guest_offloads(vi, offloads);
                if (err)
@@ -2604,12 +2610,11 @@ static void virtnet_free_queues(struct virtnet_info *vi)
        int i;
 
        for (i = 0; i < vi->max_queue_pairs; i++) {
-               napi_hash_del(&vi->rq[i].napi);
-               netif_napi_del(&vi->rq[i].napi);
-               netif_napi_del(&vi->sq[i].napi);
+               __netif_napi_del(&vi->rq[i].napi);
+               __netif_napi_del(&vi->sq[i].napi);
        }
 
-       /* We called napi_hash_del() before netif_napi_del(),
+       /* We called __netif_napi_del(),
         * we need to respect an RCU grace period before freeing vi->rq
         */
        synchronize_net();