Skip to content

Commit

Permalink
3.8: MCP2515 and CAN cape fixes
Browse files Browse the repository at this point in the history
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
  • Loading branch information
koenkooi committed May 24, 2013
1 parent e8f4879 commit 5623fc4
Show file tree
Hide file tree
Showing 2 changed files with 217 additions and 0 deletions.
166 changes: 166 additions & 0 deletions patches/net/0004-beaglebone-TT3201-MCP2515-fixes.patch
@@ -0,0 +1,166 @@
From 18059dc985a3f2523553a560bbc5100653fd3158 Mon Sep 17 00:00:00 2001
From: Alessandro Zummo <a.zummo@towertech.it>
Date: Thu, 23 May 2013 20:57:04 +0200
Subject: [PATCH 4/4] beaglebone: TT3201 MCP2515 fixes

Signed-off-by: Alessandro Zummo <a.zummo@towertech.it>
---
drivers/net/can/mcp251x.c | 47 +++++++++++++++++++++++++++++++++++++----------
1 file changed, 37 insertions(+), 10 deletions(-)

diff --git a/drivers/net/can/mcp251x.c b/drivers/net/can/mcp251x.c
index 42b6d69..3555ef44 100644
--- a/drivers/net/can/mcp251x.c
+++ b/drivers/net/can/mcp251x.c
@@ -98,8 +98,9 @@
# define CANCTRL_REQOP_LOOPBACK 0x40
# define CANCTRL_REQOP_SLEEP 0x20
# define CANCTRL_REQOP_NORMAL 0x00
-# define CANCTRL_OSM 0x08
# define CANCTRL_ABAT 0x10
+# define CANCTRL_OSM 0x08
+# define CANCTRL_CLKEN 0x04
#define TEC 0x1c
#define REC 0x1d
#define CNF1 0x2a
@@ -292,7 +293,7 @@ static void mcp251x_clean(struct net_device *net)
/*
* Note about handling of error return of mcp251x_spi_trans: accessing
* registers via SPI is not really different conceptually than using
- * normal I/O assembler instructions, although it's much more
+ * normal I/O assembly instructions, although it's much more
* complicated from a practical POV. So it's not advisable to always
* check the return value of this function. Imagine that every
* read{b,l}, write{b,l} and friends would be bracketed in "if ( < 0)
@@ -499,7 +500,7 @@ static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx)

static void mcp251x_hw_sleep(struct spi_device *spi)
{
- mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_SLEEP);
+// mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_SLEEP);
}

static netdev_tx_t mcp251x_hard_start_xmit(struct sk_buff *skb,
@@ -556,13 +557,16 @@ static int mcp251x_set_normal_mode(struct spi_device *spi)

if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) {
/* Put device into loopback mode */
- mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LOOPBACK);
+ mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LOOPBACK | CANCTRL_CLKEN);
} else if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) {
/* Put device into listen-only mode */
- mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LISTEN_ONLY);
+ mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LISTEN_ONLY | CANCTRL_CLKEN);
} else {
/* Put device into normal mode */
- mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_NORMAL);
+ mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_NORMAL | CANCTRL_CLKEN);
+
+ netdev_info(priv->net, "CANCTRL: 0x%02x\n",
+ mcp251x_read_reg(spi, CANCTRL));

/* Wait for the device to enter normal mode */
timeout = jiffies + HZ;
@@ -594,11 +598,15 @@ static int mcp251x_do_set_bittiming(struct net_device *net)
(bt->prop_seg - 1));
mcp251x_write_bits(spi, CNF3, CNF3_PHSEG2_MASK,
(bt->phase_seg2 - 1));
- dev_info(&spi->dev, "CNF: 0x%02x 0x%02x 0x%02x\n",
+
+ netdev_info(net, "CNF: 0x%02x 0x%02x 0x%02x\n",
mcp251x_read_reg(spi, CNF1),
mcp251x_read_reg(spi, CNF2),
mcp251x_read_reg(spi, CNF3));

+ netdev_info(net, "CANCTRL: 0x%02x\n",
+ mcp251x_read_reg(spi, CANCTRL));
+
return 0;
}

@@ -609,6 +617,7 @@ static int mcp251x_setup(struct net_device *net, struct mcp251x_priv *priv,

mcp251x_write_reg(spi, RXBCTRL(0),
RXBCTRL_BUKT | RXBCTRL_RXM0 | RXBCTRL_RXM1);
+
mcp251x_write_reg(spi, RXBCTRL(1),
RXBCTRL_RXM0 | RXBCTRL_RXM1);
return 0;
@@ -736,7 +745,9 @@ static void mcp251x_tx_work_handler(struct work_struct *ws)
mutex_lock(&priv->mcp_lock);
if (priv->tx_skb) {
if (priv->can.state == CAN_STATE_BUS_OFF) {
+
mcp251x_clean(net);
+
} else {
frame = (struct can_frame *)priv->tx_skb->data;

@@ -835,21 +846,37 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id)

/* Update can state */
if (eflag & EFLG_TXBO) {
+
+ netdev_err(net, "err: bus off\n");
+
new_state = CAN_STATE_BUS_OFF;
can_id |= CAN_ERR_BUSOFF;
} else if (eflag & EFLG_TXEP) {
+
+ netdev_err(net, "err: txep\n");
+
new_state = CAN_STATE_ERROR_PASSIVE;
can_id |= CAN_ERR_CRTL;
data1 |= CAN_ERR_CRTL_TX_PASSIVE;
+
} else if (eflag & EFLG_RXEP) {
+
+ netdev_err(net, "err: rxep\n");
+
new_state = CAN_STATE_ERROR_PASSIVE;
can_id |= CAN_ERR_CRTL;
data1 |= CAN_ERR_CRTL_RX_PASSIVE;
} else if (eflag & EFLG_TXWAR) {
+
+ netdev_err(net, "err: txwar\n");
+
new_state = CAN_STATE_ERROR_WARNING;
can_id |= CAN_ERR_CRTL;
data1 |= CAN_ERR_CRTL_TX_WARNING;
} else if (eflag & EFLG_RXWAR) {
+
+ netdev_err(net, "err: rxwar\n");
+
new_state = CAN_STATE_ERROR_WARNING;
can_id |= CAN_ERR_CRTL;
data1 |= CAN_ERR_CRTL_RX_WARNING;
@@ -927,7 +954,7 @@ static int mcp251x_open(struct net_device *net)

ret = open_candev(net);
if (ret) {
- dev_err(&spi->dev, "unable to set initial baudrate!\n");
+ netdev_err(net, "failed to open can device\n");
return ret;
}

@@ -948,7 +975,7 @@ static int mcp251x_open(struct net_device *net)
ret = request_threaded_irq(spi->irq, NULL, mcp251x_can_ist,
flags, DEVICE_NAME, priv);
if (ret) {
- dev_err(&spi->dev, "failed to acquire irq %d\n", spi->irq);
+ netdev_err(net, "failed to acquire irq %d\n", spi->irq);
if (pdata->transceiver_enable)
pdata->transceiver_enable(0);
close_candev(net);
@@ -1084,7 +1111,7 @@ static int mcp251x_can_probe(struct spi_device *spi)

ret = register_candev(net);
if (!ret) {
- dev_info(&spi->dev, "probed\n");
+ netdev_info(priv->net, "probed\n");
return ret;
}
error_probe:
--
1.8.1.4

@@ -0,0 +1,51 @@
From de3ce36b51d63f87ed68251bc64dd20c79cf74c7 Mon Sep 17 00:00:00 2001
From: Pantelis Antoniou <panto@antoniou-consulting.com>
Date: Mon, 20 May 2013 16:11:38 +0300
Subject: [PATCH 4/4] capes: Update RS232 + CAN capes with resources

---
firmware/capes/BB-BONE-RS232-00A0.dts | 8 ++++++++
firmware/capes/BB-BONE-SERL-01-00A1.dts | 8 ++++++++
2 files changed, 16 insertions(+)

diff --git a/firmware/capes/BB-BONE-RS232-00A0.dts b/firmware/capes/BB-BONE-RS232-00A0.dts
index 220c85d..ad627c58 100644
--- a/firmware/capes/BB-BONE-RS232-00A0.dts
+++ b/firmware/capes/BB-BONE-RS232-00A0.dts
@@ -15,6 +15,14 @@
part-number = "BB-BONE-RS232";
version = "00A0";

+ /* state the resources this cape uses */
+ exclusive-use =
+ /* the pin header uses */
+ "P9.22", /* rs232: uart2_rxd */
+ "P9.21", /* rs232: uart2_txd */
+ /* the hardware IP uses */
+ "uart2";
+
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
diff --git a/firmware/capes/BB-BONE-SERL-01-00A1.dts b/firmware/capes/BB-BONE-SERL-01-00A1.dts
index b0459c8..93b1bfc 100644
--- a/firmware/capes/BB-BONE-SERL-01-00A1.dts
+++ b/firmware/capes/BB-BONE-SERL-01-00A1.dts
@@ -14,6 +14,14 @@
part-number = "BB-BONE-SERL-01";
version = "00A1";

+ /* state the resources this cape uses */
+ exclusive-use =
+ /* the pin header uses */
+ "P9.26", /* dcan1: dcan1_tx */
+ "P9.24", /* dcan1: dcan1_rx */
+ /* the hardware IP uses */
+ "dcan1";
+
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
--
1.8.1.4

0 comments on commit 5623fc4

Please sign in to comment.