cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

generic.c (9130B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * drivers/usb/core/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
     27static inline const char *plural(int n)
     28{
     29	return (n == 1 ? "" : "s");
     30}
     31
     32static int is_rndis(struct usb_interface_descriptor *desc)
     33{
     34	return desc->bInterfaceClass == USB_CLASS_COMM
     35		&& desc->bInterfaceSubClass == 2
     36		&& desc->bInterfaceProtocol == 0xff;
     37}
     38
     39static int is_activesync(struct usb_interface_descriptor *desc)
     40{
     41	return desc->bInterfaceClass == USB_CLASS_MISC
     42		&& desc->bInterfaceSubClass == 1
     43		&& desc->bInterfaceProtocol == 1;
     44}
     45
     46static bool is_audio(struct usb_interface_descriptor *desc)
     47{
     48	return desc->bInterfaceClass == USB_CLASS_AUDIO;
     49}
     50
     51static bool is_uac3_config(struct usb_interface_descriptor *desc)
     52{
     53	return desc->bInterfaceProtocol == UAC_VERSION_3;
     54}
     55
     56int usb_choose_configuration(struct usb_device *udev)
     57{
     58	int i;
     59	int num_configs;
     60	int insufficient_power = 0;
     61	struct usb_host_config *c, *best;
     62
     63	if (usb_device_is_owned(udev))
     64		return 0;
     65
     66	best = NULL;
     67	c = udev->config;
     68	num_configs = udev->descriptor.bNumConfigurations;
     69	for (i = 0; i < num_configs; (i++, c++)) {
     70		struct usb_interface_descriptor	*desc = NULL;
     71
     72		/* It's possible that a config has no interfaces! */
     73		if (c->desc.bNumInterfaces > 0)
     74			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		if (usb_get_max_power(udev, c) > udev->bus_mA) {
    117			insufficient_power++;
    118			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		if (desc && is_audio(desc)) {
    128			/* Always prefer the first found UAC3 config */
    129			if (is_uac3_config(desc)) {
    130				best = c;
    131				break;
    132			}
    133
    134			/* If there is no UAC3 config, prefer the first config */
    135			else if (i == 0)
    136				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			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		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			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		else if (udev->descriptor.bDeviceClass !=
    165						USB_CLASS_VENDOR_SPEC &&
    166				(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		else if (!best)
    175			best = c;
    176	}
    177
    178	if (insufficient_power > 0)
    179		dev_info(&udev->dev, "rejected %d configuration%s "
    180			"due to insufficient available bus power\n",
    181			insufficient_power, plural(insufficient_power));
    182
    183	if (best) {
    184		i = best->desc.bConfigurationValue;
    185		dev_dbg(&udev->dev,
    186			"configuration #%d chosen from %d choice%s\n",
    187			i, num_configs, plural(num_configs));
    188	} else {
    189		i = -1;
    190		dev_warn(&udev->dev,
    191			"no configuration chosen from %d choice%s\n",
    192			num_configs, plural(num_configs));
    193	}
    194	return i;
    195}
    196EXPORT_SYMBOL_GPL(usb_choose_configuration);
    197
    198static int __check_for_non_generic_match(struct device_driver *drv, void *data)
    199{
    200	struct usb_device *udev = data;
    201	struct usb_device_driver *udrv;
    202
    203	if (!is_usb_device_driver(drv))
    204		return 0;
    205	udrv = to_usb_device_driver(drv);
    206	if (udrv == &usb_generic_driver)
    207		return 0;
    208	return usb_driver_applicable(udev, udrv);
    209}
    210
    211static bool usb_generic_driver_match(struct usb_device *udev)
    212{
    213	if (udev->use_generic_driver)
    214		return true;
    215
    216	/*
    217	 * If any other driver wants the device, leave the device to this other
    218	 * driver.
    219	 */
    220	if (bus_for_each_drv(&usb_bus_type, NULL, udev, __check_for_non_generic_match))
    221		return false;
    222
    223	return true;
    224}
    225
    226int usb_generic_driver_probe(struct usb_device *udev)
    227{
    228	int err, c;
    229
    230	/* Choose and set the configuration.  This registers the interfaces
    231	 * with the driver core and lets interface drivers bind to them.
    232	 */
    233	if (udev->authorized == 0)
    234		dev_err(&udev->dev, "Device is not authorized for usage\n");
    235	else {
    236		c = usb_choose_configuration(udev);
    237		if (c >= 0) {
    238			err = usb_set_configuration(udev, c);
    239			if (err && err != -ENODEV) {
    240				dev_err(&udev->dev, "can't set config #%d, error %d\n",
    241					c, err);
    242				/* This need not be fatal.  The user can try to
    243				 * set other configurations. */
    244			}
    245		}
    246	}
    247	/* USB device state == configured ... usable */
    248	usb_notify_add_device(udev);
    249
    250	return 0;
    251}
    252
    253void usb_generic_driver_disconnect(struct usb_device *udev)
    254{
    255	usb_notify_remove_device(udev);
    256
    257	/* if this is only an unbind, not a physical disconnect, then
    258	 * unconfigure the device */
    259	if (udev->actconfig)
    260		usb_set_configuration(udev, -1);
    261}
    262
    263#ifdef	CONFIG_PM
    264
    265int usb_generic_driver_suspend(struct usb_device *udev, pm_message_t msg)
    266{
    267	int rc;
    268
    269	/* Normal USB devices suspend through their upstream port.
    270	 * Root hubs don't have upstream ports to suspend,
    271	 * so we have to shut down their downstream HC-to-USB
    272	 * interfaces manually by doing a bus (or "global") suspend.
    273	 */
    274	if (!udev->parent)
    275		rc = hcd_bus_suspend(udev, msg);
    276
    277	/*
    278	 * Non-root USB2 devices don't need to do anything for FREEZE
    279	 * or PRETHAW. USB3 devices don't support global suspend and
    280	 * needs to be selectively suspended.
    281	 */
    282	else if ((msg.event == PM_EVENT_FREEZE || msg.event == PM_EVENT_PRETHAW)
    283		 && (udev->speed < USB_SPEED_SUPER))
    284		rc = 0;
    285	else
    286		rc = usb_port_suspend(udev, msg);
    287
    288	if (rc == 0)
    289		usbfs_notify_suspend(udev);
    290	return rc;
    291}
    292
    293int usb_generic_driver_resume(struct usb_device *udev, pm_message_t msg)
    294{
    295	int rc;
    296
    297	/* Normal USB devices resume/reset through their upstream port.
    298	 * Root hubs don't have upstream ports to resume or reset,
    299	 * so we have to start up their downstream HC-to-USB
    300	 * interfaces manually by doing a bus (or "global") resume.
    301	 */
    302	if (!udev->parent)
    303		rc = hcd_bus_resume(udev, msg);
    304	else
    305		rc = usb_port_resume(udev, msg);
    306
    307	if (rc == 0)
    308		usbfs_notify_resume(udev);
    309	return rc;
    310}
    311
    312#endif	/* CONFIG_PM */
    313
    314struct usb_device_driver usb_generic_driver = {
    315	.name =	"usb",
    316	.match = usb_generic_driver_match,
    317	.probe = usb_generic_driver_probe,
    318	.disconnect = usb_generic_driver_disconnect,
    319#ifdef	CONFIG_PM
    320	.suspend = usb_generic_driver_suspend,
    321	.resume = usb_generic_driver_resume,
    322#endif
    323	.supports_autosuspend = 1,
    324};