@@ -289,18 +289,15 @@ static netdev_tx_t mscan_start_xmit(struct sk_buff *skb, struct net_device *dev)
289
289
return NETDEV_TX_OK ;
290
290
}
291
291
292
- /* This function returns the old state to see where we came from */
293
- static enum can_state check_set_state (struct net_device * dev , u8 canrflg )
292
+ static enum can_state get_new_state (struct net_device * dev , u8 canrflg )
294
293
{
295
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 ) {
299
- state = state_map [max (MSCAN_STATE_RX (canrflg ),
300
- MSCAN_STATE_TX (canrflg ))];
301
- priv -> can .state = state ;
302
- }
303
- return old_state ;
296
+ if (unlikely (canrflg & MSCAN_CSCIF ))
297
+ return state_map [max (MSCAN_STATE_RX (canrflg ),
298
+ MSCAN_STATE_TX (canrflg ))];
299
+
300
+ return priv -> can .state ;
304
301
}
305
302
306
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
346
struct mscan_priv * priv = netdev_priv (dev );
350
347
struct mscan_regs __iomem * regs = priv -> reg_base ;
351
348
struct net_device_stats * stats = & dev -> stats ;
352
- enum can_state old_state ;
349
+ enum can_state new_state ;
353
350
354
351
netdev_dbg (dev , "error interrupt (canrflg=%#x)\n" , canrflg );
355
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
360
frame -> data [1 ] = 0 ;
364
361
}
365
362
366
- old_state = check_set_state (dev , canrflg );
367
- /* State changed */
368
- if (old_state != priv -> can .state ) {
369
- switch (priv -> can .state ) {
370
- case CAN_STATE_ERROR_WARNING :
371
- frame -> can_id |= CAN_ERR_CRTL ;
372
- priv -> can .can_stats .error_warning ++ ;
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 ;
363
+ new_state = get_new_state (dev , canrflg );
364
+ if (new_state != priv -> can .state ) {
365
+ can_change_state (dev , frame ,
366
+ state_map [MSCAN_STATE_TX (canrflg )],
367
+ state_map [MSCAN_STATE_RX (canrflg )]);
368
+
369
+ if (priv -> can .state == CAN_STATE_BUS_OFF ) {
387
370
/*
388
371
* The MSCAN on the MPC5200 does recover from bus-off
389
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
379
MSCAN_SLPRQ | MSCAN_INITRQ );
397
380
}
398
381
can_bus_off (dev );
399
- break ;
400
- default :
401
- break ;
402
382
}
403
383
}
404
384
priv -> shadow_statflg = canrflg & MSCAN_STAT_MSK ;
0 commit comments