]> www.infradead.org Git - nvme.git/commitdiff
can: peak_usb: report bus recovery as well
authorJeroen Hofstee <jhofstee@victronenergy.com>
Wed, 25 Sep 2019 08:58:45 +0000 (08:58 +0000)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Mon, 4 Nov 2019 20:47:20 +0000 (21:47 +0100)
While the state changes are reported when the error counters increase
and decrease, there is no event when the bus recovers and the error
counters decrease again. So add those as well.

Change the state going downward to be ERROR_PASSIVE -> ERROR_WARNING ->
ERROR_ACTIVE instead of directly to ERROR_ACTIVE again.

Signed-off-by: Jeroen Hofstee <jhofstee@victronenergy.com>
Cc: Stephane Grosjean <s.grosjean@peak-system.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/usb/peak_usb/pcan_usb.c

index 5a66c9f53aae624df321fb1725a04ec775cce920..d2539c95adb65cc24cc7bdb73a954d721071d1a1 100644 (file)
@@ -436,8 +436,8 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n,
                }
                if ((n & PCAN_USB_ERROR_BUS_LIGHT) == 0) {
                        /* no error (back to active state) */
-                       mc->pdev->dev.can.state = CAN_STATE_ERROR_ACTIVE;
-                       return 0;
+                       new_state = CAN_STATE_ERROR_ACTIVE;
+                       break;
                }
                break;
 
@@ -460,9 +460,9 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n,
                }
 
                if ((n & PCAN_USB_ERROR_BUS_HEAVY) == 0) {
-                       /* no error (back to active state) */
-                       mc->pdev->dev.can.state = CAN_STATE_ERROR_ACTIVE;
-                       return 0;
+                       /* no error (back to warning state) */
+                       new_state = CAN_STATE_ERROR_WARNING;
+                       break;
                }
                break;
 
@@ -501,6 +501,11 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n,
                mc->pdev->dev.can.can_stats.error_warning++;
                break;
 
+       case CAN_STATE_ERROR_ACTIVE:
+               cf->can_id |= CAN_ERR_CRTL;
+               cf->data[1] = CAN_ERR_CRTL_ACTIVE;
+               break;
+
        default:
                /* CAN_STATE_MAX (trick to handle other errors) */
                cf->can_id |= CAN_ERR_CRTL;