LCOV - code coverage report
Current view: top level - drivers/usb/core - generic.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 83 0.0 %
Date: 2022-03-28 13:20:08 Functions: 0 5 0.0 %
Branches: 0 70 0.0 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0
       2                 :            : /*
       3                 :            :  * drivers/usb/generic.c - generic driver for USB devices (not interfaces)
       4                 :            :  *
       5                 :            :  * (C) Copyright 2005 Greg Kroah-Hartman <gregkh@suse.de>
       6                 :            :  *
       7                 :            :  * based on drivers/usb/usb.c which had the following copyrights:
       8                 :            :  *      (C) Copyright Linus Torvalds 1999
       9                 :            :  *      (C) Copyright Johannes Erdfelt 1999-2001
      10                 :            :  *      (C) Copyright Andreas Gal 1999
      11                 :            :  *      (C) Copyright Gregory P. Smith 1999
      12                 :            :  *      (C) Copyright Deti Fliegl 1999 (new USB architecture)
      13                 :            :  *      (C) Copyright Randy Dunlap 2000
      14                 :            :  *      (C) Copyright David Brownell 2000-2004
      15                 :            :  *      (C) Copyright Yggdrasil Computing, Inc. 2000
      16                 :            :  *              (usb_device_id matching changes by Adam J. Richter)
      17                 :            :  *      (C) Copyright Greg Kroah-Hartman 2002-2003
      18                 :            :  *
      19                 :            :  * Released under the GPLv2 only.
      20                 :            :  */
      21                 :            : 
      22                 :            : #include <linux/usb.h>
      23                 :            : #include <linux/usb/hcd.h>
      24                 :            : #include <uapi/linux/usb/audio.h>
      25                 :            : #include "usb.h"
      26                 :            : 
      27                 :          0 : static inline const char *plural(int n)
      28                 :            : {
      29                 :          0 :         return (n == 1 ? "" : "s");
      30                 :            : }
      31                 :            : 
      32                 :          0 : static int is_rndis(struct usb_interface_descriptor *desc)
      33                 :            : {
      34                 :          0 :         return desc->bInterfaceClass == USB_CLASS_COMM
      35         [ #  # ]:          0 :                 && desc->bInterfaceSubClass == 2
      36   [ #  #  #  # ]:          0 :                 && desc->bInterfaceProtocol == 0xff;
      37                 :            : }
      38                 :            : 
      39                 :          0 : static int is_activesync(struct usb_interface_descriptor *desc)
      40                 :            : {
      41                 :          0 :         return desc->bInterfaceClass == USB_CLASS_MISC
      42         [ #  # ]:          0 :                 && desc->bInterfaceSubClass == 1
      43   [ #  #  #  # ]:          0 :                 && desc->bInterfaceProtocol == 1;
      44                 :            : }
      45                 :            : 
      46                 :          0 : static bool is_audio(struct usb_interface_descriptor *desc)
      47                 :            : {
      48                 :          0 :         return desc->bInterfaceClass == USB_CLASS_AUDIO;
      49                 :            : }
      50                 :            : 
      51                 :          0 : static bool is_uac3_config(struct usb_interface_descriptor *desc)
      52                 :            : {
      53                 :          0 :         return desc->bInterfaceProtocol == UAC_VERSION_3;
      54                 :            : }
      55                 :            : 
      56                 :          0 : int usb_choose_configuration(struct usb_device *udev)
      57                 :            : {
      58                 :          0 :         int i;
      59                 :          0 :         int num_configs;
      60                 :          0 :         int insufficient_power = 0;
      61                 :          0 :         struct usb_host_config *c, *best;
      62                 :            : 
      63         [ #  # ]:          0 :         if (usb_device_is_owned(udev))
      64                 :            :                 return 0;
      65                 :            : 
      66                 :          0 :         best = NULL;
      67                 :          0 :         c = udev->config;
      68                 :          0 :         num_configs = udev->descriptor.bNumConfigurations;
      69         [ #  # ]:          0 :         for (i = 0; i < num_configs; (i++, c++)) {
      70                 :          0 :                 struct usb_interface_descriptor *desc = NULL;
      71                 :            : 
      72                 :            :                 /* It's possible that a config has no interfaces! */
      73         [ #  # ]:          0 :                 if (c->desc.bNumInterfaces > 0)
      74                 :          0 :                         desc = &c->intf_cache[0]->altsetting->desc;
      75                 :            : 
      76                 :            :                 /*
      77                 :            :                  * HP's USB bus-powered keyboard has only one configuration
      78                 :            :                  * and it claims to be self-powered; other devices may have
      79                 :            :                  * similar errors in their descriptors.  If the next test
      80                 :            :                  * were allowed to execute, such configurations would always
      81                 :            :                  * be rejected and the devices would not work as expected.
      82                 :            :                  * In the meantime, we run the risk of selecting a config
      83                 :            :                  * that requires external power at a time when that power
      84                 :            :                  * isn't available.  It seems to be the lesser of two evils.
      85                 :            :                  *
      86                 :            :                  * Bugzilla #6448 reports a device that appears to crash
      87                 :            :                  * when it receives a GET_DEVICE_STATUS request!  We don't
      88                 :            :                  * have any other way to tell whether a device is self-powered,
      89                 :            :                  * but since we don't use that information anywhere but here,
      90                 :            :                  * the call has been removed.
      91                 :            :                  *
      92                 :            :                  * Maybe the GET_DEVICE_STATUS call and the test below can
      93                 :            :                  * be reinstated when device firmwares become more reliable.
      94                 :            :                  * Don't hold your breath.
      95                 :            :                  */
      96                 :            : #if 0
      97                 :            :                 /* Rule out self-powered configs for a bus-powered device */
      98                 :            :                 if (bus_powered && (c->desc.bmAttributes &
      99                 :            :                                         USB_CONFIG_ATT_SELFPOWER))
     100                 :            :                         continue;
     101                 :            : #endif
     102                 :            : 
     103                 :            :                 /*
     104                 :            :                  * The next test may not be as effective as it should be.
     105                 :            :                  * Some hubs have errors in their descriptor, claiming
     106                 :            :                  * to be self-powered when they are really bus-powered.
     107                 :            :                  * We will overestimate the amount of current such hubs
     108                 :            :                  * make available for each port.
     109                 :            :                  *
     110                 :            :                  * This is a fairly benign sort of failure.  It won't
     111                 :            :                  * cause us to reject configurations that we should have
     112                 :            :                  * accepted.
     113                 :            :                  */
     114                 :            : 
     115                 :            :                 /* Rule out configs that draw too much bus current */
     116   [ #  #  #  # ]:          0 :                 if (usb_get_max_power(udev, c) > udev->bus_mA) {
     117                 :          0 :                         insufficient_power++;
     118                 :          0 :                         continue;
     119                 :            :                 }
     120                 :            : 
     121                 :            :                 /*
     122                 :            :                  * Select first configuration as default for audio so that
     123                 :            :                  * devices that don't comply with UAC3 protocol are supported.
     124                 :            :                  * But, still iterate through other configurations and
     125                 :            :                  * select UAC3 compliant config if present.
     126                 :            :                  */
     127   [ #  #  #  # ]:          0 :                 if (desc && is_audio(desc)) {
     128                 :            :                         /* Always prefer the first found UAC3 config */
     129         [ #  # ]:          0 :                         if (is_uac3_config(desc)) {
     130                 :            :                                 best = c;
     131                 :            :                                 break;
     132                 :            :                         }
     133                 :            : 
     134                 :            :                         /* If there is no UAC3 config, prefer the first config */
     135         [ #  # ]:          0 :                         else if (i == 0)
     136                 :          0 :                                 best = c;
     137                 :            : 
     138                 :            :                         /* Unconditional continue, because the rest of the code
     139                 :            :                          * in the loop is irrelevant for audio devices, and
     140                 :            :                          * because it can reassign best, which for audio devices
     141                 :            :                          * we don't want.
     142                 :            :                          */
     143                 :          0 :                         continue;
     144                 :            :                 }
     145                 :            : 
     146                 :            :                 /* When the first config's first interface is one of Microsoft's
     147                 :            :                  * pet nonstandard Ethernet-over-USB protocols, ignore it unless
     148                 :            :                  * this kernel has enabled the necessary host side driver.
     149                 :            :                  * But: Don't ignore it if it's the only config.
     150                 :            :                  */
     151   [ #  #  #  # ]:          0 :                 if (i == 0 && num_configs > 1 && desc &&
     152                 :            :                                 (is_rndis(desc) || is_activesync(desc))) {
     153                 :            : #if !defined(CONFIG_USB_NET_RNDIS_HOST) && !defined(CONFIG_USB_NET_RNDIS_HOST_MODULE)
     154                 :          0 :                         continue;
     155                 :            : #else
     156                 :            :                         best = c;
     157                 :            : #endif
     158                 :            :                 }
     159                 :            : 
     160                 :            :                 /* From the remaining configs, choose the first one whose
     161                 :            :                  * first interface is for a non-vendor-specific class.
     162                 :            :                  * Reason: Linux is more likely to have a class driver
     163                 :            :                  * than a vendor-specific driver. */
     164         [ #  # ]:          0 :                 else if (udev->descriptor.bDeviceClass !=
     165         [ #  # ]:          0 :                                                 USB_CLASS_VENDOR_SPEC &&
     166         [ #  # ]:          0 :                                 (desc && desc->bInterfaceClass !=
     167                 :            :                                                 USB_CLASS_VENDOR_SPEC)) {
     168                 :            :                         best = c;
     169                 :            :                         break;
     170                 :            :                 }
     171                 :            : 
     172                 :            :                 /* If all the remaining configs are vendor-specific,
     173                 :            :                  * choose the first one. */
     174         [ #  # ]:          0 :                 else if (!best)
     175                 :          0 :                         best = c;
     176                 :            :         }
     177                 :            : 
     178         [ #  # ]:          0 :         if (insufficient_power > 0)
     179         [ #  # ]:          0 :                 dev_info(&udev->dev, "rejected %d configuration%s "
     180                 :            :                         "due to insufficient available bus power\n",
     181                 :            :                         insufficient_power, plural(insufficient_power));
     182                 :            : 
     183         [ #  # ]:          0 :         if (best) {
     184                 :          0 :                 i = best->desc.bConfigurationValue;
     185                 :          0 :                 dev_dbg(&udev->dev,
     186                 :            :                         "configuration #%d chosen from %d choice%s\n",
     187                 :            :                         i, num_configs, plural(num_configs));
     188                 :            :         } else {
     189                 :          0 :                 i = -1;
     190         [ #  # ]:          0 :                 dev_warn(&udev->dev,
     191                 :            :                         "no configuration chosen from %d choice%s\n",
     192                 :            :                         num_configs, plural(num_configs));
     193                 :            :         }
     194                 :            :         return i;
     195                 :            : }
     196                 :            : EXPORT_SYMBOL_GPL(usb_choose_configuration);
     197                 :            : 
     198                 :          0 : static int generic_probe(struct usb_device *udev)
     199                 :            : {
     200                 :          0 :         int err, c;
     201                 :            : 
     202                 :            :         /* Choose and set the configuration.  This registers the interfaces
     203                 :            :          * with the driver core and lets interface drivers bind to them.
     204                 :            :          */
     205         [ #  # ]:          0 :         if (udev->authorized == 0)
     206                 :          0 :                 dev_err(&udev->dev, "Device is not authorized for usage\n");
     207                 :            :         else {
     208                 :          0 :                 c = usb_choose_configuration(udev);
     209         [ #  # ]:          0 :                 if (c >= 0) {
     210                 :          0 :                         err = usb_set_configuration(udev, c);
     211         [ #  # ]:          0 :                         if (err && err != -ENODEV) {
     212                 :          0 :                                 dev_err(&udev->dev, "can't set config #%d, error %d\n",
     213                 :            :                                         c, err);
     214                 :            :                                 /* This need not be fatal.  The user can try to
     215                 :            :                                  * set other configurations. */
     216                 :            :                         }
     217                 :            :                 }
     218                 :            :         }
     219                 :            :         /* USB device state == configured ... usable */
     220                 :          0 :         usb_notify_add_device(udev);
     221                 :            : 
     222                 :          0 :         return 0;
     223                 :            : }
     224                 :            : 
     225                 :          0 : static void generic_disconnect(struct usb_device *udev)
     226                 :            : {
     227                 :          0 :         usb_notify_remove_device(udev);
     228                 :            : 
     229                 :            :         /* if this is only an unbind, not a physical disconnect, then
     230                 :            :          * unconfigure the device */
     231         [ #  # ]:          0 :         if (udev->actconfig)
     232                 :          0 :                 usb_set_configuration(udev, -1);
     233                 :          0 : }
     234                 :            : 
     235                 :            : #ifdef  CONFIG_PM
     236                 :            : 
     237                 :          0 : static int generic_suspend(struct usb_device *udev, pm_message_t msg)
     238                 :            : {
     239                 :          0 :         int rc;
     240                 :            : 
     241                 :            :         /* Normal USB devices suspend through their upstream port.
     242                 :            :          * Root hubs don't have upstream ports to suspend,
     243                 :            :          * so we have to shut down their downstream HC-to-USB
     244                 :            :          * interfaces manually by doing a bus (or "global") suspend.
     245                 :            :          */
     246         [ #  # ]:          0 :         if (!udev->parent)
     247                 :          0 :                 rc = hcd_bus_suspend(udev, msg);
     248                 :            : 
     249                 :            :         /*
     250                 :            :          * Non-root USB2 devices don't need to do anything for FREEZE
     251                 :            :          * or PRETHAW. USB3 devices don't support global suspend and
     252                 :            :          * needs to be selectively suspended.
     253                 :            :          */
     254         [ #  # ]:          0 :         else if ((msg.event == PM_EVENT_FREEZE || msg.event == PM_EVENT_PRETHAW)
     255         [ #  # ]:          0 :                  && (udev->speed < USB_SPEED_SUPER))
     256                 :            :                 rc = 0;
     257                 :            :         else
     258                 :          0 :                 rc = usb_port_suspend(udev, msg);
     259                 :            : 
     260         [ #  # ]:          0 :         if (rc == 0)
     261                 :          0 :                 usbfs_notify_suspend(udev);
     262                 :          0 :         return rc;
     263                 :            : }
     264                 :            : 
     265                 :          0 : static int generic_resume(struct usb_device *udev, pm_message_t msg)
     266                 :            : {
     267                 :          0 :         int rc;
     268                 :            : 
     269                 :            :         /* Normal USB devices resume/reset through their upstream port.
     270                 :            :          * Root hubs don't have upstream ports to resume or reset,
     271                 :            :          * so we have to start up their downstream HC-to-USB
     272                 :            :          * interfaces manually by doing a bus (or "global") resume.
     273                 :            :          */
     274         [ #  # ]:          0 :         if (!udev->parent)
     275                 :          0 :                 rc = hcd_bus_resume(udev, msg);
     276                 :            :         else
     277                 :          0 :                 rc = usb_port_resume(udev, msg);
     278                 :            : 
     279         [ #  # ]:          0 :         if (rc == 0)
     280                 :          0 :                 usbfs_notify_resume(udev);
     281                 :          0 :         return rc;
     282                 :            : }
     283                 :            : 
     284                 :            : #endif  /* CONFIG_PM */
     285                 :            : 
     286                 :            : struct usb_device_driver usb_generic_driver = {
     287                 :            :         .name = "usb",
     288                 :            :         .probe = generic_probe,
     289                 :            :         .disconnect = generic_disconnect,
     290                 :            : #ifdef  CONFIG_PM
     291                 :            :         .suspend = generic_suspend,
     292                 :            :         .resume = generic_resume,
     293                 :            : #endif
     294                 :            :         .supports_autosuspend = 1,
     295                 :            : };

Generated by: LCOV version 1.14