|
@@ -221,32 +221,13 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif)
|
|
|
struct usb_device *dev = chip->dev;
|
|
|
struct usb_host_interface *host_iface;
|
|
|
struct usb_interface_descriptor *altsd;
|
|
|
- void *control_header;
|
|
|
int i, protocol;
|
|
|
- int rest_bytes;
|
|
|
|
|
|
/* find audiocontrol interface */
|
|
|
host_iface = &usb_ifnum_to_if(dev, ctrlif)->altsetting[0];
|
|
|
- control_header = snd_usb_find_csint_desc(host_iface->extra,
|
|
|
- host_iface->extralen,
|
|
|
- NULL, UAC_HEADER);
|
|
|
altsd = get_iface_desc(host_iface);
|
|
|
protocol = altsd->bInterfaceProtocol;
|
|
|
|
|
|
- if (!control_header) {
|
|
|
- dev_err(&dev->dev, "cannot find UAC_HEADER\n");
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
- rest_bytes = (void *)(host_iface->extra + host_iface->extralen) -
|
|
|
- control_header;
|
|
|
-
|
|
|
- /* just to be sure -- this shouldn't hit at all */
|
|
|
- if (rest_bytes <= 0) {
|
|
|
- dev_err(&dev->dev, "invalid control header\n");
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
switch (protocol) {
|
|
|
default:
|
|
|
dev_warn(&dev->dev,
|
|
@@ -255,7 +236,25 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif)
|
|
|
/* fall through */
|
|
|
|
|
|
case UAC_VERSION_1: {
|
|
|
- struct uac1_ac_header_descriptor *h1 = control_header;
|
|
|
+ struct uac1_ac_header_descriptor *h1;
|
|
|
+ int rest_bytes;
|
|
|
+
|
|
|
+ h1 = snd_usb_find_csint_desc(host_iface->extra,
|
|
|
+ host_iface->extralen,
|
|
|
+ NULL, UAC_HEADER);
|
|
|
+ if (!h1) {
|
|
|
+ dev_err(&dev->dev, "cannot find UAC_HEADER\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ rest_bytes = (void *)(host_iface->extra +
|
|
|
+ host_iface->extralen) - (void *)h1;
|
|
|
+
|
|
|
+ /* just to be sure -- this shouldn't hit at all */
|
|
|
+ if (rest_bytes <= 0) {
|
|
|
+ dev_err(&dev->dev, "invalid control header\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
|
|
|
if (rest_bytes < sizeof(*h1)) {
|
|
|
dev_err(&dev->dev, "too short v1 buffer descriptor\n");
|