mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-10 15:10:38 +00:00
xhci: refactor static MSI function
The current way the xhci driver sets up MSI interrupts is overly complex and messy. The whole MSI setup can be done in one simple function. Continue refactoring MSI/MSI-X setup by incorporating 'xhci_setup_msi()' into 'xhci_try_enable_msi()'. Now all interrupt enabling is contained in one function, which should make it easier to rework. Signed-off-by: Niklas Neronin <niklas.neronin@linux.intel.com> Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> Link: https://lore.kernel.org/r/20231201150647.1307406-15-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
74554e9c22
commit
a795f708b2
@ -116,35 +116,6 @@ static void xhci_cleanup_msix(struct xhci_hcd *xhci)
|
||||
hcd->msix_enabled = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up MSI
|
||||
*/
|
||||
static int xhci_setup_msi(struct xhci_hcd *xhci)
|
||||
{
|
||||
int ret;
|
||||
/*
|
||||
* TODO:Check with MSI Soc for sysdev
|
||||
*/
|
||||
struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller);
|
||||
|
||||
ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
|
||||
if (ret < 0) {
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_init,
|
||||
"failed to allocate MSI entry");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = request_irq(pdev->irq, xhci_msi_irq,
|
||||
0, "xhci_hcd", xhci_to_hcd(xhci));
|
||||
if (ret) {
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_init,
|
||||
"disable MSI interrupt");
|
||||
pci_free_irq_vectors(pdev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int xhci_try_enable_msi(struct usb_hcd *hcd)
|
||||
{
|
||||
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
||||
@ -194,13 +165,23 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd)
|
||||
return 0;
|
||||
|
||||
setup_msi:
|
||||
/* fall back to MSI */
|
||||
ret = xhci_setup_msi(xhci);
|
||||
if (!ret) {
|
||||
hcd->msi_enabled = 1;
|
||||
return 0;
|
||||
/* TODO: Check with MSI Soc for sysdev */
|
||||
ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
|
||||
if (ret < 0) {
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_init, "failed to allocate MSI entry");
|
||||
goto legacy_irq;
|
||||
}
|
||||
|
||||
ret = request_irq(pdev->irq, xhci_msi_irq, 0, "xhci_hcd", xhci_to_hcd(xhci));
|
||||
if (ret) {
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_init, "disable MSI interrupt");
|
||||
pci_free_irq_vectors(pdev);
|
||||
goto legacy_irq;
|
||||
}
|
||||
|
||||
hcd->msi_enabled = 1;
|
||||
return 0;
|
||||
|
||||
legacy_irq:
|
||||
if (!pdev->irq) {
|
||||
xhci_err(xhci, "No msi-x/msi found and no IRQ in BIOS\n");
|
||||
|
Loading…
x
Reference in New Issue
Block a user