summaryrefslogtreecommitdiffstats
path: root/drivers/net/can
diff options
context:
space:
mode:
authorAndri Yngvason <andri.yngvason@marel.com>2014-12-03 12:54:14 -0500
committerMarc Kleine-Budde <mkl@pengutronix.de>2014-12-07 15:22:10 -0500
commitb12a43e6dd0f201b81f4c1a9654f30d54c4e6838 (patch)
treeb31aa05100e538ab8a57b25e43b52631c6fb237f /drivers/net/can
parent215db1856e8313ef8a1d9b64346dc261570012a6 (diff)
can: mscan: Consolidate and unify state change handling
Replacing error state change handling with the new mechanism. Signed-off-by: Andri Yngvason <andri.yngvason@marel.com> Acked-by: Wolfgang Grandegger <wg@grandegger.com> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'drivers/net/can')
-rw-r--r--drivers/net/can/mscan/mscan.c48
1 files changed, 14 insertions, 34 deletions
diff --git a/drivers/net/can/mscan/mscan.c b/drivers/net/can/mscan/mscan.c
index e0c9be5e2ab7..e36b7400d5cc 100644
--- a/drivers/net/can/mscan/mscan.c
+++ b/drivers/net/can/mscan/mscan.c
@@ -289,18 +289,15 @@ static netdev_tx_t mscan_start_xmit(struct sk_buff *skb, struct net_device *dev)
289 return NETDEV_TX_OK; 289 return NETDEV_TX_OK;
290} 290}
291 291
292/* This function returns the old state to see where we came from */ 292static enum can_state get_new_state(struct net_device *dev, u8 canrflg)
293static enum can_state check_set_state(struct net_device *dev, u8 canrflg)
294{ 293{
295 struct mscan_priv *priv = netdev_priv(dev); 294 struct mscan_priv *priv = netdev_priv(dev);
296 enum can_state state, old_state = priv->can.state;
297 295
298 if (canrflg & MSCAN_CSCIF && old_state <= CAN_STATE_BUS_OFF) { 296 if (unlikely(canrflg & MSCAN_CSCIF))
299 state = state_map[max(MSCAN_STATE_RX(canrflg), 297 return state_map[max(MSCAN_STATE_RX(canrflg),
300 MSCAN_STATE_TX(canrflg))]; 298 MSCAN_STATE_TX(canrflg))];
301 priv->can.state = state; 299
302 } 300 return priv->can.state;
303 return old_state;
304} 301}
305 302
306static void mscan_get_rx_frame(struct net_device *dev, struct can_frame *frame) 303static void mscan_get_rx_frame(struct net_device *dev, struct can_frame *frame)
@@ -349,7 +346,7 @@ static void mscan_get_err_frame(struct net_device *dev, struct can_frame *frame,
349 struct mscan_priv *priv = netdev_priv(dev); 346 struct mscan_priv *priv = netdev_priv(dev);
350 struct mscan_regs __iomem *regs = priv->reg_base; 347 struct mscan_regs __iomem *regs = priv->reg_base;
351 struct net_device_stats *stats = &dev->stats; 348 struct net_device_stats *stats = &dev->stats;
352 enum can_state old_state; 349 enum can_state new_state;
353 350
354 netdev_dbg(dev, "error interrupt (canrflg=%#x)\n", canrflg); 351 netdev_dbg(dev, "error interrupt (canrflg=%#x)\n", canrflg);
355 frame->can_id = CAN_ERR_FLAG; 352 frame->can_id = CAN_ERR_FLAG;
@@ -363,27 +360,13 @@ static void mscan_get_err_frame(struct net_device *dev, struct can_frame *frame,
363 frame->data[1] = 0; 360 frame->data[1] = 0;
364 } 361 }
365 362
366 old_state = check_set_state(dev, canrflg); 363 new_state = get_new_state(dev, canrflg);
367 /* State changed */ 364 if (new_state != priv->can.state) {
368 if (old_state != priv->can.state) { 365 can_change_state(dev, frame,
369 switch (priv->can.state) { 366 state_map[MSCAN_STATE_TX(canrflg)],
370 case CAN_STATE_ERROR_WARNING: 367 state_map[MSCAN_STATE_RX(canrflg)]);
371 frame->can_id |= CAN_ERR_CRTL; 368
372 priv->can.can_stats.error_warning++; 369 if (priv->can.state == CAN_STATE_BUS_OFF) {
373 if ((priv->shadow_statflg & MSCAN_RSTAT_MSK) <
374 (canrflg & MSCAN_RSTAT_MSK))
375 frame->data[1] |= CAN_ERR_CRTL_RX_WARNING;
376 if ((priv->shadow_statflg & MSCAN_TSTAT_MSK) <
377 (canrflg & MSCAN_TSTAT_MSK))
378 frame->data[1] |= CAN_ERR_CRTL_TX_WARNING;
379 break;
380 case CAN_STATE_ERROR_PASSIVE:
381 frame->can_id |= CAN_ERR_CRTL;
382 priv->can.can_stats.error_passive++;
383 frame->data[1] |= CAN_ERR_CRTL_RX_PASSIVE;
384 break;
385 case CAN_STATE_BUS_OFF:
386 frame->can_id |= CAN_ERR_BUSOFF;
387 /* 370 /*
388 * The MSCAN on the MPC5200 does recover from bus-off 371 * The MSCAN on the MPC5200 does recover from bus-off
389 * automatically. To avoid that we stop the chip doing 372 * automatically. To avoid that we stop the chip doing
@@ -396,9 +379,6 @@ static void mscan_get_err_frame(struct net_device *dev, struct can_frame *frame,
396 MSCAN_SLPRQ | MSCAN_INITRQ); 379 MSCAN_SLPRQ | MSCAN_INITRQ);
397 } 380 }
398 can_bus_off(dev); 381 can_bus_off(dev);
399 break;
400 default:
401 break;
402 } 382 }
403 } 383 }
404 priv->shadow_statflg = canrflg & MSCAN_STAT_MSK; 384 priv->shadow_statflg = canrflg & MSCAN_STAT_MSK;