> On Wednesday 11 February 2009, Kumar, Purushotam wrote:
> > > @@ -914,7 +927,12 @@ static inline int handle_core_command(
> > > status = readl(host->base + DAVINCI_MMCST0);
> > > if (!status)
> > > break;
> > > +
> > > qstatus |= status;
> > > + if (count++ > 40) {
> > > + dev_dbg(mmc_dev(host->mmc), "PIO timeout\n");
> > > + break;
> > > + }
> > > }
> > >
> > > if (qstatus & MMCST0_DATDNE) {
>
> > There will be no write to FIFO and so MMCST0_DXRDY/MMCST0_DRRDY
> > will not be set again and so no next interrupt which could cause
> > hang. In order to fix this bug, we need to check count value before
> > DAVINCI_MMCST0 register read. But, I feel we should not add any
> > PIO timeout here. I checked on EVM and count has never increased
> > more than 1 for high speed card.
>
> If it it only gets to one, then there's no need for the loop in
> the first place. I'm a bit curious why that loop is there in the
> first place ... it shouldn't actually be needed.
This loop was added because we have observed earlier on non-linux operating
system that MMC gives very fast interrupt when FIFO is 32 bytes which has
caused stack overflow. In my test, count has never increased more than 1 but it
may be more than 1 for some or other card. It will be better idea to write to
FIFO when DXRDY/ DRRDY bit is already set instead of going out and coming back
2nd time immediately to IRQ.
At first glance, it seems that it is unbounded while loop. But it has proper
break if "status" is zero. All bits in register DAVINCI_MMCST0 are cleared by
read and so read of DAVINCI_MMCST0 will certainly return zero after few
iteration irrespective of any condition because controller does not report same
error again. So, I feel there is no change required and we should leave it as
it is. What is your view on this?
> Note there's another unbounded loop in the driver, which I didn't
> fix: the main irq handler, mmc_davinci_irq(), which is calling
> that handle_core_command() thing. The handle_core() thing ought
> to be the main body of the IRQ handler; without looping; and
> that "spurious IRQ branch should return IRQ_NONE (and never even
> happen, for that matter, easily arranged).
>
> - Dave
Ya, You are right mmc_davinci_irq(), which is calling that
handle_core_command() in the unbounded loop. Do we really need this loop at
first place? I tried after removing this unbounded loop and it seems that
everything is working. What is your view on this? I agree with you that we
should have IRQ_NONE.
-Purushotam
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source