LCOV - code coverage report
Current view: top level - drivers/usb/core - generic.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 56 0.0 %
Date: 2014-02-18 Functions: 0 5 0.0 %
Branches: 0 58 0.0 %

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

Generated by: LCOV version 1.9