@@ -926,6 +926,42 @@ kvaser_usb_hydra_bus_status_to_can_state(const struct kvaser_usb_net_priv *priv,
926
926
}
927
927
}
928
928
929
+ static void kvaser_usb_hydra_change_state (struct kvaser_usb_net_priv * priv ,
930
+ const struct can_berr_counter * bec ,
931
+ struct can_frame * cf ,
932
+ enum can_state new_state )
933
+ {
934
+ struct net_device * netdev = priv -> netdev ;
935
+ enum can_state old_state = priv -> can .state ;
936
+ enum can_state tx_state , rx_state ;
937
+
938
+ tx_state = (bec -> txerr >= bec -> rxerr ) ?
939
+ new_state : CAN_STATE_ERROR_ACTIVE ;
940
+ rx_state = (bec -> txerr <= bec -> rxerr ) ?
941
+ new_state : CAN_STATE_ERROR_ACTIVE ;
942
+ can_change_state (netdev , cf , tx_state , rx_state );
943
+
944
+ if (new_state == CAN_STATE_BUS_OFF && old_state < CAN_STATE_BUS_OFF ) {
945
+ if (priv -> can .restart_ms == 0 )
946
+ kvaser_usb_hydra_send_simple_cmd_async (priv , CMD_STOP_CHIP_REQ );
947
+
948
+ can_bus_off (netdev );
949
+ }
950
+
951
+ if (priv -> can .restart_ms &&
952
+ old_state >= CAN_STATE_BUS_OFF &&
953
+ new_state < CAN_STATE_BUS_OFF ) {
954
+ priv -> can .can_stats .restarts ++ ;
955
+ if (cf )
956
+ cf -> can_id |= CAN_ERR_RESTARTED ;
957
+ }
958
+ if (cf && new_state != CAN_STATE_BUS_OFF ) {
959
+ cf -> can_id |= CAN_ERR_CNT ;
960
+ cf -> data [6 ] = bec -> txerr ;
961
+ cf -> data [7 ] = bec -> rxerr ;
962
+ }
963
+ }
964
+
929
965
static void kvaser_usb_hydra_update_state (struct kvaser_usb_net_priv * priv ,
930
966
u8 bus_status ,
931
967
const struct can_berr_counter * bec )
@@ -951,41 +987,11 @@ static void kvaser_usb_hydra_update_state(struct kvaser_usb_net_priv *priv,
951
987
return ;
952
988
953
989
skb = alloc_can_err_skb (netdev , & cf );
954
- if (skb ) {
955
- enum can_state tx_state , rx_state ;
956
-
957
- tx_state = (bec -> txerr >= bec -> rxerr ) ?
958
- new_state : CAN_STATE_ERROR_ACTIVE ;
959
- rx_state = (bec -> txerr <= bec -> rxerr ) ?
960
- new_state : CAN_STATE_ERROR_ACTIVE ;
961
- can_change_state (netdev , cf , tx_state , rx_state );
962
- }
963
-
964
- if (new_state == CAN_STATE_BUS_OFF && old_state < CAN_STATE_BUS_OFF ) {
965
- if (!priv -> can .restart_ms )
966
- kvaser_usb_hydra_send_simple_cmd_async
967
- (priv , CMD_STOP_CHIP_REQ );
968
-
969
- can_bus_off (netdev );
970
- }
971
-
972
- if (!skb ) {
990
+ kvaser_usb_hydra_change_state (priv , bec , cf , new_state );
991
+ if (skb )
992
+ netif_rx (skb );
993
+ else
973
994
netdev_warn (netdev , "No memory left for err_skb\n" );
974
- return ;
975
- }
976
-
977
- if (priv -> can .restart_ms &&
978
- old_state >= CAN_STATE_BUS_OFF &&
979
- new_state < CAN_STATE_BUS_OFF )
980
- priv -> can .can_stats .restarts ++ ;
981
-
982
- if (new_state != CAN_STATE_BUS_OFF ) {
983
- cf -> can_id |= CAN_ERR_CNT ;
984
- cf -> data [6 ] = bec -> txerr ;
985
- cf -> data [7 ] = bec -> rxerr ;
986
- }
987
-
988
- netif_rx (skb );
989
995
}
990
996
991
997
static void kvaser_usb_hydra_state_event (const struct kvaser_usb * dev ,
@@ -1080,7 +1086,6 @@ kvaser_usb_hydra_error_frame(struct kvaser_usb_net_priv *priv,
1080
1086
struct net_device_stats * stats = & netdev -> stats ;
1081
1087
struct can_frame * cf ;
1082
1088
struct sk_buff * skb ;
1083
- struct skb_shared_hwtstamps * shhwtstamps ;
1084
1089
struct can_berr_counter bec ;
1085
1090
enum can_state new_state , old_state ;
1086
1091
u8 bus_status ;
@@ -1097,51 +1102,22 @@ kvaser_usb_hydra_error_frame(struct kvaser_usb_net_priv *priv,
1097
1102
& new_state );
1098
1103
1099
1104
skb = alloc_can_err_skb (netdev , & cf );
1105
+ if (new_state != old_state )
1106
+ kvaser_usb_hydra_change_state (priv , & bec , cf , new_state );
1100
1107
1101
- if (new_state != old_state ) {
1102
- if (skb ) {
1103
- enum can_state tx_state , rx_state ;
1104
-
1105
- tx_state = (bec .txerr >= bec .rxerr ) ?
1106
- new_state : CAN_STATE_ERROR_ACTIVE ;
1107
- rx_state = (bec .txerr <= bec .rxerr ) ?
1108
- new_state : CAN_STATE_ERROR_ACTIVE ;
1109
-
1110
- can_change_state (netdev , cf , tx_state , rx_state );
1111
-
1112
- if (priv -> can .restart_ms &&
1113
- old_state >= CAN_STATE_BUS_OFF &&
1114
- new_state < CAN_STATE_BUS_OFF )
1115
- cf -> can_id |= CAN_ERR_RESTARTED ;
1116
- }
1117
-
1118
- if (new_state == CAN_STATE_BUS_OFF ) {
1119
- if (!priv -> can .restart_ms )
1120
- kvaser_usb_hydra_send_simple_cmd_async
1121
- (priv , CMD_STOP_CHIP_REQ );
1122
-
1123
- can_bus_off (netdev );
1124
- }
1125
- }
1126
-
1127
- if (!skb ) {
1128
- stats -> rx_dropped ++ ;
1129
- netdev_warn (netdev , "No memory left for err_skb\n" );
1130
- return ;
1131
- }
1132
-
1133
- shhwtstamps = skb_hwtstamps (skb );
1134
- shhwtstamps -> hwtstamp = hwtstamp ;
1108
+ if (skb ) {
1109
+ struct skb_shared_hwtstamps * shhwtstamps = skb_hwtstamps (skb );
1135
1110
1136
- cf -> can_id |= CAN_ERR_BUSERROR ;
1137
- if (new_state != CAN_STATE_BUS_OFF ) {
1138
- cf -> can_id |= CAN_ERR_CNT ;
1111
+ shhwtstamps -> hwtstamp = hwtstamp ;
1112
+ cf -> can_id |= CAN_ERR_BUSERROR | CAN_ERR_CNT ;
1139
1113
cf -> data [6 ] = bec .txerr ;
1140
1114
cf -> data [7 ] = bec .rxerr ;
1115
+ netif_rx (skb );
1116
+ } else {
1117
+ stats -> rx_dropped ++ ;
1118
+ netdev_warn (netdev , "No memory left for err_skb\n" );
1141
1119
}
1142
1120
1143
- netif_rx (skb );
1144
-
1145
1121
priv -> bec .txerr = bec .txerr ;
1146
1122
priv -> bec .rxerr = bec .rxerr ;
1147
1123
}
0 commit comments