]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/crypto/cavium/nitrox/nitrox_sriov.c
crypto: cavium/nitrox - Enable interrups for PF in SR-IOV mode.
[linux.git] / drivers / crypto / cavium / nitrox / nitrox_sriov.c
index 30c0aa87458373fdfeb17fb08c6efc03b0c59ad5..7ba0cc5d6d026e056f0cda43baa74de40c8018fe 100644 (file)
@@ -7,6 +7,10 @@
 #include "nitrox_common.h"
 #include "nitrox_isr.h"
 
+/**
+ * num_vfs_valid - validate VF count
+ * @num_vfs: number of VF(s)
+ */
 static inline bool num_vfs_valid(int num_vfs)
 {
        bool valid = false;
@@ -48,7 +52,7 @@ static inline enum vf_mode num_vfs_to_mode(int num_vfs)
        return mode;
 }
 
-static void pf_sriov_cleanup(struct nitrox_device *ndev)
+static void nitrox_pf_cleanup(struct nitrox_device *ndev)
 {
         /* PF has no queues in SR-IOV mode */
        atomic_set(&ndev->state, __NDEV_NOT_READY);
@@ -60,7 +64,11 @@ static void pf_sriov_cleanup(struct nitrox_device *ndev)
        nitrox_common_sw_cleanup(ndev);
 }
 
-static int pf_sriov_init(struct nitrox_device *ndev)
+/**
+ * nitrox_pf_reinit - re-initialize PF resources once SR-IOV is disabled
+ * @ndev: NITROX device
+ */
+static int nitrox_pf_reinit(struct nitrox_device *ndev)
 {
        int err;
 
@@ -86,6 +94,18 @@ static int pf_sriov_init(struct nitrox_device *ndev)
        return nitrox_crypto_register();
 }
 
+static int nitrox_sriov_init(struct nitrox_device *ndev)
+{
+       /* register interrupts for PF in SR-IOV */
+       return nitrox_sriov_register_interupts(ndev);
+}
+
+static void nitrox_sriov_cleanup(struct nitrox_device *ndev)
+{
+       /* unregister interrupts for PF in SR-IOV */
+       nitrox_sriov_unregister_interrupts(ndev);
+}
+
 static int nitrox_sriov_enable(struct pci_dev *pdev, int num_vfs)
 {
        struct nitrox_device *ndev = pci_get_drvdata(pdev);
@@ -106,17 +126,31 @@ static int nitrox_sriov_enable(struct pci_dev *pdev, int num_vfs)
        }
        dev_info(DEV(ndev), "Enabled VF(s) %d\n", num_vfs);
 
-       ndev->num_vfs = num_vfs;
+       ndev->iov.num_vfs = num_vfs;
        ndev->mode = num_vfs_to_mode(num_vfs);
        /* set bit in flags */
        set_bit(__NDEV_SRIOV_BIT, &ndev->flags);
 
        /* cleanup PF resources */
-       pf_sriov_cleanup(ndev);
+       nitrox_pf_cleanup(ndev);
 
-       config_nps_core_vfcfg_mode(ndev, ndev->mode);
+       /* PF SR-IOV mode initialization */
+       err = nitrox_sriov_init(ndev);
+       if (err)
+               goto iov_fail;
 
+       config_nps_core_vfcfg_mode(ndev, ndev->mode);
        return num_vfs;
+
+iov_fail:
+       pci_disable_sriov(pdev);
+       /* clear bit in flags */
+       clear_bit(__NDEV_SRIOV_BIT, &ndev->flags);
+       ndev->iov.num_vfs = 0;
+       ndev->mode = __NDEV_MODE_PF;
+       /* reset back to working mode in PF */
+       nitrox_pf_reinit(ndev);
+       return err;
 }
 
 static int nitrox_sriov_disable(struct pci_dev *pdev)
@@ -134,12 +168,15 @@ static int nitrox_sriov_disable(struct pci_dev *pdev)
        /* clear bit in flags */
        clear_bit(__NDEV_SRIOV_BIT, &ndev->flags);
 
-       ndev->num_vfs = 0;
+       ndev->iov.num_vfs = 0;
        ndev->mode = __NDEV_MODE_PF;
 
+       /* cleanup PF SR-IOV resources */
+       nitrox_sriov_cleanup(ndev);
+
        config_nps_core_vfcfg_mode(ndev, ndev->mode);
 
-       return pf_sriov_init(ndev);
+       return nitrox_pf_reinit(ndev);
 }
 
 int nitrox_sriov_configure(struct pci_dev *pdev, int num_vfs)