diff options
author | Dong Aisheng <b29396@freescale.com> | 2014-06-26 05:27:58 -0400 |
---|---|---|
committer | Dong Aisheng <b29396@freescale.com> | 2014-06-29 23:36:21 -0400 |
commit | aae2f032d251df790a1bfcf5c0dfa7c194d9cf6a (patch) | |
tree | 941ff2b7709b44f00f4538dfc5084c66bfaa9215 /drivers/net | |
parent | 19d35d8c55fb1edba73c70cf133c8a361e56a956 (diff) |
ENGR00320354-2 can: m_can: add loopback and monitor mode support
add loopback and monitor mode support.
Signed-off-by: Dong Aisheng <b29396@freescale.com>
(cherry picked from commit 534152b41012b4648c22b37f2feb0ddb6a6cde2e)
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/can/m_can.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/net/can/m_can.c b/drivers/net/can/m_can.c index 1a320aff2b27..ed6d86bfdd02 100644 --- a/drivers/net/can/m_can.c +++ b/drivers/net/can/m_can.c | |||
@@ -94,8 +94,12 @@ enum m_can_lec_type { | |||
94 | LEC_CRC_ERROR, | 94 | LEC_CRC_ERROR, |
95 | LEC_UNUSED, | 95 | LEC_UNUSED, |
96 | }; | 96 | }; |
97 | /* Test Register (TEST) */ | ||
98 | #define TEST_LBCK BIT(4) | ||
97 | 99 | ||
98 | /* CC Control Register(CCCR) */ | 100 | /* CC Control Register(CCCR) */ |
101 | #define CCCR_TEST BIT(7) | ||
102 | #define CCCR_MON BIT(5) | ||
99 | #define CCCR_CCE BIT(1) | 103 | #define CCCR_CCE BIT(1) |
100 | #define CCCR_INIT BIT(0) | 104 | #define CCCR_INIT BIT(0) |
101 | 105 | ||
@@ -661,13 +665,13 @@ static int m_can_set_bittiming(struct net_device *dev) | |||
661 | * - configure rx fifo | 665 | * - configure rx fifo |
662 | * - accept non-matching frame into fifo 0 | 666 | * - accept non-matching frame into fifo 0 |
663 | * - configure tx buffer | 667 | * - configure tx buffer |
668 | * - configure mode | ||
664 | * - setup bittiming | 669 | * - setup bittiming |
665 | * - TODO: | ||
666 | * 1) other working modes support like monitor, loopback... | ||
667 | */ | 670 | */ |
668 | static void m_can_chip_config(struct net_device *dev) | 671 | static void m_can_chip_config(struct net_device *dev) |
669 | { | 672 | { |
670 | struct m_can_priv *priv = netdev_priv(dev); | 673 | struct m_can_priv *priv = netdev_priv(dev); |
674 | u32 cccr, test; | ||
671 | 675 | ||
672 | m_can_config_endisable(priv, true); | 676 | m_can_config_endisable(priv, true); |
673 | 677 | ||
@@ -694,6 +698,22 @@ static void m_can_chip_config(struct net_device *dev) | |||
694 | m_can_write(priv, M_CAN_RXF1C, (priv->rxf1_elems << RXFC_FS_OFF) | | 698 | m_can_write(priv, M_CAN_RXF1C, (priv->rxf1_elems << RXFC_FS_OFF) | |
695 | RXFC_FWM_1 | (priv->mram_off + priv->rxf1_off)); | 699 | RXFC_FWM_1 | (priv->mram_off + priv->rxf1_off)); |
696 | 700 | ||
701 | cccr = m_can_read(priv, M_CAN_CCCR); | ||
702 | cccr &= ~(CCCR_TEST | CCCR_MON); | ||
703 | test = m_can_read(priv, M_CAN_TEST); | ||
704 | test &= ~TEST_LBCK; | ||
705 | |||
706 | if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) | ||
707 | cccr |= CCCR_MON; | ||
708 | |||
709 | if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) { | ||
710 | cccr |= CCCR_TEST; | ||
711 | test |= TEST_LBCK; | ||
712 | } | ||
713 | |||
714 | m_can_write(priv, M_CAN_CCCR, cccr); | ||
715 | m_can_write(priv, M_CAN_TEST, test); | ||
716 | |||
697 | /* enable all interrupts */ | 717 | /* enable all interrupts */ |
698 | m_can_write(priv, M_CAN_IR, IR_ALL_INT); | 718 | m_can_write(priv, M_CAN_IR, IR_ALL_INT); |
699 | m_can_write(priv, M_CAN_IE, IR_ALL_INT); | 719 | m_can_write(priv, M_CAN_IE, IR_ALL_INT); |