From 9b9031f6bb44a6077abe5def818bd1da378da3a4 Mon Sep 17 00:00:00 2001 From: Marc Kleine-Budde Date: Tue, 28 Sep 2010 10:18:34 +0200 Subject: [PATCH] --- yaml --- r: 215212 b: refs/heads/master c: d3cd15657516141adce387810be8cb377baf020e h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/net/can/mcp251x.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 4c36ebfafbee..3cc5bbe46ed0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7e15de3a73899903f33975b1ce57cf59c616d1d9 +refs/heads/master: d3cd15657516141adce387810be8cb377baf020e diff --git a/trunk/drivers/net/can/mcp251x.c b/trunk/drivers/net/can/mcp251x.c index 7e2f951002a5..f5e2edd09ce4 100644 --- a/trunk/drivers/net/can/mcp251x.c +++ b/trunk/drivers/net/can/mcp251x.c @@ -125,6 +125,8 @@ # define CANINTF_TX0IF 0x04 # define CANINTF_RX1IF 0x02 # define CANINTF_RX0IF 0x01 +# define CANINTF_ERR_TX \ + (CANINTF_ERRIF | CANINTF_TX2IF | CANINTF_TX1IF | CANINTF_TX0IF) #define EFLG 0x2d # define EFLG_EWARN 0x01 # define EFLG_RXWAR 0x02 @@ -769,10 +771,12 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id) while (!priv->force_quit) { enum can_state new_state; u8 intf, eflag; + u8 clear_intf = 0; int can_id = 0, data1 = 0; mcp251x_read_2regs(spi, CANINTF, &intf, &eflag); + /* receive buffer 0 */ if (intf & CANINTF_RX0IF) { mcp251x_hw_rx(spi, 0); /* Free one buffer ASAP */ @@ -780,10 +784,17 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id) 0x00); } - if (intf & CANINTF_RX1IF) + /* receive buffer 1 */ + if (intf & CANINTF_RX1IF) { mcp251x_hw_rx(spi, 1); + clear_intf |= CANINTF_RX1IF; + } - mcp251x_write_bits(spi, CANINTF, intf, 0x00); + /* any error or tx interrupt we need to clear? */ + if (intf & CANINTF_ERR_TX) + clear_intf |= intf & CANINTF_ERR_TX; + if (clear_intf) + mcp251x_write_bits(spi, CANINTF, clear_intf, 0x00); if (eflag) mcp251x_write_bits(spi, EFLG, eflag, 0x00);