On Mon, Mar 18, 2019 at 08:12:04PM -0500, Alexandru Gagniuc wrote:
> A threaded IRQ with a NULL handler does not work with level-triggered
> interrupts. request_threaded_irq() will return an error:
> 
>   genirq: Threaded irq requested with handler=NULL and !ONESHOT for irq 16
>   pcie_bw_notification: probe of 0000:00:1b.0:pcie010 failed with error -22
> 
> For level interrupts we need to silence the interrupt before exiting
> the IRQ handler, so just clear the PCI_EXP_LNKSTA_LBMS bit there.
> 
> Reported-by: Linus Torvalds <torva...@linux-foundation.org>
> Signed-off-by: Alexandru Gagniuc <mr.nuke...@gmail.com>

I've tested this on my Ivy Bridge MacBook Pro which uses INTx on root and
downstream ports and I'm not seeing probe errors, so:

Tested-by: Lukas Wunner <lu...@wunner.de>


> @@ -67,8 +77,8 @@ static irqreturn_t pcie_bw_notification_handler(int irq, 
> void *context)
>               __pcie_print_link_status(dev, false);
>       up_read(&pci_bus_sem);
>  
> +     pcie_capability_read_word(port, PCI_EXP_LNKSTA, &link_status);
>       pcie_update_link_speed(port->subordinate, link_status);
> -     pcie_capability_write_word(port, PCI_EXP_LNKSTA, events);
>       return IRQ_HANDLED;
>  }

I'd suggest leaving the call to pcie_update_link_speed() in
pcie_bw_notification_irq() to avoid the duplicate read of the
Link Status register.

With that addressed,
Reviewed-by: Lukas Wunner <lu...@wunner.de>

Thanks,

Lukas

Reply via email to