Linux USB
 help / color / mirror / Atom feed
From: Mauricio Faria de Oliveira <mfo@igalia.com>
To: Stanislaw Gruszka <stf_xl@wp.pl>
Cc: Matthieu CASTET <castet.matthieu@free.fr>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	kernel-dev@igalia.com, linux-atm-general@lists.sourceforge.net,
	linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
	syzbot+ce1e5a1b4e086b43e56d@syzkaller.appspotmail.com,
	syzbot+306212936b13e520679d@syzkaller.appspotmail.com
Subject: Re: [PATCH] usb: atm: ueagle-atm: use synchronous request_firmware()
Date: Mon, 18 May 2026 12:54:30 -0300	[thread overview]
Message-ID: <553f402beef6864520d0789f506fa4e2@igalia.com> (raw)
In-Reply-To: <20260516091920.GA9154@wp.pl>

On 2026-05-16 06:19, Stanislaw Gruszka wrote:
> Hi, thanks for working on this
> 
> On Fri, May 15, 2026 at 08:52:16PM -0300, Mauricio Faria de Oliveira wrote:
>> ueagle-atm uses the asynchronous request_firmware_nowait() in .probe(),
>> but does not wait for its completion, not even in .disconnect(); so, if the
>> device is unplugged meanwhile, its teardown runs concurrently with that.
>> 
>> Even though this inconsistency is worth addressing on its own, it has also
>> triggered several bug reports in syzbot over the years (some auto-closed)
>> where the firmware sysfs fallback mechanism (CONFIG_FW_LOADER_USER_HELPER)
>> creates a firmware subdirectory in the device directory during its removal,
>> which might hit unexpected conditions in kernfs, apparently, depending at
>> which point the add and remove operations raced. (See links.)
>> 
>> The pattern is:
>> 
>> usb ?-?: Direct firmware load for ueagle-atm/eagle?.fw failed with error -2
>> usb ?-?: Falling back to sysfs fallback for: ueagle-atm/eagle?.fw
>> <ERROR>
>> Call trace:
>>  ...
>>  kernfs_create_dir_ns
>>  sysfs_create_dir_ns
>>  create_dir
>>  kobject_add_internal
>>  kobject_add_varg
>>  kobject_add
>>  class_dir_create_and_add
>>  get_device_parent
>>  device_add
>>  fw_load_sysfs_fallback
>>  fw_load_from_user_helper
>>  firmware_fallback_sysfs
>>  _request_firmware
>>  request_firmware_work_func
>>  ...
>> 
>> While the kernfs side is being looked at, the ueagle-atm side can be fixed
>> by converting .probe() to the synchronous request_firmware(), which blocks
>> the device directory removal until it is finished, preventing such errors.

Thanks for the prompt feedback.

> The async firmware loading was introduced intentionally to avoid
> device initialization failure when the firmware is not available in 
> the initramfs. Also possible blocking of probe and boot for FW request
> timeout.
> 
> See the original discussion in the driver submission thread:
> https://lore.kernel.org/lkml/20051101224510.GB28193@kroah.com/

Sure, I'll take a look.

> I prefer not to change this. If synchronization with disconnect
> is required, I would rather keep request_firmware_nowait() and add 
> explicit completion handling. Andrey some time ago posted a patch 
> for this:
> https://lore.kernel.org/lkml/20250410093146.3776801-1-aitsygunka@yandex.ru/
> 
> I refused the patch because it appears to only avoid pr_debug, but if
> it fixes actual problem, we can take it.

Ok, I found it earlier, but opted otherwise as I missed the rationale.

I'll be happy to check it for resending; I had a slightly different
implementation in mind when I considered a similar approach (using a
struct completion in the existing data structure), but I'll double check
it whether it's doable, and get back to you.

Thanks for the pointers.

> 
> Regards
> Stanislaw
> 
>> This has been tested with a synthetic reproducer to check the error path
>> and with a USB gadget (virtual device) to check the firmware upload path.
>> (The latter was written by AI/Claude; no other code/text in this commit.)
>> 
>> Links (year first reported):
>>  2025 https://syzbot.org/bug?extid=ce1e5a1b4e086b43e56d
>>  2025 https://syzbot.org/bug?extid=9af8471255ac36e34fd4
>>  2024 https://syzbot.org/bug?extid=306212936b13e520679d
>>  2022 https://syzbot.org/bug?extid=782984d6f1701b526edb
>>  2021 https://syzbot.org/bug?id=f3f221579f4ef7e9691281f3c6f56c05f83e8490
>>  2021 https://syzbot.org/bug?id=84d86f0d71394829df6fc53daf6642c045983881
>>  2021 https://syzbot.org/bug?id=3302dc1c0e2b9c94f2e8edb404eabc9267bc6f90
>> 
>> Reported-by: syzbot+ce1e5a1b4e086b43e56d@syzkaller.appspotmail.com
>> Closes: https://syzbot.org/bug?extid=ce1e5a1b4e086b43e56d
>> Reported-by: syzbot+306212936b13e520679d@syzkaller.appspotmail.com
>> Closes: https://syzbot.org/bug?extid=306212936b13e520679d
>> Fixes: b72458a80c75 ("[PATCH] USB: Eagle and ADI 930 usb adsl modem driver")
>> Assisted-by: Claude:claude-sonnet-4.6 # test USB gadget
>> Signed-off-by: Mauricio Faria de Oliveira <mfo@igalia.com>
>> ---
>> Testing:
>> =======
>> 
>> Firmware upload path:
>> --------------------
>> 
>> This has been tested with a USB gadget (virtual device) written by Claude [1].
>> It ACKs the firmware upload commands, so the driver considers that successful:
>> 
>>   [  296.997194] usb 1-1: [ueagle-atm] firmware uploaded
>>   
>> Log (blocks separated for clarity):
>> 
>>   # echo 'file drivers/base/firmware_loader/* +p' >/sys/kernel/debug/dynamic_debug/control
>> 
>>   # insmod ueagle_gadget.ko
>> 
>>   [  294.840943] ueagle_gadget gadget.0: [ueagle-gadget] bound: VID=0x1039 PID=0x2101 bcdDev=0x2581
>>   [  294.841341] [ueagle-gadget] registered (VID=0x1039 PID=0x2101)
>>   
>>   [  295.066627] usb 1-1: new full-speed USB device number 4 using dummy_hcd
>>   [  295.222302] usb 1-1: New USB device found, idVendor=1039, idProduct=2101, bcdDevice=25.81
>>   [  295.222315] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
>>   [  295.227343] ueagle_gadget gadget.0: [ueagle-gadget] SET_CONFIGURATION 1
>>   [  295.228029] usb 1-1: [ueagle-atm] ADSL device founded vid (0X1039) pid (0X2101) Rev (0X2581): Eagle I
>>   
>>   [  295.343162] usb 1-1: reset full-speed USB device number 4 using dummy_hcd
>>   [  295.482615] ueagle_gadget gadget.0: [ueagle-gadget] SET_CONFIGURATION 1
>>   
>>   [  295.482682] usb 1-1: [ueagle-atm] pre-firmware device, uploading firmware
>>   [  295.482723] firmware_class: __allocate_fw_priv: fw-ueagle-atm/eagleI.fw fw_priv=00000000470f8800
>>   [  295.482839] usb 1-1: loading /lib/firmware/updates/7.1.0-rc2-next-20260508-dirty/ueagle-atm/eagleI.fw failed for no such file or directory.
>>   [  295.482900] usb 1-1: loading /lib/firmware/updates/ueagle-atm/eagleI.fw failed for no such file or directory.
>>   [  295.482960] usb 1-1: loading /lib/firmware/7.1.0-rc2-next-20260508-dirty/ueagle-atm/eagleI.fw failed for no such file or directory.
>>   [  295.483037] usb 1-1: Loading firmware from /lib/firmware/ueagle-atm/eagleI.fw
>>   [  295.483040] usb 1-1: direct-loading ueagle-atm/eagleI.fw
>>   [  295.483065] firmware_class: fw_set_page_data: fw-ueagle-atm/eagleI.fw fw_priv=00000000470f8800 data=00000000c4ccb93b size=10981
>>   
>>   [  295.483186] usb 1-1: Loaded FW: ueagle-atm/eagleI.fw, sha256: 8c5047be3b02ed4a8b98c22ed03c010afae1782f6056d8bf2f32bbdde834a74a
>>   [  295.483191] usb 1-1: [ueagle-atm] loading firmware ueagle-atm/eagleI.fw
>>   [  295.487856] ueagle_gadget gadget.0: [ueagle-gadget] LOAD_INTERNAL addr=0x7f92 (F8051_USBCS reset), len=1
>>   [  296.997153] ueagle_gadget gadget.0: [ueagle-gadget] LOAD_INTERNAL addr=0x7f92 (F8051_USBCS reset), len=1
>>   [  296.997194] usb 1-1: [ueagle-atm] firmware uploaded
>>   [  296.997199] firmware_class: __free_fw_priv: fw-ueagle-atm/eagleI.fw fw_priv=00000000470f8800 data=00000000c4ccb93b size=10981
>>   
>>   # rmmod ueagle_gadget
>> 
>>   [  362.899931] ueagle_gadget gadget.0: [ueagle-gadget] disconnected
>>   [  362.899947] ueagle_gadget gadget.0: [ueagle-gadget] unbound
>>   [  362.978201] [ueagle-gadget] unregistered
>>   [  363.080344] usb 1-1: USB disconnect, device number 4
>>   [  363.085192] firmware_class: fw_name_devm_release: fw_name-ueagle-atm/eagleI.fw devm-0000000037b7f4fe released
>> 
>> Error path:
>> ----------
>> 
>> This has been tested with a synthetic reproducer [2]:
>> 
>>   # echo 'file drivers/base/firmware_loader/* +p' >/sys/kernel/debug/dynamic_debug/control
>>   # echo 'file drivers/usb/atm/ueagle-atm.c +p' >/sys/kernel/debug/dynamic_debug/control
>>   # echo 2 >/sys/module/ueagle_atm/parameters/debug
>>   
>>   # mv /lib/firmware/ueagle-atm/eagleI.fw \
>>        /lib/firmware/ueagle-atm/eagleI.fw.NOT-FOUND
>>   
>>   # cat ueagle-atm.syzlang
>>   syz_usb_connect(0x3, 0x2d, &(0x7f00000002c0)=ANY=[@ANYBLOB="12011003faff82083910012181250102030109021b00028c4400600904"], &(0x7f0000000240)={0x0, 0x0, 0x0, 0x0})
>>   
>>   # ./syz-execprog -procs=1 -enable='' ueagle-atm.syzlang
>> 
>> Modified: 
>> 
>>   .probe() fails with -ETIMEDOUT from the firmware load timeout of 60 seconds per
>>   struct firmware_fallback_config fw_fallback_config = { .loading_timeout = 60, }
>>   
>>   [  176.023944] usb 1-1: new high-speed USB device number 2 using dummy_hcd
>>   ...
>>   [  176.158744] usb 1-1: New USB device found, idVendor=1039, idProduct=2101, bcdDevice=25.81
>>   ...
>>   [  176.363215] usb 1-1: [ueagle-atm vdbg]  entering uea_probe
>>   [  176.363221] usb 1-1: [ueagle-atm] ADSL device founded vid (0X1039) pid (0X2101) Rev (0X2581): Eagle I
>>   [  177.113140] usb 1-1: [ueagle-atm vdbg]  entering uea_load_firmware
>>   [  177.113156] usb 1-1: [ueagle-atm] pre-firmware device, uploading firmware
>>   
>>   [  177.113194] firmware_class: __allocate_fw_priv: fw-ueagle-atm/eagleI.fw fw_priv=000000005bf63c12
>>   [  177.113404] usb 1-1: loading /lib/firmware/updates/7.1.0-rc2-next-20260508-dirty/ueagle-atm/eagleI.fw failed for no such file or directory.
>>   [  177.113617] usb 1-1: loading /lib/firmware/updates/ueagle-atm/eagleI.fw failed for no such file or directory.
>>   [  177.113775] usb 1-1: loading /lib/firmware/7.1.0-rc2-next-20260508-dirty/ueagle-atm/eagleI.fw failed for no such file or directory.
>>   [  177.113905] usb 1-1: loading /lib/firmware/ueagle-atm/eagleI.fw failed for no such file or directory.
>>   
>>   [  177.113926] usb 1-1: Direct firmware load for ueagle-atm/eagleI.fw failed with error -2
>>   [  177.113934] usb 1-1: Falling back to sysfs fallback for: ueagle-atm/eagleI.fw
>>   
>>   [  177.114706] test kernfs_activate(): sleep 3s
>>   [  180.125483] test kernfs_activate(): slept 3s
>>   [  180.126005] firmware ueagle-atm!eagleI.fw: firmware: requesting ueagle-atm/eagleI.fw
>>   [  242.849608] test __kernfs_remove(): done
>>   
>>   [  242.849648] firmware_class: __free_fw_priv: fw-ueagle-atm/eagleI.fw fw_priv=000000005bf63c12 data=0000000000000000 size=0
>>   [  242.849670] usb 1-1: [UEAGLE-ATM] firmware ueagle-atm/eagleI.fw is not available
>>   [  242.849674] usb 1-1: [ueagle-atm vdbg]  leaving  uea_load_firmware
>>   [  242.849681] ueagle-atm 1-1:140.0: probe with driver ueagle-atm failed with error -110
>>   [  242.854626] usb 1-1: USB disconnect, device number 2
>> 
>> Original:
>> 
>>   [  184.103791] usb 1-1: new high-speed USB device number 2 using dummy_hcd
>>   ...
>>   [  184.390454] usb 1-1: New USB device found, idVendor=1039, idProduct=2101, bcdDevice=25.81
>>   ...
>>   [  184.770574] usb 1-1: [ueagle-atm vdbg]  entering uea_probe
>>   [  184.770582] usb 1-1: [ueagle-atm] ADSL device founded vid (0X1039) pid (0X2101) Rev (0X2581): Eagle I
>>   [  185.526950] usb 1-1: [ueagle-atm vdbg]  entering uea_load_firmware
>>   [  185.526967] usb 1-1: [ueagle-atm] pre-firmware device, uploading firmware
>>   
>>   [  185.527004] usb 1-1: [ueagle-atm] loading firmware ueagle-atm/eagleI.fw
>>   [  185.530762] usb 1-1: [ueagle-atm vdbg]  leaving  uea_load_firmware
>>   
>>   [  185.535543] firmware_class: __allocate_fw_priv: fw-ueagle-atm/eagleI.fw fw_priv=00000000e8499bd6
>>   [  185.535677] usb 1-1: loading /lib/firmware/updates/7.1.0-rc2-next-20260508-dirty/ueagle-atm/eagleI.fw failed for no such file or directory.
>>   [  185.535743] usb 1-1: loading /lib/firmware/updates/ueagle-atm/eagleI.fw failed for no such file or directory.
>>   [  185.535820] usb 1-1: loading /lib/firmware/7.1.0-rc2-next-20260508-dirty/ueagle-atm/eagleI.fw failed for no such file or directory.
>>   [  185.535886] usb 1-1: loading /lib/firmware/ueagle-atm/eagleI.fw failed for no such file or directory.
>> 
>>   [  185.535898] usb 1-1: Direct firmware load for ueagle-atm/eagleI.fw failed with error -2
>>   [  185.535906] usb 1-1: Falling back to sysfs fallback for: ueagle-atm/eagleI.fw
>> 
>>   [  185.535994] test kernfs_activate(): sleep 3s
>>   [  185.542397] usb 1-1: USB disconnect, device number 2
>>   [  185.560753] usb 1-1: [ueagle-atm vdbg]  entering uea_disconnect
>>   [  185.560766] usb 1-1: [ueagle-atm vdbg]  leaving  uea_disconnect
>>   [  185.584851] test __kernfs_remove(): done
>>   [  188.566069] test kernfs_activate(): slept 3s
>> 
>>   [  188.566086] ==================================================================
>>   [  188.566092] BUG: KASAN: slab-use-after-free in kernfs_root+0x68/0x80
>>   [  188.566110] Read of size 8 at addr ffff88800b387a30 by task kworker/0:1/11
>>   [  188.566119]
>>   [  188.566127] CPU: 0 UID: 0 PID: 11 Comm: kworker/0:1 Not tainted 7.1.0-rc2-next-20260508-dirty #92 PREEMPT_{RT,(lazy)}
>>   [  188.566139] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.2-debian-1.16.2-1 04/01/2014
>>   [  188.566146] Workqueue: events request_firmware_work_func
>>   [  188.566162] Call Trace:
>>   [  188.566171]  <TASK>
>>   [  188.566177]  dump_stack_lvl+0x64/0x80
>>   [  188.566192]  print_report+0xce/0x620
>>   [  188.566213]  kasan_report+0xce/0x100
>>   [  188.566229]  kernfs_root+0x68/0x80
>>   [  188.566236]  kernfs_next_descendant_post+0x1b/0x270
>>   [  188.566245]  kernfs_activate+0x79/0x110
>>   [  188.566253]  kernfs_add_one+0x267/0x3d0
>>   [  188.566262]  kernfs_create_dir_ns+0xcc/0x140
>>   [  188.566507]  sysfs_create_dir_ns+0x130/0x280
>>   [  188.566556]  kobject_add_internal+0x21b/0x9c0
>>   [  188.566564]  kobject_add+0x13a/0x200
>>   [  188.566601]  device_add+0x21e/0x1540
>>   [  188.566632]  firmware_fallback_sysfs+0x232/0x980
>>   [  188.566642]  _request_firmware+0xa53/0x1100
>>   [  188.566691]  request_firmware_work_func+0xeb/0x360
>>   [  188.566709]  process_one_work+0x610/0x1150
>>   [  188.566741]  worker_thread+0x50d/0xd60
>>   [  188.566771]  kthread+0x318/0x400
>>   [  188.566790]  ret_from_fork+0x447/0x6a0
>>   [  188.566853]  ret_from_fork_asm+0x1a/0x30
>>   [  188.566866]  </TASK>
>>   [  188.566869]
>>   [  188.566871] Allocated by task 11:
>>   [  188.566876]  kasan_save_stack+0x33/0x60
>>   [  188.566884]  kasan_save_track+0x14/0x30
>>   [  188.566891]  __kasan_slab_alloc+0x6e/0x70
>>   [  188.566898]  kmem_cache_alloc_noprof+0x1a5/0x4d0
>>   [  188.566907]  __kernfs_new_node+0xce/0x950
>>   [  188.566913]  kernfs_new_node+0xeb/0x170
>>   [  188.566920]  kernfs_create_dir_ns+0x2b/0x140
>>   [  188.566927]  sysfs_create_dir_ns+0x130/0x280
>>   [  188.566935]  kobject_add_internal+0x21b/0x9c0
>>   [  188.566941]  kobject_add+0x13a/0x200
>>   [  188.566947]  device_add+0x21e/0x1540
>>   [  188.566956]  firmware_fallback_sysfs+0x232/0x980
>>   [  188.566963]  _request_firmware+0xa53/0x1100
>>   [  188.566969]  request_firmware_work_func+0xeb/0x360
>>   [  188.566976]  process_one_work+0x610/0x1150
>>   [  188.566985]  worker_thread+0x50d/0xd60
>>   [  188.566993]  kthread+0x318/0x400
>>   [  188.567001]  ret_from_fork+0x447/0x6a0
>>   [  188.567007]  ret_from_fork_asm+0x1a/0x30
>>   [  188.567015]
>>   [  188.567016] Freed by task 20:
>>   [  188.567021]  kasan_save_stack+0x33/0x60
>>   [  188.567027]  kasan_save_track+0x14/0x30
>>   [  188.567032]  kasan_save_free_info+0x3b/0x60
>>   [  188.567040]  __kasan_slab_free+0x43/0x70
>>   [  188.567046]  kmem_cache_free+0xc3/0x510
>>   [  188.567055]  rcu_core+0x5d1/0x1a50
>>   [  188.567063]  rcu_cpu_kthread+0x148/0x6f0
>>   [  188.567070]  smpboot_thread_fn+0x347/0x8e0
>>   [  188.567080]  kthread+0x318/0x400
>>   [  188.567087]  ret_from_fork+0x447/0x6a0
>>   [  188.567093]  ret_from_fork_asm+0x1a/0x30
>>   [  188.567101]
>>   [  188.567103] Last potentially related work creation:
>>   [  188.567107]  kasan_save_stack+0x33/0x60
>>   [  188.567113]  kasan_record_aux_stack+0x8c/0xa0
>>   [  188.567121]  __call_rcu_common.constprop.0+0x76/0xa20
>>   [  188.567129]  kernfs_put.part.0+0x1aa/0x540
>>   [  188.567135]  __kernfs_remove.part.0+0x3f2/0x820
>>   [  188.567142]  kernfs_remove+0x9e/0xd0
>>   [  188.567149]  __kobject_del+0xc3/0x340
>>   [  188.567158]  kobject_del+0x35/0x50
>>   [  188.567163]  device_del+0x5ef/0x960
>>   [  188.567170]  usb_disconnect+0x504/0x970
>>   [  188.567181]  hub_event+0x2898/0x4670
>>   [  188.567187]  process_one_work+0x610/0x1150
>>   [  188.567196]  worker_thread+0x50d/0xd60
>>   [  188.567204]  kthread+0x318/0x400
>>   [  188.567212]  ret_from_fork+0x447/0x6a0
>>   [  188.567217]  ret_from_fork_asm+0x1a/0x30
>>   [  188.567225]
>>   [  188.567227] The buggy address belongs to the object at ffff88800b387a28
>>   [  188.567227]  which belongs to the cache kernfs_node_cache of size 136
>>   [  188.567235] The buggy address is located 8 bytes inside of
>>   [  188.567235]  freed 136-byte region [ffff88800b387a28, ffff88800b387ab0)
>>   [  188.567243]
>>   [  188.567245] The buggy address belongs to the physical page:
>>   [  188.567251] page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0xb387
>>   [  188.567259] flags: 0x100000000000000(node=0|zone=1)
>>   [  188.567267] page_type: f5(slab)
>>   [  188.567277] raw: 0100000000000000 ffff888006ead640 dead000000000100 dead000000000122
>>   [  188.567284] raw: 0000000000000000 0000000000140014 00000000f5000000 0000000000000000
>>   [  188.567288] page dumped because: kasan: bad access detected
>>   [  188.567291]
>>   [  188.567293] Memory state around the buggy address:
>>   [  188.567297]  ffff88800b387900: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
>>   [  188.567302]  ffff88800b387980: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
>>   [  188.567308] >ffff88800b387a00: fc fc fc fc fc fa fb fb fb fb fb fb fb fb fb fb
>>   [  188.567311]                                      ^
>>   [  188.567316]  ffff88800b387a80: fb fb fb fb fb fb fc fc fc fc fc fc fc fc 00 00
>>   [  188.567320]  ffff88800b387b00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fc
>>   [  188.567324] ==================================================================
>>   [  188.568915] Disabling lock debugging due to kernel taint
>> 
>> References:
>> 
>> [1] https://gist.github.com/mfoliveira/c6b77fbae3d8083be6944477aedbc5d2
>> [2] https://gist.github.com/mfoliveira/cd1d78561e2db80dd87103e835e3ebec
>> ---
>>  drivers/usb/atm/ueagle-atm.c | 22 ++++++++++------------
>>  1 file changed, 10 insertions(+), 12 deletions(-)
>> 
>> diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c
>> index f3ae72feb5bfc313ccfa1ab6a9bb40fcd8f5800a..8f8c63f613cccb7cce29bff62afe82587776f6b5 100644
>> --- a/drivers/usb/atm/ueagle-atm.c
>> +++ b/drivers/usb/atm/ueagle-atm.c
>> @@ -597,20 +597,15 @@ static int uea_send_modem_cmd(struct usb_device *usb,
>>  	return (ret == size) ? 0 : -EIO;
>>  }
>>  
>> -static void uea_upload_pre_firmware(const struct firmware *fw_entry,
>> -								void *context)
>> +static int uea_upload_pre_firmware(const struct firmware *fw_entry,
>> +				   struct usb_device *usb)
>>  {
>> -	struct usb_device *usb = context;
>>  	const u8 *pfw;
>>  	u8 value;
>>  	u32 crc = 0;
>>  	int ret, size;
>>  
>>  	uea_enters(usb);
>> -	if (!fw_entry) {
>> -		uea_err(usb, "firmware is not available\n");
>> -		goto err;
>> -	}
>>  
>>  	pfw = fw_entry->data;
>>  	size = fw_entry->size;
>> @@ -668,9 +663,11 @@ static void uea_upload_pre_firmware(const struct firmware *fw_entry,
>>  
>>  err_fw_corrupted:
>>  	uea_err(usb, "firmware is corrupted\n");
>> +	ret = -EINVAL;
>>  err:
>>  	release_firmware(fw_entry);
>>  	uea_leaves(usb);
>> +	return ret;
>>  }
>>  
>>  /*
>> @@ -680,6 +677,7 @@ static int uea_load_firmware(struct usb_device *usb, unsigned int ver)
>>  {
>>  	int ret;
>>  	char *fw_name = EAGLE_FIRMWARE;
>> +	const struct firmware *firmware;
>>  
>>  	uea_enters(usb);
>>  	uea_info(usb, "pre-firmware device, uploading firmware\n");
>> @@ -702,13 +700,13 @@ static int uea_load_firmware(struct usb_device *usb, unsigned int ver)
>>  		break;
>>  	}
>>  
>> -	ret = request_firmware_nowait(THIS_MODULE, 1, fw_name, &usb->dev,
>> -					GFP_KERNEL, usb,
>> -					uea_upload_pre_firmware);
>> -	if (ret)
>> +	ret = request_firmware(&firmware, fw_name, &usb->dev);
>> +	if (ret) {
>>  		uea_err(usb, "firmware %s is not available\n", fw_name);
>> -	else
>> +	} else {
>>  		uea_info(usb, "loading firmware %s\n", fw_name);
>> +		ret = uea_upload_pre_firmware(firmware, usb);
>> +	}
>>  
>>  	uea_leaves(usb);
>>  	return ret;
>> 
>> ---
>> base-commit: e98d21c170b01ddef366f023bbfcf6b31509fa83
>> change-id: 20260515-ueagle-atm_req-fw-sync-204761fa0809
>> 
>> Best regards,
>> -- 
>> Mauricio Faria de Oliveira <mfo@igalia.com>
>>

-- 
Mauricio

      reply	other threads:[~2026-05-18 15:54 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-15 23:52 [PATCH] usb: atm: ueagle-atm: use synchronous request_firmware() Mauricio Faria de Oliveira
2026-05-16  9:19 ` Stanislaw Gruszka
2026-05-18 15:54   ` Mauricio Faria de Oliveira [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=553f402beef6864520d0789f506fa4e2@igalia.com \
    --to=mfo@igalia.com \
    --cc=castet.matthieu@free.fr \
    --cc=gregkh@linuxfoundation.org \
    --cc=kernel-dev@igalia.com \
    --cc=linux-atm-general@lists.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=stf_xl@wp.pl \
    --cc=syzbot+306212936b13e520679d@syzkaller.appspotmail.com \
    --cc=syzbot+ce1e5a1b4e086b43e56d@syzkaller.appspotmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox