Messages in this thread |  | | From | Muni Sekhar <> | Date | Tue, 7 Jan 2020 21:45:13 +0530 | Subject | pcie: xilinx: kernel hang - ISR readl() |
| |
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
|  |