ALSA: scarlett2: Add retry on -EPROTO from scarlett2_usb_tx()
Subsystems (2)
Geoffrey D. Bennett
maintainerPATCH 1/1 ALSA: scarlett2: Add retry on -EPROTO from scarlett2_usb_tx()
During communication with Focusrite Scarlett Gen 2/3/4 USB audio interfaces, -EPROTO is sometimes returned from scarlett2_usb_tx(), snd_usb_ctl_msg() which can cause initialisation and control operations to fail intermittently.
This patch adds up to 5 retries in scarlett2_usb(), with a delay starting at 5ms and doubling each time. This follows the same approach as the fix for usb_set_interface() in endpoint.c (commit f406005e162b ("ALSA: usb-audio: Add retry on -EPROTO from usb_set_interface()")), which resolved similar -EPROTO issues during device initialisation, and is the same approach as in fcp.c:fcp_usb().
--- sound/usb/mixer_scarlett2.c | 7 +++++++ 1 file changed, 7 insertions(+)
sound/usb/mixer_scarlett2.c +7 -0
@@ -2351,6 +2351,8 @@ static int scarlett2_usb(struct scarlett2_usb_packet *req, *resp =NULL ;size_t req_buf_size =struct_size (req, data, req_size);size_t resp_buf_size =struct_size (resp, data, resp_size); +int retries =0 ; +const int max_retries =5 ;int err; req =kmalloc (req_buf_size,GFP_KERNEL );
@@ -2374,10 +2376,15 @@ static int scarlett2_usb(if (req_size)memcpy (req->data, req_data, req_size); +retry: err =scarlett2_usb_tx (dev, private->bInterfaceNumber, req, req_buf_size);if (err != req_buf_size) { +if (err == -EPROTO && ++retries <= max_retries) { +msleep (5 * (1 << (retries -1 ))); + goto retry; + } usb_audio_err( mixer->chip, "%s USB request result cmd %x was %d\n",
Signature · 1 line
2.45.0
Takashi Iwai
AppliedQuoted 13 lines · Geoffrey D. Bennett
During communication with Focusrite Scarlett Gen 2/3/4 USB audio interfaces,
-EPROTOis sometimes returned fromscarlett2_usb_tx(),snd_usb_ctl_msg()which can cause initialisation and control operations to fail intermittently.This patch adds up to 5 retries in
scarlett2_usb(), with a delay starting at 5ms and doubling each time. This follows the same approach as the fix forusb_set_interface()inendpoint.c(commitf406005e162b("ALSA: usb-audio: Add retry on-EPROTOfromusb_set_interface()")), which resolved similar-EPROTOissues during device initialisation, and is the same approach as in fcp.c:fcp_usb().
Quoted 4 lines
Fixes 9e4d5c1be21f ("ALSA: usb-audio: Scarlett Gen 2 mixer interface")Signed-off-by Geoffrey D. Bennett <[email protected]>
Thanks, applied now.
Takashi