#include #include static DECLARE_COMPLETION( obj_not_in_use ); static void firmware_device_release( struct device *dev ) { complete( &obj_not_in_use ); } static struct device fwasync_device = { .bus_id = "fwasync", .release = firmware_device_release, }; static void fwasync_cont(const struct firmware *fw, void *private_data) { unsigned char buf[80+1]; int to_copy; if(fw==NULL){ printk("fwasync_cont: firmware load failed\n"); return; } to_copy = min( (sizeof(buf)-1), fw->size ); memcpy(buf, fw->data, to_copy); buf[to_copy] = '\0'; printk("firmware(%d): \"%s\"\n", (int)fw->size, buf); } static int __init fwasync_init(void) { if( device_register( &fwasync_device ) ) { printk("device_register failed\n"); return -EIO; } if( request_firmware_nowait(THIS_MODULE, FW_ACTION_NOHOTPLUG, "pseudo_firmware", &fwasync_device, "private_data", fwasync_cont) ) { printk("fwasync: request_firmware_nowait failed\n"); device_unregister( &fwasync_device ); return -EIO; } return 0; } static void __exit fwasync_exit(void) { device_unregister( &fwasync_device ); wait_for_completion( &obj_not_in_use ); } module_init(fwasync_init); module_exit(fwasync_exit); MODULE_LICENSE("GPL");