pcie: xilinx: kernel hang - ISR readl()
From: Muni Sekhar
Date: Tue Jan 07 2020 - 11:15:28 EST
Hi,
I have module with Xilinx FPGA. It implements UART(s), SPI(s),
parallel I/O and interfaces them to the Host CPU via PCI Express bus.
I see that my system freezes without capturing the crash dump for
certain tests. I debugged this issue and it was tracked down to the
below mentioned interrupt handler code.
In ISR, first reads the Interrupt Status register using âreadl()â as
given below.
status = readl(ctrl->reg + INT_STATUS);
And then clears the pending interrupts using âwritel()â as given blow.
writel(status, ctrl->reg + INT_STATUS);
I've noticed a kernel hang if INT_STATUS register read again after
clearing the pending interrupts.
Can someone clarify me why the kernel hangs without crash dump incase
if I read the INT_STATUS register using readl() after clearing the
pending bits?
Can readl() block?
Snippet of the ISR code is given blow:
https://pastebin.com/WdnZJZF5
static irqreturn_t pcie_isr(int irq, void *dev_id)
{
struct test_device *ctrl = data;
u32 status;
â
status = readl(ctrl->reg + INT_STATUS);
/*
* Check to see if it was our interrupt
*/
if (!(status & 0x000C))
return IRQ_NONE;
/* Clear the interrupt */
writel(status, ctrl->reg + INT_STATUS);
if (status & 0x0004) {
/*
* Tx interrupt pending.
*/
....
}
if (status & 0x0008) {
/* Rx interrupt Pending */
/* The system freezes if I read again the INT_STATUS
register as given below */
status = readl(ctrl->reg + INT_STATUS);
....
}
..
return IRQ_HANDLED;
}
--
Thanks,
Sekhar