The Bosch MCAN hardware (3.1.0 and above) supports interrupt flag to
detect Protocol error in arbitration phase.
Transmit error statistics is currently not updated from the MCAN driver.
Protocol error in arbitration phase is a TX error and the network
statistics should be updated accordingly.
The member "tx_error" of "struct net_device_stats" should be incremented
as arbitration is a transmit protocol error. Also "arbitration_lost" of
"struct can_device_stats" should be incremented to report arbitration
lost.
Signed-off-by: Pankaj Sharma <redacted>
Signed-off-by: Sriram Dash <redacted>
---
changes in v2:
- common m_can_ prefix for is_protocol_err function
- handling stats even if the allocation of the skb fails
- resolving build errors on net-next branch
drivers/net/can/m_can/m_can.c | 37 +++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
@@ -778,6 +778,38 @@ static inline bool is_lec_err(u32 psr)returnpsr&&(psr!=LEC_UNUSED);}+staticinlineboolm_can_is_protocol_err(u32irqstatus)+{+returnirqstatus&IR_ERR_LEC_31X;+}++staticintm_can_handle_protocol_error(structnet_device*dev,u32irqstatus)+{+structnet_device_stats*stats=&dev->stats;+structm_can_classdev*cdev=netdev_priv(dev);+structcan_frame*cf;+structsk_buff*skb;++/* propagate the error condition to the CAN stack */+skb=alloc_can_err_skb(dev,&cf);+if(unlikely(!skb)){+netdev_dbg(dev,"allocation of skb failed\n");+stats->tx_errors++;+return0;+}+if(cdev->version>=31&&(irqstatus&IR_PEA)){+netdev_dbg(dev,"Protocol error in Arbitration fail\n");+stats->tx_errors++;+cdev->can.can_stats.arbitration_lost++;+cf->can_id|=CAN_ERR_LOSTARB;+cf->data[0]|=CAN_ERR_LOSTARB_UNSPEC;+}++netif_receive_skb(skb);++return1;+}+staticintm_can_handle_bus_errors(structnet_device*dev,u32irqstatus,u32psr){
@@ -792,6 +824,11 @@ static int m_can_handle_bus_errors(struct net_device *dev, u32 irqstatus,is_lec_err(psr))work_done+=m_can_handle_lec_err(dev,psr&LEC_UNUSED);+/* handle protocol errors in arbitration phase */+if((cdev->can.ctrlmode&CAN_CTRLMODE_BERR_REPORTING)&&+m_can_is_protocol_err(irqstatus))+work_done+=m_can_handle_protocol_error(dev,irqstatus);+/* other unproccessed error interrupts */m_can_handle_other_err(dev,irqstatus);
From: Pankaj Sharma <redacted>
Subject: [PATCH v2] can: m_can: add support for handling arbitration error
The Bosch MCAN hardware (3.1.0 and above) supports interrupt flag to detect
Protocol error in arbitration phase.
Transmit error statistics is currently not updated from the MCAN driver.
Protocol error in arbitration phase is a TX error and the network statistics should
be updated accordingly.
The member "tx_error" of "struct net_device_stats" should be incremented as
arbitration is a transmit protocol error. Also "arbitration_lost" of "struct
can_device_stats" should be incremented to report arbitration lost.
Signed-off-by: Pankaj Sharma <redacted>
Signed-off-by: Sriram Dash <redacted>
---
changes in v2:
- common m_can_ prefix for is_protocol_err function
- handling stats even if the allocation of the skb fails
- resolving build errors on net-next branch
drivers/net/can/m_can/m_can.c | 37
+++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
@@ -778,6 +778,38 @@ static inline bool is_lec_err(u32 psr)returnpsr&&(psr!=LEC_UNUSED);}+staticinlineboolm_can_is_protocol_err(u32irqstatus){+returnirqstatus&IR_ERR_LEC_31X;+}++staticintm_can_handle_protocol_error(structnet_device*dev,u32+irqstatus){+structnet_device_stats*stats=&dev->stats;+structm_can_classdev*cdev=netdev_priv(dev);+structcan_frame*cf;+structsk_buff*skb;++/* propagate the error condition to the CAN stack */+skb=alloc_can_err_skb(dev,&cf);+if(unlikely(!skb)){+netdev_dbg(dev,"allocation of skb failed\n");+stats->tx_errors++;+return0;+}+if(cdev->version>=31&&(irqstatus&IR_PEA)){+netdev_dbg(dev,"Protocol error in Arbitration fail\n");+stats->tx_errors++;+cdev->can.can_stats.arbitration_lost++;+cf->can_id|=CAN_ERR_LOSTARB;+cf->data[0]|=CAN_ERR_LOSTARB_UNSPEC;+}++netif_receive_skb(skb);++return1;+}+staticintm_can_handle_bus_errors(structnet_device*dev,u32irqstatus,u32psr){
@@ -792,6 +824,11 @@ static int m_can_handle_bus_errors(struct net_device
From: Simon Horman <hidden> Date: 2019-10-25 11:16:34
On Mon, Oct 21, 2019 at 05:43:36PM +0530, Pankaj Sharma wrote:
The Bosch MCAN hardware (3.1.0 and above) supports interrupt flag to
detect Protocol error in arbitration phase.
Transmit error statistics is currently not updated from the MCAN driver.
Protocol error in arbitration phase is a TX error and the network
statistics should be updated accordingly.
The member "tx_error" of "struct net_device_stats" should be incremented
as arbitration is a transmit protocol error. Also "arbitration_lost" of
"struct can_device_stats" should be incremented to report arbitration
lost.
Signed-off-by: Pankaj Sharma <redacted>
Signed-off-by: Sriram Dash <redacted>
---
changes in v2:
- common m_can_ prefix for is_protocol_err function
- handling stats even if the allocation of the skb fails
- resolving build errors on net-next branch
From: Marc Kleine-Budde <mkl@pengutronix.de> Date: 2019-10-29 14:23:53
On 10/21/19 2:13 PM, Pankaj Sharma wrote:
quoted hunk
The Bosch MCAN hardware (3.1.0 and above) supports interrupt flag to
detect Protocol error in arbitration phase.
Transmit error statistics is currently not updated from the MCAN driver.
Protocol error in arbitration phase is a TX error and the network
statistics should be updated accordingly.
The member "tx_error" of "struct net_device_stats" should be incremented
as arbitration is a transmit protocol error. Also "arbitration_lost" of
"struct can_device_stats" should be incremented to report arbitration
lost.
Signed-off-by: Pankaj Sharma <redacted>
Signed-off-by: Sriram Dash <redacted>
---
changes in v2:
- common m_can_ prefix for is_protocol_err function
- handling stats even if the allocation of the skb fails
- resolving build errors on net-next branch
drivers/net/can/m_can/m_can.c | 37 +++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
@@ -778,6 +778,38 @@ static inline bool is_lec_err(u32 psr)returnpsr&&(psr!=LEC_UNUSED);}+staticinlineboolm_can_is_protocol_err(u32irqstatus)+{+returnirqstatus&IR_ERR_LEC_31X;+}++staticintm_can_handle_protocol_error(structnet_device*dev,u32irqstatus)+{+structnet_device_stats*stats=&dev->stats;+structm_can_classdev*cdev=netdev_priv(dev);+structcan_frame*cf;+structsk_buff*skb;++/* propagate the error condition to the CAN stack */+skb=alloc_can_err_skb(dev,&cf);+if(unlikely(!skb)){+netdev_dbg(dev,"allocation of skb failed\n");+stats->tx_errors++;+return0;+}+if(cdev->version>=31&&(irqstatus&IR_PEA)){+netdev_dbg(dev,"Protocol error in Arbitration fail\n");+stats->tx_errors++;+cdev->can.can_stats.arbitration_lost++;
If the skb allocation fails, you miss the stats here.
From: Marc Kleine-Budde <mkl@pengutronix.de>
Subject: Re: [PATCH v2] can: m_can: add support for handling arbitration error
On 10/21/19 2:13 PM, Pankaj Sharma wrote:
quoted
The Bosch MCAN hardware (3.1.0 and above) supports interrupt flag to
detect Protocol error in arbitration phase.
Transmit error statistics is currently not updated from the MCAN driver.
Protocol error in arbitration phase is a TX error and the network
statistics should be updated accordingly.
The member "tx_error" of "struct net_device_stats" should be
incremented as arbitration is a transmit protocol error. Also
"arbitration_lost" of "struct can_device_stats" should be incremented
to report arbitration lost.
Signed-off-by: Pankaj Sharma <redacted>
Signed-off-by: Sriram Dash <redacted>
---
changes in v2:
- common m_can_ prefix for is_protocol_err function
- handling stats even if the allocation of the skb fails
- resolving build errors on net-next branch
drivers/net/can/m_can/m_can.c | 37
+++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/drivers/net/can/m_can/m_can.c
b/drivers/net/can/m_can/m_can.c index 75e7490c4299..a736297a875f
100644
@@ -778,6 +778,38 @@ static inline bool is_lec_err(u32 psr)returnpsr&&(psr!=LEC_UNUSED);}+staticinlineboolm_can_is_protocol_err(u32irqstatus){+returnirqstatus&IR_ERR_LEC_31X;+}++staticintm_can_handle_protocol_error(structnet_device*dev,u32+irqstatus){+structnet_device_stats*stats=&dev->stats;+structm_can_classdev*cdev=netdev_priv(dev);+structcan_frame*cf;+structsk_buff*skb;++/* propagate the error condition to the CAN stack */+skb=alloc_can_err_skb(dev,&cf);+if(unlikely(!skb)){+netdev_dbg(dev,"allocation of skb failed\n");+stats->tx_errors++;+return0;+}+if(cdev->version>=31&&(irqstatus&IR_PEA)){+netdev_dbg(dev,"Protocol error in Arbitration fail\n");+stats->tx_errors++;+cdev->can.can_stats.arbitration_lost++;
If the skb allocation fails, you miss the stats here.
Alright. We shall handle the stats even when skb fails.
Shall post in upcoming revision.