rtl8xxxu_start() allocates and submits RX URBs one at a time. If a later allocation fails, earlier requests may already be active. After a successful submission, that allocation failure can also leave ret set to zero. The error path then frees TX resources and disables RX filters without draining the earlier RX requests, yet reports startup success. Separate pool allocation from submission so an allocation failure can be handled before any RX request is active. Introduce rtl8xxxu_alloc_rx_urbs() to allocate all 32 wrappers, then rtl8xxxu_start_rx() to submit the completed pool. Return ENOMEM for every RX or TX URB pool allocation failure so a partial allocation is reported as an error. Once submission begins, keep ENOMEM/EAGAIN failures queued for retry. For other submission errors, rtl8xxxu_start_rx() frees the unsubmitted requests and returns the error. Since earlier submissions may already be active at that point, route the outer start failure through the existing rtl8xxxu_stop() path. This drains queued work and active requests and cleans up RF state and TX resources together. Interrupt URB submission failure uses the same cleanup path. Fixes: 26f1fad29ad9 ("New driver: rtl8xxxu (mac80211)") Assisted-by: GPT-6 Astra Signed-off-by: kimwooseok <5mghybrid@khu.ac.kr> --- drivers/net/wireless/realtek/rtl8xxxu/core.c | 99 ++++++++++++++------ 1 file changed, 71 insertions(+), 28 deletions(-)