// the code: int shim_osLoadFWImageOLD(unsigned char *ptr) { unsigned int bytesRead; mm_segment_t oldfs; static struct file *filp; unsigned int imageLength=0x4ffff; dprintf(4, "tn7dsl_read_dsp()\n"); dprintf(4,"open file %s\n", DSP_FIRMWARE_PATH); filp=filp_open(DSP_FIRMWARE_PATH ,00,O_RDONLY); if(filp ==NULL) { printk("Failed: Could not open DSP binary file\n"); return -1; } if (filp->f_op->read==NULL) return -1; /* File(system) doesn't allow reads */ /* Now read bytes from postion "StartPos" */ filp->f_pos = 0; oldfs = get_fs(); set_fs(KERNEL_DS); bytesRead = filp->f_op->read(filp,ptr,imageLength,&filp->f_pos); dprintf(4,"file length = %d\n", bytesRead); set_fs(oldfs); /* Close the file */ fput(filp); return bytesRead; } static struct device avsar = { .bus_id = "vlynq", }; int shim_osLoadFWImage(unsigned char *ptr) { const char *file = "ar0700xx"; const struct firmware *fw_entry; printk("requesting firmware image '%s'\n", file); if(request_firmware(&fw_entry, file, &avsar)) { /* printk(KERN_ERR "avsar: Firmware not available\n"); return -1;*/ printk(KERN_ERR "avsar: Firmware not available, calling old function...\n"); return shim_osLoadFWImageOLD(ptr); } if(fw_entry->size > 0x4ffff) { printk(KERN_ERR "avsar: Firmware too big (%d bytes), calling old function...\n", fw_entry->size); return -1; } memcpy(ptr, fw_entry->data, fw_entry->size); release_firmware(fw_entry); return fw_entry->size; } /* the result: requesting firmware image 'ar0700xx' BUG: warning at lib/kref.c:32/kref_get() Call Trace: [<9410a940>] dump_stack+0x8/0x34 [<941fc068>] kref_get+0x44/0xdc [<941fb188>] kobject_get+0x20/0x34 [<941b7380>] sysfs_create_link+0xec/0x16c [<9422c830>] class_device_add+0x254/0x560 [<942309a0>] _request_firmware+0x170/0x494 [] shim_osLoadFWImage+0x50/0xf0 [tiatm] [] dslhal_api_dslStartup+0x100/0x320 [tiatm] [] tn7dsl_init+0x50/0x65c [tiatm] [] tn7atm_detect+0x180/0x54c [tiatm] [<94148c14>] sys_init_module+0x1628/0x18a0 [<9410cc00>] stack_done+0x20/0x3c fw_register_class_device: class_device_register failed avsar: Firmware not available, calling old function... */