diff options
author | Andri Yngvason <andri.yngvason@marel.com> | 2014-12-03 12:54:14 -0500 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2014-12-07 15:22:10 -0500 |
commit | b12a43e6dd0f201b81f4c1a9654f30d54c4e6838 (patch) | |
tree | b31aa05100e538ab8a57b25e43b52631c6fb237f /drivers/net/can | |
parent | 215db1856e8313ef8a1d9b64346dc261570012a6 (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.c | 48 |
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 */ | 292 | static enum can_state get_new_state(struct net_device *dev, u8 canrflg) |
293 | static 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 | ||
306 | static void mscan_get_rx_frame(struct net_device *dev, struct can_frame *frame) | 303 | static 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; |