Commit eae4d054 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: usb-audio: Annotate the endpoint index in audioformat

There are devices that have multiple endpoints sharing the same
iface/altset not only for sync but also for the actual streams, and
the audioformat for such an endpoint needs to be handled with the
proper endpoint index; otherwise it confuses the endpoint management.

This patch extends the audioformat to annotate the endpoint index, and
put the proper ep_idx=1 to Pioneer device quirk entries accordingly.

Fixes: bf6313a0 ("ALSA: usb-audio: Refactor endpoint management")
Link: https://lore.kernel.org/r/20210108075219.21463-5-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 00272c61
...@@ -18,6 +18,7 @@ struct audioformat { ...@@ -18,6 +18,7 @@ struct audioformat {
unsigned int frame_size; /* samples per frame for non-audio */ unsigned int frame_size; /* samples per frame for non-audio */
unsigned char iface; /* interface number */ unsigned char iface; /* interface number */
unsigned char altsetting; /* corresponding alternate setting */ unsigned char altsetting; /* corresponding alternate setting */
unsigned char ep_idx; /* endpoint array index */
unsigned char altset_idx; /* array index of altenate setting */ unsigned char altset_idx; /* array index of altenate setting */
unsigned char attributes; /* corresponding attributes of cs endpoint */ unsigned char attributes; /* corresponding attributes of cs endpoint */
unsigned char endpoint; /* endpoint */ unsigned char endpoint; /* endpoint */
......
...@@ -683,7 +683,7 @@ snd_usb_endpoint_open(struct snd_usb_audio *chip, ...@@ -683,7 +683,7 @@ snd_usb_endpoint_open(struct snd_usb_audio *chip,
} else { } else {
ep->iface = fp->iface; ep->iface = fp->iface;
ep->altsetting = fp->altsetting; ep->altsetting = fp->altsetting;
ep->ep_idx = 0; ep->ep_idx = fp->ep_idx;
} }
usb_audio_dbg(chip, "Open EP 0x%x, iface=%d:%d, idx=%d\n", usb_audio_dbg(chip, "Open EP 0x%x, iface=%d:%d, idx=%d\n",
ep_num, ep->iface, ep->altsetting, ep->ep_idx); ep_num, ep->iface, ep->altsetting, ep->ep_idx);
......
...@@ -3362,6 +3362,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), ...@@ -3362,6 +3362,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
.altsetting = 1, .altsetting = 1,
.altset_idx = 1, .altset_idx = 1,
.endpoint = 0x86, .endpoint = 0x86,
.ep_idx = 1,
.ep_attr = USB_ENDPOINT_XFER_ISOC| .ep_attr = USB_ENDPOINT_XFER_ISOC|
USB_ENDPOINT_SYNC_ASYNC| USB_ENDPOINT_SYNC_ASYNC|
USB_ENDPOINT_USAGE_IMPLICIT_FB, USB_ENDPOINT_USAGE_IMPLICIT_FB,
...@@ -3450,6 +3451,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), ...@@ -3450,6 +3451,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
.altsetting = 1, .altsetting = 1,
.altset_idx = 1, .altset_idx = 1,
.endpoint = 0x82, .endpoint = 0x82,
.ep_idx = 1,
.ep_attr = USB_ENDPOINT_XFER_ISOC| .ep_attr = USB_ENDPOINT_XFER_ISOC|
USB_ENDPOINT_SYNC_ASYNC| USB_ENDPOINT_SYNC_ASYNC|
USB_ENDPOINT_USAGE_IMPLICIT_FB, USB_ENDPOINT_USAGE_IMPLICIT_FB,
...@@ -3506,6 +3508,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), ...@@ -3506,6 +3508,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
.altsetting = 1, .altsetting = 1,
.altset_idx = 1, .altset_idx = 1,
.endpoint = 0x82, .endpoint = 0x82,
.ep_idx = 1,
.ep_attr = USB_ENDPOINT_XFER_ISOC| .ep_attr = USB_ENDPOINT_XFER_ISOC|
USB_ENDPOINT_SYNC_ASYNC| USB_ENDPOINT_SYNC_ASYNC|
USB_ENDPOINT_USAGE_IMPLICIT_FB, USB_ENDPOINT_USAGE_IMPLICIT_FB,
...@@ -3562,6 +3565,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), ...@@ -3562,6 +3565,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
.altsetting = 1, .altsetting = 1,
.altset_idx = 1, .altset_idx = 1,
.endpoint = 0x82, .endpoint = 0x82,
.ep_idx = 1,
.ep_attr = USB_ENDPOINT_XFER_ISOC| .ep_attr = USB_ENDPOINT_XFER_ISOC|
USB_ENDPOINT_SYNC_ASYNC| USB_ENDPOINT_SYNC_ASYNC|
USB_ENDPOINT_USAGE_IMPLICIT_FB, USB_ENDPOINT_USAGE_IMPLICIT_FB,
...@@ -3619,6 +3623,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), ...@@ -3619,6 +3623,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
.altsetting = 1, .altsetting = 1,
.altset_idx = 1, .altset_idx = 1,
.endpoint = 0x82, .endpoint = 0x82,
.ep_idx = 1,
.ep_attr = USB_ENDPOINT_XFER_ISOC| .ep_attr = USB_ENDPOINT_XFER_ISOC|
USB_ENDPOINT_SYNC_ASYNC| USB_ENDPOINT_SYNC_ASYNC|
USB_ENDPOINT_USAGE_IMPLICIT_FB, USB_ENDPOINT_USAGE_IMPLICIT_FB,
...@@ -3679,6 +3684,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), ...@@ -3679,6 +3684,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
.altsetting = 1, .altsetting = 1,
.altset_idx = 1, .altset_idx = 1,
.endpoint = 0x82, .endpoint = 0x82,
.ep_idx = 1,
.ep_attr = USB_ENDPOINT_XFER_ISOC| .ep_attr = USB_ENDPOINT_XFER_ISOC|
USB_ENDPOINT_SYNC_ASYNC| USB_ENDPOINT_SYNC_ASYNC|
USB_ENDPOINT_USAGE_IMPLICIT_FB, USB_ENDPOINT_USAGE_IMPLICIT_FB,
......
...@@ -194,7 +194,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, ...@@ -194,7 +194,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip,
} }
alts = &iface->altsetting[fp->altset_idx]; alts = &iface->altsetting[fp->altset_idx];
altsd = get_iface_desc(alts); altsd = get_iface_desc(alts);
if (altsd->bNumEndpoints < 1) { if (altsd->bNumEndpoints <= fp->ep_idx) {
err = -EINVAL; err = -EINVAL;
goto error; goto error;
} }
...@@ -204,7 +204,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, ...@@ -204,7 +204,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip,
if (fp->datainterval == 0) if (fp->datainterval == 0)
fp->datainterval = snd_usb_parse_datainterval(chip, alts); fp->datainterval = snd_usb_parse_datainterval(chip, alts);
if (fp->maxpacksize == 0) if (fp->maxpacksize == 0)
fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); fp->maxpacksize = le16_to_cpu(get_endpoint(alts, fp->ep_idx)->wMaxPacketSize);
if (!fp->fmt_type) if (!fp->fmt_type)
fp->fmt_type = UAC_FORMAT_TYPE_I; fp->fmt_type = UAC_FORMAT_TYPE_I;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment