X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fvirtio_net.c;h=bd4d26a36eadcb1a95bac0ba5226cf3254b400d2;hb=a48bd8f67003c342e147309a331f656a5e75a5e4;hp=ec43284ffd13ad8945c83ccdbf60d26789b780f4;hpb=b3369c1fb410fddeb38a404316c861395f6d6ae8;p=powerpc.git diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index ec43284ffd..bd4d26a36e 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -283,6 +283,13 @@ static int virtnet_open(struct net_device *dev) struct virtnet_info *vi = netdev_priv(dev); napi_enable(&vi->napi); + + /* If all buffers were filled by other side before we napi_enabled, we + * won't get another interrupt, so process any outstanding packets + * now. virtnet_poll wants re-enable the queue, so we disable here. */ + vi->rvq->vq_ops->disable_cb(vi->rvq); + netif_rx_schedule(vi->dev, &vi->napi); + return 0; } @@ -307,7 +314,6 @@ static int virtnet_probe(struct virtio_device *vdev) return -ENOMEM; /* Set up network device as normal. */ - ether_setup(dev); dev->open = virtnet_open; dev->stop = virtnet_close; dev->hard_start_xmit = start_xmit; @@ -390,13 +396,14 @@ static void virtnet_remove(struct virtio_device *vdev) struct virtnet_info *vi = vdev->priv; struct sk_buff *skb; + /* Stop all the virtqueues. */ + vdev->config->reset(vdev); + /* Free our skbs in send and recv queues, if any. */ - vi->rvq->vq_ops->shutdown(vi->rvq); while ((skb = __skb_dequeue(&vi->recv)) != NULL) { kfree_skb(skb); vi->num--; } - vi->svq->vq_ops->shutdown(vi->svq); while ((skb = __skb_dequeue(&vi->send)) != NULL) kfree_skb(skb);