On 25.06.2021 15:09:31, Stephane Grosjean wrote: > This patch updates old code by using the functions published since by the > socket-can module. In particular, this new code better manages the change > of bus state by also using the value of the error counters that the driver > now systematically asks for when initializing the channel. > > Signed-off-by: Stephane Grosjean <s.grosjean@xxxxxxxxxxxxxxx> > --- > drivers/net/can/usb/peak_usb/pcan_usb.c | 169 ++++++------------------ > 1 file changed, 41 insertions(+), 128 deletions(-) > > diff --git a/drivers/net/can/usb/peak_usb/pcan_usb.c b/drivers/net/can/usb/peak_usb/pcan_usb.c > index 7d18bc6911f5..1ab3be8dbb83 100644 > --- a/drivers/net/can/usb/peak_usb/pcan_usb.c > +++ b/drivers/net/can/usb/peak_usb/pcan_usb.c > @@ -453,146 +453,59 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n, > { > struct sk_buff *skb; > struct can_frame *cf; > - enum can_state new_state; > + enum can_state new_state = CAN_STATE_ERROR_ACTIVE; > > /* ignore this error until 1st ts received */ > if (n == PCAN_USB_ERROR_QOVR) > if (!mc->pdev->time_ref.tick_count) > return 0; > > - new_state = mc->pdev->dev.can.state; > - > - switch (mc->pdev->dev.can.state) { > - case CAN_STATE_ERROR_ACTIVE: > - if (n & PCAN_USB_ERROR_BUS_LIGHT) { > - new_state = CAN_STATE_ERROR_WARNING; > - break; > - } > - fallthrough; > - > - case CAN_STATE_ERROR_WARNING: > - if (n & PCAN_USB_ERROR_BUS_HEAVY) { > - new_state = CAN_STATE_ERROR_PASSIVE; > - break; > - } > - if (n & PCAN_USB_ERROR_BUS_OFF) { > - new_state = CAN_STATE_BUS_OFF; > - break; > - } > - if (n & ~PCAN_USB_ERROR_BUS) { > - /* > - * trick to bypass next comparison and process other > - * errors > - */ > - new_state = CAN_STATE_MAX; > - break; > - } > - if ((n & PCAN_USB_ERROR_BUS_LIGHT) == 0) { > - /* no error (back to active state) */ > - new_state = CAN_STATE_ERROR_ACTIVE; > - break; > - } > - break; > - > - case CAN_STATE_ERROR_PASSIVE: > - if (n & PCAN_USB_ERROR_BUS_OFF) { > - new_state = CAN_STATE_BUS_OFF; > - break; > - } > - if (n & PCAN_USB_ERROR_BUS_LIGHT) { > - new_state = CAN_STATE_ERROR_WARNING; > - break; > - } > - if (n & ~PCAN_USB_ERROR_BUS) { > - /* > - * trick to bypass next comparison and process other > - * errors > - */ > - new_state = CAN_STATE_MAX; > - break; > - } > - > - if ((n & PCAN_USB_ERROR_BUS_HEAVY) == 0) { > - /* no error (back to warning state) */ > - new_state = CAN_STATE_ERROR_WARNING; > - break; > - } > - break; > - > - default: > - /* do nothing waiting for restart */ > + if (n & PCAN_USB_ERROR_TXQFULL) { > + netdev_dbg(mc->netdev, "device Tx queue full)\n"); > return 0; > } > > - /* donot post any error if current state didn't change */ > - if (mc->pdev->dev.can.state == new_state) > - return 0; > - > /* allocate an skb to store the error frame */ > skb = alloc_can_err_skb(mc->netdev, &cf); Please update the driver, to do the statistics and state update, even if the allocation of the skb fails. Marc -- Pengutronix e.K. | Marc Kleine-Budde | Embedded Linux | https://www.pengutronix.de | Vertretung West/Dortmund | Phone: +49-231-2826-924 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
Attachment:
signature.asc
Description: PGP signature