int dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size, unsigned long large_buffer_size, int (*needs_bounce_fn)(struct device *, dma_addr_t, size_t)) { struct dmabounce_device_info *device_info; int ret; device_info = kmalloc(sizeof(struct dmabounce_device_info), GFP_ATOMIC); if (!device_info) { dev_err(dev, "Could not allocated dmabounce_device_info\n"); return -ENOMEM; } ret = dmabounce_init_pool(&device_info->small, dev, "small_dmabounce_pool", small_buffer_size); if (ret) { dev_err(dev, "dmabounce: could not allocate DMA pool for %ld byte objects\n", small_buffer_size); goto err_free; } if (large_buffer_size) { ret = dmabounce_init_pool(&device_info->large, dev, "large_dmabounce_pool", large_buffer_size); if (ret) { dev_err(dev, "dmabounce: could not allocate DMA pool for %ld byte objects\n", large_buffer_size); goto err_destroy; } } device_info->dev = dev; INIT_LIST_HEAD(&device_info->safe_buffers); rwlock_init(&device_info->lock); device_info->needs_bounce = needs_bounce_fn; #ifdef STATS device_info->total_allocs = 0; device_info->map_op_count = 0; device_info->bounce_count = 0; device_info->attr_res = device_create_file(dev, &dev_attr_dmabounce_stats); #endif dev->archdata.dmabounce = device_info; set_dma_ops(dev, &dmabounce_ops); dev_info(dev, "dmabounce: registered device\n"); return 0; err_destroy: dma_pool_destroy(device_info->small.pool); err_free: kfree(device_info); return ret; }
int dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size, unsigned long large_buffer_size) { struct dmabounce_device_info *device_info; int ret; device_info = kmalloc(sizeof(struct dmabounce_device_info), GFP_ATOMIC); if (!device_info) { printk(KERN_ERR "Could not allocated dmabounce_device_info for %s", dev->bus_id); return -ENOMEM; } ret = dmabounce_init_pool(&device_info->small, dev, "small_dmabounce_pool", small_buffer_size); if (ret) { dev_err(dev, "dmabounce: could not allocate DMA pool for %ld byte objects\n", small_buffer_size); goto err_free; } if (large_buffer_size) { ret = dmabounce_init_pool(&device_info->large, dev, "large_dmabounce_pool", large_buffer_size); if (ret) { dev_err(dev, "dmabounce: could not allocate DMA pool for %ld byte objects\n", large_buffer_size); goto err_destroy; } } device_info->dev = dev; INIT_LIST_HEAD(&device_info->safe_buffers); rwlock_init(&device_info->lock); #ifdef STATS device_info->total_allocs = 0; device_info->map_op_count = 0; device_info->bounce_count = 0; device_info->attr_res = device_create_file(dev, &dev_attr_dmabounce_stats); #endif dev->archdata.dmabounce = device_info; printk(KERN_INFO "dmabounce: registered device %s on %s bus\n", dev->bus_id, dev->bus->name); return 0; err_destroy: dma_pool_destroy(device_info->small.pool); err_free: kfree(device_info); return ret; }