Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f893180b authored by Dan Williams's avatar Dan Williams Committed by Tejun Heo
Browse files

ahci: compile out msi/msix infrastructure



Quoting Arnd:
    The AHCI driver is used for some on-chip devices that do not use PCI
    for probing, and it can be built even when CONFIG_PCI is disabled, but
    that now results in a build failure:

    ata/libahci.c: In function 'ahci_host_activate_multi_irqs':
    ata/libahci.c:2475:4: error: invalid use of undefined type 'struct msix_entry'
    ata/libahci.c:2475:21: error: dereferencing pointer to incomplete type 'struct msix_entry'

Add ifdef CONFIG_PCI_MSI infrastructure to compile out the multi-msi and
multi-msix code.

Reported-by: default avatarArnd Bergmann <arnd@arndb.de>
Tested--by: default avatarArnd Bergmann <arnd@arndb.de>
[arnd: fix up pci enabled case]
Reported-by: default avatarPaul Gortmaker <paul.gortmaker@windriver.com>
Fixes: d684a90d ("ahci: per-port msix support")
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent 7e22c002
Loading
Loading
Loading
Loading
+24 −2
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#ifndef _AHCI_H
#define _AHCI_H

#include <linux/pci.h>
#include <linux/clk.h>
#include <linux/libata.h>
#include <linux/phy/phy.h>
@@ -237,12 +238,18 @@ enum {
	AHCI_HFLAG_DELAY_ENGINE		= (1 << 15), /* do not start engine on
						        port start (wait until
						        error-handling stage) */
	AHCI_HFLAG_MULTI_MSI		= (1 << 16), /* multiple PCI MSIs */
	AHCI_HFLAG_NO_DEVSLP		= (1 << 17), /* no device sleep */
	AHCI_HFLAG_NO_FBS		= (1 << 18), /* no FBS */
	AHCI_HFLAG_EDGE_IRQ		= (1 << 19), /* HOST_IRQ_STAT behaves as
							Edge Triggered */
	AHCI_HFLAG_MULTI_MSIX		= (1 << 20), /* per-port MSI-X */
#ifdef CONFIG_PCI_MSI
	AHCI_HFLAG_MULTI_MSI		= (1 << 20), /* multiple PCI MSIs */
	AHCI_HFLAG_MULTI_MSIX		= (1 << 21), /* per-port MSI-X */
#else
	/* compile out MSI infrastructure */
	AHCI_HFLAG_MULTI_MSI		= 0,
	AHCI_HFLAG_MULTI_MSIX		= 0,
#endif

	/* ap->flags bits */

@@ -355,6 +362,21 @@ struct ahci_host_priv {
	void			(*start_engine)(struct ata_port *ap);
};

#ifdef CONFIG_PCI_MSI
static inline int ahci_irq_vector(struct ahci_host_priv *hpriv, int port)
{
	if (hpriv->flags & AHCI_HFLAG_MULTI_MSIX)
		return hpriv->msix[port].vector;
	else
		return hpriv->irq + port;
}
#else
static inline int ahci_irq_vector(struct ahci_host_priv *hpriv, int port)
{
	return hpriv->irq;
}
#endif

extern int ahci_ignore_sss;

extern struct device_attribute *ahci_shost_attrs[];
+1 −6
Original line number Diff line number Diff line
@@ -2469,12 +2469,7 @@ static int ahci_host_activate_multi_irqs(struct ata_host *host,
	 */
	for (i = 0; i < host->n_ports; i++) {
		struct ahci_port_priv *pp = host->ports[i]->private_data;
		int irq;

		if (hpriv->flags & AHCI_HFLAG_MULTI_MSIX)
			irq = hpriv->msix[i].vector;
		else
			irq = hpriv->irq + i;
		int irq = ahci_irq_vector(hpriv, i);

		/* Do not receive interrupts sent by dummy ports */
		if (!pp) {