求助: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);
}
页:
[1]