Message ID | 20210301112100.197939-4-mkl@pengutronix.de |
---|---|
State | New |
Headers | show |
Series | [net,1/6] can: flexcan: assert FRZ bit in flexcan_chip_freeze() | expand |
Hello Joakim, Marc, On 01.03.21 12:20, Marc Kleine-Budde wrote: > From: Joakim Zhang <qiangqing.zhang@nxp.com> > > Invoke flexcan_chip_freeze() to enter freeze mode, since need poll > freeze mode acknowledge. > > Fixes: e955cead03117 ("CAN: Add Flexcan CAN controller driver") > Link: https://lore.kernel.org/r/20210218110037.16591-4-qiangqing.zhang@nxp.com > Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com> > Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> > --- > drivers/net/can/flexcan.c | 12 +++++++----- > 1 file changed, 7 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c > index e66a51dbea0a..134c05757a3b 100644 > --- a/drivers/net/can/flexcan.c > +++ b/drivers/net/can/flexcan.c > @@ -1480,10 +1480,13 @@ static int flexcan_chip_start(struct net_device *dev) > > flexcan_set_bittiming(dev); > > + /* set freeze, halt */ > + err = flexcan_chip_freeze(priv); > + if (err) > + goto out_chip_disable; With v5.12-rc3, both my FlexCAN controllers on an i.MX6Q now divide by zero on probe because priv->can.bittiming.bitrate == 0 inside of flexcan_chip_freeze. Reverting this patch fixes it. > + > /* MCR > * > - * enable freeze > - * halt now > * only supervisor access > * enable warning int > * enable individual RX masking > @@ -1492,9 +1495,8 @@ static int flexcan_chip_start(struct net_device *dev) > */ > reg_mcr = priv->read(®s->mcr); > reg_mcr &= ~FLEXCAN_MCR_MAXMB(0xff); > - reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | FLEXCAN_MCR_SUPV | > - FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_IRMQ | FLEXCAN_MCR_IDAM_C | > - FLEXCAN_MCR_MAXMB(priv->tx_mb_idx); > + reg_mcr |= FLEXCAN_MCR_SUPV | FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_IRMQ | > + FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_MAXMB(priv->tx_mb_idx); > > /* MCR > * >
On 16.03.2021 17:00:25, Ahmad Fatoum wrote: > > --- a/drivers/net/can/flexcan.c > > +++ b/drivers/net/can/flexcan.c > > @@ -1480,10 +1480,13 @@ static int flexcan_chip_start(struct net_device *dev) > > > > flexcan_set_bittiming(dev); > > > > + /* set freeze, halt */ > > + err = flexcan_chip_freeze(priv); > > + if (err) > > + goto out_chip_disable; > > With v5.12-rc3, both my FlexCAN controllers on an i.MX6Q now divide by zero > on probe because priv->can.bittiming.bitrate == 0 inside of flexcan_chip_freeze. > > Reverting this patch fixes it. A fix for this in on its way to net/master: https://lore.kernel.org/linux-can/20210316082104.4027260-6-mkl@pengutronix.de/ regards, 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 |
On 17.03.2021 09:18:31, Marc Kleine-Budde wrote: > A fix for this in on its way to net/master: > > https://lore.kernel.org/linux-can/20210316082104.4027260-6-mkl@pengutronix.de/ It's already in net/master. regards, 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 |
On 17.03.21 12:49, Marc Kleine-Budde wrote: > On 17.03.2021 09:18:31, Marc Kleine-Budde wrote: >> A fix for this in on its way to net/master: >> >> https://lore.kernel.org/linux-can/20210316082104.4027260-6-mkl@pengutronix.de/ > > It's already in net/master. Cherry-picked and works for me. Thanks, Ahmad > > regards, > Marc > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index e66a51dbea0a..134c05757a3b 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c @@ -1480,10 +1480,13 @@ static int flexcan_chip_start(struct net_device *dev) flexcan_set_bittiming(dev); + /* set freeze, halt */ + err = flexcan_chip_freeze(priv); + if (err) + goto out_chip_disable; + /* MCR * - * enable freeze - * halt now * only supervisor access * enable warning int * enable individual RX masking @@ -1492,9 +1495,8 @@ static int flexcan_chip_start(struct net_device *dev) */ reg_mcr = priv->read(®s->mcr); reg_mcr &= ~FLEXCAN_MCR_MAXMB(0xff); - reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | FLEXCAN_MCR_SUPV | - FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_IRMQ | FLEXCAN_MCR_IDAM_C | - FLEXCAN_MCR_MAXMB(priv->tx_mb_idx); + reg_mcr |= FLEXCAN_MCR_SUPV | FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_IRMQ | + FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_MAXMB(priv->tx_mb_idx); /* MCR *