Hi, > -----Original Message----- > From: Kumari Pallavi <kumari.pallavi@xxxxxxxxx> > Sent: Friday, June 23, 2023 2:29 PM > To: rcsekar@xxxxxxxxxxx; wg@xxxxxxxxxxxxxx; mkl@xxxxxxxxxxxxxx; > davem@xxxxxxxxxxxxx; edumazet@xxxxxxxxxx; kuba@xxxxxxxxxx; > pabeni@xxxxxxxxxx > Cc: Sangannavar, Mallikarjunappa <mallikarjunappa.sangannavar@xxxxxxxxx>; > Nikula, Jarkko <jarkko.nikula@xxxxxxxxx>; linux-can@xxxxxxxxxxxxxxx; > netdev@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; Kumari Pallavi > <kumari.pallavi@xxxxxxxxx>; Thokala, Srikanth <srikanth.thokala@xxxxxxxxx> > Subject: [RESEND] [PATCH 1/1] can: m_can: Control tx and rx flow to avoid > communication stall > > In bi-directional CAN transfer using M_CAN IP, with the frame gap being set to > '0', it leads to Protocol error in Arbitration phase resulting in communication > stall. > Discussed with Bosch M_CAN IP team and the stall issue can only be overcome > by controlling the tx and rx packets flow as done by the patch. > > Rx packets would also be serviced when there is a tx interrupt. The solution has > been tested extensively for more than 10 days, and no issues has been observed. > > Setup that is used to reproduce the issue: > > +---------------------+ +----------------------+ > |Intel ElkhartLake | |Intel ElkhartLake | > | +--------+ | | +--------+ | > | |m_can 0 | |<=======>| |m_can 0 | | > | +--------+ | | +--------+ | > +---------------------+ +----------------------+ > > Steps to be run on the two Elkhartlake HW: > > 1. ip link set can0 type can bitrate 1000000 2. ip link set can0 txqueuelen 2048 3. > ip link set can0 up 4. cangen -g 0 can0 5. candump can0 > > cangen -g 0 can0 & candump can0 commands are used for transmit and receive > on both the m_can HW simultaneously where -g is the frame gap between two > frames. > > Signed-off-by: Kumari Pallavi <kumari.pallavi@xxxxxxxxx> > Signed-off-by: Srikanth Thokala <srikanth.thokala@xxxxxxxxx> > --- > drivers/net/can/m_can/m_can.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c > index a5003435802b..94aa0ba89202 100644 > --- a/drivers/net/can/m_can/m_can.c > +++ b/drivers/net/can/m_can/m_can.c > @@ -1118,7 +1118,7 @@ static irqreturn_t m_can_isr(int irq, void *dev_id) > /* New TX FIFO Element arrived */ > if (m_can_echo_tx_event(dev) != 0) > goto out_fail; > - > + m_can_write(cdev, M_CAN_IE, IR_ALL_INT & > ~(IR_TEFN)); > if (netif_queue_stopped(dev) && > !m_can_tx_fifo_full(cdev)) > netif_wake_queue(dev); > @@ -1787,6 +1787,7 @@ static netdev_tx_t m_can_start_xmit(struct sk_buff > *skb, > } > } else { > cdev->tx_skb = skb; > + m_can_write(cdev, M_CAN_IE, IR_ALL_INT & (IR_TEFN)); > return m_can_tx_handler(cdev); > } > Kindly review the patch and please let us know if any comments! Thanks, Pallavi > -- > 2.17.1