FAILED: patch "[PATCH] ALSA: usb-audio: Fix UAC2 get_ctl request with a RANGE" failed to apply to 3.18-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 3.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
447cae58cecd69392b74a4a42cd0ab9cabd816afMon Sep 17 00:00:00 2001
From: Kirill Marinushkin <[email protected]>
Date: Mon, 29 Jan 2018 06:37:55 +0100
Subject: [PATCH] ALSA: usb-audio: Fix UAC2 get_ctl request with a RANGE
attribute
The layout of the UAC2 Control request and response varies depending on the request type. With the current implementation, only the Layout 2 Parameter Block (with the 2-byte sized RANGE attribute) is handled properly. For the Control requests with the 1-byte sized RANGE attribute (Bass Control, Mid Control, Tremble Control), the response is parsed incorrectly.
This commit:
* fixes the wLength field value in the request
* fixes parsing the range values from the response
sound/usb/mixer.c +11 -7
@@ -347,17 +347,20 @@ static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, int validx, int *value_ret) { struct snd_usb_audio *chip = cval->head.mixer->chip; -unsigned char buf[4 +3 *sizeof (__u32)];/* enough space for one range */ +/* enough space for one range */ +unsigned char buf[sizeof (__u16) +3 *sizeof (__u32)];unsigned char *val; -int idx =0 , ret, size; +int idx =0 , ret, val_size, size;__u8 bRequest; + val_size =uac2_ctl_value_size (cval->val_type); +if (request ==UAC_GET_CUR ) { bRequest =UAC2_CS_CUR ; - size =uac2_ctl_value_size (cval->val_type); + size = val_size; }else { bRequest =UAC2_CS_RANGE ; - size =sizeof (buf); + size =sizeof (__u16) +3 * val_size; }memset (buf,0 ,sizeof (buf));
@@ -390,16 +393,17 @@ static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, val = buf +sizeof (__u16);break ;case UAC_GET_MAX : - val = buf +sizeof (__u16) *2 ; + val = buf +sizeof (__u16) + val_size;break ;case UAC_GET_RES : - val = buf +sizeof (__u16) *3 ; + val = buf +sizeof (__u16) + val_size *2 ;break ;default :return -EINVAL ; } - *value_ret =convert_signed_value (cval,snd_usb_combine_bytes (val,sizeof (__u16))); + *value_ret =convert_signed_value (cval, +snd_usb_combine_bytes (val, val_size));return 0 ; }