[alsa-devel] [PATCH v2 2/2] ALSA: usb: initial USB Audio Device Class 3.0 support
kbuild test robot
lkp at intel.com
Mon Mar 19 14:43:29 CET 2018
Hi Ruslan,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on linus/master]
[also build test WARNING on v4.16-rc6 next-20180316]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Ruslan-Bilovol/ALSA-usb-audio-move-audioformat-quirks-to-quirks-c/20180319-205541
config: i386-randconfig-x016-201811 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
# save the attached .config to linux build tree
make ARCH=i386
Note: it may well be a FALSE warning. FWIW you are at least aware of it now.
http://gcc.gnu.org/wiki/Better_Uninitialized_Warnings
All warnings (new ones prefixed by >>):
sound/usb/stream.c: In function 'snd_usb_parse_audio_interface':
>> sound/usb/stream.c:956:8: warning: 'fmt' may be used uninitialized in this function [-Wmaybe-uninitialized]
if (snd_usb_parse_audio_format(chip, fp, format,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fmt, stream) < 0) {
~~~~~~~~~~~~
vim +/fmt +956 sound/usb/stream.c
628
629 int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no)
630 {
631 struct usb_device *dev;
632 struct usb_interface *iface;
633 struct usb_host_interface *alts;
634 struct usb_interface_descriptor *altsd;
635 int i, altno, err, stream;
636 u64 format = 0;
637 unsigned int num_channels = 0;
638 struct audioformat *fp = NULL;
639 int num, protocol, clock = 0;
640 struct uac_format_type_i_continuous_descriptor *fmt;
641 struct snd_pcm_chmap_elem *chmap_v3 = NULL;
642 unsigned int chconfig;
643
644 dev = chip->dev;
645
646 /* parse the interface's altsettings */
647 iface = usb_ifnum_to_if(dev, iface_no);
648
649 num = iface->num_altsetting;
650
651 /*
652 * Dallas DS4201 workaround: It presents 5 altsettings, but the last
653 * one misses syncpipe, and does not produce any sound.
654 */
655 if (chip->usb_id == USB_ID(0x04fa, 0x4201))
656 num = 4;
657
658 for (i = 0; i < num; i++) {
659 alts = &iface->altsetting[i];
660 altsd = get_iface_desc(alts);
661 protocol = altsd->bInterfaceProtocol;
662 /* skip invalid one */
663 if (((altsd->bInterfaceClass != USB_CLASS_AUDIO ||
664 (altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIOSTREAMING &&
665 altsd->bInterfaceSubClass != USB_SUBCLASS_VENDOR_SPEC)) &&
666 altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||
667 altsd->bNumEndpoints < 1 ||
668 le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) == 0)
669 continue;
670 /* must be isochronous */
671 if ((get_endpoint(alts, 0)->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=
672 USB_ENDPOINT_XFER_ISOC)
673 continue;
674 /* check direction */
675 stream = (get_endpoint(alts, 0)->bEndpointAddress & USB_DIR_IN) ?
676 SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
677 altno = altsd->bAlternateSetting;
678
679 if (snd_usb_apply_interface_quirk(chip, iface_no, altno))
680 continue;
681
682 /*
683 * Roland audio streaming interfaces are marked with protocols
684 * 0/1/2, but are UAC 1 compatible.
685 */
686 if (USB_ID_VENDOR(chip->usb_id) == 0x0582 &&
687 altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
688 protocol <= 2)
689 protocol = UAC_VERSION_1;
690
691 chconfig = 0;
692 /* get audio formats */
693 switch (protocol) {
694 default:
695 dev_dbg(&dev->dev, "%u:%d: unknown interface protocol %#02x, assuming v1\n",
696 iface_no, altno, protocol);
697 protocol = UAC_VERSION_1;
698 /* fall through */
699
700 case UAC_VERSION_1: {
701 struct uac1_as_header_descriptor *as =
702 snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_AS_GENERAL);
703 struct uac_input_terminal_descriptor *iterm;
704
705 if (!as) {
706 dev_err(&dev->dev,
707 "%u:%d : UAC_AS_GENERAL descriptor not found\n",
708 iface_no, altno);
709 continue;
710 }
711
712 if (as->bLength < sizeof(*as)) {
713 dev_err(&dev->dev,
714 "%u:%d : invalid UAC_AS_GENERAL desc\n",
715 iface_no, altno);
716 continue;
717 }
718
719 format = le16_to_cpu(as->wFormatTag); /* remember the format value */
720
721 iterm = snd_usb_find_input_terminal_descriptor(chip->ctrl_intf,
722 as->bTerminalLink);
723 if (iterm) {
724 num_channels = iterm->bNrChannels;
725 chconfig = le16_to_cpu(iterm->wChannelConfig);
726 }
727
728 break;
729 }
730
731 case UAC_VERSION_2: {
732 struct uac2_input_terminal_descriptor *input_term;
733 struct uac2_output_terminal_descriptor *output_term;
734 struct uac2_as_header_descriptor *as =
735 snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_AS_GENERAL);
736
737 if (!as) {
738 dev_err(&dev->dev,
739 "%u:%d : UAC_AS_GENERAL descriptor not found\n",
740 iface_no, altno);
741 continue;
742 }
743
744 if (as->bLength < sizeof(*as)) {
745 dev_err(&dev->dev,
746 "%u:%d : invalid UAC_AS_GENERAL desc\n",
747 iface_no, altno);
748 continue;
749 }
750
751 num_channels = as->bNrChannels;
752 format = le32_to_cpu(as->bmFormats);
753 chconfig = le32_to_cpu(as->bmChannelConfig);
754
755 /* lookup the terminal associated to this interface
756 * to extract the clock */
757 input_term = snd_usb_find_input_terminal_descriptor(chip->ctrl_intf,
758 as->bTerminalLink);
759 if (input_term) {
760 clock = input_term->bCSourceID;
761 if (!chconfig && (num_channels == input_term->bNrChannels))
762 chconfig = le32_to_cpu(input_term->bmChannelConfig);
763 break;
764 }
765
766 output_term = snd_usb_find_output_terminal_descriptor(chip->ctrl_intf,
767 as->bTerminalLink);
768 if (output_term) {
769 clock = output_term->bCSourceID;
770 break;
771 }
772
773 dev_err(&dev->dev,
774 "%u:%d : bogus bTerminalLink %d\n",
775 iface_no, altno, as->bTerminalLink);
776 continue;
777 }
778
779 case UAC_VERSION_3: {
780 struct uac3_input_terminal_descriptor *input_term;
781 struct uac3_output_terminal_descriptor *output_term;
782 struct uac3_as_header_descriptor *as;
783 struct uac3_cluster_header_descriptor *cluster;
784 struct uac3_hc_descriptor_header hc_header;
785 u16 cluster_id, wLength;
786
787 as = snd_usb_find_csint_desc(alts->extra,
788 alts->extralen,
789 NULL, UAC_AS_GENERAL);
790
791 if (!as) {
792 dev_err(&dev->dev,
793 "%u:%d : UAC_AS_GENERAL descriptor not found\n",
794 iface_no, altno);
795 continue;
796 }
797
798 if (as->bLength < sizeof(*as)) {
799 dev_err(&dev->dev,
800 "%u:%d : invalid UAC_AS_GENERAL desc\n",
801 iface_no, altno);
802 continue;
803 }
804
805 cluster_id = le16_to_cpu(as->wClusterDescrID);
806 if (!cluster_id) {
807 dev_err(&dev->dev,
808 "%u:%d : no cluster descriptor\n",
809 iface_no, altno);
810 continue;
811 }
812
813 /*
814 * Get number of channels and channel map through
815 * High Capability Cluster Descriptor
816 *
817 * First step: get High Capability header and
818 * read size of Cluster Descriptor
819 */
820 err = snd_usb_ctl_msg(chip->dev,
821 usb_rcvctrlpipe(chip->dev, 0),
822 UAC3_CS_REQ_HIGH_CAPABILITY_DESCRIPTOR,
823 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
824 cluster_id,
825 snd_usb_ctrl_intf(chip),
826 &hc_header, sizeof(hc_header));
827 if (err < 0)
828 return err;
829 else if (err != sizeof(hc_header)) {
830 dev_err(&dev->dev,
831 "%u:%d : can't get High Capability descriptor\n",
832 iface_no, altno);
833 return -EIO;
834 }
835
836 /*
837 * Second step: allocate needed amount of memory
838 * and request Cluster Descriptor
839 */
840 wLength = le16_to_cpu(hc_header.wLength);
841 cluster = kzalloc(wLength, GFP_KERNEL);
842 if (!cluster)
843 return -ENOMEM;
844 err = snd_usb_ctl_msg(chip->dev,
845 usb_rcvctrlpipe(chip->dev, 0),
846 UAC3_CS_REQ_HIGH_CAPABILITY_DESCRIPTOR,
847 USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
848 cluster_id,
849 snd_usb_ctrl_intf(chip),
850 cluster, wLength);
851 if (err < 0) {
852 kfree(cluster);
853 return err;
854 } else if (err != wLength) {
855 dev_err(&dev->dev,
856 "%u:%d : can't get Cluster Descriptor\n",
857 iface_no, altno);
858 kfree(cluster);
859 return -EIO;
860 }
861
862 num_channels = cluster->bNrChannels;
863 chmap_v3 = convert_chmap_v3(cluster);
864
865 kfree(cluster);
866
867 format = le64_to_cpu(as->bmFormats);
868
869 /* lookup the terminal associated to this interface
870 * to extract the clock */
871 input_term = snd_usb_find_input_terminal_descriptor(
872 chip->ctrl_intf,
873 as->bTerminalLink);
874
875 if (input_term) {
876 clock = input_term->bCSourceID;
877 break;
878 }
879
880 output_term = snd_usb_find_output_terminal_descriptor(chip->ctrl_intf,
881 as->bTerminalLink);
882 if (output_term) {
883 clock = output_term->bCSourceID;
884 break;
885 }
886
887 dev_err(&dev->dev,
888 "%u:%d : bogus bTerminalLink %d\n",
889 iface_no, altno, as->bTerminalLink);
890 continue;
891 }
892 }
893
894 if (protocol == UAC_VERSION_1 || protocol == UAC_VERSION_2) {
895 /* get format type */
896 fmt = snd_usb_find_csint_desc(alts->extra,
897 alts->extralen,
898 NULL, UAC_FORMAT_TYPE);
899 if (!fmt) {
900 dev_err(&dev->dev,
901 "%u:%d : no UAC_FORMAT_TYPE desc\n",
902 iface_no, altno);
903 continue;
904 }
905 if (((protocol == UAC_VERSION_1) && (fmt->bLength < 8))
906 || ((protocol == UAC_VERSION_2) &&
907 (fmt->bLength < 6))) {
908 dev_err(&dev->dev,
909 "%u:%d : invalid UAC_FORMAT_TYPE desc\n",
910 iface_no, altno);
911 continue;
912 }
913
914 /*
915 * Blue Microphones workaround: The last altsetting is
916 * identical with the previous one, except for a larger
917 * packet size, but is actually a mislabeled two-channel
918 * setting; ignore it.
919 */
920 if (fmt->bNrChannels == 1 &&
921 fmt->bSubframeSize == 2 &&
922 altno == 2 && num == 3 &&
923 fp && fp->altsetting == 1 && fp->channels == 1 &&
924 fp->formats == SNDRV_PCM_FMTBIT_S16_LE &&
925 protocol == UAC_VERSION_1 &&
926 le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) ==
927 fp->maxpacksize * 2)
928 continue;
929 }
930
931 fp = kzalloc(sizeof(*fp), GFP_KERNEL);
932 if (!fp)
933 return -ENOMEM;
934
935 fp->iface = iface_no;
936 fp->altsetting = altno;
937 fp->altset_idx = i;
938 fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress;
939 fp->ep_attr = get_endpoint(alts, 0)->bmAttributes;
940 fp->datainterval = snd_usb_parse_datainterval(chip, alts);
941 fp->protocol = protocol;
942 fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
943 fp->channels = num_channels;
944 if (snd_usb_get_speed(dev) == USB_SPEED_HIGH)
945 fp->maxpacksize = (((fp->maxpacksize >> 11) & 3) + 1)
946 * (fp->maxpacksize & 0x7ff);
947 fp->attributes = parse_uac_endpoint_attributes(chip, alts, protocol, iface_no);
948 fp->clock = clock;
949 INIT_LIST_HEAD(&fp->list);
950
951 /* some quirks for attributes here */
952 snd_usb_audioformat_attributes_quirk(chip, fp, stream);
953
954 /* ok, let's parse further... */
955 if (protocol == UAC_VERSION_1 || protocol == UAC_VERSION_2) {
> 956 if (snd_usb_parse_audio_format(chip, fp, format,
957 fmt, stream) < 0) {
958 kfree(fp->rate_table);
959 kfree(fp);
960 fp = NULL;
961 continue;
962 }
963 } else {
964 struct uac3_as_header_descriptor *as;
965
966 as = snd_usb_find_csint_desc(alts->extra,
967 alts->extralen,
968 NULL, UAC_AS_GENERAL);
969
970 if (snd_usb_parse_audio_format_v3(chip, fp, as,
971 stream) < 0) {
972 kfree(fp->rate_table);
973 kfree(fp);
974 fp = NULL;
975 continue;
976 }
977 }
978
979 /* Create chmap */
980 if (fp->channels != num_channels)
981 chconfig = 0;
982
983 if (protocol == UAC_VERSION_3)
984 fp->chmap = chmap_v3;
985 else
986 fp->chmap = convert_chmap(fp->channels, chconfig,
987 protocol);
988
989 dev_dbg(&dev->dev, "%u:%d: add audio endpoint %#x\n", iface_no, altno, fp->endpoint);
990 err = snd_usb_add_audio_stream(chip, stream, fp);
991 if (err < 0) {
992 list_del(&fp->list); /* unlink for avoiding double-free */
993 kfree(fp->rate_table);
994 kfree(fp->chmap);
995 kfree(fp);
996 return err;
997 }
998 /* try to set the interface... */
999 usb_set_interface(chip->dev, iface_no, altno);
1000 snd_usb_init_pitch(chip, iface_no, alts, fp);
1001 snd_usb_init_sample_rate(chip, iface_no, alts, fp, fp->rate_max);
1002 }
1003 return 0;
1004 }
1005
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 28503 bytes
Desc: not available
URL: <http://mailman.alsa-project.org/pipermail/alsa-devel/attachments/20180319/99c0cf4d/attachment-0001.bin>
More information about the Alsa-devel
mailing list