aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/hfi1/chip.c18
-rw-r--r--drivers/infiniband/hw/hfi1/hfi.h1
-rw-r--r--drivers/infiniband/hw/hfi1/init.c4
3 files changed, 16 insertions, 7 deletions
diff --git a/drivers/infiniband/hw/hfi1/chip.c b/drivers/infiniband/hw/hfi1/chip.c
index 6660f920f42e..57f0df2f84f2 100644
--- a/drivers/infiniband/hw/hfi1/chip.c
+++ b/drivers/infiniband/hw/hfi1/chip.c
@@ -8264,8 +8264,8 @@ static irqreturn_t sdma_interrupt(int irq, void *data)
8264 /* handle the interrupt(s) */ 8264 /* handle the interrupt(s) */
8265 sdma_engine_interrupt(sde, status); 8265 sdma_engine_interrupt(sde, status);
8266 } else { 8266 } else {
8267 dd_dev_err_ratelimited(dd, "SDMA engine %u interrupt, but no status bits set\n", 8267 dd_dev_info_ratelimited(dd, "SDMA engine %u interrupt, but no status bits set\n",
8268 sde->this_idx); 8268 sde->this_idx);
8269 } 8269 }
8270 return IRQ_HANDLED; 8270 return IRQ_HANDLED;
8271} 8271}
@@ -12960,7 +12960,14 @@ static void disable_intx(struct pci_dev *pdev)
12960 pci_intx(pdev, 0); 12960 pci_intx(pdev, 0);
12961} 12961}
12962 12962
12963static void clean_up_interrupts(struct hfi1_devdata *dd) 12963/**
12964 * hfi1_clean_up_interrupts() - Free all IRQ resources
12965 * @dd: valid device data data structure
12966 *
12967 * Free the MSI or INTx IRQs and assoicated PCI resources,
12968 * if they have been allocated.
12969 */
12970void hfi1_clean_up_interrupts(struct hfi1_devdata *dd)
12964{ 12971{
12965 int i; 12972 int i;
12966 12973
@@ -13321,7 +13328,7 @@ static int set_up_interrupts(struct hfi1_devdata *dd)
13321 return 0; 13328 return 0;
13322 13329
13323fail: 13330fail:
13324 clean_up_interrupts(dd); 13331 hfi1_clean_up_interrupts(dd);
13325 return ret; 13332 return ret;
13326} 13333}
13327 13334
@@ -14748,7 +14755,6 @@ void hfi1_start_cleanup(struct hfi1_devdata *dd)
14748 aspm_exit(dd); 14755 aspm_exit(dd);
14749 free_cntrs(dd); 14756 free_cntrs(dd);
14750 free_rcverr(dd); 14757 free_rcverr(dd);
14751 clean_up_interrupts(dd);
14752 finish_chip_resources(dd); 14758 finish_chip_resources(dd);
14753} 14759}
14754 14760
@@ -15204,7 +15210,7 @@ bail_free_rcverr:
15204bail_free_cntrs: 15210bail_free_cntrs:
15205 free_cntrs(dd); 15211 free_cntrs(dd);
15206bail_clear_intr: 15212bail_clear_intr:
15207 clean_up_interrupts(dd); 15213 hfi1_clean_up_interrupts(dd);
15208bail_cleanup: 15214bail_cleanup:
15209 hfi1_pcie_ddcleanup(dd); 15215 hfi1_pcie_ddcleanup(dd);
15210bail_free: 15216bail_free:
diff --git a/drivers/infiniband/hw/hfi1/hfi.h b/drivers/infiniband/hw/hfi1/hfi.h
index b42c22292597..5757d0e3482d 100644
--- a/drivers/infiniband/hw/hfi1/hfi.h
+++ b/drivers/infiniband/hw/hfi1/hfi.h
@@ -1957,6 +1957,7 @@ void hfi1_verbs_unregister_sysfs(struct hfi1_devdata *dd);
1957int qsfp_dump(struct hfi1_pportdata *ppd, char *buf, int len); 1957int qsfp_dump(struct hfi1_pportdata *ppd, char *buf, int len);
1958 1958
1959int hfi1_pcie_init(struct pci_dev *pdev, const struct pci_device_id *ent); 1959int hfi1_pcie_init(struct pci_dev *pdev, const struct pci_device_id *ent);
1960void hfi1_clean_up_interrupts(struct hfi1_devdata *dd);
1960void hfi1_pcie_cleanup(struct pci_dev *pdev); 1961void hfi1_pcie_cleanup(struct pci_dev *pdev);
1961int hfi1_pcie_ddinit(struct hfi1_devdata *dd, struct pci_dev *pdev); 1962int hfi1_pcie_ddinit(struct hfi1_devdata *dd, struct pci_dev *pdev);
1962void hfi1_pcie_ddcleanup(struct hfi1_devdata *); 1963void hfi1_pcie_ddcleanup(struct hfi1_devdata *);
diff --git a/drivers/infiniband/hw/hfi1/init.c b/drivers/infiniband/hw/hfi1/init.c
index 9b128268fb28..c676d1cb8755 100644
--- a/drivers/infiniband/hw/hfi1/init.c
+++ b/drivers/infiniband/hw/hfi1/init.c
@@ -1058,8 +1058,9 @@ static void shutdown_device(struct hfi1_devdata *dd)
1058 } 1058 }
1059 dd->flags &= ~HFI1_INITTED; 1059 dd->flags &= ~HFI1_INITTED;
1060 1060
1061 /* mask interrupts, but not errors */ 1061 /* mask and clean up interrupts, but not errors */
1062 set_intr_state(dd, 0); 1062 set_intr_state(dd, 0);
1063 hfi1_clean_up_interrupts(dd);
1063 1064
1064 for (pidx = 0; pidx < dd->num_pports; ++pidx) { 1065 for (pidx = 0; pidx < dd->num_pports; ++pidx) {
1065 ppd = dd->pport + pidx; 1066 ppd = dd->pport + pidx;
@@ -1704,6 +1705,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1704 dd_dev_err(dd, "Failed to create /dev devices: %d\n", -j); 1705 dd_dev_err(dd, "Failed to create /dev devices: %d\n", -j);
1705 1706
1706 if (initfail || ret) { 1707 if (initfail || ret) {
1708 hfi1_clean_up_interrupts(dd);
1707 stop_timers(dd); 1709 stop_timers(dd);
1708 flush_workqueue(ib_wq); 1710 flush_workqueue(ib_wq);
1709 for (pidx = 0; pidx < dd->num_pports; ++pidx) { 1711 for (pidx = 0; pidx < dd->num_pports; ++pidx) {