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

Commit a7384925 authored by Kristen Carlson Accardi's avatar Kristen Carlson Accardi Committed by Jeff Garzik
Browse files

ahci: Store interrupt value



Use a stored value for which interrupts to enable.  Changing this allows
us to selectively turn off certain interrupts later and have them
stay off.

Signed-off-by: default avatarKristen Carlson Accardi <kristen.c.accardi@intel.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 2f294968
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -175,6 +175,7 @@ enum {
	AHCI_FLAG_32BIT_ONLY		= (1 << 28), /* force 32bit */
	AHCI_FLAG_MV_PATA		= (1 << 29), /* PATA port */
	AHCI_FLAG_NO_MSI		= (1 << 30), /* no PCI MSI */
	AHCI_FLAG_NO_HOTPLUG		= (1 << 31), /* ignore PxSERR.DIAG.N */

	AHCI_FLAG_COMMON		= ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
					  ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
@@ -215,6 +216,7 @@ struct ahci_port_priv {
	unsigned int		ncq_saw_d2h:1;
	unsigned int		ncq_saw_dmas:1;
	unsigned int		ncq_saw_sdb:1;
	u32 			intr_mask;	/* interrupts to enable */
};

static int ahci_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val);
@@ -1552,6 +1554,7 @@ static void ahci_thaw(struct ata_port *ap)
	void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
	void __iomem *port_mmio = ahci_port_base(ap);
	u32 tmp;
	struct ahci_port_priv *pp = ap->private_data;

	/* clear IRQ */
	tmp = readl(port_mmio + PORT_IRQ_STAT);
@@ -1559,7 +1562,7 @@ static void ahci_thaw(struct ata_port *ap)
	writel(1 << ap->port_no, mmio + HOST_IRQ_STAT);

	/* turn IRQ back on */
	writel(DEF_PORT_IRQ, port_mmio + PORT_IRQ_MASK);
	writel(pp->intr_mask, port_mmio + PORT_IRQ_MASK);
}

static void ahci_error_handler(struct ata_port *ap)
@@ -1713,6 +1716,12 @@ static int ahci_port_start(struct ata_port *ap)
	pp->cmd_tbl = mem;
	pp->cmd_tbl_dma = mem_dma;

	/*
 	 * Save off initial list of interrupts to be enabled.
 	 * This could be changed later
 	 */
	pp->intr_mask = DEF_PORT_IRQ;

	ap->private_data = pp;

	/* engage engines, captain */