Hi thomas,
>It can be a
driver problem, but as you haven't posted your code source,
>nobody is able to tell. Are you doing the correct things at module >exit ? These are some parts of my code.
within probe funcion
--------------------------------------------------------------------------------------------------------------------------------------
{
gdma.dma_buf = (char*)kmalloc(
GAIAPCI_DMABUF_SIZE, GFP_KERNEL|__GFP_DMA );
if( gdma.dma_buf==0 ){ printk( KERN_ALERT "@ ERROR - unable to allocate memory\n" ); ret=-1; } else{ /* clear RM7965 interrupt */ gaiapci_int_clear( PCIDT_RM7965INTCLR ); /* unmask RM7965 interrupt */ gaiapci_int_enable( PCIDT_RM7965INTMSK ); ret = 0; } }
--------------------------------------------------------------------------------------------------------------------------------------
within remove function
--------------------------------------------------------------------------------------------------------------------------------------
{
kfree(gdma.dma_buf);
gdma.dma_buf = 0; free_irq(irq_no,
irq_id);
if( pciVmOffset
){
iounmap((void*)(pciVmOffset & PAGE_MASK)); } pci_release_region(dev, 0);
pci_disable_device(dev);
gaiapci_unregister_chr(); }
write function
--------------------------------------------------------------------------------------------------------------------------------------
{
gdma.dma_dir =
DMA_TO_DEVICE;
bus_addr = dma_map_single( &gdev.pdev->dev, (void*)gdma.dma_buf, GAIAPCI_DMABUF_SIZE, gdma.dma_dir ); gdma.dma_bus = bus_addr; /* set data size */
/* set address */
/* enable dma interrupt
*/
/* dma start command
*/
}
--------------------------------------------------------------------------------------------------------------------------------------
interrupt routine
--------------------------------------------------------------------------------------------------------------------------------------
{
gaiapci_int_clear( PCIDT_MDMAENDCLR
);
gaiapci_int_mask( PCIDT_MDMAENDMSK ); dma_unmap_single(&gdev.pdev->dev, gdma.dma_bus,
GAIAPCI_DMABUF_SIZE, gdma.dma_dir );
ret = IRQ_HANDLED; }
--------------------------------------------------------------------------------------------------------------------------------------
I think this gives you an idea how I hv done
it.
Is there anything wrong with this
method.
Thanx in advance.
Sumudu
|