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: bf6313a0ff76 ("ALSA: usb-audio: Refactor endpoint management")
Link: https://lore.kernel.org/r/20210108075219.21463-5-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
 
        unsigned int frame_size;        /* samples per frame for non-audio */
        unsigned char iface;            /* interface number */
        unsigned char altsetting;       /* corresponding alternate setting */
+       unsigned char ep_idx;           /* endpoint array index */
        unsigned char altset_idx;       /* array index of altenate setting */
        unsigned char attributes;       /* corresponding attributes of cs endpoint */
        unsigned char endpoint;         /* endpoint */
 
                } else {
                        ep->iface = fp->iface;
                        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",
                              ep_num, ep->iface, ep->altsetting, ep->ep_idx);
 
                                        .altsetting = 1,
                                        .altset_idx = 1,
                                        .endpoint = 0x86,
+                                       .ep_idx = 1,
                                        .ep_attr = USB_ENDPOINT_XFER_ISOC|
                                                 USB_ENDPOINT_SYNC_ASYNC|
                                                 USB_ENDPOINT_USAGE_IMPLICIT_FB,
                                        .altsetting = 1,
                                        .altset_idx = 1,
                                        .endpoint = 0x82,
+                                       .ep_idx = 1,
                                        .ep_attr = USB_ENDPOINT_XFER_ISOC|
                                                USB_ENDPOINT_SYNC_ASYNC|
                                                USB_ENDPOINT_USAGE_IMPLICIT_FB,
                                        .altsetting = 1,
                                        .altset_idx = 1,
                                        .endpoint = 0x82,
+                                       .ep_idx = 1,
                                        .ep_attr = USB_ENDPOINT_XFER_ISOC|
                                                 USB_ENDPOINT_SYNC_ASYNC|
                                                 USB_ENDPOINT_USAGE_IMPLICIT_FB,
                                        .altsetting = 1,
                                        .altset_idx = 1,
                                        .endpoint = 0x82,
+                                       .ep_idx = 1,
                                        .ep_attr = USB_ENDPOINT_XFER_ISOC|
                                                 USB_ENDPOINT_SYNC_ASYNC|
                                                 USB_ENDPOINT_USAGE_IMPLICIT_FB,
                                        .altsetting = 1,
                                        .altset_idx = 1,
                                        .endpoint = 0x82,
+                                       .ep_idx = 1,
                                        .ep_attr = USB_ENDPOINT_XFER_ISOC|
                                                USB_ENDPOINT_SYNC_ASYNC|
                                        USB_ENDPOINT_USAGE_IMPLICIT_FB,
                                        .altsetting = 1,
                                        .altset_idx = 1,
                                        .endpoint = 0x82,
+                                       .ep_idx = 1,
                                        .ep_attr = USB_ENDPOINT_XFER_ISOC|
                                            USB_ENDPOINT_SYNC_ASYNC|
                                            USB_ENDPOINT_USAGE_IMPLICIT_FB,
 
        }
        alts = &iface->altsetting[fp->altset_idx];
        altsd = get_iface_desc(alts);
-       if (altsd->bNumEndpoints < 1) {
+       if (altsd->bNumEndpoints <= fp->ep_idx) {
                err = -EINVAL;
                goto error;
        }
        if (fp->datainterval == 0)
                fp->datainterval = snd_usb_parse_datainterval(chip, alts);
        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)
                fp->fmt_type = UAC_FORMAT_TYPE_I;