Em Sat, 07 Nov 2009 15:05:02 +0100
e9hack <e9h...@googlemail.com> escreveu:

> Mauro Carvalho Chehab schrieb:
> 
> > I agree. We need first to stop DMA activity, and then release the page 
> > tables.
> > 
> > Could you please test if the enclosed patch fixes the issue?
> 
> Hi Mauro,
> 
> your patch doesn't solve the problem, because saa7146_dma_free() doesn't stop 
> a running
> dma transfer of the saa7146.

Well, it should be stopping it. The logic is to wait for an incoming dma
transfer and then disable dma transfers:

void saa7146_dma_free(struct saa7146_dev *dev,struct videobuf_queue *q,
                                                struct saa7146_buf *buf)
{
        struct videobuf_dmabuf *dma=videobuf_to_dma(&buf->vb);
        DEB_EE(("dev:%p, buf:%p\n",dev,buf));

        BUG_ON(in_interrupt());

        videobuf_waiton(&buf->vb,0,0);
        videobuf_dma_unmap(q, dma);
        videobuf_dma_free(dma);
        buf->vb.state = VIDEOBUF_NEEDS_INIT;
}

Maybe the code for dma_unmap is incomplete?

> Since last weekend, I'm using the attached patch. I'm not
> sure, if the functionality of video_end() must be split. Maybe the last part 
> of
> video_end() must be execute at the end of vidioc_streamoff().

It is not safe to stop at streamoff(), since applications may close the device
without calling streamoff. The kernel driver should be able to handle such
situations as well.

So, if my patch doesn't work, we'll need to add more bits at saa7146_dma_free().

-- 

Cheers,
Mauro
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to