All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] mcp251x: mcp2515 stops receiving
@ 2014-05-08  6:33 Rost, Martin
  2014-05-12 17:00 ` Marc Kleine-Budde
  0 siblings, 1 reply; 10+ messages in thread
From: Rost, Martin @ 2014-05-08  6:33 UTC (permalink / raw)
  To: linux-can@vger.kernel.org

[-- Attachment #1: Type: text/plain, Size: 2186 bytes --]


The mcp2515 sometimes seems to trigger an interrupt with the corresponding register not being set yet.
This makes the driver exit the interrupt because there is obviously nothing to do, but the interrupt line is kept low.
Therefore the driver does not see any more interrupts until the chip is reset (via interface down/up).

This patch changes the IST to first check the IRQ registers, and wait up to 10 ms if an event really occurrs.
If the IRQ register is still empty after 10ms, a kernel message gets issued.
The IST loop is rearranged to evaluate the IRQ register at the last moment before exiting, to not miss a late irq event.

---
diff --git "a/mcp251x.c" "b/mcp251x.c"
index ad58ac6..668ce63 100644
--- "a/mcp251x.c"	
+++ "b/mcp251x.c"	
@@ -806,15 +806,29 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id)
 	struct mcp251x_priv *priv = dev_id;
 	struct spi_device *spi = priv->spi;
 	struct net_device *net = priv->net;
+	u8 intf, eflag;
+	u8 retrycount = 10;
 
 	mutex_lock(&priv->mcp_lock);
-	while (!priv->force_quit) {
+	
+	do {
+	mcp251x_read_2regs(spi, CANINTF, &intf, &eflag);
+		if (!intf) {
+//			printk(KERN_CRIT "MCP251x: IRQ delaying.\r\n");
+			mdelay(1);
+		}
+	} while (!intf && (retrycount--));
+	
+	if (!intf)
+		printk(KERN_CRIT "MCP251x: IRQ without a cause.\r\n");
+	
+	while ((!priv->force_quit) && (intf)) {
 		enum can_state new_state;
-		u8 intf, eflag;
+//		u8 intf, eflag;
 		u8 clear_intf = 0;
 		int can_id = 0, data1 = 0;
 
-		mcp251x_read_2regs(spi, CANINTF, &intf, &eflag);
+//		mcp251x_read_2regs(spi, CANINTF, &intf, &eflag);
 
 		/* mask out flags we don't care about */
 		intf &= CANINTF_RX | CANINTF_TX | CANINTF_ERR;
@@ -913,8 +927,8 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id)
 			}
 		}
 
-		if (intf == 0)
-			break;
+//		if (intf == 0)
+//			break;
 
 		if (intf & CANINTF_TX) {
 			net->stats.tx_packets++;
@@ -926,6 +940,7 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id)
 			netif_wake_queue(net);
 		}
 
+		mcp251x_read_2regs(spi, CANINTF, &intf, &eflag);
 	}
 	mutex_unlock(&priv->mcp_lock);
 	return IRQ_HANDLED;

---


[-- Attachment #2: smime.p7s --]
[-- Type: application/x-pkcs7-signature, Size: 2015 bytes --]

^ permalink raw reply related	[flat|nested] 10+ messages in thread
* Re: [PATCH] mcp251x: mcp2515 stops receiving
@ 2014-05-12 17:27 Rost, Martin
  0 siblings, 0 replies; 10+ messages in thread
From: Rost, Martin @ 2014-05-12 17:27 UTC (permalink / raw)
  To: linux-can@vger.kernel.org

[-- Attachment #1: Type: text/plain, Size: 770 bytes --]


Hello Marc,

> Hmmmm, I think level triggered interrupt would help here. However not
> all interrupt controller support level interrupts and
> arch/arm/mach-pxa/icontrol.c sets the trigger to rising edge.

That was my first attempt. That explains why it didn't help, too.

> What happens if the register is still empty after 10ms? Can we do
> something better than the print, which will probably not fix the probem...

I thought about re-checking the line if the IRQ line was released, but I have no clue how to do that...
I haven't seen a problem when returning regardless (in my setup), but I'd like to give a hint at least in case someone runs into the same problem.

> I'll send a cleaned version of you patch.
much appreciated.

Regards,
Martin.

[-- Attachment #2: smime.p7s --]
[-- Type: application/x-pkcs7-signature, Size: 2015 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2014-05-22 16:14 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-08  6:33 [PATCH] mcp251x: mcp2515 stops receiving Rost, Martin
2014-05-12 17:00 ` Marc Kleine-Budde
2014-05-12 17:14   ` Alexander Shiyan
2014-05-12 17:34     ` AW: " Rost, Martin
2014-05-12 17:47       ` Alexander Shiyan
2014-05-21 23:53   ` John Whitmore
2014-05-22  6:38     ` Rost, Martin
2014-05-22 10:28       ` John Whitmore
2014-05-22 16:08       ` Gerhard Bertelsmann
  -- strict thread matches above, loose matches on Subject: below --
2014-05-12 17:27 Rost, Martin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.