aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorDong Aisheng <b29396@freescale.com>2014-06-26 05:27:58 -0400
committerDong Aisheng <b29396@freescale.com>2014-06-29 23:36:21 -0400
commitaae2f032d251df790a1bfcf5c0dfa7c194d9cf6a (patch)
tree941ff2b7709b44f00f4538dfc5084c66bfaa9215 /drivers/net
parent19d35d8c55fb1edba73c70cf133c8a361e56a956 (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.c24
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 */
668static void m_can_chip_config(struct net_device *dev) 671static 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);