cnic: Add cnic_free_uio()
authorMichael Chan <mchan@broadcom.com>
Wed, 13 Oct 2010 14:06:48 +0000 (14:06 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 14 Oct 2010 17:45:54 +0000 (10:45 -0700)
to free all UIO related structures.

Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/cnic.c

index b12bba795f2e7d2c791d380ea107c26da0b6d881..739ffcb9bff0fc0ce6ba2c506ce870fb02fe614d 100644 (file)
@@ -770,20 +770,15 @@ static void cnic_free_context(struct cnic_dev *dev)
        }
 }
 
-static void cnic_free_resc(struct cnic_dev *dev)
+static void __cnic_free_uio(struct cnic_dev *dev)
 {
        struct cnic_local *cp = dev->cnic_priv;
-       int i = 0;
 
-       if (cp->cnic_uinfo) {
-               while (cp->uio_dev != -1 && i < 15) {
-                       msleep(100);
-                       i++;
-               }
+       if (cp->cnic_uinfo)
                uio_unregister_device(cp->cnic_uinfo);
-               kfree(cp->cnic_uinfo);
-               cp->cnic_uinfo = NULL;
-       }
+
+       kfree(cp->cnic_uinfo);
+       cp->cnic_uinfo = NULL;
 
        if (cp->l2_buf) {
                dma_free_coherent(&dev->pcidev->dev, cp->l2_buf_size,
@@ -796,6 +791,28 @@ static void cnic_free_resc(struct cnic_dev *dev)
                                  cp->l2_ring, cp->l2_ring_map);
                cp->l2_ring = NULL;
        }
+}
+
+static void cnic_free_uio(struct cnic_dev *dev)
+{
+       if (!dev)
+               return;
+
+       __cnic_free_uio(dev);
+}
+
+static void cnic_free_resc(struct cnic_dev *dev)
+{
+       struct cnic_local *cp = dev->cnic_priv;
+       int i = 0;
+
+       if (cp->cnic_uinfo) {
+               while (cp->uio_dev != -1 && i < 15) {
+                       msleep(100);
+                       i++;
+               }
+               cnic_free_uio(dev);
+       }
 
        cnic_free_context(dev);
        kfree(cp->ctx_arr);