return IRQ_WAKE_THREAD;
 }
 
+static void hisi_sas_v3_free_vectors(void *data)
+{
+       struct pci_dev *pdev = data;
+
+       pci_free_irq_vectors(pdev);
+}
+
 static int interrupt_preinit_v3_hw(struct hisi_hba *hisi_hba)
 {
        int vectors;
        int max_msi = HISI_SAS_MSI_COUNT_V3_HW, min_msi;
        struct Scsi_Host *shost = hisi_hba->shost;
+       struct pci_dev *pdev = hisi_hba->pci_dev;
        struct irq_affinity desc = {
                .pre_vectors = BASE_VECTORS_V3_HW,
        };
 
        min_msi = MIN_AFFINE_VECTORS_V3_HW;
-       vectors = pci_alloc_irq_vectors_affinity(hisi_hba->pci_dev,
+       vectors = pci_alloc_irq_vectors_affinity(pdev,
                                                 min_msi, max_msi,
                                                 PCI_IRQ_MSI |
                                                 PCI_IRQ_AFFINITY,
        hisi_hba->cq_nvecs = vectors - BASE_VECTORS_V3_HW;
        shost->nr_hw_queues = hisi_hba->cq_nvecs;
 
+       devm_add_action(&pdev->dev, hisi_sas_v3_free_vectors, pdev);
        return 0;
 }
 
 
        rc = scsi_add_host(shost, dev);
        if (rc)
-               goto err_out_free_irq_vectors;
+               goto err_out_debugfs;
 
        rc = sas_register_ha(sha);
        if (rc)
        sas_unregister_ha(sha);
 err_out_register_ha:
        scsi_remove_host(shost);
-err_out_free_irq_vectors:
-       pci_free_irq_vectors(pdev);
 err_out_debugfs:
        debugfs_exit_v3_hw(hisi_hba);
 err_out_ha:
 
                devm_free_irq(&pdev->dev, pci_irq_vector(pdev, nr), cq);
        }
-       pci_free_irq_vectors(pdev);
 }
 
 static void hisi_sas_v3_remove(struct pci_dev *pdev)