Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ALSA: usb-audio: Don't try to submit URBs after disconnection

USB-audio driver can still submit URBs while the device is being
disconnected, and it may result in spurious error messages like:
usb 1-2: cannot submit urb (err = -19)
usb 1-2: Unable to submit urb #0: -19 at snd_usb_queue_pending_output_urbs
usb 1-2: cannot submit urb 0, error -19: no device
Although those are harmless, they are just ugly.

This patch tries to avoid spewing such error messages when the device
is already at the disconnected state. It also skips the superfluous
xfer notification, too.

Link: https://lore.kernel.org/r/20230828101924.27107-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>

+27 -13
+27 -13
sound/usb/endpoint.c
··· 505 505 return -EPIPE; 506 506 } 507 507 508 - err = usb_submit_urb(ctx->urb, GFP_ATOMIC); 508 + if (!atomic_read(&ep->chip->shutdown)) 509 + err = usb_submit_urb(ctx->urb, GFP_ATOMIC); 510 + else 511 + err = -ENODEV; 509 512 if (err < 0) { 510 - usb_audio_err(ep->chip, 511 - "Unable to submit urb #%d: %d at %s\n", 512 - ctx->index, err, __func__); 513 - if (!in_stream_lock) 514 - notify_xrun(ep); 513 + if (!atomic_read(&ep->chip->shutdown)) { 514 + usb_audio_err(ep->chip, 515 + "Unable to submit urb #%d: %d at %s\n", 516 + ctx->index, err, __func__); 517 + if (!in_stream_lock) 518 + notify_xrun(ep); 519 + } 515 520 return -EPIPE; 516 521 } 517 522 ··· 580 575 prepare_inbound_urb(ep, ctx); 581 576 } 582 577 583 - err = usb_submit_urb(urb, GFP_ATOMIC); 578 + if (!atomic_read(&ep->chip->shutdown)) 579 + err = usb_submit_urb(urb, GFP_ATOMIC); 580 + else 581 + err = -ENODEV; 584 582 if (err == 0) 585 583 return; 586 584 587 - usb_audio_err(ep->chip, "cannot submit urb (err = %d)\n", err); 588 - notify_xrun(ep); 585 + if (!atomic_read(&ep->chip->shutdown)) { 586 + usb_audio_err(ep->chip, "cannot submit urb (err = %d)\n", err); 587 + notify_xrun(ep); 588 + } 589 589 590 590 exit_clear: 591 591 clear_bit(ctx->index, &ep->active_mask); ··· 1613 1603 goto __error; 1614 1604 } 1615 1605 1616 - err = usb_submit_urb(urb, GFP_ATOMIC); 1606 + if (!atomic_read(&ep->chip->shutdown)) 1607 + err = usb_submit_urb(urb, GFP_ATOMIC); 1608 + else 1609 + err = -ENODEV; 1617 1610 if (err < 0) { 1618 - usb_audio_err(ep->chip, 1619 - "cannot submit urb %d, error %d: %s\n", 1620 - i, err, usb_error_string(err)); 1611 + if (!atomic_read(&ep->chip->shutdown)) 1612 + usb_audio_err(ep->chip, 1613 + "cannot submit urb %d, error %d: %s\n", 1614 + i, err, usb_error_string(err)); 1621 1615 goto __error; 1622 1616 } 1623 1617 set_bit(i, &ep->active_mask);