Message ID | 20241029084525.2858224-2-dario.binacchi@amarulasolutions.com (mailing list archive) |
---|---|
State | RFC |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | can: dev: add generic function can_update_bus_error_stats() | expand |
Hello Dario, On 29.10.2024 09:44:45, Dario Binacchi wrote: > The function aims to generalize the statistics update by centralizing > the related code, thus avoiding code duplication. > > Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com> > --- no proper review, just found that double assignment. Marc > > (no changes since v1) > > drivers/net/can/dev/dev.c | 30 ++++++++++++++++++++++++++++++ > include/linux/can/dev.h | 1 + > 2 files changed, 31 insertions(+) > > diff --git a/drivers/net/can/dev/dev.c b/drivers/net/can/dev/dev.c > index 6792c14fd7eb..0a3b1aad405b 100644 > --- a/drivers/net/can/dev/dev.c > +++ b/drivers/net/can/dev/dev.c > @@ -16,6 +16,36 @@ > #include <linux/gpio/consumer.h> > #include <linux/of.h> > > +void can_update_bus_error_stats(struct net_device *dev, struct can_frame *cf) > +{ > + struct can_priv *priv = netdev_priv(dev); ^^^^^^^^^^^^^^^^ > + bool rx_errors = false, tx_errors = false; > + > + if (!cf || !(cf->can_id & (CAN_ERR_PROT | CAN_ERR_BUSERROR))) > + return; > + > + priv = netdev_priv(dev); ^^^^^^^^^^^^^^^^ > + priv->can_stats.bus_error++; > + > + if ((cf->can_id & CAN_ERR_ACK) && cf->data[3] == CAN_ERR_PROT_LOC_ACK) > + tx_errors = true; > + else if (cf->data[2] & (CAN_ERR_PROT_BIT1 | CAN_ERR_PROT_BIT0)) > + tx_errors = true; > + > + if (cf->data[2] & (CAN_ERR_PROT_FORM | CAN_ERR_PROT_STUFF)) > + rx_errors = true; > + else if ((cf->data[2] & CAN_ERR_PROT_BIT) && > + (cf->data[3] == CAN_ERR_PROT_LOC_CRC_SEQ)) > + rx_errors = true; > + > + if (rx_errors) > + dev->stats.rx_errors++; > + > + if (tx_errors) > + dev->stats.tx_errors++; > +} > +EXPORT_SYMBOL_GPL(can_update_bus_error_stats); > + > static void can_update_state_error_stats(struct net_device *dev, > enum can_state new_state) > { > diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h > index 23492213ea35..0977656b366d 100644 > --- a/include/linux/can/dev.h > +++ b/include/linux/can/dev.h > @@ -201,6 +201,7 @@ void can_state_get_by_berr_counter(const struct net_device *dev, > enum can_state *rx_state); > void can_change_state(struct net_device *dev, struct can_frame *cf, > enum can_state tx_state, enum can_state rx_state); > +void can_update_bus_error_stats(struct net_device *dev, struct can_frame *cf); > > #ifdef CONFIG_OF > void of_can_transceiver(struct net_device *dev); > -- > 2.43.0 > >
diff --git a/drivers/net/can/dev/dev.c b/drivers/net/can/dev/dev.c index 6792c14fd7eb..0a3b1aad405b 100644 --- a/drivers/net/can/dev/dev.c +++ b/drivers/net/can/dev/dev.c @@ -16,6 +16,36 @@ #include <linux/gpio/consumer.h> #include <linux/of.h> +void can_update_bus_error_stats(struct net_device *dev, struct can_frame *cf) +{ + struct can_priv *priv = netdev_priv(dev); + bool rx_errors = false, tx_errors = false; + + if (!cf || !(cf->can_id & (CAN_ERR_PROT | CAN_ERR_BUSERROR))) + return; + + priv = netdev_priv(dev); + priv->can_stats.bus_error++; + + if ((cf->can_id & CAN_ERR_ACK) && cf->data[3] == CAN_ERR_PROT_LOC_ACK) + tx_errors = true; + else if (cf->data[2] & (CAN_ERR_PROT_BIT1 | CAN_ERR_PROT_BIT0)) + tx_errors = true; + + if (cf->data[2] & (CAN_ERR_PROT_FORM | CAN_ERR_PROT_STUFF)) + rx_errors = true; + else if ((cf->data[2] & CAN_ERR_PROT_BIT) && + (cf->data[3] == CAN_ERR_PROT_LOC_CRC_SEQ)) + rx_errors = true; + + if (rx_errors) + dev->stats.rx_errors++; + + if (tx_errors) + dev->stats.tx_errors++; +} +EXPORT_SYMBOL_GPL(can_update_bus_error_stats); + static void can_update_state_error_stats(struct net_device *dev, enum can_state new_state) { diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h index 23492213ea35..0977656b366d 100644 --- a/include/linux/can/dev.h +++ b/include/linux/can/dev.h @@ -201,6 +201,7 @@ void can_state_get_by_berr_counter(const struct net_device *dev, enum can_state *rx_state); void can_change_state(struct net_device *dev, struct can_frame *cf, enum can_state tx_state, enum can_state rx_state); +void can_update_bus_error_stats(struct net_device *dev, struct can_frame *cf); #ifdef CONFIG_OF void of_can_transceiver(struct net_device *dev);
The function aims to generalize the statistics update by centralizing the related code, thus avoiding code duplication. Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com> --- (no changes since v1) drivers/net/can/dev/dev.c | 30 ++++++++++++++++++++++++++++++ include/linux/can/dev.h | 1 + 2 files changed, 31 insertions(+)