diff options
Diffstat (limited to 'drivers/net/cnic.c')
| -rw-r--r-- | drivers/net/cnic.c | 10 | 
1 files changed, 8 insertions, 2 deletions
| diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c index 6dfa56440ac0..aa5016ad9e19 100644 --- a/drivers/net/cnic.c +++ b/drivers/net/cnic.c @@ -951,7 +951,7 @@ static int cnic_alloc_uio_rings(struct cnic_dev *dev, int pages)  					   &udev->l2_ring_map,  					   GFP_KERNEL | __GFP_COMP);  	if (!udev->l2_ring) -		return -ENOMEM; +		goto err_udev;  	udev->l2_buf_size = (cp->l2_rx_ring_size + 1) * cp->l2_single_buf_size;  	udev->l2_buf_size = PAGE_ALIGN(udev->l2_buf_size); @@ -959,7 +959,7 @@ static int cnic_alloc_uio_rings(struct cnic_dev *dev, int pages)  					  &udev->l2_buf_map,  					  GFP_KERNEL | __GFP_COMP);  	if (!udev->l2_buf) -		return -ENOMEM; +		goto err_dma;  	write_lock(&cnic_dev_lock);  	list_add(&udev->list, &cnic_udev_list); @@ -970,6 +970,12 @@ static int cnic_alloc_uio_rings(struct cnic_dev *dev, int pages)  	cp->udev = udev;  	return 0; + err_dma: +	dma_free_coherent(&udev->pdev->dev, udev->l2_ring_size, +			  udev->l2_ring, udev->l2_ring_map); + err_udev: +	kfree(udev); +	return -ENOMEM;  }  static int cnic_init_uio(struct cnic_dev *dev) | 
