|
@@ -12929,7 +12929,7 @@ static void clean_up_interrupts(struct hfi1_devdata *dd)
|
|
|
if (!me->arg) /* => no irq, no affinity */
|
|
|
continue;
|
|
|
hfi1_put_irq_affinity(dd, me);
|
|
|
- free_irq(me->irq, me->arg);
|
|
|
+ pci_free_irq(dd->pcidev, i, me->arg);
|
|
|
}
|
|
|
|
|
|
/* clean structures */
|
|
@@ -12939,7 +12939,7 @@ static void clean_up_interrupts(struct hfi1_devdata *dd)
|
|
|
} else {
|
|
|
/* INTx */
|
|
|
if (dd->requested_intx_irq) {
|
|
|
- free_irq(dd->pcidev->irq, dd);
|
|
|
+ pci_free_irq(dd->pcidev, 0, dd);
|
|
|
dd->requested_intx_irq = 0;
|
|
|
}
|
|
|
disable_intx(dd->pcidev);
|
|
@@ -12998,10 +12998,8 @@ static int request_intx_irq(struct hfi1_devdata *dd)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
- snprintf(dd->intx_name, sizeof(dd->intx_name), DRIVER_NAME "_%d",
|
|
|
- dd->unit);
|
|
|
- ret = request_irq(dd->pcidev->irq, general_interrupt,
|
|
|
- IRQF_SHARED, dd->intx_name, dd);
|
|
|
+ ret = pci_request_irq(dd->pcidev, 0, general_interrupt, NULL, dd,
|
|
|
+ DRIVER_NAME "_%d", dd->unit);
|
|
|
if (ret)
|
|
|
dd_dev_err(dd, "unable to request INTx interrupt, err %d\n",
|
|
|
ret);
|
|
@@ -13044,13 +13042,14 @@ static int request_msix_irqs(struct hfi1_devdata *dd)
|
|
|
int idx;
|
|
|
struct hfi1_ctxtdata *rcd = NULL;
|
|
|
struct sdma_engine *sde = NULL;
|
|
|
+ char name[MAX_NAME_SIZE];
|
|
|
|
|
|
- /* obtain the arguments to request_irq */
|
|
|
+ /* obtain the arguments to pci_request_irq */
|
|
|
if (first_general <= i && i < last_general) {
|
|
|
idx = i - first_general;
|
|
|
handler = general_interrupt;
|
|
|
arg = dd;
|
|
|
- snprintf(me->name, sizeof(me->name),
|
|
|
+ snprintf(name, sizeof(name),
|
|
|
DRIVER_NAME "_%d", dd->unit);
|
|
|
err_info = "general";
|
|
|
me->type = IRQ_GENERAL;
|
|
@@ -13059,7 +13058,7 @@ static int request_msix_irqs(struct hfi1_devdata *dd)
|
|
|
sde = &dd->per_sdma[idx];
|
|
|
handler = sdma_interrupt;
|
|
|
arg = sde;
|
|
|
- snprintf(me->name, sizeof(me->name),
|
|
|
+ snprintf(name, sizeof(name),
|
|
|
DRIVER_NAME "_%d sdma%d", dd->unit, idx);
|
|
|
err_info = "sdma";
|
|
|
remap_sdma_interrupts(dd, idx, i);
|
|
@@ -13078,7 +13077,7 @@ static int request_msix_irqs(struct hfi1_devdata *dd)
|
|
|
handler = receive_context_interrupt;
|
|
|
thread = receive_context_thread;
|
|
|
arg = rcd;
|
|
|
- snprintf(me->name, sizeof(me->name),
|
|
|
+ snprintf(name, sizeof(name),
|
|
|
DRIVER_NAME "_%d kctxt%d",
|
|
|
dd->unit, idx);
|
|
|
err_info = "receive context";
|
|
@@ -13099,18 +13098,10 @@ static int request_msix_irqs(struct hfi1_devdata *dd)
|
|
|
if (!arg)
|
|
|
continue;
|
|
|
/* make sure the name is terminated */
|
|
|
- me->name[sizeof(me->name) - 1] = 0;
|
|
|
+ name[sizeof(name) - 1] = 0;
|
|
|
me->irq = pci_irq_vector(dd->pcidev, i);
|
|
|
- /*
|
|
|
- * On err return me->irq. Don't need to clear this
|
|
|
- * because 'arg' has not been set, and cleanup will
|
|
|
- * do the right thing.
|
|
|
- */
|
|
|
- if (me->irq < 0)
|
|
|
- return me->irq;
|
|
|
-
|
|
|
- ret = request_threaded_irq(me->irq, handler, thread, 0,
|
|
|
- me->name, arg);
|
|
|
+ ret = pci_request_irq(dd->pcidev, i, handler, thread, arg,
|
|
|
+ name);
|
|
|
if (ret) {
|
|
|
dd_dev_err(dd,
|
|
|
"unable to allocate %s interrupt, irq %d, index %d, err %d\n",
|
|
@@ -13118,7 +13109,7 @@ static int request_msix_irqs(struct hfi1_devdata *dd)
|
|
|
return ret;
|
|
|
}
|
|
|
/*
|
|
|
- * assign arg after request_irq call, so it will be
|
|
|
+ * assign arg after pci_request_irq call, so it will be
|
|
|
* cleaned up
|
|
|
*/
|
|
|
me->arg = arg;
|
|
@@ -13136,7 +13127,7 @@ void hfi1_vnic_synchronize_irq(struct hfi1_devdata *dd)
|
|
|
int i;
|
|
|
|
|
|
if (!dd->num_msix_entries) {
|
|
|
- synchronize_irq(dd->pcidev->irq);
|
|
|
+ synchronize_irq(pci_irq_vector(dd->pcidev, 0));
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -13157,7 +13148,7 @@ void hfi1_reset_vnic_msix_info(struct hfi1_ctxtdata *rcd)
|
|
|
return;
|
|
|
|
|
|
hfi1_put_irq_affinity(dd, me);
|
|
|
- free_irq(me->irq, me->arg);
|
|
|
+ pci_free_irq(dd->pcidev, rcd->msix_intr, me->arg);
|
|
|
|
|
|
me->arg = NULL;
|
|
|
}
|
|
@@ -13180,28 +13171,21 @@ void hfi1_set_vnic_msix_info(struct hfi1_ctxtdata *rcd)
|
|
|
rcd->ireg = (IS_RCVAVAIL_START + idx) / 64;
|
|
|
rcd->imask = ((u64)1) <<
|
|
|
((IS_RCVAVAIL_START + idx) % 64);
|
|
|
-
|
|
|
- snprintf(me->name, sizeof(me->name),
|
|
|
- DRIVER_NAME "_%d kctxt%d", dd->unit, idx);
|
|
|
- me->name[sizeof(me->name) - 1] = 0;
|
|
|
me->type = IRQ_RCVCTXT;
|
|
|
me->irq = pci_irq_vector(dd->pcidev, rcd->msix_intr);
|
|
|
- if (me->irq < 0) {
|
|
|
- dd_dev_err(dd, "vnic irq vector request (idx %d) fail %d\n",
|
|
|
- idx, me->irq);
|
|
|
- return;
|
|
|
- }
|
|
|
remap_intr(dd, IS_RCVAVAIL_START + idx, rcd->msix_intr);
|
|
|
|
|
|
- ret = request_threaded_irq(me->irq, receive_context_interrupt,
|
|
|
- receive_context_thread, 0, me->name, arg);
|
|
|
+ ret = pci_request_irq(dd->pcidev, rcd->msix_intr,
|
|
|
+ receive_context_interrupt,
|
|
|
+ receive_context_thread, arg,
|
|
|
+ DRIVER_NAME "_%d kctxt%d", dd->unit, idx);
|
|
|
if (ret) {
|
|
|
dd_dev_err(dd, "vnic irq request (irq %d, idx %d) fail %d\n",
|
|
|
me->irq, idx, ret);
|
|
|
return;
|
|
|
}
|
|
|
/*
|
|
|
- * assign arg after request_irq call, so it will be
|
|
|
+ * assign arg after pci_request_irq call, so it will be
|
|
|
* cleaned up
|
|
|
*/
|
|
|
me->arg = arg;
|
|
@@ -13210,7 +13194,7 @@ void hfi1_set_vnic_msix_info(struct hfi1_ctxtdata *rcd)
|
|
|
if (ret) {
|
|
|
dd_dev_err(dd,
|
|
|
"unable to pin IRQ %d\n", ret);
|
|
|
- free_irq(me->irq, me->arg);
|
|
|
+ pci_free_irq(dd->pcidev, rcd->msix_intr, me->arg);
|
|
|
}
|
|
|
}
|
|
|
|