diff options
-rw-r--r-- | drivers/net/can/at91_can.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c index 7ef83d06f7ed..892c3d8c64a2 100644 --- a/drivers/net/can/at91_can.c +++ b/drivers/net/can/at91_can.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * at91_can.c - CAN network driver for AT91 SoC CAN controller | 2 | * at91_can.c - CAN network driver for AT91 SoC CAN controller |
3 | * | 3 | * |
4 | * (C) 2007 by Hans J. Koch <hjk@hansjkoch.de> | 4 | * (C) 2007 by Hans J. Koch <hjk@hansjkoch.de> |
5 | * (C) 2008, 2009, 2010 by Marc Kleine-Budde <kernel@pengutronix.de> | 5 | * (C) 2008, 2009, 2010, 2011 by Marc Kleine-Budde <kernel@pengutronix.de> |
6 | * | 6 | * |
7 | * This software may be distributed under the terms of the GNU General | 7 | * This software may be distributed under the terms of the GNU General |
8 | * Public License ("GPL") version 2 as distributed in the 'COPYING' | 8 | * Public License ("GPL") version 2 as distributed in the 'COPYING' |
@@ -55,7 +55,8 @@ | |||
55 | #define AT91_MB_RX_MASK(i) ((1 << (i)) - 1) | 55 | #define AT91_MB_RX_MASK(i) ((1 << (i)) - 1) |
56 | #define AT91_MB_RX_SPLIT 8 | 56 | #define AT91_MB_RX_SPLIT 8 |
57 | #define AT91_MB_RX_LOW_LAST (AT91_MB_RX_SPLIT - 1) | 57 | #define AT91_MB_RX_LOW_LAST (AT91_MB_RX_SPLIT - 1) |
58 | #define AT91_MB_RX_LOW_MASK (AT91_MB_RX_MASK(AT91_MB_RX_SPLIT)) | 58 | #define AT91_MB_RX_LOW_MASK (AT91_MB_RX_MASK(AT91_MB_RX_SPLIT) & \ |
59 | ~AT91_MB_RX_MASK(AT91_MB_RX_FIRST)) | ||
59 | 60 | ||
60 | #define AT91_MB_TX_NUM (1 << AT91_MB_TX_SHIFT) | 61 | #define AT91_MB_TX_NUM (1 << AT91_MB_TX_SHIFT) |
61 | #define AT91_MB_TX_FIRST (AT91_MB_RX_LAST + 1) | 62 | #define AT91_MB_TX_FIRST (AT91_MB_RX_LAST + 1) |
@@ -254,7 +255,8 @@ static void at91_setup_mailboxes(struct net_device *dev) | |||
254 | set_mb_mode_prio(priv, i, AT91_MB_MODE_TX, 0); | 255 | set_mb_mode_prio(priv, i, AT91_MB_MODE_TX, 0); |
255 | 256 | ||
256 | /* Reset tx and rx helper pointers */ | 257 | /* Reset tx and rx helper pointers */ |
257 | priv->tx_next = priv->tx_echo = priv->rx_next = 0; | 258 | priv->tx_next = priv->tx_echo = 0; |
259 | priv->rx_next = AT91_MB_RX_FIRST; | ||
258 | } | 260 | } |
259 | 261 | ||
260 | static int at91_set_bittiming(struct net_device *dev) | 262 | static int at91_set_bittiming(struct net_device *dev) |
@@ -590,10 +592,10 @@ static int at91_poll_rx(struct net_device *dev, int quota) | |||
590 | "order of incoming frames cannot be guaranteed\n"); | 592 | "order of incoming frames cannot be guaranteed\n"); |
591 | 593 | ||
592 | again: | 594 | again: |
593 | for (mb = find_next_bit(addr, AT91_MB_RX_NUM, priv->rx_next); | 595 | for (mb = find_next_bit(addr, AT91_MB_RX_LAST + 1, priv->rx_next); |
594 | mb < AT91_MB_RX_NUM && quota > 0; | 596 | mb < AT91_MB_RX_LAST + 1 && quota > 0; |
595 | reg_sr = at91_read(priv, AT91_SR), | 597 | reg_sr = at91_read(priv, AT91_SR), |
596 | mb = find_next_bit(addr, AT91_MB_RX_NUM, ++priv->rx_next)) { | 598 | mb = find_next_bit(addr, AT91_MB_RX_LAST + 1, ++priv->rx_next)) { |
597 | at91_read_msg(dev, mb); | 599 | at91_read_msg(dev, mb); |
598 | 600 | ||
599 | /* reactivate mailboxes */ | 601 | /* reactivate mailboxes */ |
@@ -610,8 +612,8 @@ static int at91_poll_rx(struct net_device *dev, int quota) | |||
610 | 612 | ||
611 | /* upper group completed, look again in lower */ | 613 | /* upper group completed, look again in lower */ |
612 | if (priv->rx_next > AT91_MB_RX_LOW_LAST && | 614 | if (priv->rx_next > AT91_MB_RX_LOW_LAST && |
613 | quota > 0 && mb >= AT91_MB_RX_NUM) { | 615 | quota > 0 && mb > AT91_MB_RX_LAST) { |
614 | priv->rx_next = 0; | 616 | priv->rx_next = AT91_MB_RX_FIRST; |
615 | goto again; | 617 | goto again; |
616 | } | 618 | } |
617 | 619 | ||