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

Attachment: .config.gz
Description: application/gzip

Reply via email to