Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cac61a1a authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

media: mantis: prevent staying forever in a loop at IRQ



As warned by smatch:
	drivers/media/pci/mantis/mantis_uart.c:105 mantis_uart_work() warn: this loop depends on readl() succeeding

If something goes wrong at readl(), the logic will stay there
inside an IRQ code forever. This is not the nicest thing to
do :-)

So, add a timeout there, preventing staying inside the IRQ
for more than 10ms.

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent ee2d243d
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -92,6 +92,7 @@ static void mantis_uart_work(struct work_struct *work)
{
	struct mantis_pci *mantis = container_of(work, struct mantis_pci, uart_work);
	u32 stat;
	unsigned long timeout;

	stat = mmread(MANTIS_UART_STAT);

@@ -102,9 +103,15 @@ static void mantis_uart_work(struct work_struct *work)
	 * MANTIS_UART_RXFIFO_DATA is only set if at least
	 * config->bytes + 1 bytes are in the FIFO.
	 */

	/* FIXME: is 10ms good enough ? */
	timeout = jiffies +  msecs_to_jiffies(10);
	while (stat & MANTIS_UART_RXFIFO_DATA) {
		mantis_uart_read(mantis);
		stat = mmread(MANTIS_UART_STAT);

		if (!time_is_after_jiffies(timeout))
			break;
	}

	/* re-enable UART (RX) interrupt */