diff options
| author | David S. Miller <davem@davemloft.net> | 2009-06-15 03:02:23 -0700 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-06-15 03:02:23 -0700 | 
| commit | 9cbc1cb8cd46ce1f7645b9de249b2ce8460129bb (patch) | |
| tree | 8d104ec2a459346b99413b0b77421ca7b9936c1a /drivers/net/virtio_net.c | |
| parent | ca44d6e60f9de26281fda203f58b570e1748c015 (diff) | |
| parent | 45e3e1935e2857c54783291107d33323b3ef33c8 (diff) | |
| download | olio-linux-3.10-9cbc1cb8cd46ce1f7645b9de249b2ce8460129bb.tar.xz olio-linux-3.10-9cbc1cb8cd46ce1f7645b9de249b2ce8460129bb.zip  | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
Conflicts:
	Documentation/feature-removal-schedule.txt
	drivers/scsi/fcoe/fcoe.c
	net/core/drop_monitor.c
	net/core/net-traces.c
Diffstat (limited to 'drivers/net/virtio_net.c')
| -rw-r--r-- | drivers/net/virtio_net.c | 45 | 
1 files changed, 18 insertions, 27 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index f0bb1a4c832..52198f6797a 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -843,6 +843,10 @@ static int virtnet_probe(struct virtio_device *vdev)  	int err;  	struct net_device *dev;  	struct virtnet_info *vi; +	struct virtqueue *vqs[3]; +	vq_callback_t *callbacks[] = { skb_recv_done, skb_xmit_done, NULL}; +	const char *names[] = { "input", "output", "control" }; +	int nvqs;  	/* Allocate ourselves a network device with room for our info */  	dev = alloc_etherdev(sizeof(struct virtnet_info)); @@ -903,25 +907,19 @@ static int virtnet_probe(struct virtio_device *vdev)  	if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF))  		vi->mergeable_rx_bufs = true; -	/* We expect two virtqueues, receive then send. */ -	vi->rvq = vdev->config->find_vq(vdev, 0, skb_recv_done); -	if (IS_ERR(vi->rvq)) { -		err = PTR_ERR(vi->rvq); +	/* We expect two virtqueues, receive then send, +	 * and optionally control. */ +	nvqs = virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ) ? 3 : 2; + +	err = vdev->config->find_vqs(vdev, nvqs, vqs, callbacks, names); +	if (err)  		goto free; -	} -	vi->svq = vdev->config->find_vq(vdev, 1, skb_xmit_done); -	if (IS_ERR(vi->svq)) { -		err = PTR_ERR(vi->svq); -		goto free_recv; -	} +	vi->rvq = vqs[0]; +	vi->svq = vqs[1];  	if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ)) { -		vi->cvq = vdev->config->find_vq(vdev, 2, NULL); -		if (IS_ERR(vi->cvq)) { -			err = PTR_ERR(vi->svq); -			goto free_send; -		} +		vi->cvq = vqs[2];  		if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VLAN))  			dev->features |= NETIF_F_HW_VLAN_FILTER; @@ -939,7 +937,7 @@ static int virtnet_probe(struct virtio_device *vdev)  	err = register_netdev(dev);  	if (err) {  		pr_debug("virtio_net: registering device failed\n"); -		goto free_ctrl; +		goto free_vqs;  	}  	/* Last of all, set up some receive buffers. */ @@ -960,13 +958,8 @@ static int virtnet_probe(struct virtio_device *vdev)  unregister:  	unregister_netdev(dev); -free_ctrl: -	if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ)) -		vdev->config->del_vq(vi->cvq); -free_send: -	vdev->config->del_vq(vi->svq); -free_recv: -	vdev->config->del_vq(vi->rvq); +free_vqs: +	vdev->config->del_vqs(vdev);  free:  	free_netdev(dev);  	return err; @@ -992,12 +985,10 @@ static void virtnet_remove(struct virtio_device *vdev)  	BUG_ON(vi->num != 0); -	vdev->config->del_vq(vi->svq); -	vdev->config->del_vq(vi->rvq); -	if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ)) -		vdev->config->del_vq(vi->cvq);  	unregister_netdev(vi->dev); +	vdev->config->del_vqs(vi->vdev); +  	while (vi->pages)  		__free_pages(get_a_page(vi, GFP_KERNEL), 0);  |