All of lore.kernel.org
 help / color / mirror / Atom feed
* pull-request: can 2014-08-21
@ 2014-08-21  9:23 Marc Kleine-Budde
  2014-08-21  9:23 ` [PATCH 1/4] can: sja1000: Validate initialization state in start method Marc Kleine-Budde
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Marc Kleine-Budde @ 2014-08-21  9:23 UTC (permalink / raw)
  To: netdev; +Cc: davem, linux-can, kernel

Hello David,

this is a pull request of 4 patches for net.

The first patch is from Mirza Krak, it fixes the initialization of the hardware
in the sja1000 driver. The next patch is contributed by Dan Carpenter, it fixes
the error handling in the c_can's probe function. Then there are two patches
for the flexcan driver, one by Alexander Stein, which fixes the resetting of
the bus error interrupt mask, the other one by Sebastian Andrzej Siewior which
adds an additional error state transition message.

regards,
Marc

---

The following changes since commit 02784f1b05b8f241c8180af88869e717e2758593:

  tipc: Fix build. (2014-08-19 11:16:38 -0700)

are available in the git repository at:

  git://gitorious.org/linux-can/linux-can.git tags/linux-can-fixes-for-3.17-20140821

for you to fetch changes up to 8ce261d0bb491da957278cdcba207791f329d1da:

  can: flexcan: handle state passive -> warning transition (2014-08-21 10:50:00 +0200)

----------------------------------------------------------------
linux-can-fixes-for-3.17-20140821

----------------------------------------------------------------
Alexander Stein (1):
      can: flexcan: Disable error interrupt when bus error reporting is disabled

Dan Carpenter (1):
      can: c_can: checking IS_ERR() instead of NULL

Mirza Krak (1):
      can: sja1000: Validate initialization state in start method

Sebastian Andrzej Siewior (1):
      can: flexcan: handle state passive -> warning transition

 drivers/net/can/c_can/c_can_platform.c |  2 +-
 drivers/net/can/flexcan.c              |  9 +++++
 drivers/net/can/sja1000/sja1000.c      | 62 ++++++++++++++++++----------------
 3 files changed, 43 insertions(+), 30 deletions(-)


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/4] can: sja1000: Validate initialization state in start method
  2014-08-21  9:23 pull-request: can 2014-08-21 Marc Kleine-Budde
@ 2014-08-21  9:23 ` Marc Kleine-Budde
  2014-08-21  9:23 ` [PATCH 2/4] can: c_can: checking IS_ERR() instead of NULL Marc Kleine-Budde
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Marc Kleine-Budde @ 2014-08-21  9:23 UTC (permalink / raw)
  To: netdev; +Cc: davem, linux-can, kernel, Mirza Krak, Marc Kleine-Budde

From: Mirza Krak <mirza.krak@hostmobility.com>

When sja1000 is not compiled as module the SJA1000 chip is only
initialized during device registration on kernel boot. Should the chip
get a hardware reset there is no way to reinitialize it without re-
booting the Linux kernel.

This patch adds a check in sja1000_start if the chip is initialized, if
not we initialize it.

Signed-off-by: Mirza Krak <mirza.krak@hostmobility.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/sja1000/sja1000.c | 62 +++++++++++++++++++++------------------
 1 file changed, 33 insertions(+), 29 deletions(-)

diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c
index d169215..b27ac60 100644
--- a/drivers/net/can/sja1000/sja1000.c
+++ b/drivers/net/can/sja1000/sja1000.c
@@ -172,6 +172,35 @@ static void set_normal_mode(struct net_device *dev)
 	netdev_err(dev, "setting SJA1000 into normal mode failed!\n");
 }
 
+/*
+ * initialize SJA1000 chip:
+ *   - reset chip
+ *   - set output mode
+ *   - set baudrate
+ *   - enable interrupts
+ *   - start operating mode
+ */
+static void chipset_init(struct net_device *dev)
+{
+	struct sja1000_priv *priv = netdev_priv(dev);
+
+	/* set clock divider and output control register */
+	priv->write_reg(priv, SJA1000_CDR, priv->cdr | CDR_PELICAN);
+
+	/* set acceptance filter (accept all) */
+	priv->write_reg(priv, SJA1000_ACCC0, 0x00);
+	priv->write_reg(priv, SJA1000_ACCC1, 0x00);
+	priv->write_reg(priv, SJA1000_ACCC2, 0x00);
+	priv->write_reg(priv, SJA1000_ACCC3, 0x00);
+
+	priv->write_reg(priv, SJA1000_ACCM0, 0xFF);
+	priv->write_reg(priv, SJA1000_ACCM1, 0xFF);
+	priv->write_reg(priv, SJA1000_ACCM2, 0xFF);
+	priv->write_reg(priv, SJA1000_ACCM3, 0xFF);
+
+	priv->write_reg(priv, SJA1000_OCR, priv->ocr | OCR_MODE_NORMAL);
+}
+
 static void sja1000_start(struct net_device *dev)
 {
 	struct sja1000_priv *priv = netdev_priv(dev);
@@ -180,6 +209,10 @@ static void sja1000_start(struct net_device *dev)
 	if (priv->can.state != CAN_STATE_STOPPED)
 		set_reset_mode(dev);
 
+	/* Initialize chip if uninitialized at this stage */
+	if (!(priv->read_reg(priv, SJA1000_CDR) & CDR_PELICAN))
+		chipset_init(dev);
+
 	/* Clear error counters and error code capture */
 	priv->write_reg(priv, SJA1000_TXERR, 0x0);
 	priv->write_reg(priv, SJA1000_RXERR, 0x0);
@@ -237,35 +270,6 @@ static int sja1000_get_berr_counter(const struct net_device *dev,
 }
 
 /*
- * initialize SJA1000 chip:
- *   - reset chip
- *   - set output mode
- *   - set baudrate
- *   - enable interrupts
- *   - start operating mode
- */
-static void chipset_init(struct net_device *dev)
-{
-	struct sja1000_priv *priv = netdev_priv(dev);
-
-	/* set clock divider and output control register */
-	priv->write_reg(priv, SJA1000_CDR, priv->cdr | CDR_PELICAN);
-
-	/* set acceptance filter (accept all) */
-	priv->write_reg(priv, SJA1000_ACCC0, 0x00);
-	priv->write_reg(priv, SJA1000_ACCC1, 0x00);
-	priv->write_reg(priv, SJA1000_ACCC2, 0x00);
-	priv->write_reg(priv, SJA1000_ACCC3, 0x00);
-
-	priv->write_reg(priv, SJA1000_ACCM0, 0xFF);
-	priv->write_reg(priv, SJA1000_ACCM1, 0xFF);
-	priv->write_reg(priv, SJA1000_ACCM2, 0xFF);
-	priv->write_reg(priv, SJA1000_ACCM3, 0xFF);
-
-	priv->write_reg(priv, SJA1000_OCR, priv->ocr | OCR_MODE_NORMAL);
-}
-
-/*
  * transmit a CAN message
  * message layout in the sk_buff should be like this:
  * xx xx xx xx	 ff	 ll   00 11 22 33 44 55 66 77
-- 
2.1.0.rc1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/4] can: c_can: checking IS_ERR() instead of NULL
  2014-08-21  9:23 pull-request: can 2014-08-21 Marc Kleine-Budde
  2014-08-21  9:23 ` [PATCH 1/4] can: sja1000: Validate initialization state in start method Marc Kleine-Budde
@ 2014-08-21  9:23 ` Marc Kleine-Budde
  2014-08-21  9:23 ` [PATCH 3/4] can: flexcan: Disable error interrupt when bus error reporting is disabled Marc Kleine-Budde
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Marc Kleine-Budde @ 2014-08-21  9:23 UTC (permalink / raw)
  To: netdev
  Cc: davem, linux-can, kernel, Dan Carpenter, linux-stable, Marc Kleine-Budde

From: Dan Carpenter <dan.carpenter@oracle.com>

devm_ioremap() returns NULL on error, not an ERR_PTR().

Fixes: 33cf75656923 ('can: c_can_platform: Fix raminit, use devm_ioremap() instead of devm_ioremap_resource()')

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Cc: linux-stable <stable@vger.kernel.org> # >= v3.11
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/c_can/c_can_platform.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/can/c_can/c_can_platform.c b/drivers/net/can/c_can/c_can_platform.c
index 5dede6e..109cb44 100644
--- a/drivers/net/can/c_can/c_can_platform.c
+++ b/drivers/net/can/c_can/c_can_platform.c
@@ -280,7 +280,7 @@ static int c_can_plat_probe(struct platform_device *pdev)
 
 		priv->raminit_ctrlreg = devm_ioremap(&pdev->dev, res->start,
 						     resource_size(res));
-		if (IS_ERR(priv->raminit_ctrlreg) || priv->instance < 0)
+		if (!priv->raminit_ctrlreg || priv->instance < 0)
 			dev_info(&pdev->dev, "control memory is not used for raminit\n");
 		else
 			priv->raminit = c_can_hw_raminit_ti;
-- 
2.1.0.rc1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/4] can: flexcan: Disable error interrupt when bus error reporting is disabled
  2014-08-21  9:23 pull-request: can 2014-08-21 Marc Kleine-Budde
  2014-08-21  9:23 ` [PATCH 1/4] can: sja1000: Validate initialization state in start method Marc Kleine-Budde
  2014-08-21  9:23 ` [PATCH 2/4] can: c_can: checking IS_ERR() instead of NULL Marc Kleine-Budde
@ 2014-08-21  9:23 ` Marc Kleine-Budde
  2014-08-21  9:23 ` [PATCH 4/4] can: flexcan: handle state passive -> warning transition Marc Kleine-Budde
  2014-08-22  4:53 ` pull-request: can 2014-08-21 David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: Marc Kleine-Budde @ 2014-08-21  9:23 UTC (permalink / raw)
  To: netdev; +Cc: davem, linux-can, kernel, Alexander Stein, Marc Kleine-Budde

From: Alexander Stein <alexander.stein@systec-electronic.com>

In case we don't have FLEXCAN_HAS_BROKEN_ERR_STATE and the user set
CAN_CTRLMODE_BERR_REPORTING once it can not be unset again until reboot.
So in case neither hardware nor user wants the error interrupt disable
the bit.

Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/flexcan.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
index f425ec2..a691651 100644
--- a/drivers/net/can/flexcan.c
+++ b/drivers/net/can/flexcan.c
@@ -852,6 +852,8 @@ static int flexcan_chip_start(struct net_device *dev)
 	if (priv->devtype_data->features & FLEXCAN_HAS_BROKEN_ERR_STATE ||
 	    priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
 		reg_ctrl |= FLEXCAN_CTRL_ERR_MSK;
+	else
+		reg_ctrl &= ~FLEXCAN_CTRL_ERR_MSK;
 
 	/* save for later use */
 	priv->reg_ctrl_default = reg_ctrl;
-- 
2.1.0.rc1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 4/4] can: flexcan: handle state passive -> warning transition
  2014-08-21  9:23 pull-request: can 2014-08-21 Marc Kleine-Budde
                   ` (2 preceding siblings ...)
  2014-08-21  9:23 ` [PATCH 3/4] can: flexcan: Disable error interrupt when bus error reporting is disabled Marc Kleine-Budde
@ 2014-08-21  9:23 ` Marc Kleine-Budde
  2014-08-22  4:53 ` pull-request: can 2014-08-21 David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: Marc Kleine-Budde @ 2014-08-21  9:23 UTC (permalink / raw)
  To: netdev
  Cc: davem, linux-can, kernel, Sebastian Andrzej Siewior,
	Matthias Klein, Marc Kleine-Budde

From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

Once the CAN-bus is open and a packet is sent, the controller switches
into the PASSIVE state. Once the BUS is closed again it goes the back
err-warning. The TX error counter goes 0 -> 0x80 -> 0x7f.
This patch makes sure that the user learns about this state chang
(CAN_STATE_ERROR_WARNING => CAN_STATE_ERROR_PASSIVE)

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Matthias Klein <matthias.klein@optimeas.de>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/flexcan.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
index a691651..944aa5d 100644
--- a/drivers/net/can/flexcan.c
+++ b/drivers/net/can/flexcan.c
@@ -549,6 +549,13 @@ static void do_state(struct net_device *dev,
 
 	/* process state changes depending on the new state */
 	switch (new_state) {
+	case CAN_STATE_ERROR_WARNING:
+		netdev_dbg(dev, "Error Warning\n");
+		cf->can_id |= CAN_ERR_CRTL;
+		cf->data[1] = (bec.txerr > bec.rxerr) ?
+			CAN_ERR_CRTL_TX_WARNING :
+			CAN_ERR_CRTL_RX_WARNING;
+		break;
 	case CAN_STATE_ERROR_ACTIVE:
 		netdev_dbg(dev, "Error Active\n");
 		cf->can_id |= CAN_ERR_PROT;
-- 
2.1.0.rc1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: pull-request: can 2014-08-21
  2014-08-21  9:23 pull-request: can 2014-08-21 Marc Kleine-Budde
                   ` (3 preceding siblings ...)
  2014-08-21  9:23 ` [PATCH 4/4] can: flexcan: handle state passive -> warning transition Marc Kleine-Budde
@ 2014-08-22  4:53 ` David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2014-08-22  4:53 UTC (permalink / raw)
  To: mkl; +Cc: netdev, linux-can, kernel

From: Marc Kleine-Budde <mkl@pengutronix.de>
Date: Thu, 21 Aug 2014 11:23:18 +0200

> The first patch is from Mirza Krak, it fixes the initialization of the hardware
> in the sja1000 driver. The next patch is contributed by Dan Carpenter, it fixes
> the error handling in the c_can's probe function. Then there are two patches
> for the flexcan driver, one by Alexander Stein, which fixes the resetting of
> the bus error interrupt mask, the other one by Sebastian Andrzej Siewior which
> adds an additional error state transition message.

Pulled, thanks Marc.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-08-22  4:53 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-08-21  9:23 pull-request: can 2014-08-21 Marc Kleine-Budde
2014-08-21  9:23 ` [PATCH 1/4] can: sja1000: Validate initialization state in start method Marc Kleine-Budde
2014-08-21  9:23 ` [PATCH 2/4] can: c_can: checking IS_ERR() instead of NULL Marc Kleine-Budde
2014-08-21  9:23 ` [PATCH 3/4] can: flexcan: Disable error interrupt when bus error reporting is disabled Marc Kleine-Budde
2014-08-21  9:23 ` [PATCH 4/4] can: flexcan: handle state passive -> warning transition Marc Kleine-Budde
2014-08-22  4:53 ` pull-request: can 2014-08-21 David Miller

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.