ALSA: usb-audio: Evaluate packsize caps at the right place
PATCH v2 1/1 ALSA: usb-audio: Evaluate packsize caps at the right place
From: Takashi Iwai <[email protected]>
[ Upstream commit 52521e8398839105ef8eb22b3f0993f9b0d11a57 ]
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.
[王YP: Move the check to snd_usb_pcm_prepare(). For linux-5.10.y,
ep->maxframesize is calculated in `snd_usb_pcm_prepare()`.]
--- sound/usb/endpoint.c | 3 --- sound/usb/pcm.c | 7 +++++++ 2 files changed, 7 insertions(+), 3 deletions(-)
sound/usb/endpoint.c +0 -3
@@ -1099,9 +1099,6 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,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 ;
sound/usb/pcm.c +7 -0
@@ -953,6 +953,13 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream) subs->data_endpoint->curframesize =bytes_to_frames (runtime, subs->data_endpoint->curpacksize); + subs->data_endpoint->packsize[0 ] =min ( + subs->data_endpoint->packsize[0 ], + subs->data_endpoint->maxframesize); + subs->data_endpoint->packsize[1 ] =min ( + subs->data_endpoint->packsize[1 ], + subs->data_endpoint->maxframesize); +/* reset the pointer */ subs->hwptr_done =0 ; subs->transfer_done =0 ;
Signature · 1 line
2.43.0
Quoted 2 lines · 王YP
[王YP: Move the check to
snd_usb_pcm_prepare(). For linux-5.10.y,ep->maxframesize is calculated in `snd_usb_pcm_prepare()`.]
Queued for 5.10, thanks.
Signature · 2 lines
Thanks, Sasha