Commit 7d0724ce authored by Lukas Wunner's avatar Lukas Wunner Committed by Greg Kroah-Hartman

can: hi311x: Use level-triggered interrupt

commit f164d020 upstream.

If the hi3110 shares the SPI bus with another traffic-intensive device
and packets are received in high volume (by a separate machine sending
with "cangen -g 0 -i -x"), reception stops after a few minutes and the
counter in /proc/interrupts stops incrementing.  Bus state is "active".
Bringing the interface down and back up reconvenes the reception.  The
issue is not observed when the hi3110 is the sole device on the SPI bus.

Using a level-triggered interrupt makes the issue go away and lets the
hi3110 successfully receive 2 GByte over the course of 5 days while a
ks8851 Ethernet chip on the same SPI bus handles 6 GByte of traffic.

Unfortunately the hi3110 datasheet is mum on the trigger type.  The pin
description on page 3 only specifies the polarity (active high):
http://www.holtic.com/documents/371-hi-3110_v-rev-kpdf.do

Cc: Mathias Duckeck <m.duckeck@kunbus.de>
Cc: Akshay Bhat <akshay.bhat@timesys.com>
Cc: Casey Fitzpatrick <casey.fitzpatrick@timesys.com>
Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
Cc: linux-stable <stable@vger.kernel.org>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9af977ae
...@@ -18,7 +18,7 @@ Example: ...@@ -18,7 +18,7 @@ Example:
reg = <1>; reg = <1>;
clocks = <&clk32m>; clocks = <&clk32m>;
interrupt-parent = <&gpio4>; interrupt-parent = <&gpio4>;
interrupts = <13 IRQ_TYPE_EDGE_RISING>; interrupts = <13 IRQ_TYPE_LEVEL_HIGH>;
vdd-supply = <&reg5v0>; vdd-supply = <&reg5v0>;
xceiver-supply = <&reg5v0>; xceiver-supply = <&reg5v0>;
}; };
...@@ -760,7 +760,7 @@ static int hi3110_open(struct net_device *net) ...@@ -760,7 +760,7 @@ static int hi3110_open(struct net_device *net)
{ {
struct hi3110_priv *priv = netdev_priv(net); struct hi3110_priv *priv = netdev_priv(net);
struct spi_device *spi = priv->spi; struct spi_device *spi = priv->spi;
unsigned long flags = IRQF_ONESHOT | IRQF_TRIGGER_RISING; unsigned long flags = IRQF_ONESHOT | IRQF_TRIGGER_HIGH;
int ret; int ret;
ret = open_candev(net); ret = open_candev(net);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment