All of lore.kernel.org
 help / color / mirror / Atom feed
From: kbuild test robot <lkp@intel.com>
To: Ruslan Bilovol <ruslan.bilovol@gmail.com>
Cc: kbuild-all@01.org, Takashi Iwai <tiwai@suse.com>,
	Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>,
	Jorge <jorge.sanjuan@codethink.co.uk>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 2/2] ALSA: usb: initial USB Audio Device Class 3.0 support
Date: Mon, 19 Mar 2018 21:43:29 +0800	[thread overview]
Message-ID: <201803192103.TpMCRTC7%fengguang.wu@intel.com> (raw)
In-Reply-To: <1521423963-24677-3-git-send-email-ruslan.bilovol@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 14482 bytes --]

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

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 28503 bytes --]

  reply	other threads:[~2018-03-19 13:43 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-19  1:46 [PATCH v2 0/2] USB Audio Device Class 3.0 support Ruslan Bilovol
2018-03-19  1:46 ` Ruslan Bilovol
2018-03-19  1:46 ` [PATCH v2 1/2] ALSA: usb-audio: move audioformat quirks to quirks.c Ruslan Bilovol
2018-03-19  1:46   ` Ruslan Bilovol
2018-03-19 16:00   ` Takashi Iwai
2018-03-19 16:00     ` Takashi Iwai
2018-03-19 23:42     ` Ruslan Bilovol
2018-03-19  1:46 ` [PATCH v2 2/2] ALSA: usb: initial USB Audio Device Class 3.0 support Ruslan Bilovol
2018-03-19  1:46   ` Ruslan Bilovol
2018-03-19 13:43   ` kbuild test robot [this message]
2018-03-19 16:20     ` Takashi Iwai
2018-03-19 16:20       ` Takashi Iwai
2018-03-19 16:28   ` Takashi Iwai
2018-03-19 16:28     ` Takashi Iwai
2018-03-19 17:14     ` Greg Kroah-Hartman
2018-03-19 17:14       ` Greg Kroah-Hartman
2018-03-19 23:57     ` Ruslan Bilovol

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201803192103.TpMCRTC7%fengguang.wu@intel.com \
    --to=lkp@intel.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=jorge.sanjuan@codethink.co.uk \
    --cc=kbuild-all@01.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pierre-louis.bossart@linux.intel.com \
    --cc=ruslan.bilovol@gmail.com \
    --cc=tiwai@suse.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.