Consolidate and unify state change handling
PATCH 2/4 Consolidate and unify state change handling
Signed-off-by Andri Yngvason <[email protected]>
--- drivers/net/can/flexcan.c | 66 +++-------------------------------------------- 1 file changed, 3 insertions(+), 63 deletions(-)
drivers/net/can/flexcan.c +3 -63
@@ -559,74 +559,15 @@ static int flexcan_poll_bus_err(struct net_device *dev, u32 reg_esr)static void do_state (struct net_device *dev,struct can_frame *cf,enum can_state new_state) { -struct flexcan_priv *priv =netdev_priv (dev);struct can_berr_counter bec;__flexcan_get_berr_counter (dev, &bec); -switch (priv->can.state) { -case CAN_STATE_ERROR_ACTIVE : -/* -* from: ERROR_ACTIVE -* to : ERROR_WARNING, ERROR_PASSIVE, BUS_OFF -* => : there was a warning int -*/ -if (new_state >=CAN_STATE_ERROR_WARNING && - new_state <=CAN_STATE_BUS_OFF ) { -netdev_dbg (dev,"Error Warning IRQ\n" ); - priv->can.can_stats.error_warning++; - - cf->can_id |=CAN_ERR_CRTL ; - cf->data[1 ] = (bec.txerr > bec.rxerr) ? -CAN_ERR_CRTL_TX_WARNING : -CAN_ERR_CRTL_RX_WARNING ; - } -case CAN_STATE_ERROR_WARNING :/* fallthrough */ -/* -* from: ERROR_ACTIVE, ERROR_WARNING -* to : ERROR_PASSIVE, BUS_OFF -* => : error passive int -*/ -if (new_state >=CAN_STATE_ERROR_PASSIVE && - new_state <=CAN_STATE_BUS_OFF ) { -netdev_dbg (dev,"Error Passive IRQ\n" ); - priv->can.can_stats.error_passive++; - - cf->can_id |=CAN_ERR_CRTL ; - cf->data[1 ] = (bec.txerr > bec.rxerr) ? -CAN_ERR_CRTL_TX_PASSIVE : -CAN_ERR_CRTL_RX_PASSIVE ; - } -break ; -case CAN_STATE_BUS_OFF : -netdev_err (dev,"BUG! " -"hardware recovered automatically from BUS_OFF\n" ); -break ; -default : -break ; - } +can_change_state (dev, cf, new_state, +can_get_err_dir (bec.rxerr, bec.txerr)); -/* 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 ; - cf->data[2 ] =CAN_ERR_PROT_ACTIVE ; -break ; -case CAN_STATE_BUS_OFF : - cf->can_id |=CAN_ERR_BUSOFF ; +if (unlikely (new_state ==CAN_STATE_BUS_OFF ))can_bus_off (dev); -break ; -default : -break ; - } }static int flexcan_poll_state (struct net_device *dev,u32 reg_esr)
@@ -658,7 +599,6 @@ static int flexcan_poll_state(struct net_device *dev, u32 reg_esr)return 0 ;do_state (dev, cf, new_state); - priv->can.state = new_state;netif_receive_skb (skb); dev->stats.rx_packets++;