Message ID | 20210715082413.3042149-3-xiaoning.wang@nxp.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | i3c: master: svc: some bug fixes | expand |
Hi Clark, Clark Wang <xiaoning.wang@nxp.com> wrote on Thu, 15 Jul 2021 16:24:11 +0800: > do_daa_locked() function is in a spin lock environment, use > readl_poll_timeout_atomic() to replace the origin > readl_poll_timeout(). > > Signed-off-by: Clark Wang <xiaoning.wang@nxp.com> > --- > drivers/i3c/master/svc-i3c-master.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i3c-master.c > index c25a372f6820..9d80435638ea 100644 > --- a/drivers/i3c/master/svc-i3c-master.c > +++ b/drivers/i3c/master/svc-i3c-master.c > @@ -656,7 +656,7 @@ static int svc_i3c_master_readb(struct svc_i3c_master *master, u8 *dst, > u32 reg; > > for (i = 0; i < len; i++) { > - ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, > + ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS, reg, > SVC_I3C_MSTATUS_RXPEND(reg), 0, 1000); You forgot to align the parameters of the function here and below. Otherwise, Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com> > if (ret) > return ret; > @@ -687,7 +687,7 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master, > * Either one slave will send its ID, or the assignment process > * is done. > */ > - ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, > + ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS, reg, > SVC_I3C_MSTATUS_RXPEND(reg) | > SVC_I3C_MSTATUS_MCTRLDONE(reg), > 1, 1000); > @@ -744,7 +744,7 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master, > } > > /* Wait for the slave to be ready to receive its address */ > - ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, > + ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS, reg, > SVC_I3C_MSTATUS_MCTRLDONE(reg) && > SVC_I3C_MSTATUS_STATE_DAA(reg) && > SVC_I3C_MSTATUS_BETWEEN(reg), Thanks, Miquèl
> -----Original Message----- > From: Miquel Raynal <miquel.raynal@bootlin.com> > Sent: Friday, July 16, 2021 6:52 > To: Clark Wang <xiaoning.wang@nxp.com> > Cc: conor.culhane@silvaco.com; alexandre.belloni@bootlin.com; > vitor.soares@synopsys.com; boris.brezillon@bootlin.com; linux- > i3c@lists.infradead.org; linux-kernel@vger.kernel.org > Subject: Re: [PATCH 2/4] i3c: master: svc: fix atomic issue > > Hi Clark, > > Clark Wang <xiaoning.wang@nxp.com> wrote on Thu, 15 Jul 2021 16:24:11 > +0800: > > > do_daa_locked() function is in a spin lock environment, use > > readl_poll_timeout_atomic() to replace the origin > > readl_poll_timeout(). > > > > Signed-off-by: Clark Wang <xiaoning.wang@nxp.com> > > --- > > drivers/i3c/master/svc-i3c-master.c | 6 +++--- > > 1 file changed, 3 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/i3c/master/svc-i3c-master.c > > b/drivers/i3c/master/svc-i3c-master.c > > index c25a372f6820..9d80435638ea 100644 > > --- a/drivers/i3c/master/svc-i3c-master.c > > +++ b/drivers/i3c/master/svc-i3c-master.c > > @@ -656,7 +656,7 @@ static int svc_i3c_master_readb(struct > svc_i3c_master *master, u8 *dst, > > u32 reg; > > > > for (i = 0; i < len; i++) { > > - ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, > reg, > > + ret = readl_poll_timeout_atomic(master->regs + > SVC_I3C_MSTATUS, > > +reg, > > SVC_I3C_MSTATUS_RXPEND(reg), 0, > 1000); > > You forgot to align the parameters of the function here and below. Oh, sorry about this. I will send V2 to correct this. By the way, can you help to check the question I mentioned in the cover letter? Thank you very much! Best Regards, Clark Wang > > Otherwise, > > Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com> > > > if (ret) > > return ret; > > @@ -687,7 +687,7 @@ static int svc_i3c_master_do_daa_locked(struct > svc_i3c_master *master, > > * Either one slave will send its ID, or the assignment process > > * is done. > > */ > > - ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, > reg, > > + ret = readl_poll_timeout_atomic(master->regs + > SVC_I3C_MSTATUS, > > +reg, > > SVC_I3C_MSTATUS_RXPEND(reg) | > > > SVC_I3C_MSTATUS_MCTRLDONE(reg), > > 1, 1000); > > @@ -744,7 +744,7 @@ static int svc_i3c_master_do_daa_locked(struct > svc_i3c_master *master, > > } > > > > /* Wait for the slave to be ready to receive its address */ > > - ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, > reg, > > + ret = readl_poll_timeout_atomic(master->regs + > SVC_I3C_MSTATUS, > > +reg, > > > SVC_I3C_MSTATUS_MCTRLDONE(reg) && > > SVC_I3C_MSTATUS_STATE_DAA(reg) > && > > SVC_I3C_MSTATUS_BETWEEN(reg), > > > > > Thanks, > Miquèl
diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i3c-master.c index c25a372f6820..9d80435638ea 100644 --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -656,7 +656,7 @@ static int svc_i3c_master_readb(struct svc_i3c_master *master, u8 *dst, u32 reg; for (i = 0; i < len; i++) { - ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, + ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS, reg, SVC_I3C_MSTATUS_RXPEND(reg), 0, 1000); if (ret) return ret; @@ -687,7 +687,7 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master, * Either one slave will send its ID, or the assignment process * is done. */ - ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, + ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS, reg, SVC_I3C_MSTATUS_RXPEND(reg) | SVC_I3C_MSTATUS_MCTRLDONE(reg), 1, 1000); @@ -744,7 +744,7 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master, } /* Wait for the slave to be ready to receive its address */ - ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, + ret = readl_poll_timeout_atomic(master->regs + SVC_I3C_MSTATUS, reg, SVC_I3C_MSTATUS_MCTRLDONE(reg) && SVC_I3C_MSTATUS_STATE_DAA(reg) && SVC_I3C_MSTATUS_BETWEEN(reg),
do_daa_locked() function is in a spin lock environment, use readl_poll_timeout_atomic() to replace the origin readl_poll_timeout(). Signed-off-by: Clark Wang <xiaoning.wang@nxp.com> --- drivers/i3c/master/svc-i3c-master.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)