}
}
+/** Helper to free all virtqueue memory
+ *
+ * @v netdev Network device
+ */
+static void virtnet_free_virtqueues ( struct net_device *netdev ) {
+ struct virtnet_nic *virtnet = netdev->priv;
+ int i;
+
+ for ( i = 0; i < QUEUE_NB; i++ ) {
+ virtio_pci_unmap_capability ( &virtnet->virtqueue[i].notification );
+ }
+
+ free ( virtnet->virtqueue );
+ virtnet->virtqueue = NULL;
+}
+
/** Open network device, legacy virtio 0.9.5
*
* @v netdev Network device
if ( vp_find_vq ( ioaddr, i, &virtnet->virtqueue[i] ) == -1 ) {
DBGC ( virtnet, "VIRTIO-NET %p cannot register queue %d\n",
virtnet, i );
- free ( virtnet->virtqueue );
- virtnet->virtqueue = NULL;
+ virtnet_free_virtqueues ( netdev );
return -ENOENT;
}
}
if ( vpm_find_vqs ( &virtnet->vdev, QUEUE_NB, virtnet->virtqueue ) ) {
DBGC ( virtnet, "VIRTIO-NET %p cannot register queues\n",
virtnet );
- free ( virtnet->virtqueue );
- virtnet->virtqueue = NULL;
+ virtnet_free_virtqueues ( netdev );
vpm_add_status ( &virtnet->vdev, VIRTIO_CONFIG_S_FAILED );
return -ENOENT;
}
struct virtnet_nic *virtnet = netdev->priv;
struct io_buffer *iobuf;
struct io_buffer *next_iobuf;
- int i;
if ( virtnet->virtio_version ) {
vpm_reset ( &virtnet->vdev );
}
/* Virtqueues can be freed now that NIC is reset */
- for ( i = 0 ; i < QUEUE_NB ; i++ ) {
- virtio_pci_unmap_capability ( &virtnet->virtqueue[i].notification );
- }
-
- free ( virtnet->virtqueue );
- virtnet->virtqueue = NULL;
+ virtnet_free_virtqueues ( netdev );
/* Free rx iobufs */
list_for_each_entry_safe ( iobuf, next_iobuf, &virtnet->rx_iobufs, list ) {