Thread (1 message) 1 message, 1 author, 2016-07-06

Re: BUG: INTx is assered unexpectly when unload AHCI driver with MSIx support.

From: "tj@kernel.org" <tj@kernel.org>
Date: 2016-07-06 13:52:41
Also in: lkml

Hello,

(Can you please flow the text a bit below 80 column when you reply?)

On Wed, Jul 06, 2016 at 02:51:47AM +0000, Pang Raymond wrote:
Why does the phenomenon appear?
	Two factors cause this problem.
		1. In MSIx's irq handler
		   (ahci_multi_irqs_intr_hard()), we do not clear
		   GHC.IS register which presents which ports need
		   interrupt service.  static irqreturn_t
		   ahci_multi_irqs_intr_hard(int irq, void
		   *dev_instance)
			{
				//  omitting unconcerned codes here
				// ...				
				// here we just clear PxIS register, not clear GHC.IS
				status = readl(port_mmio + PORT_IRQ_STAT);
				writel(status, port_mmio + PORT_IRQ_STAT);
				// ...
			}
		2. In PCI subsystem, after Disable MSIx, INTx is
	   enabled automatically.
			void pci_msix_shutdown(struct pci_dev *dev)
			{
				// omitting unconcerned codes here
				// ...				
				// after Disable MSIx, enable INTx imediately
				pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
				pci_intx_for_msi(dev, 1);
				dev->msix_enabled = 0;
				pcibios_alloc_irq(dev);
			}

When Kernel enables INTx(I mean clearing PCI configure space
Rx04.bit10), controller will find GHC.IS is not Zero (because driver
haven't cleared GHC.IS after servicing MSIx interrupt), so it
believes some SATA ports need interrupt servicing and asserts INTx
interrupt.
Looks like you debugged the problem.  Care to write up and test a
patch?

Thanks a lot!

-- 
tejun
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help