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: Sebastian Sanchez <sebastian.sanchez@intel.com> Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
8cb1021b80
commit
581d01aaac
@ -1,7 +1,7 @@
|
|||||||
#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;
|
|||||||
#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 *);
|
|||||||
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 *);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
|
|
||||||
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,
|
|||||||
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 */
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
|
* 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)
|
|||||||
|
|
||||||
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)
|
|||||||
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,
|
|||||||
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");
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 @@ try_intx:
|
|||||||
- 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 @@ try_intx:
|
|||||||
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 @@ try_intx:
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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 */
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
|
* 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)
|
|||||||
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)
|
|||||||
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 @@ bail:
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user