| From 52521e8398839105ef8eb22b3f0993f9b0d11a57 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Fri, 10 Apr 2026 16:32:19 +0200 |
| Subject: ALSA: usb-audio: Evaluate packsize caps at the right place |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit 52521e8398839105ef8eb22b3f0993f9b0d11a57 upstream. |
| |
| We introduced the upper bound checks of the packet sizes by the |
| ep->maxframesize for avoiding the URB submission errors. However, the |
| check was applied at an incorrect place in the function |
| snd_usb_endpoint_set_params() where ep->maxframesize isn't defined |
| yet; the value is defined at a bit later position. So this ended up |
| with a failure at the first run while the second run works. |
| |
| For fixing it, move the check at the correct place, right after the |
| calculation of ep->maxframesize in the same function. |
| |
| Fixes: 7fe8dec3f628 ("ALSA: usb-audio: Cap the packet size pre-calculations") |
| Link: https://bugzilla.kernel.org/show_bug.cgi?id=221292 |
| Cc: <stable@vger.kernel.org> |
| Link: https://patch.msgid.link/20260410143220.1676344-1-tiwai@suse.de |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| sound/usb/endpoint.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/sound/usb/endpoint.c |
| +++ b/sound/usb/endpoint.c |
| @@ -1379,9 +1379,6 @@ int snd_usb_endpoint_set_params(struct s |
| return -EINVAL; |
| } |
| |
| - ep->packsize[0] = min(ep->packsize[0], ep->maxframesize); |
| - ep->packsize[1] = min(ep->packsize[1], ep->maxframesize); |
| - |
| /* calculate the frequency in 16.16 format */ |
| ep->freqm = ep->freqn; |
| ep->freqshift = INT_MIN; |
| @@ -1408,6 +1405,9 @@ int snd_usb_endpoint_set_params(struct s |
| ep->maxframesize = ep->maxpacksize / ep->cur_frame_bytes; |
| ep->curframesize = ep->curpacksize / ep->cur_frame_bytes; |
| |
| + ep->packsize[0] = min(ep->packsize[0], ep->maxframesize); |
| + ep->packsize[1] = min(ep->packsize[1], ep->maxframesize); |
| + |
| err = update_clock_ref_rate(chip, ep); |
| if (err >= 0) { |
| ep->need_setup = false; |