On Thu, Jan 21, 2010 at 02:14,  <[email protected]> wrote:
> Revision 8206 Author cliff Date 2010-01-21 02:14:30 -0500 (Thu, 21 Jan 2010)
>
> Log Message
>
> bug[#5832]quickly jump out of error interrupt handler,when DMA tx interrupt
> handler is waiting for sport to complete transfer
>
> Modified: trunk/drivers/char/bfin_sport.c (8205 => 8206)
>
> @@ -54,6 +54,7 @@
>
>       volatile struct sport_register *regs;
>       struct sport_config config;
> +     int dma_tx_run;
>  };
>
>  /* XXX: this should get pushed to platform device */
> @@ -285,7 +286,7 @@
>       dev->regs->tcr1 &= ~TSPEN;
>       SSYNC();
>       disable_dma(dev->dma_tx_chan);
> -
> +     dev->dma_tx_run = 0;
>       complete(&dev->c);
>
>       /* Clear the interrupt status */
> @@ -399,6 +400,10 @@
>
>       if (status & (TOVF | TUVF | ROVF | RUVF)) {
>               dev->regs->stat = (status & (TOVF | TUVF | ROVF | RUVF));
> +             if (dev->dma_tx_run && dev->config.dma_enabled) {
> +                     dev->regs->tcr1 &= ~TSPEN;
> +                     goto out;
> +             }
>               if (dev->config.dma_enabled) {
>                       disable_dma(dev->dma_rx_chan);
>                       disable_dma(dev->dma_tx_chan);
> @@ -406,21 +411,16 @@
>               dev->regs->tcr1 &= ~TSPEN;
>               dev->regs->rcr1 &= ~RSPEN;
>               SSYNC();
> -
> -             if (!dev->config.dma_enabled && !dev->config.int_clk) {
> -                     if (status & TUVF)
> -                             complete(&dev->c);
> -             } else
> -                     pr_warning("sport %p status error:%s%s%s%s\n",
> -                            dev->regs,
> -                            status & TOVF ? " TOVF" : "",
> -                            status & TUVF ? " TUVF" : "",
> -                            status & ROVF ? " ROVF" : "",
> -                            status & RUVF ? " RUVF" : "");
> +             pr_warning("sport %p status error:%s%s%s%s\n",
> +                    dev->regs,
> +                    status & TOVF ? " TOVF" : "",
> +                    status & TUVF ? " TUVF" : "",
> +                    status & ROVF ? " ROVF" : "",
> +                    status & RUVF ? " RUVF" : "");
>       }
>
>       /* XXX: should we always complete here and have read/write error ? */
> -
> +out:
>       return IRQ_HANDLED;
>  }
>
> @@ -640,6 +640,7 @@
>               set_dma_config(dev->dma_tx_chan, dma_config);
>
>               enable_dma(dev->dma_tx_chan);
> +             dev->dma_tx_run = 1;
>       } else {
>               /* Configure parameters to start PIO transfer */
>               dev->tx_buf = buf;

you've changed it so that when a DMA TX is done, all status errors are
simply ignored.  they only get processed _if_ the DMA TX finishes and
by that point, there really arent going to be any errors flying up.  i
dont think this is the correct fix.

if the issue is nested interrupts, why not have the DMA TX handler
disable interrupts at the start and restore when it's done ?  that
should give the same behavior as IRQF_DISABLED ...
-mike
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to