linux/drivers/net/can
Thomas Gleixner 710c56105d can: c_can: Remove EOB exit
The rx_poll code has the following gem:

	if (msg_ctrl_save & IF_MCONT_EOB)
		return num_rx_pkts;

The EOB bit is the indicator for the hardware that this is the last
configured FIFO object. But this object can contain valid data, if we
manage to free up objects before the overrun case hits.

Now if the code exits due to the EOB bit set, then this buffer is
stale and the interrupt bit and NewDat bit of the buffer are still
set. Results in a nice interrupt storm unless we come into an overrun
situation where the MSGLST bit gets set.

     ksoftirqd/0-3     [000] ..s.    79.124101: c_can_poll: rx_poll: val: 00008001 pend 00008001
     ksoftirqd/0-3     [000] ..s.    79.124176: c_can_poll: rx_poll: val: 00008000 pend 00008000
     ksoftirqd/0-3     [000] ..s.    79.124187: c_can_poll: rx_poll: val: 00008002 pend 00008002
     ksoftirqd/0-3     [000] ..s.    79.124256: c_can_poll: rx_poll: val: 00008000 pend 00008000
     ksoftirqd/0-3     [000] ..s.    79.124267: c_can_poll: rx_poll: val: 00008000 pend 00008000

The amazing thing is that the check of the MSGLST (aka overrun bit)
used to be after the check of the EOB bit. That was "fixed" in commit
5d0f801a2c(can: c_can: Fix RX message handling, handle lost message
before EOB). But the author of this "fix" did not even understand that
the EOB check is broken as well.

Again a simple solution: Remove

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
[mkl: adjusted subject and commit message]
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
2014-04-01 11:54:59 +02:00
..
c_can can: c_can: Remove EOB exit 2014-04-01 11:54:59 +02:00
cc770 can: cc770: use dev_get_platdata() 2013-09-21 15:43:13 +02:00
mscan Merge remote-tracking branch 'agust/next' into next 2014-01-29 16:53:55 +11:00
sja1000 can: sja1000: add support for Elcus CAN200PCI 2014-01-11 19:43:16 +01:00
softing drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
usb can: usb_8dev: Fix memory leak in usb_8dev_start_xmit 2014-04-01 11:54:55 +02:00
at91_can.c drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
bfin_can.c drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
dev.c can: add destructor for self generated skbs 2014-01-30 16:25:49 -08:00
flexcan.c can: flexcan: factor out soft reset into seperate funtion 2014-03-03 14:29:51 +01:00
grcan.c drivers: remove unnecessary prom.h includes 2013-10-09 20:03:58 -05:00
janz-ican3.c linux-can-fixes-for-3.14-20140129 2014-01-30 16:48:17 -08:00
Kconfig can: flexcan: fix flexcan driver build for big endian on ARM and little endian on PowerPc 2014-01-29 20:23:22 +01:00
led.c net: pass info struct via netdevice notifier 2013-05-28 13:11:01 -07:00
Makefile can: add tx/rx LED trigger support 2013-01-26 16:58:59 +01:00
mcp251x.c can: mcp251x: Add device tree support 2013-12-21 15:04:24 +01:00
pch_can.c drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
slcan.c can: Fix FSF address in file headers 2013-12-17 11:47:21 +01:00
ti_hecc.c drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
vcan.c can: add destructor for self generated skbs 2014-01-30 16:25:49 -08:00