Commit 581d01aa authored by Michael J. Ruhl's avatar Michael J. Ruhl Committed by Doug Ledford

IB/qib: Replace deprecated pci functions with new API

pci_enable_msix_range() and pci_disable_msix() have been deprecated.
Updating to the new pci_alloc_irq_vectors() interface.
Reviewed-by: default avatarSebastian Sanchez <sebastian.sanchez@intel.com>
Reviewed-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: default avatarMichael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 8cb1021b
#ifndef _QIB_KERNEL_H #ifndef _QIB_KERNEL_H
#define _QIB_KERNEL_H #define _QIB_KERNEL_H
/* /*
* Copyright (c) 2012, 2013 Intel Corporation. All rights reserved. * Copyright (c) 2012 - 2017 Intel Corporation. All rights reserved.
* Copyright (c) 2006 - 2012 QLogic Corporation. All rights reserved. * Copyright (c) 2006 - 2012 QLogic Corporation. All rights reserved.
* Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved.
* *
...@@ -443,7 +443,7 @@ struct qib_irq_notify; ...@@ -443,7 +443,7 @@ struct qib_irq_notify;
#endif #endif
struct qib_msix_entry { struct qib_msix_entry {
struct msix_entry msix; int irq;
void *arg; void *arg;
#ifdef CONFIG_INFINIBAND_QIB_DCA #ifdef CONFIG_INFINIBAND_QIB_DCA
int dca; int dca;
...@@ -1433,9 +1433,9 @@ int qib_pcie_init(struct pci_dev *, const struct pci_device_id *); ...@@ -1433,9 +1433,9 @@ int qib_pcie_init(struct pci_dev *, const struct pci_device_id *);
int qib_pcie_ddinit(struct qib_devdata *, struct pci_dev *, int qib_pcie_ddinit(struct qib_devdata *, struct pci_dev *,
const struct pci_device_id *); const struct pci_device_id *);
void qib_pcie_ddcleanup(struct qib_devdata *); void qib_pcie_ddcleanup(struct qib_devdata *);
int qib_pcie_params(struct qib_devdata *, u32, u32 *, struct qib_msix_entry *); int qib_pcie_params(struct qib_devdata *dd, u32 minw, u32 *nent);
int qib_reinit_intr(struct qib_devdata *); int qib_reinit_intr(struct qib_devdata *);
void qib_enable_intx(struct pci_dev *); void qib_enable_intx(struct qib_devdata *dd);
void qib_nomsi(struct qib_devdata *); void qib_nomsi(struct qib_devdata *);
void qib_nomsix(struct qib_devdata *); void qib_nomsix(struct qib_devdata *);
void qib_pcie_getcmd(struct qib_devdata *, u16 *, u8 *, u8 *); void qib_pcie_getcmd(struct qib_devdata *, u16 *, u8 *, u8 *);
......
/* /*
* Copyright (c) 2013 Intel Corporation. All rights reserved. * Copyright (c) 2013 - 2017 Intel Corporation. All rights reserved.
* Copyright (c) 2006, 2007, 2008, 2009, 2010 QLogic Corporation. * Copyright (c) 2006, 2007, 2008, 2009, 2010 QLogic Corporation.
* All rights reserved. * All rights reserved.
* Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved.
...@@ -1838,7 +1838,7 @@ static int qib_6120_setup_reset(struct qib_devdata *dd) ...@@ -1838,7 +1838,7 @@ static int qib_6120_setup_reset(struct qib_devdata *dd)
bail: bail:
if (ret) { if (ret) {
if (qib_pcie_params(dd, dd->lbus_width, NULL, NULL)) if (qib_pcie_params(dd, dd->lbus_width, NULL))
qib_dev_err(dd, qib_dev_err(dd,
"Reset failed to setup PCIe or interrupts; continuing anyway\n"); "Reset failed to setup PCIe or interrupts; continuing anyway\n");
/* clear the reset error, init error/hwerror mask */ /* clear the reset error, init error/hwerror mask */
...@@ -3562,7 +3562,7 @@ struct qib_devdata *qib_init_iba6120_funcs(struct pci_dev *pdev, ...@@ -3562,7 +3562,7 @@ struct qib_devdata *qib_init_iba6120_funcs(struct pci_dev *pdev,
if (qib_mini_init) if (qib_mini_init)
goto bail; goto bail;
if (qib_pcie_params(dd, 8, NULL, NULL)) if (qib_pcie_params(dd, 8, NULL))
qib_dev_err(dd, qib_dev_err(dd,
"Failed to setup PCIe or interrupts; continuing anyway\n"); "Failed to setup PCIe or interrupts; continuing anyway\n");
dd->cspec->irq = pdev->irq; /* save IRQ */ dd->cspec->irq = pdev->irq; /* save IRQ */
......
/* /*
* Copyright (c) 2011 - 2017 Intel Corporation. All rights reserved.
* Copyright (c) 2006, 2007, 2008, 2009, 2010 QLogic Corporation. * Copyright (c) 2006, 2007, 2008, 2009, 2010 QLogic Corporation.
* All rights reserved. * All rights reserved.
* Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved.
...@@ -2148,7 +2149,7 @@ static int qib_setup_7220_reset(struct qib_devdata *dd) ...@@ -2148,7 +2149,7 @@ static int qib_setup_7220_reset(struct qib_devdata *dd)
bail: bail:
if (ret) { if (ret) {
if (qib_pcie_params(dd, dd->lbus_width, NULL, NULL)) if (qib_pcie_params(dd, dd->lbus_width, NULL))
qib_dev_err(dd, qib_dev_err(dd,
"Reset failed to setup PCIe or interrupts; continuing anyway\n"); "Reset failed to setup PCIe or interrupts; continuing anyway\n");
...@@ -3309,7 +3310,7 @@ static int qib_7220_intr_fallback(struct qib_devdata *dd) ...@@ -3309,7 +3310,7 @@ static int qib_7220_intr_fallback(struct qib_devdata *dd)
qib_devinfo(dd->pcidev, qib_devinfo(dd->pcidev,
"MSI interrupt not detected, trying INTx interrupts\n"); "MSI interrupt not detected, trying INTx interrupts\n");
qib_7220_free_irq(dd); qib_7220_free_irq(dd);
qib_enable_intx(dd->pcidev); qib_enable_intx(dd);
/* /*
* Some newer kernels require free_irq before disable_msi, * Some newer kernels require free_irq before disable_msi,
* and irq can be changed during disable and INTx enable * and irq can be changed during disable and INTx enable
...@@ -4619,7 +4620,7 @@ struct qib_devdata *qib_init_iba7220_funcs(struct pci_dev *pdev, ...@@ -4619,7 +4620,7 @@ struct qib_devdata *qib_init_iba7220_funcs(struct pci_dev *pdev,
minwidth = 8; /* x8 capable boards */ minwidth = 8; /* x8 capable boards */
break; break;
} }
if (qib_pcie_params(dd, minwidth, NULL, NULL)) if (qib_pcie_params(dd, minwidth, NULL))
qib_dev_err(dd, qib_dev_err(dd,
"Failed to setup PCIe or interrupts; continuing anyway\n"); "Failed to setup PCIe or interrupts; continuing anyway\n");
......
/* /*
* Copyright (c) 2012 Intel Corporation. All rights reserved. * Copyright (c) 2012 - 2017 Intel Corporation. All rights reserved.
* Copyright (c) 2008 - 2012 QLogic Corporation. All rights reserved. * Copyright (c) 2008 - 2012 QLogic Corporation. All rights reserved.
* *
* This software is available to you under a choice of one of two * This software is available to you under a choice of one of two
...@@ -2841,10 +2841,10 @@ static void qib_7322_nomsix(struct qib_devdata *dd) ...@@ -2841,10 +2841,10 @@ static void qib_7322_nomsix(struct qib_devdata *dd)
reset_dca_notifier(dd, &dd->cspec->msix_entries[i]); reset_dca_notifier(dd, &dd->cspec->msix_entries[i]);
#endif #endif
irq_set_affinity_hint( irq_set_affinity_hint(
dd->cspec->msix_entries[i].msix.vector, NULL); dd->cspec->msix_entries[i].irq, NULL);
free_cpumask_var(dd->cspec->msix_entries[i].mask); free_cpumask_var(dd->cspec->msix_entries[i].mask);
free_irq(dd->cspec->msix_entries[i].msix.vector, free_irq(dd->cspec->msix_entries[i].irq,
dd->cspec->msix_entries[i].arg); dd->cspec->msix_entries[i].arg);
} }
qib_nomsix(dd); qib_nomsix(dd);
} }
...@@ -3336,9 +3336,9 @@ static void reset_dca_notifier(struct qib_devdata *dd, struct qib_msix_entry *m) ...@@ -3336,9 +3336,9 @@ static void reset_dca_notifier(struct qib_devdata *dd, struct qib_msix_entry *m)
qib_devinfo(dd->pcidev, qib_devinfo(dd->pcidev,
"Disabling notifier on HCA %d irq %d\n", "Disabling notifier on HCA %d irq %d\n",
dd->unit, dd->unit,
m->msix.vector); m->irq);
irq_set_affinity_notifier( irq_set_affinity_notifier(
m->msix.vector, m->irq,
NULL); NULL);
m->notifier = NULL; m->notifier = NULL;
} }
...@@ -3354,7 +3354,7 @@ static void setup_dca_notifier(struct qib_devdata *dd, struct qib_msix_entry *m) ...@@ -3354,7 +3354,7 @@ static void setup_dca_notifier(struct qib_devdata *dd, struct qib_msix_entry *m)
int ret; int ret;
m->notifier = n; m->notifier = n;
n->notify.irq = m->msix.vector; n->notify.irq = m->irq;
n->notify.notify = qib_irq_notifier_notify; n->notify.notify = qib_irq_notifier_notify;
n->notify.release = qib_irq_notifier_release; n->notify.release = qib_irq_notifier_release;
n->arg = m->arg; n->arg = m->arg;
...@@ -3500,10 +3500,21 @@ static void qib_setup_7322_interrupt(struct qib_devdata *dd, int clearpend) ...@@ -3500,10 +3500,21 @@ static void qib_setup_7322_interrupt(struct qib_devdata *dd, int clearpend)
- 1, - 1,
QIB_DRV_NAME "%d (kctx)", dd->unit); QIB_DRV_NAME "%d (kctx)", dd->unit);
} }
ret = request_irq(
dd->cspec->msix_entries[msixnum].msix.vector, dd->cspec->msix_entries[msixnum].irq = pci_irq_vector(
handler, 0, dd->cspec->msix_entries[msixnum].name, dd->pcidev, msixnum);
arg); if (dd->cspec->msix_entries[msixnum].irq < 0) {
qib_dev_err(dd,
"Couldn't get MSIx irq (vec=%d): %d\n",
msixnum,
dd->cspec->msix_entries[msixnum].irq);
qib_7322_nomsix(dd);
goto try_intx;
}
ret = request_irq(dd->cspec->msix_entries[msixnum].irq,
handler, 0,
dd->cspec->msix_entries[msixnum].name,
arg);
if (ret) { if (ret) {
/* /*
* Shouldn't happen since the enable said we could * Shouldn't happen since the enable said we could
...@@ -3512,7 +3523,7 @@ static void qib_setup_7322_interrupt(struct qib_devdata *dd, int clearpend) ...@@ -3512,7 +3523,7 @@ static void qib_setup_7322_interrupt(struct qib_devdata *dd, int clearpend)
qib_dev_err(dd, qib_dev_err(dd,
"Couldn't setup MSIx interrupt (vec=%d, irq=%d): %d\n", "Couldn't setup MSIx interrupt (vec=%d, irq=%d): %d\n",
msixnum, msixnum,
dd->cspec->msix_entries[msixnum].msix.vector, dd->cspec->msix_entries[msixnum].irq,
ret); ret);
qib_7322_nomsix(dd); qib_7322_nomsix(dd);
goto try_intx; goto try_intx;
...@@ -3548,7 +3559,7 @@ static void qib_setup_7322_interrupt(struct qib_devdata *dd, int clearpend) ...@@ -3548,7 +3559,7 @@ static void qib_setup_7322_interrupt(struct qib_devdata *dd, int clearpend)
dd->cspec->msix_entries[msixnum].mask); dd->cspec->msix_entries[msixnum].mask);
} }
irq_set_affinity_hint( irq_set_affinity_hint(
dd->cspec->msix_entries[msixnum].msix.vector, dd->cspec->msix_entries[msixnum].irq,
dd->cspec->msix_entries[msixnum].mask); dd->cspec->msix_entries[msixnum].mask);
} }
msixnum++; msixnum++;
...@@ -3744,7 +3755,6 @@ static int qib_do_7322_reset(struct qib_devdata *dd) ...@@ -3744,7 +3755,6 @@ static int qib_do_7322_reset(struct qib_devdata *dd)
if (msix_entries) { if (msix_entries) {
/* restore the MSIx vector address and data if saved above */ /* restore the MSIx vector address and data if saved above */
for (i = 0; i < msix_entries; i++) { for (i = 0; i < msix_entries; i++) {
dd->cspec->msix_entries[i].msix.entry = i;
if (!msix_vecsave || !msix_vecsave[2 * i]) if (!msix_vecsave || !msix_vecsave[2 * i])
continue; continue;
qib_write_kreg(dd, 2 * i + qib_write_kreg(dd, 2 * i +
...@@ -3762,8 +3772,7 @@ static int qib_do_7322_reset(struct qib_devdata *dd) ...@@ -3762,8 +3772,7 @@ static int qib_do_7322_reset(struct qib_devdata *dd)
write_7322_initregs(dd); write_7322_initregs(dd);
if (qib_pcie_params(dd, dd->lbus_width, if (qib_pcie_params(dd, dd->lbus_width,
&dd->cspec->num_msix_entries, &dd->cspec->num_msix_entries))
dd->cspec->msix_entries))
qib_dev_err(dd, qib_dev_err(dd,
"Reset failed to setup PCIe or interrupts; continuing anyway\n"); "Reset failed to setup PCIe or interrupts; continuing anyway\n");
...@@ -5195,7 +5204,7 @@ static int qib_7322_intr_fallback(struct qib_devdata *dd) ...@@ -5195,7 +5204,7 @@ static int qib_7322_intr_fallback(struct qib_devdata *dd)
qib_devinfo(dd->pcidev, qib_devinfo(dd->pcidev,
"MSIx interrupt not detected, trying INTx interrupts\n"); "MSIx interrupt not detected, trying INTx interrupts\n");
qib_7322_nomsix(dd); qib_7322_nomsix(dd);
qib_enable_intx(dd->pcidev); qib_enable_intx(dd);
qib_setup_7322_interrupt(dd, 0); qib_setup_7322_interrupt(dd, 0);
return 1; return 1;
} }
...@@ -7327,10 +7336,7 @@ struct qib_devdata *qib_init_iba7322_funcs(struct pci_dev *pdev, ...@@ -7327,10 +7336,7 @@ struct qib_devdata *qib_init_iba7322_funcs(struct pci_dev *pdev,
if (!dd->cspec->msix_entries) if (!dd->cspec->msix_entries)
tabsize = 0; tabsize = 0;
for (i = 0; i < tabsize; i++) if (qib_pcie_params(dd, 8, &tabsize))
dd->cspec->msix_entries[i].msix.entry = i;
if (qib_pcie_params(dd, 8, &tabsize, dd->cspec->msix_entries))
qib_dev_err(dd, qib_dev_err(dd,
"Failed to setup PCIe or interrupts; continuing anyway\n"); "Failed to setup PCIe or interrupts; continuing anyway\n");
/* may be less than we wanted, if not enough available */ /* may be less than we wanted, if not enough available */
......
/* /*
* Copyright (c) 2010 - 2017 Intel Corporation. All rights reserved.
* Copyright (c) 2008, 2009 QLogic Corporation. All rights reserved. * Copyright (c) 2008, 2009 QLogic Corporation. All rights reserved.
* *
* This software is available to you under a choice of one of two * This software is available to you under a choice of one of two
...@@ -187,112 +188,84 @@ void qib_pcie_ddcleanup(struct qib_devdata *dd) ...@@ -187,112 +188,84 @@ void qib_pcie_ddcleanup(struct qib_devdata *dd)
pci_set_drvdata(dd->pcidev, NULL); pci_set_drvdata(dd->pcidev, NULL);
} }
static void qib_msix_setup(struct qib_devdata *dd, int pos, u32 *msixcnt,
struct qib_msix_entry *qib_msix_entry)
{
int ret;
int nvec = *msixcnt;
struct msix_entry *msix_entry;
int i;
ret = pci_msix_vec_count(dd->pcidev);
if (ret < 0)
goto do_intx;
nvec = min(nvec, ret);
/* We can't pass qib_msix_entry array to qib_msix_setup
* so use a dummy msix_entry array and copy the allocated
* irq back to the qib_msix_entry array. */
msix_entry = kcalloc(nvec, sizeof(*msix_entry), GFP_KERNEL);
if (!msix_entry)
goto do_intx;
for (i = 0; i < nvec; i++)
msix_entry[i] = qib_msix_entry[i].msix;
ret = pci_enable_msix_range(dd->pcidev, msix_entry, 1, nvec);
if (ret < 0)
goto free_msix_entry;
else
nvec = ret;
for (i = 0; i < nvec; i++)
qib_msix_entry[i].msix = msix_entry[i];
kfree(msix_entry);
*msixcnt = nvec;
return;
free_msix_entry:
kfree(msix_entry);
do_intx:
qib_dev_err(
dd,
"pci_enable_msix_range %d vectors failed: %d, falling back to INTx\n",
nvec, ret);
*msixcnt = 0;
qib_enable_intx(dd->pcidev);
}
/** /**
* We save the msi lo and hi values, so we can restore them after * We save the msi lo and hi values, so we can restore them after
* chip reset (the kernel PCI infrastructure doesn't yet handle that * chip reset (the kernel PCI infrastructure doesn't yet handle that
* correctly. * correctly.
*/ */
static int qib_msi_setup(struct qib_devdata *dd, int pos) static void qib_msi_setup(struct qib_devdata *dd, int pos)
{ {
struct pci_dev *pdev = dd->pcidev; struct pci_dev *pdev = dd->pcidev;
u16 control; u16 control;
int ret;
ret = pci_enable_msi(pdev); pci_read_config_dword(pdev, pos + PCI_MSI_ADDRESS_LO, &dd->msi_lo);
if (ret) pci_read_config_dword(pdev, pos + PCI_MSI_ADDRESS_HI, &dd->msi_hi);
qib_dev_err(dd,
"pci_enable_msi failed: %d, interrupts may not work\n",
ret);
/* continue even if it fails, we may still be OK... */
pci_read_config_dword(pdev, pos + PCI_MSI_ADDRESS_LO,
&dd->msi_lo);
pci_read_config_dword(pdev, pos + PCI_MSI_ADDRESS_HI,
&dd->msi_hi);
pci_read_config_word(pdev, pos + PCI_MSI_FLAGS, &control); pci_read_config_word(pdev, pos + PCI_MSI_FLAGS, &control);
/* now save the data (vector) info */ /* now save the data (vector) info */
pci_read_config_word(pdev, pos + ((control & PCI_MSI_FLAGS_64BIT) pci_read_config_word(pdev,
? 12 : 8), pos + ((control & PCI_MSI_FLAGS_64BIT) ? 12 : 8),
&dd->msi_data); &dd->msi_data);
return ret;
} }
int qib_pcie_params(struct qib_devdata *dd, u32 minw, u32 *nent, static int qib_allocate_irqs(struct qib_devdata *dd, u32 maxvec)
struct qib_msix_entry *entry) {
unsigned int flags = PCI_IRQ_LEGACY;
/* Check our capabilities */
if (dd->pcidev->msix_cap) {
flags |= PCI_IRQ_MSIX;
} else {
if (dd->pcidev->msi_cap) {
flags |= PCI_IRQ_MSI;
/* Get msi_lo and msi_hi */
qib_msi_setup(dd, dd->pcidev->msi_cap);
}
}
if (!(flags & (PCI_IRQ_MSIX | PCI_IRQ_MSI)))
qib_dev_err(dd, "No PCI MSI or MSIx capability!\n");
return pci_alloc_irq_vectors(dd->pcidev, 1, maxvec, flags);
}
int qib_pcie_params(struct qib_devdata *dd, u32 minw, u32 *nent)
{ {
u16 linkstat, speed; u16 linkstat, speed;
int pos = 0, ret = 1; int nvec;
int maxvec;
int ret = 0;
if (!pci_is_pcie(dd->pcidev)) { if (!pci_is_pcie(dd->pcidev)) {
qib_dev_err(dd, "Can't find PCI Express capability!\n"); qib_dev_err(dd, "Can't find PCI Express capability!\n");
/* set up something... */ /* set up something... */
dd->lbus_width = 1; dd->lbus_width = 1;
dd->lbus_speed = 2500; /* Gen1, 2.5GHz */ dd->lbus_speed = 2500; /* Gen1, 2.5GHz */
ret = -1;
goto bail; goto bail;
} }
pos = dd->pcidev->msix_cap; maxvec = (nent && *nent) ? *nent : 1;
if (nent && *nent && pos) { nvec = qib_allocate_irqs(dd, maxvec);
qib_msix_setup(dd, pos, nent, entry); if (nvec < 0) {
ret = 0; /* did it, either MSIx or INTx */ ret = nvec;
} else { goto bail;
pos = dd->pcidev->msi_cap; }
if (pos)
ret = qib_msi_setup(dd, pos); /*
else * If nent exists, make sure to record how many vectors were allocated
qib_dev_err(dd, "No PCI MSI or MSIx capability!\n"); */
if (nent) {
*nent = nvec;
/*
* If we requested (nent) MSIX, but msix_enabled is not set,
* pci_alloc_irq_vectors() enabled INTx.
*/
if (!dd->pcidev->msix_enabled)
qib_dev_err(dd,
"no msix vectors allocated, using INTx\n");
} }
if (!pos)
qib_enable_intx(dd->pcidev);
pcie_capability_read_word(dd->pcidev, PCI_EXP_LNKSTA, &linkstat); pcie_capability_read_word(dd->pcidev, PCI_EXP_LNKSTA, &linkstat);
/* /*
...@@ -379,7 +352,7 @@ int qib_reinit_intr(struct qib_devdata *dd) ...@@ -379,7 +352,7 @@ int qib_reinit_intr(struct qib_devdata *dd)
ret = 1; ret = 1;
bail: bail:
if (!ret && (dd->flags & QIB_HAS_INTX)) { if (!ret && (dd->flags & QIB_HAS_INTX)) {
qib_enable_intx(dd->pcidev); qib_enable_intx(dd);
ret = 1; ret = 1;
} }
...@@ -397,7 +370,7 @@ int qib_reinit_intr(struct qib_devdata *dd) ...@@ -397,7 +370,7 @@ int qib_reinit_intr(struct qib_devdata *dd)
void qib_nomsi(struct qib_devdata *dd) void qib_nomsi(struct qib_devdata *dd)
{ {
dd->msi_lo = 0; dd->msi_lo = 0;
pci_disable_msi(dd->pcidev); pci_free_irq_vectors(dd->pcidev);
} }
/* /*
...@@ -405,23 +378,21 @@ void qib_nomsi(struct qib_devdata *dd) ...@@ -405,23 +378,21 @@ void qib_nomsi(struct qib_devdata *dd)
*/ */
void qib_nomsix(struct qib_devdata *dd) void qib_nomsix(struct qib_devdata *dd)
{ {
pci_disable_msix(dd->pcidev); pci_free_irq_vectors(dd->pcidev);
} }
/* /*
* Similar to pci_intx(pdev, 1), except that we make sure * Similar to pci_intx(pdev, 1), except that we make sure
* msi(x) is off. * msi(x) is off.
*/ */
void qib_enable_intx(struct pci_dev *pdev) void qib_enable_intx(struct qib_devdata *dd)
{ {
u16 cw, new; u16 cw, new;
int pos; int pos;
struct pci_dev *pdev = dd->pcidev;
/* first, turn on INTx */ if (pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_LEGACY) < 0)
pci_read_config_word(pdev, PCI_COMMAND, &cw); qib_dev_err(dd, "Failed to enable INTx\n");
new = cw & ~PCI_COMMAND_INTX_DISABLE;
if (new != cw)
pci_write_config_word(pdev, PCI_COMMAND, new);
pos = pdev->msi_cap; pos = pdev->msi_cap;
if (pos) { if (pos) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment