liushui1029 发表于 2012-04-11 09:16

求助:dma_alloc_coherent执行crash

代码如下:
ssize_t fpga_wr_write(struct file * pfile, const char __user * ch_user, size_t count, loff_t * pos)
{
        u64                        addr64;

        printk(KERN_ALERT "dma write begin\n");

        // 写入数据
        dma_src = dma_alloc_coherent(&my_s_dev->dev,1024,bus_src_addr,GFP_KERNEL);//这里crash

             printk(KERN_ALERT "dma write end\n");
             return 0;
}

static int __devinit fpga_wr_probe(struct pci_dev* pdev, const struct pci_device_id* ent)
{
        int                        result;
        dev_t                dev=0;
        if((result = pci_enable_device(pdev)))
                returnresult;

        /// 创建字符设备

        dev = MKDEV(FPGA_WR_CHAR_MAJOR, FPGA_WR_CHAR_MINOR);

        result = register_chrdev(0, "demo", &fpga_wr_fops);
        if(result <0)
        {
                printk(KERN_ALERT "DEMO: can't get major %d\n", FPGA_WR_CHAR_MAJOR);
                return result;
        }

        //alloct DEMO_dev
        my_fpga_wr_dev = kmalloc(sizeof(struct fpga_wr_dev), GFP_KERNEL);
        if(!my_fpga_wr_dev)
        {
                result = -ENOMEM;
                goto fail;
        }

        memset(my_fpga_wr_dev, 0, sizeof(struct fpga_wr_dev));

        //init a char driver
        cdev_init(&my_fpga_wr_dev->my_cdev, &fpga_wr_fops);
        my_fpga_wr_dev->my_cdev.owner = THIS_MODULE;
        my_fpga_wr_dev->my_cdev.ops = &fpga_wr_fops;

        //add char driver to kernel
        result = cdev_add(&my_fpga_wr_dev->my_cdev, dev, 1);
        if(result)
        {
                printk(KERN_ALERT "Error %d addint DEMO\n", result);
                goto fail;
        }

        my_s_dev = pdev;
        printk(KERN_ALERT "All True\n");
        return 0;

        //handle fail
fail:
        fpga_wr_remove(pdev);
        return result;

}

static void __devexit fpga_wr_remove(struct pci_dev* pdev)
{
        printk(KERN_ALERT "remove\n");
        if(my_fpga_wr_dev)
                kfree(my_fpga_wr_dev);
}
struct pci_driver fpga_wr_driver = {
        .name          = FPGA_WR_DRIVER_NAME,
        .id_table = fpga_wb_table_id,
        .probe          = fpga_wr_probe,
        .remove          = __devexit_p(fpga_wr_remove),
};


static int __init fpga_wr_init_module(void)
{
        b_open = 0;
        my_fpga_wr_dev = 0;
        return pci_register_driver(&fpga_wr_driver);
}

static void __exit fpga_wr_cleanup_module(void)
{
        pci_unregister_driver(&fpga_wr_driver);
}

luodongxin 发表于 2012-04-12 14:49

页: [1]
查看完整版本: 求助:dma_alloc_coherent执行crash