Message ID | 20201104155237.77772-5-sven.auhagen@voleatech.de |
---|---|
State | New |
Headers | show |
Series | Armada8k enable per-port SATA interrupts and drop a hack in the IRQ subsystem | expand |
Hi, On 11/4/20 4:52 PM, sven.auhagen@voleatech.de wrote: > From: Sven Auhagen <sven.auhagen@voleatech.de> > > In order to support custom actions at the end of the irq handler > a multi_irq_host_ack callback is added to the struct ahci_host_priv. > > Suggested-by: Hans de Goede <hdegoede@redhat.com> > Signed-off-by: Sven Auhagen <sven.auhagen@voleatech.de> Thanks, patch looks good to me: Reviewed-by: Hans de Goede <hdegoede@redhat.com> Regards, Hans > --- > drivers/ata/ahci.h | 2 ++ > drivers/ata/libahci.c | 4 ++++ > 2 files changed, 6 insertions(+) > > diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h > index 98b8baa47dc5..d8109e06794c 100644 > --- a/drivers/ata/ahci.h > +++ b/drivers/ata/ahci.h > @@ -371,6 +371,8 @@ struct ahci_host_priv { > /* only required for per-port MSI(-X) support */ > int (*get_irq_vector)(struct ata_host *host, > int port); > + > + int (*multi_irq_host_ack)(int irq, struct ata_port *ap); > }; > > extern int ahci_ignore_sss; > diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c > index ea5bf5f4cbed..cf9839135a57 100644 > --- a/drivers/ata/libahci.c > +++ b/drivers/ata/libahci.c > @@ -1897,6 +1897,7 @@ static void ahci_port_intr(struct ata_port *ap) > static irqreturn_t ahci_multi_irqs_intr_hard(int irq, void *dev_instance) > { > struct ata_port *ap = dev_instance; > + struct ahci_host_priv *hpriv = ap->host->private_data; > void __iomem *port_mmio = ahci_port_base(ap); > u32 status; > > @@ -1909,6 +1910,9 @@ static irqreturn_t ahci_multi_irqs_intr_hard(int irq, void *dev_instance) > ahci_handle_port_interrupt(ap, port_mmio, status); > spin_unlock(ap->lock); > > + if (hpriv->multi_irq_host_ack) > + hpriv->multi_irq_host_ack(irq, ap); > + > VPRINTK("EXIT\n"); > > return IRQ_HANDLED; >
diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h index 98b8baa47dc5..d8109e06794c 100644 --- a/drivers/ata/ahci.h +++ b/drivers/ata/ahci.h @@ -371,6 +371,8 @@ struct ahci_host_priv { /* only required for per-port MSI(-X) support */ int (*get_irq_vector)(struct ata_host *host, int port); + + int (*multi_irq_host_ack)(int irq, struct ata_port *ap); }; extern int ahci_ignore_sss; diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index ea5bf5f4cbed..cf9839135a57 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c @@ -1897,6 +1897,7 @@ static void ahci_port_intr(struct ata_port *ap) static irqreturn_t ahci_multi_irqs_intr_hard(int irq, void *dev_instance) { struct ata_port *ap = dev_instance; + struct ahci_host_priv *hpriv = ap->host->private_data; void __iomem *port_mmio = ahci_port_base(ap); u32 status; @@ -1909,6 +1910,9 @@ static irqreturn_t ahci_multi_irqs_intr_hard(int irq, void *dev_instance) ahci_handle_port_interrupt(ap, port_mmio, status); spin_unlock(ap->lock); + if (hpriv->multi_irq_host_ack) + hpriv->multi_irq_host_ack(irq, ap); + VPRINTK("EXIT\n"); return IRQ_HANDLED;