Skip to content

Commit 215a004

Browse files
committed
Merge tag 'linux-can-fixes-for-3.17-20140821' of git://gitorious.org/linux-can/linux-can
Marc Kleine-Budde says: ==================== pull-request: can 2014-08-21 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. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 29aaee6 + 8ce261d commit 215a004

File tree

3 files changed

+43
-30
lines changed

3 files changed

+43
-30
lines changed

drivers/net/can/c_can/c_can_platform.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ static int c_can_plat_probe(struct platform_device *pdev)
280280

281281
priv->raminit_ctrlreg = devm_ioremap(&pdev->dev, res->start,
282282
resource_size(res));
283-
if (IS_ERR(priv->raminit_ctrlreg) || priv->instance < 0)
283+
if (!priv->raminit_ctrlreg || priv->instance < 0)
284284
dev_info(&pdev->dev, "control memory is not used for raminit\n");
285285
else
286286
priv->raminit = c_can_hw_raminit_ti;

drivers/net/can/flexcan.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,13 @@ static void do_state(struct net_device *dev,
549549

550550
/* process state changes depending on the new state */
551551
switch (new_state) {
552+
case CAN_STATE_ERROR_WARNING:
553+
netdev_dbg(dev, "Error Warning\n");
554+
cf->can_id |= CAN_ERR_CRTL;
555+
cf->data[1] = (bec.txerr > bec.rxerr) ?
556+
CAN_ERR_CRTL_TX_WARNING :
557+
CAN_ERR_CRTL_RX_WARNING;
558+
break;
552559
case CAN_STATE_ERROR_ACTIVE:
553560
netdev_dbg(dev, "Error Active\n");
554561
cf->can_id |= CAN_ERR_PROT;
@@ -852,6 +859,8 @@ static int flexcan_chip_start(struct net_device *dev)
852859
if (priv->devtype_data->features & FLEXCAN_HAS_BROKEN_ERR_STATE ||
853860
priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
854861
reg_ctrl |= FLEXCAN_CTRL_ERR_MSK;
862+
else
863+
reg_ctrl &= ~FLEXCAN_CTRL_ERR_MSK;
855864

856865
/* save for later use */
857866
priv->reg_ctrl_default = reg_ctrl;

drivers/net/can/sja1000/sja1000.c

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,35 @@ static void set_normal_mode(struct net_device *dev)
172172
netdev_err(dev, "setting SJA1000 into normal mode failed!\n");
173173
}
174174

175+
/*
176+
* initialize SJA1000 chip:
177+
* - reset chip
178+
* - set output mode
179+
* - set baudrate
180+
* - enable interrupts
181+
* - start operating mode
182+
*/
183+
static void chipset_init(struct net_device *dev)
184+
{
185+
struct sja1000_priv *priv = netdev_priv(dev);
186+
187+
/* set clock divider and output control register */
188+
priv->write_reg(priv, SJA1000_CDR, priv->cdr | CDR_PELICAN);
189+
190+
/* set acceptance filter (accept all) */
191+
priv->write_reg(priv, SJA1000_ACCC0, 0x00);
192+
priv->write_reg(priv, SJA1000_ACCC1, 0x00);
193+
priv->write_reg(priv, SJA1000_ACCC2, 0x00);
194+
priv->write_reg(priv, SJA1000_ACCC3, 0x00);
195+
196+
priv->write_reg(priv, SJA1000_ACCM0, 0xFF);
197+
priv->write_reg(priv, SJA1000_ACCM1, 0xFF);
198+
priv->write_reg(priv, SJA1000_ACCM2, 0xFF);
199+
priv->write_reg(priv, SJA1000_ACCM3, 0xFF);
200+
201+
priv->write_reg(priv, SJA1000_OCR, priv->ocr | OCR_MODE_NORMAL);
202+
}
203+
175204
static void sja1000_start(struct net_device *dev)
176205
{
177206
struct sja1000_priv *priv = netdev_priv(dev);
@@ -180,6 +209,10 @@ static void sja1000_start(struct net_device *dev)
180209
if (priv->can.state != CAN_STATE_STOPPED)
181210
set_reset_mode(dev);
182211

212+
/* Initialize chip if uninitialized at this stage */
213+
if (!(priv->read_reg(priv, SJA1000_CDR) & CDR_PELICAN))
214+
chipset_init(dev);
215+
183216
/* Clear error counters and error code capture */
184217
priv->write_reg(priv, SJA1000_TXERR, 0x0);
185218
priv->write_reg(priv, SJA1000_RXERR, 0x0);
@@ -236,35 +269,6 @@ static int sja1000_get_berr_counter(const struct net_device *dev,
236269
return 0;
237270
}
238271

239-
/*
240-
* initialize SJA1000 chip:
241-
* - reset chip
242-
* - set output mode
243-
* - set baudrate
244-
* - enable interrupts
245-
* - start operating mode
246-
*/
247-
static void chipset_init(struct net_device *dev)
248-
{
249-
struct sja1000_priv *priv = netdev_priv(dev);
250-
251-
/* set clock divider and output control register */
252-
priv->write_reg(priv, SJA1000_CDR, priv->cdr | CDR_PELICAN);
253-
254-
/* set acceptance filter (accept all) */
255-
priv->write_reg(priv, SJA1000_ACCC0, 0x00);
256-
priv->write_reg(priv, SJA1000_ACCC1, 0x00);
257-
priv->write_reg(priv, SJA1000_ACCC2, 0x00);
258-
priv->write_reg(priv, SJA1000_ACCC3, 0x00);
259-
260-
priv->write_reg(priv, SJA1000_ACCM0, 0xFF);
261-
priv->write_reg(priv, SJA1000_ACCM1, 0xFF);
262-
priv->write_reg(priv, SJA1000_ACCM2, 0xFF);
263-
priv->write_reg(priv, SJA1000_ACCM3, 0xFF);
264-
265-
priv->write_reg(priv, SJA1000_OCR, priv->ocr | OCR_MODE_NORMAL);
266-
}
267-
268272
/*
269273
* transmit a CAN message
270274
* message layout in the sk_buff should be like this:

0 commit comments

Comments
 (0)