@@ -239,41 +239,42 @@ static void esd_usb_rx_event(struct esd_usb_net_priv *priv,
239
239
msg -> msg .rx .dlc , state , ecc , rxerr , txerr );
240
240
241
241
skb = alloc_can_err_skb (priv -> netdev , & cf );
242
- if (skb == NULL ) {
243
- stats -> rx_dropped ++ ;
244
- return ;
245
- }
246
242
247
243
if (state != priv -> old_state ) {
244
+ enum can_state tx_state , rx_state ;
245
+ enum can_state new_state = CAN_STATE_ERROR_ACTIVE ;
246
+
248
247
priv -> old_state = state ;
249
248
250
249
switch (state & ESD_BUSSTATE_MASK ) {
251
250
case ESD_BUSSTATE_BUSOFF :
252
- priv -> can .state = CAN_STATE_BUS_OFF ;
253
- cf -> can_id |= CAN_ERR_BUSOFF ;
254
- priv -> can .can_stats .bus_off ++ ;
251
+ new_state = CAN_STATE_BUS_OFF ;
255
252
can_bus_off (priv -> netdev );
256
253
break ;
257
254
case ESD_BUSSTATE_WARN :
258
- priv -> can .state = CAN_STATE_ERROR_WARNING ;
259
- priv -> can .can_stats .error_warning ++ ;
255
+ new_state = CAN_STATE_ERROR_WARNING ;
260
256
break ;
261
257
case ESD_BUSSTATE_ERRPASSIVE :
262
- priv -> can .state = CAN_STATE_ERROR_PASSIVE ;
263
- priv -> can .can_stats .error_passive ++ ;
258
+ new_state = CAN_STATE_ERROR_PASSIVE ;
264
259
break ;
265
260
default :
266
- priv -> can . state = CAN_STATE_ERROR_ACTIVE ;
261
+ new_state = CAN_STATE_ERROR_ACTIVE ;
267
262
txerr = 0 ;
268
263
rxerr = 0 ;
269
264
break ;
270
265
}
271
- } else {
266
+
267
+ if (new_state != priv -> can .state ) {
268
+ tx_state = (txerr >= rxerr ) ? new_state : 0 ;
269
+ rx_state = (txerr <= rxerr ) ? new_state : 0 ;
270
+ can_change_state (priv -> netdev , cf ,
271
+ tx_state , rx_state );
272
+ }
273
+ } else if (skb ) {
272
274
priv -> can .can_stats .bus_error ++ ;
273
275
stats -> rx_errors ++ ;
274
276
275
- cf -> can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR |
276
- CAN_ERR_CNT ;
277
+ cf -> can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR ;
277
278
278
279
switch (ecc & SJA1000_ECC_MASK ) {
279
280
case SJA1000_ECC_BIT :
@@ -295,21 +296,20 @@ static void esd_usb_rx_event(struct esd_usb_net_priv *priv,
295
296
296
297
/* Bit stream position in CAN frame as the error was detected */
297
298
cf -> data [3 ] = ecc & SJA1000_ECC_SEG ;
298
-
299
- if (priv -> can .state == CAN_STATE_ERROR_WARNING ||
300
- priv -> can .state == CAN_STATE_ERROR_PASSIVE ) {
301
- cf -> data [1 ] = (txerr > rxerr ) ?
302
- CAN_ERR_CRTL_TX_PASSIVE :
303
- CAN_ERR_CRTL_RX_PASSIVE ;
304
- }
305
- cf -> data [6 ] = txerr ;
306
- cf -> data [7 ] = rxerr ;
307
299
}
308
300
309
301
priv -> bec .txerr = txerr ;
310
302
priv -> bec .rxerr = rxerr ;
311
303
312
- netif_rx (skb );
304
+ if (skb ) {
305
+ cf -> can_id |= CAN_ERR_CNT ;
306
+ cf -> data [6 ] = txerr ;
307
+ cf -> data [7 ] = rxerr ;
308
+
309
+ netif_rx (skb );
310
+ } else {
311
+ stats -> rx_dropped ++ ;
312
+ }
313
313
}
314
314
}
315
315
0 commit comments