Messages in this thread | | | Date | Tue, 18 Mar 2014 19:11:19 +0100 | From | Marc Kleine-Budde <> | Subject | Re: [patch 01/12] can: c_can: Wait for CONTROL_INIT to be cleared |
| |
On 03/18/2014 06:19 PM, Thomas Gleixner wrote: > According to the documentation the CPU must wait for CONTROL_INIT to > be cleared before writing to the baudrate registers.
Thanks for the catch.
> Signed-off-by: Benedikt Spranger <b.spranger@linutronix.de> > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> > > --- > drivers/net/can/c_can/c_can.c | 26 +++++++++++++++++++++++--- > 1 file changed, 23 insertions(+), 3 deletions(-) > > Index: linux/drivers/net/can/c_can/c_can.c > =================================================================== > --- linux.orig/drivers/net/can/c_can/c_can.c > +++ linux/drivers/net/can/c_can/c_can.c > @@ -566,6 +566,21 @@ static netdev_tx_t c_can_start_xmit(stru > return NETDEV_TX_OK; > } > > +static int c_can_wait_for_ctrl_init(struct net_device *dev, > + struct c_can_priv *priv, u32 init) > +{ > + int retry = 0; > + > + while (init != (priv->read_reg(priv, C_CAN_CTRL_REG) & CONTROL_INIT)) { > + udelay(10); > + if (retry++ > 1000) { > + netdev_err(dev, "CCTRL: set CONTROL_INIT failed\n"); > + return -EIO; > + } > + } > + return 0; > +} > + > static int c_can_set_bittiming(struct net_device *dev) > { > unsigned int reg_btr, reg_brpe, ctrl_save; > @@ -573,6 +588,7 @@ static int c_can_set_bittiming(struct ne > u32 ten_bit_brp; > struct c_can_priv *priv = netdev_priv(dev); > const struct can_bittiming *bt = &priv->can.bittiming; > + int res; > > /* c_can provides a 6-bit brp and 4-bit brpe fields */ > ten_bit_brp = bt->brp - 1; > @@ -590,13 +606,17 @@ static int c_can_set_bittiming(struct ne > "setting BTR=%04x BRPE=%04x\n", reg_btr, reg_brpe); > > ctrl_save = priv->read_reg(priv, C_CAN_CTRL_REG); > - priv->write_reg(priv, C_CAN_CTRL_REG, > - ctrl_save | CONTROL_CCE | CONTROL_INIT); > + ctrl_save &= ~CONTROL_INIT; > + priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_CCE | CONTROL_INIT); > + res = c_can_wait_for_ctrl_init(dev, priv, CONTROL_INIT); > + if (res) > + return res; > + > priv->write_reg(priv, C_CAN_BTR_REG, reg_btr); > priv->write_reg(priv, C_CAN_BRPEXT_REG, reg_brpe); > priv->write_reg(priv, C_CAN_CTRL_REG, ctrl_save); > > - return 0; > + return c_can_wait_for_ctrl_init(dev, priv, 0);
I'll post a patch that adds return value checking of all direct and indirect users of c_can_set_bittiming().
> } > > /*
Thanks, Marc
-- Pengutronix e.K. | Marc Kleine-Budde | Industrial Linux Solutions | Phone: +49-231-2826-924 | Vertretung West/Dortmund | Fax: +49-5121-206917-5555 | Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
[unhandled content-type:application/pgp-signature] | |