enic: Clean up: Add wrapper functions
authorVasanthy Kolluri <vkolluri@cisco.com>
Thu, 18 Mar 2010 16:19:59 +0000 (16:19 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 19 Mar 2010 04:22:49 +0000 (21:22 -0700)
Add wrapper functions vnic_dev_notify_setcmd and vnic_dev_notify_unsetcmd
for firmware notify commands.

Signed-off-by: Scott Feldman <scofeldm@cisco.com>
Signed-off-by: Vasanthy Kolluri <vkolluri@cisco.com>
Signed-off-by: Roopa Prabhu <roprabhu@cisco.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/enic/vnic_dev.c
drivers/net/enic/vnic_dev.h

index 69b9b70c7da08c441f5cfa77c45a4ab1e3ab9745..cbc0ba953fc6eec765f932baaefe8bd54d286d9c 100644 (file)
@@ -573,22 +573,18 @@ int vnic_dev_raise_intr(struct vnic_dev *vdev, u16 intr)
        return err;
 }
 
-int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr)
+int vnic_dev_notify_setcmd(struct vnic_dev *vdev,
+       void *notify_addr, dma_addr_t notify_pa, u16 intr)
 {
        u64 a0, a1;
        int wait = 1000;
        int r;
 
-       if (!vdev->notify) {
-               vdev->notify = pci_alloc_consistent(vdev->pdev,
-                       sizeof(struct vnic_devcmd_notify),
-                       &vdev->notify_pa);
-               if (!vdev->notify)
-                       return -ENOMEM;
-               memset(vdev->notify, 0, sizeof(struct vnic_devcmd_notify));
-       }
+       memset(notify_addr, 0, sizeof(struct vnic_devcmd_notify));
+       vdev->notify = notify_addr;
+       vdev->notify_pa = notify_pa;
 
-       a0 = vdev->notify_pa;
+       a0 = (u64)notify_pa;
        a1 = ((u64)intr << 32) & 0x0000ffff00000000ULL;
        a1 += sizeof(struct vnic_devcmd_notify);
 
@@ -597,7 +593,27 @@ int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr)
        return r;
 }
 
-void vnic_dev_notify_unset(struct vnic_dev *vdev)
+int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr)
+{
+       void *notify_addr;
+       dma_addr_t notify_pa;
+
+       if (vdev->notify || vdev->notify_pa) {
+               printk(KERN_ERR "notify block %p still allocated",
+                       vdev->notify);
+               return -EINVAL;
+       }
+
+       notify_addr = pci_alloc_consistent(vdev->pdev,
+                       sizeof(struct vnic_devcmd_notify),
+                       &notify_pa);
+       if (!notify_addr)
+               return -ENOMEM;
+
+       return vnic_dev_notify_setcmd(vdev, notify_addr, notify_pa, intr);
+}
+
+void vnic_dev_notify_unsetcmd(struct vnic_dev *vdev)
 {
        u64 a0, a1;
        int wait = 1000;
@@ -607,9 +623,23 @@ void vnic_dev_notify_unset(struct vnic_dev *vdev)
        a1 += sizeof(struct vnic_devcmd_notify);
 
        vnic_dev_cmd(vdev, CMD_NOTIFY, &a0, &a1, wait);
+       vdev->notify = NULL;
+       vdev->notify_pa = 0;
        vdev->notify_sz = 0;
 }
 
+void vnic_dev_notify_unset(struct vnic_dev *vdev)
+{
+       if (vdev->notify) {
+               pci_free_consistent(vdev->pdev,
+                       sizeof(struct vnic_devcmd_notify),
+                       vdev->notify,
+                       vdev->notify_pa);
+       }
+
+       vnic_dev_notify_unsetcmd(vdev);
+}
+
 static int vnic_dev_notify_ready(struct vnic_dev *vdev)
 {
        u32 *words;
index fc5e3eb35a5eac21dfc83275ea67c026c32108bb..f5be640b0b5c27b871f6e86940bebe3bee0f93db 100644 (file)
@@ -107,7 +107,10 @@ void vnic_dev_add_addr(struct vnic_dev *vdev, u8 *addr);
 void vnic_dev_del_addr(struct vnic_dev *vdev, u8 *addr);
 int vnic_dev_mac_addr(struct vnic_dev *vdev, u8 *mac_addr);
 int vnic_dev_raise_intr(struct vnic_dev *vdev, u16 intr);
+int vnic_dev_notify_setcmd(struct vnic_dev *vdev,
+       void *notify_addr, dma_addr_t notify_pa, u16 intr);
 int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr);
+void vnic_dev_notify_unsetcmd(struct vnic_dev *vdev);
 void vnic_dev_notify_unset(struct vnic_dev *vdev);
 int vnic_dev_link_status(struct vnic_dev *vdev);
 u32 vnic_dev_port_speed(struct vnic_dev *vdev);