[alsa-devel] [PATCH 1/1] ALSA: usb: initial USB Audio Device Class 3.0 support

kbuild test robot lkp at intel.com
Wed Nov 8 17:46:44 CET 2017


Hi Ruslan,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on sound/for-next]
[also build test WARNING on v4.14-rc8 next-20171108]
[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/USB-Audio-Device-Class-3-0-support/20171108-235800
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git for-next
config: mips-allyesconfig (attached as .config)
compiler: mips-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=mips 

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:917: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 +917 sound/usb/stream.c

   561	
   562	int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no)
   563	{
   564		struct usb_device *dev;
   565		struct usb_interface *iface;
   566		struct usb_host_interface *alts;
   567		struct usb_interface_descriptor *altsd;
   568		int i, altno, err, stream;
   569		u64 format = 0;
   570		unsigned int num_channels = 0;
   571		struct audioformat *fp = NULL;
   572		int num, protocol, clock = 0;
   573		struct uac_format_type_i_continuous_descriptor *fmt;
   574		struct snd_pcm_chmap_elem *chmap_v3 = NULL;
   575		unsigned int chconfig;
   576	
   577		dev = chip->dev;
   578	
   579		/* parse the interface's altsettings */
   580		iface = usb_ifnum_to_if(dev, iface_no);
   581	
   582		num = iface->num_altsetting;
   583	
   584		/*
   585		 * Dallas DS4201 workaround: It presents 5 altsettings, but the last
   586		 * one misses syncpipe, and does not produce any sound.
   587		 */
   588		if (chip->usb_id == USB_ID(0x04fa, 0x4201))
   589			num = 4;
   590	
   591		for (i = 0; i < num; i++) {
   592			alts = &iface->altsetting[i];
   593			altsd = get_iface_desc(alts);
   594			protocol = altsd->bInterfaceProtocol;
   595			/* skip invalid one */
   596			if (((altsd->bInterfaceClass != USB_CLASS_AUDIO ||
   597			      (altsd->bInterfaceSubClass != USB_SUBCLASS_AUDIOSTREAMING &&
   598			       altsd->bInterfaceSubClass != USB_SUBCLASS_VENDOR_SPEC)) &&
   599			     altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||
   600			    altsd->bNumEndpoints < 1 ||
   601			    le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) == 0)
   602				continue;
   603			/* must be isochronous */
   604			if ((get_endpoint(alts, 0)->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=
   605			    USB_ENDPOINT_XFER_ISOC)
   606				continue;
   607			/* check direction */
   608			stream = (get_endpoint(alts, 0)->bEndpointAddress & USB_DIR_IN) ?
   609				SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
   610			altno = altsd->bAlternateSetting;
   611	
   612			if (snd_usb_apply_interface_quirk(chip, iface_no, altno))
   613				continue;
   614	
   615			/*
   616			 * Roland audio streaming interfaces are marked with protocols
   617			 * 0/1/2, but are UAC 1 compatible.
   618			 */
   619			if (USB_ID_VENDOR(chip->usb_id) == 0x0582 &&
   620			    altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
   621			    protocol <= 2)
   622				protocol = UAC_VERSION_1;
   623	
   624			chconfig = 0;
   625			/* get audio formats */
   626			switch (protocol) {
   627			default:
   628				dev_dbg(&dev->dev, "%u:%d: unknown interface protocol %#02x, assuming v1\n",
   629					iface_no, altno, protocol);
   630				protocol = UAC_VERSION_1;
   631				/* fall through */
   632	
   633			case UAC_VERSION_1: {
   634				struct uac1_as_header_descriptor *as =
   635					snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_AS_GENERAL);
   636				struct uac_input_terminal_descriptor *iterm;
   637	
   638				if (!as) {
   639					dev_err(&dev->dev,
   640						"%u:%d : UAC_AS_GENERAL descriptor not found\n",
   641						iface_no, altno);
   642					continue;
   643				}
   644	
   645				if (as->bLength < sizeof(*as)) {
   646					dev_err(&dev->dev,
   647						"%u:%d : invalid UAC_AS_GENERAL desc\n",
   648						iface_no, altno);
   649					continue;
   650				}
   651	
   652				format = le16_to_cpu(as->wFormatTag); /* remember the format value */
   653	
   654				iterm = snd_usb_find_input_terminal_descriptor(chip->ctrl_intf,
   655									       as->bTerminalLink);
   656				if (iterm) {
   657					num_channels = iterm->bNrChannels;
   658					chconfig = le16_to_cpu(iterm->wChannelConfig);
   659				}
   660	
   661				break;
   662			}
   663	
   664			case UAC_VERSION_2: {
   665				struct uac2_input_terminal_descriptor *input_term;
   666				struct uac2_output_terminal_descriptor *output_term;
   667				struct uac2_as_header_descriptor *as =
   668					snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_AS_GENERAL);
   669	
   670				if (!as) {
   671					dev_err(&dev->dev,
   672						"%u:%d : UAC_AS_GENERAL descriptor not found\n",
   673						iface_no, altno);
   674					continue;
   675				}
   676	
   677				if (as->bLength < sizeof(*as)) {
   678					dev_err(&dev->dev,
   679						"%u:%d : invalid UAC_AS_GENERAL desc\n",
   680						iface_no, altno);
   681					continue;
   682				}
   683	
   684				num_channels = as->bNrChannels;
   685				format = le32_to_cpu(as->bmFormats);
   686				chconfig = le32_to_cpu(as->bmChannelConfig);
   687	
   688				/* lookup the terminal associated to this interface
   689				 * to extract the clock */
   690				input_term = snd_usb_find_input_terminal_descriptor(chip->ctrl_intf,
   691										    as->bTerminalLink);
   692				if (input_term) {
   693					clock = input_term->bCSourceID;
   694					if (!chconfig && (num_channels == input_term->bNrChannels))
   695						chconfig = le32_to_cpu(input_term->bmChannelConfig);
   696					break;
   697				}
   698	
   699				output_term = snd_usb_find_output_terminal_descriptor(chip->ctrl_intf,
   700										      as->bTerminalLink);
   701				if (output_term) {
   702					clock = output_term->bCSourceID;
   703					break;
   704				}
   705	
   706				dev_err(&dev->dev,
   707					"%u:%d : bogus bTerminalLink %d\n",
   708					iface_no, altno, as->bTerminalLink);
   709				continue;
   710			}
   711	
   712			case UAC_VERSION_3: {
   713				struct uac3_input_terminal_descriptor *input_term;
   714				struct uac3_output_terminal_descriptor *output_term;
   715				struct uac3_as_header_descriptor *as;
   716				struct uac3_cluster_header_descriptor *cluster;
   717				struct uac3_hc_descriptor_header hc_header;
   718				u16 cluster_id, wLength;
   719	
   720				as = snd_usb_find_csint_desc(alts->extra,
   721								alts->extralen,
   722								NULL, UAC_AS_GENERAL);
   723	
   724				if (!as) {
   725					dev_err(&dev->dev,
   726						"%u:%d : UAC_AS_GENERAL descriptor not found\n",
   727						iface_no, altno);
   728					continue;
   729				}
   730	
   731				if (as->bLength < sizeof(*as)) {
   732					dev_err(&dev->dev,
   733						"%u:%d : invalid UAC_AS_GENERAL desc\n",
   734						iface_no, altno);
   735					continue;
   736				}
   737	
   738				cluster_id = le16_to_cpu(as->wClusterDescrID);
   739				if (!cluster_id) {
   740					dev_err(&dev->dev,
   741						"%u:%d : no cluster descriptor\n",
   742						iface_no, altno);
   743					continue;
   744				}
   745	
   746				/*
   747				 * Get number of channels and channel map through
   748				 * High Capability Cluster Descriptor
   749				 *
   750				 * First step: get High Capability header and
   751				 * read size of Cluster Descriptor
   752				 */
   753				err = snd_usb_ctl_msg(chip->dev,
   754						usb_rcvctrlpipe(chip->dev, 0),
   755						UAC3_CS_REQ_HIGH_CAPABILITY_DESCRIPTOR,
   756						USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
   757						cluster_id,
   758						snd_usb_ctrl_intf(chip),
   759						&hc_header, sizeof(hc_header));
   760				if (err < 0)
   761					return err;
   762				else if (err != sizeof(hc_header)) {
   763					dev_err(&dev->dev,
   764						"%u:%d : can't get High Capability descriptor\n",
   765						iface_no, altno);
   766					return -EIO;
   767				}
   768	
   769				/*
   770				 * Second step: allocate needed amount of memory
   771				 * and request Cluster Descriptor
   772				 */
   773				wLength = le16_to_cpu(hc_header.wLength);
   774				cluster = kzalloc(wLength, GFP_KERNEL);
   775				if (!cluster)
   776					return -ENOMEM;
   777				err = snd_usb_ctl_msg(chip->dev,
   778						usb_rcvctrlpipe(chip->dev, 0),
   779						UAC3_CS_REQ_HIGH_CAPABILITY_DESCRIPTOR,
   780						USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
   781						cluster_id,
   782						snd_usb_ctrl_intf(chip),
   783						cluster, wLength);
   784				if (err < 0) {
   785					kfree(cluster);
   786					return err;
   787				} else if (err != wLength) {
   788					dev_err(&dev->dev,
   789						"%u:%d : can't get Cluster Descriptor\n",
   790						iface_no, altno);
   791					kfree(cluster);
   792					return -EIO;
   793				}
   794	
   795				num_channels = cluster->bNrChannels;
   796				chmap_v3 = convert_chmap_v3(cluster);
   797	
   798				kfree(cluster);
   799	
   800				format = le64_to_cpu(as->bmFormats);
   801	
   802				/* lookup the terminal associated to this interface
   803				 * to extract the clock */
   804				input_term = snd_usb_find_input_terminal_descriptor(
   805								chip->ctrl_intf,
   806								as->bTerminalLink);
   807	
   808				if (input_term) {
   809					clock = input_term->bCSourceID;
   810					break;
   811				}
   812	
   813				output_term = snd_usb_find_output_terminal_descriptor(chip->ctrl_intf,
   814										      as->bTerminalLink);
   815				if (output_term) {
   816					clock = output_term->bCSourceID;
   817					break;
   818				}
   819	
   820				dev_err(&dev->dev,
   821					"%u:%d : bogus bTerminalLink %d\n",
   822					iface_no, altno, as->bTerminalLink);
   823				continue;
   824			}
   825			}
   826	
   827			if (protocol == UAC_VERSION_1 || protocol == UAC_VERSION_2) {
   828				/* get format type */
   829				fmt = snd_usb_find_csint_desc(alts->extra,
   830							      alts->extralen,
   831							      NULL, UAC_FORMAT_TYPE);
   832				if (!fmt) {
   833					dev_err(&dev->dev,
   834						"%u:%d : no UAC_FORMAT_TYPE desc\n",
   835						iface_no, altno);
   836					continue;
   837				}
   838				if (((protocol == UAC_VERSION_1) && (fmt->bLength < 8))
   839						|| ((protocol == UAC_VERSION_2) &&
   840								(fmt->bLength < 6))) {
   841					dev_err(&dev->dev,
   842						"%u:%d : invalid UAC_FORMAT_TYPE desc\n",
   843						iface_no, altno);
   844					continue;
   845				}
   846	
   847				/*
   848				 * Blue Microphones workaround: The last altsetting is
   849				 * identical with the previous one, except for a larger
   850				 * packet size, but is actually a mislabeled two-channel
   851				 * setting; ignore it.
   852				 */
   853				if (fmt->bNrChannels == 1 &&
   854				    fmt->bSubframeSize == 2 &&
   855				    altno == 2 && num == 3 &&
   856				    fp && fp->altsetting == 1 && fp->channels == 1 &&
   857				    fp->formats == SNDRV_PCM_FMTBIT_S16_LE &&
   858				    protocol == UAC_VERSION_1 &&
   859				    le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) ==
   860								fp->maxpacksize * 2)
   861					continue;
   862			}
   863	
   864			fp = kzalloc(sizeof(*fp), GFP_KERNEL);
   865			if (!fp)
   866				return -ENOMEM;
   867	
   868			fp->iface = iface_no;
   869			fp->altsetting = altno;
   870			fp->altset_idx = i;
   871			fp->endpoint = get_endpoint(alts, 0)->bEndpointAddress;
   872			fp->ep_attr = get_endpoint(alts, 0)->bmAttributes;
   873			fp->datainterval = snd_usb_parse_datainterval(chip, alts);
   874			fp->protocol = protocol;
   875			fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
   876			fp->channels = num_channels;
   877			if (snd_usb_get_speed(dev) == USB_SPEED_HIGH)
   878				fp->maxpacksize = (((fp->maxpacksize >> 11) & 3) + 1)
   879						* (fp->maxpacksize & 0x7ff);
   880			fp->attributes = parse_uac_endpoint_attributes(chip, alts, protocol, iface_no);
   881			fp->clock = clock;
   882			INIT_LIST_HEAD(&fp->list);
   883	
   884			/* some quirks for attributes here */
   885	
   886			switch (chip->usb_id) {
   887			case USB_ID(0x0a92, 0x0053): /* AudioTrak Optoplay */
   888				/* Optoplay sets the sample rate attribute although
   889				 * it seems not supporting it in fact.
   890				 */
   891				fp->attributes &= ~UAC_EP_CS_ATTR_SAMPLE_RATE;
   892				break;
   893			case USB_ID(0x041e, 0x3020): /* Creative SB Audigy 2 NX */
   894			case USB_ID(0x0763, 0x2003): /* M-Audio Audiophile USB */
   895				/* doesn't set the sample rate attribute, but supports it */
   896				fp->attributes |= UAC_EP_CS_ATTR_SAMPLE_RATE;
   897				break;
   898			case USB_ID(0x0763, 0x2001):  /* M-Audio Quattro USB */
   899			case USB_ID(0x0763, 0x2012):  /* M-Audio Fast Track Pro USB */
   900			case USB_ID(0x047f, 0x0ca1): /* plantronics headset */
   901			case USB_ID(0x077d, 0x07af): /* Griffin iMic (note that there is
   902							an older model 77d:223) */
   903			/*
   904			 * plantronics headset and Griffin iMic have set adaptive-in
   905			 * although it's really not...
   906			 */
   907				fp->ep_attr &= ~USB_ENDPOINT_SYNCTYPE;
   908				if (stream == SNDRV_PCM_STREAM_PLAYBACK)
   909					fp->ep_attr |= USB_ENDPOINT_SYNC_ADAPTIVE;
   910				else
   911					fp->ep_attr |= USB_ENDPOINT_SYNC_SYNC;
   912				break;
   913			}
   914	
   915			/* ok, let's parse further... */
   916			if (protocol == UAC_VERSION_1 || protocol == UAC_VERSION_2) {
 > 917				if (snd_usb_parse_audio_format(chip, fp, format,
   918								fmt, stream) < 0) {
   919					kfree(fp->rate_table);
   920					kfree(fp);
   921					fp = NULL;
   922					continue;
   923				}
   924			} else {
   925				struct uac3_as_header_descriptor *as;
   926	
   927				as = snd_usb_find_csint_desc(alts->extra,
   928							     alts->extralen,
   929							     NULL, UAC_AS_GENERAL);
   930	
   931				if (snd_usb_parse_audio_format_v3(chip, fp, as,
   932									stream) < 0) {
   933					kfree(fp->rate_table);
   934					kfree(fp);
   935					fp = NULL;
   936					continue;
   937				}
   938			}
   939	
   940			/* Create chmap */
   941			if (fp->channels != num_channels)
   942				chconfig = 0;
   943	
   944			if (protocol == UAC_VERSION_3)
   945				fp->chmap = chmap_v3;
   946			else
   947				fp->chmap = convert_chmap(fp->channels, chconfig,
   948							  protocol);
   949	
   950			dev_dbg(&dev->dev, "%u:%d: add audio endpoint %#x\n", iface_no, altno, fp->endpoint);
   951			err = snd_usb_add_audio_stream(chip, stream, fp);
   952			if (err < 0) {
   953				list_del(&fp->list); /* unlink for avoiding double-free */
   954				kfree(fp->rate_table);
   955				kfree(fp->chmap);
   956				kfree(fp);
   957				return err;
   958			}
   959			/* try to set the interface... */
   960			usb_set_interface(chip->dev, iface_no, altno);
   961			snd_usb_init_pitch(chip, iface_no, alts, fp);
   962			snd_usb_init_sample_rate(chip, iface_no, alts, fp, fp->rate_max);
   963		}
   964		return 0;
   965	}
   966	

---
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: 47745 bytes
Desc: not available
URL: <http://mailman.alsa-project.org/pipermail/alsa-devel/attachments/20171109/b3c35de6/attachment-0001.bin>


More information about the Alsa-devel mailing list