1. 20 9月, 2018 1 次提交
    • A
      USB: handle NULL config in usb_find_alt_setting() · c9a4cb20
      Alan Stern 提交于
      usb_find_alt_setting() takes a pointer to a struct usb_host_config as
      an argument; it searches for an interface with specified interface and
      alternate setting numbers in that config.  However, it crashes if the
      usb_host_config pointer argument is NULL.
      
      Since this is a general-purpose routine, available for use in many
      places, we want to to be more robust.  This patch makes it return NULL
      whenever the config argument is NULL.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Reported-by: syzbot+19c3aaef85a89d451eac@syzkaller.appspotmail.com
      CC: <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c9a4cb20
  2. 31 5月, 2018 1 次提交
  3. 20 3月, 2018 1 次提交
    • K
      usb: core: Add "quirks" parameter for usbcore · 027bd6ca
      Kai-Heng Feng 提交于
      Trying quirks in usbcore needs to rebuild the driver or the entire
      kernel if it's builtin. It can save a lot of time if usbcore has similar
      ability like "usbhid.quirks=" and "usb-storage.quirks=".
      
      Rename the original quirk detection function to "static" as we introduce
      this new "dynamic" function.
      
      Now users can use "usbcore.quirks=" as short term workaround before the
      next kernel release. Also, the quirk parameter can XOR the builtin
      quirks for debugging purpose.
      
      This is inspired by usbhid and usb-storage.
      Signed-off-by: NKai-Heng Feng <kai.heng.feng@canonical.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      027bd6ca
  4. 12 3月, 2018 1 次提交
    • G
      Revert "usb: core: Add "quirks" parameter for usbcore" · 95713fb8
      Greg Kroah-Hartman 提交于
      This reverts commit b27560e4 as it
      breaks the build for some arches :(
      Reported-by: Nkbuild test robot <fengguang.wu@intel.com>
      Cc: Kai-Heng Feng <kai.heng.feng@canonical.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      
      diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
      index 1d1d53f85ddd..70a7398c20e2 100644
      --- a/Documentation/admin-guide/kernel-parameters.txt
      +++ b/Documentation/admin-guide/kernel-parameters.txt
      @@ -4368,6 +4368,61 @@
      
       	usbcore.nousb	[USB] Disable the USB subsystem
      
      +	usbcore.quirks=
      +			[USB] A list of quirks entries to supplement or
      +			override the built-in usb core quirk list.  List
      +			entries are separated by commas.  Each entry has
      +			the form VID:PID:Flags where VID and PID are Vendor
      +			and Product ID values (4-digit hex numbers) and
      +			Flags is a set of characters, each corresponding
      +			to a common usb core quirk flag as follows:
      +				a = USB_QUIRK_STRING_FETCH_255 (string
      +					descriptors must not be fetched using
      +					a 255-byte read);
      +				b = USB_QUIRK_RESET_RESUME (device can't resume
      +					correctly so reset it instead);
      +				c = USB_QUIRK_NO_SET_INTF (device can't handle
      +					Set-Interface requests);
      +				d = USB_QUIRK_CONFIG_INTF_STRINGS (device can't
      +					handle its Configuration or Interface
      +					strings);
      +				e = USB_QUIRK_RESET (device can't be reset
      +					(e.g morph devices), don't use reset);
      +				f = USB_QUIRK_HONOR_BNUMINTERFACES (device has
      +					more interface descriptions than the
      +					bNumInterfaces count, and can't handle
      +					talking to these interfaces);
      +				g = USB_QUIRK_DELAY_INIT (device needs a pause
      +					during initialization, after we read
      +					the device descriptor);
      +				h = USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL (For
      +					high speed and super speed interrupt
      +					endpoints, the USB 2.0 and USB 3.0 spec
      +					require the interval in microframes (1
      +					microframe = 125 microseconds) to be
      +					calculated as interval = 2 ^
      +					(bInterval-1).
      +					Devices with this quirk report their
      +					bInterval as the result of this
      +					calculation instead of the exponent
      +					variable used in the calculation);
      +				i = USB_QUIRK_DEVICE_QUALIFIER (device can't
      +					handle device_qualifier descriptor
      +					requests);
      +				j = USB_QUIRK_IGNORE_REMOTE_WAKEUP (device
      +					generates spurious wakeup, ignore
      +					remote wakeup capability);
      +				k = USB_QUIRK_NO_LPM (device can't handle Link
      +					Power Management);
      +				l = USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL
      +					(Device reports its bInterval as linear
      +					frames instead of the USB 2.0
      +					calculation);
      +				m = USB_QUIRK_DISCONNECT_SUSPEND (Device needs
      +					to be disconnected before suspend to
      +					prevent spurious wakeup)
      +			Example: quirks=0781:5580:bk,0a5c:5834:gij
      +
       	usbhid.mousepoll=
       			[USBHID] The interval which mice are to be polled at.
      
      diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
      index f4a548471f0f..42faaeead81b 100644
      --- a/drivers/usb/core/quirks.c
      +++ b/drivers/usb/core/quirks.c
      @@ -11,6 +11,143 @@
       #include <linux/usb/hcd.h>
       #include "usb.h"
      
      +struct quirk_entry {
      +	u16 vid;
      +	u16 pid;
      +	u32 flags;
      +};
      +
      +static DEFINE_MUTEX(quirk_mutex);
      +
      +static struct quirk_entry *quirk_list;
      +static unsigned int quirk_count;
      +
      +static char quirks_param[128];
      +
      +static int quirks_param_set(const char *val, const struct kernel_param *kp)
      +{
      +	char *p, *field;
      +	u16 vid, pid;
      +	u32 flags;
      +	size_t i;
      +
      +	mutex_lock(&quirk_mutex);
      +
      +	if (!val || !*val) {
      +		quirk_count = 0;
      +		kfree(quirk_list);
      +		quirk_list = NULL;
      +		goto unlock;
      +	}
      +
      +	for (quirk_count = 1, i = 0; val[i]; i++)
      +		if (val[i] == ',')
      +			quirk_count++;
      +
      +	if (quirk_list) {
      +		kfree(quirk_list);
      +		quirk_list = NULL;
      +	}
      +
      +	quirk_list = kcalloc(quirk_count, sizeof(struct quirk_entry),
      +			     GFP_KERNEL);
      +	if (!quirk_list) {
      +		mutex_unlock(&quirk_mutex);
      +		return -ENOMEM;
      +	}
      +
      +	for (i = 0, p = (char *)val; p && *p;) {
      +		/* Each entry consists of VID:PID:flags */
      +		field = strsep(&p, ":");
      +		if (!field)
      +			break;
      +
      +		if (kstrtou16(field, 16, &vid))
      +			break;
      +
      +		field = strsep(&p, ":");
      +		if (!field)
      +			break;
      +
      +		if (kstrtou16(field, 16, &pid))
      +			break;
      +
      +		field = strsep(&p, ",");
      +		if (!field || !*field)
      +			break;
      +
      +		/* Collect the flags */
      +		for (flags = 0; *field; field++) {
      +			switch (*field) {
      +			case 'a':
      +				flags |= USB_QUIRK_STRING_FETCH_255;
      +				break;
      +			case 'b':
      +				flags |= USB_QUIRK_RESET_RESUME;
      +				break;
      +			case 'c':
      +				flags |= USB_QUIRK_NO_SET_INTF;
      +				break;
      +			case 'd':
      +				flags |= USB_QUIRK_CONFIG_INTF_STRINGS;
      +				break;
      +			case 'e':
      +				flags |= USB_QUIRK_RESET;
      +				break;
      +			case 'f':
      +				flags |= USB_QUIRK_HONOR_BNUMINTERFACES;
      +				break;
      +			case 'g':
      +				flags |= USB_QUIRK_DELAY_INIT;
      +				break;
      +			case 'h':
      +				flags |= USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL;
      +				break;
      +			case 'i':
      +				flags |= USB_QUIRK_DEVICE_QUALIFIER;
      +				break;
      +			case 'j':
      +				flags |= USB_QUIRK_IGNORE_REMOTE_WAKEUP;
      +				break;
      +			case 'k':
      +				flags |= USB_QUIRK_NO_LPM;
      +				break;
      +			case 'l':
      +				flags |= USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL;
      +				break;
      +			case 'm':
      +				flags |= USB_QUIRK_DISCONNECT_SUSPEND;
      +				break;
      +			/* Ignore unrecognized flag characters */
      +			}
      +		}
      +
      +		quirk_list[i++] = (struct quirk_entry)
      +			{ .vid = vid, .pid = pid, .flags = flags };
      +	}
      +
      +	if (i < quirk_count)
      +		quirk_count = i;
      +
      +unlock:
      +	mutex_unlock(&quirk_mutex);
      +
      +	return param_set_copystring(val, kp);
      +}
      +
      +static const struct kernel_param_ops quirks_param_ops = {
      +	.set = quirks_param_set,
      +	.get = param_get_string,
      +};
      +
      +static struct kparam_string quirks_param_string = {
      +	.maxlen = sizeof(quirks_param),
      +	.string = quirks_param,
      +};
      +
      +module_param_cb(quirks, &quirks_param_ops, &quirks_param_string, 0644);
      +MODULE_PARM_DESC(quirks, "Add/modify USB quirks by specifying quirks=vendorID:productID:quirks");
      +
       /* Lists of quirky USB devices, split in device quirks and interface quirks.
        * Device quirks are applied at the very beginning of the enumeration process,
        * right after reading the device descriptor. They can thus only match on device
      @@ -320,8 +457,8 @@ static int usb_amd_resume_quirk(struct usb_device *udev)
       	return 0;
       }
      
      -static u32 __usb_detect_quirks(struct usb_device *udev,
      -			       const struct usb_device_id *id)
      +static u32 usb_detect_static_quirks(struct usb_device *udev,
      +				    const struct usb_device_id *id)
       {
       	u32 quirks = 0;
      
      @@ -339,21 +476,43 @@ static u32 __usb_detect_quirks(struct usb_device *udev,
       	return quirks;
       }
      
      +static u32 usb_detect_dynamic_quirks(struct usb_device *udev)
      +{
      +	u16 vid = le16_to_cpu(udev->descriptor.idVendor);
      +	u16 pid = le16_to_cpu(udev->descriptor.idProduct);
      +	int i, flags = 0;
      +
      +	mutex_lock(&quirk_mutex);
      +
      +	for (i = 0; i < quirk_count; i++) {
      +		if (vid == quirk_list[i].vid && pid == quirk_list[i].pid) {
      +			flags = quirk_list[i].flags;
      +			break;
      +		}
      +	}
      +
      +	mutex_unlock(&quirk_mutex);
      +
      +	return flags;
      +}
      +
       /*
        * Detect any quirks the device has, and do any housekeeping for it if needed.
        */
       void usb_detect_quirks(struct usb_device *udev)
       {
      -	udev->quirks = __usb_detect_quirks(udev, usb_quirk_list);
      +	udev->quirks = usb_detect_static_quirks(udev, usb_quirk_list);
      
       	/*
       	 * Pixart-based mice would trigger remote wakeup issue on AMD
       	 * Yangtze chipset, so set them as RESET_RESUME flag.
       	 */
       	if (usb_amd_resume_quirk(udev))
      -		udev->quirks |= __usb_detect_quirks(udev,
      +		udev->quirks |= usb_detect_static_quirks(udev,
       				usb_amd_resume_quirk_list);
      
      +	udev->quirks ^= usb_detect_dynamic_quirks(udev);
      +
       	if (udev->quirks)
       		dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
       			udev->quirks);
      @@ -372,7 +531,7 @@ void usb_detect_interface_quirks(struct usb_device *udev)
       {
       	u32 quirks;
      
      -	quirks = __usb_detect_quirks(udev, usb_interface_quirk_list);
      +	quirks = usb_detect_static_quirks(udev, usb_interface_quirk_list);
       	if (quirks == 0)
       		return;
      
      @@ -380,3 +539,11 @@ void usb_detect_interface_quirks(struct usb_device *udev)
       		quirks);
       	udev->quirks |= quirks;
       }
      +
      +void usb_release_quirk_list(void)
      +{
      +	mutex_lock(&quirk_mutex);
      +	kfree(quirk_list);
      +	quirk_list = NULL;
      +	mutex_unlock(&quirk_mutex);
      +}
      diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
      index 2f5fbc56a9dd..0adb6345ff2e 100644
      --- a/drivers/usb/core/usb.c
      +++ b/drivers/usb/core/usb.c
      @@ -1259,6 +1259,7 @@ static void __exit usb_exit(void)
       	if (usb_disabled())
       		return;
      
      +	usb_release_quirk_list();
       	usb_deregister_device_driver(&usb_generic_driver);
       	usb_major_cleanup();
       	usb_deregister(&usbfs_driver);
      diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h
      index 149cc7480971..546a2219454b 100644
      --- a/drivers/usb/core/usb.h
      +++ b/drivers/usb/core/usb.h
      @@ -36,6 +36,7 @@ extern void usb_deauthorize_interface(struct usb_interface *);
       extern void usb_authorize_interface(struct usb_interface *);
       extern void usb_detect_quirks(struct usb_device *udev);
       extern void usb_detect_interface_quirks(struct usb_device *udev);
      +extern void usb_release_quirk_list(void);
       extern int usb_remove_device(struct usb_device *udev);
      
       extern int usb_get_device_descriptor(struct usb_device *dev,
      95713fb8
  5. 10 3月, 2018 1 次提交
    • K
      usb: core: Add "quirks" parameter for usbcore · b27560e4
      Kai-Heng Feng 提交于
      Trying quirks in usbcore needs to rebuild the driver or the entire
      kernel if it's builtin. It can save a lot of time if usbcore has similar
      ability like "usbhid.quirks=" and "usb-storage.quirks=".
      
      Rename the original quirk detection function to "static" as we introduce
      this new "dynamic" function.
      
      Now users can use "usbcore.quirks=" as short term workaround before the
      next kernel release. Also, the quirk parameter can XOR the builtin
      quirks for debugging purpose.
      
      This is inspired by usbhid and usb-storage.
      Signed-off-by: NKai-Heng Feng <kai.heng.feng@canonical.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b27560e4
  6. 28 11月, 2017 1 次提交
    • J
      USB: of: clean up device-node helper · 7739376e
      Johan Hovold 提交于
      Clean up the USB device-node helper that is used to look up a device
      node given a parent hub device and a port number. Also pass in a struct
      usb_device as first argument to provide some type checking.
      
      Give the helper the more descriptive name usb_of_get_device_node(),
      which matches the new usb_of_get_interface_node() helper that is used to
      look up a second type of of child node from a USB device.
      
      Note that the terms "device node" and "interface node" are defined and
      used by the OF Recommended Practice for USB.
      Signed-off-by: NJohan Hovold <johan@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7739376e
  7. 03 11月, 2017 1 次提交
  8. 13 6月, 2017 2 次提交
    • J
      USB: of: fix root-hub device-tree node handling · 2bf69867
      Johan Hovold 提交于
      In an attempt to work around a pinmux over-allocation issue in driver
      core, commit dc5878ab ("usb: core: move root hub's device node
      assignment after it is added to bus") moved the device-tree node
      assignment until after the root hub had been registered.
      
      This not only makes the device-tree node unavailable to the usb driver
      during probe, but also prevents the of_node from being linked to in
      sysfs and causes a race with user-space for the (recently added) devspec
      attribute.
      
      Use the new device_set_of_node_from_dev() helper to reuse the node of
      the sysdev device, something which now prevents driver core from trying
      to reclaim any pinctrl pins during probe.
      
      Fixes: dc5878ab ("usb: core: move root hub's device node assignment after it is added to bus")
      Fixes: 51fa9147 ("usb/core: Added devspec sysfs entry for devices behind the usb hub")
      Signed-off-by: NJohan Hovold <johan@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      2bf69867
    • J
      USB: core: fix device node leak · e271b2c9
      Johan Hovold 提交于
      Make sure to release any OF device-node reference taken when creating
      the USB device.
      
      Note that we currently do not hold a reference to the root hub
      device-tree node (i.e. the parent controller node).
      
      Fixes: 69bec725 ("USB: core: let USB device know device node")
      Cc: stable <stable@vger.kernel.org>	# v4.6
      Acked-by: NPeter Chen <peter.chen@nxp.com>
      Signed-off-by: NJohan Hovold <johan@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e271b2c9
  9. 25 3月, 2017 1 次提交
  10. 23 3月, 2017 3 次提交
  11. 30 10月, 2016 1 次提交
  12. 13 9月, 2016 1 次提交
    • R
      usb: core: setup dma_pfn_offset for USB devices and, interfaces · b44bbc46
      Roger Quadros 提交于
      If dma_pfn_offset is not inherited correctly from the host controller,
      it might result in sub-optimal configuration as bounce
      buffer limit might be set to less than optimal level.
      
      Consider the mass storage device case.
      USB storage driver creates a scsi host for the mass storage interface in
      drivers/usb/storage/usb.c
      The scsi host parent device is nothing but the the USB interface device.
      Now, __scsi_init_queue() calls scsi_calculate_bounce_limit() to find out
      and set the block layer bounce limit.
      scsi_calculate_bounce_limit() uses dma_max_pfn(host_dev) to get the
      bounce_limit. host_dev is nothing but the device representing the
      mass storage interface.
      If that device doesn't have the right dma_pfn_offset, then dma_max_pfn()
      is messed up and the bounce buffer limit is wrong.
      
      e.g. On Keystone 2 systems, dma_max_pfn() is 0x87FFFF and dma_mask_pfn
      is 0xFFFFF. Consider a mass storage use case: Without this patch,
      usb scsi host device (usb-storage) will get a dma_pfn_offset of 0 resulting
      in a dma_max_pfn() of 0xFFFFF within the scsi layer
      (scsi_calculate_bounce_limit()).
      This will result in bounce buffers being unnecessarily used.
      
      Hint: On 32-bit ARM platforms dma_max_pfn() = dma_mask_pfn + dma_pfn_offset
      Signed-off-by: NRoger Quadros <rogerq@ti.com>
      Acked-by: NArnd Bergmann <arnd@arndb.de>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b44bbc46
  13. 02 5月, 2016 1 次提交
  14. 29 4月, 2016 1 次提交
    • P
      usb: core: move root hub's device node assignment after it is added to bus · dc5878ab
      Peter Chen 提交于
      When the root hub device is added to the bus, it tries to get pins
      information from pinctrl (see pinctrl_bind_pins, at really_probe), if
      the pin information is described at DT, it will show below error since
      the root hub's device node is the same with controller's, but controller's
      pin has already been requested when it is added to platform bus.
      
      	imx6q-pinctrl 20e0000.iomuxc: pin MX6Q_PAD_GPIO_1 already
             	requested by 2184000.usb; cannot claim for usb1
      	imx6q-pinctrl 20e0000.iomuxc: pin-137 (usb1) status -22
      	imx6q-pinctrl 20e0000.iomuxc: could not request pin 137
             	(MX6Q_PAD_GPIO_1) from group usbotggrp-3 on device 20e0000.iomuxc
      	usb usb1: Error applying setting, reverse things back
      
      To fix this issue, we move the root hub's device node assignment (equals
      to contrller's) after device is added to bus, we only need to know root
      hub's device node information after the device under root hub is created,
      so this movement will not affect current function.
      Signed-off-by: NPeter Chen <peter.chen@nxp.com>
      Reported-by: NLars Steubesand <lars.steubesand@philips.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      dc5878ab
  15. 19 3月, 2016 1 次提交
    • N
      usb/core: usb_alloc_dev(): fix setting of ->portnum · 7222c832
      Nicolai Stange 提交于
      With commit 69bec725 ("USB: core: let USB device know device node"),
      the port1 argument of usb_alloc_dev() gets overwritten as follows:
      
        ... usb_alloc_dev(..., unsigned port1)
        {
          ...
          if (!parent->parent) {
            port1 = usb_hcd_find_raw_port_number(..., port1);
          }
          ...
        }
      
      Later on, this now overwritten port1 gets assigned to ->portnum:
      
        dev->portnum = port1;
      
      However, since xhci_find_raw_port_number() isn't idempotent, the
      aforementioned commit causes a number of KASAN splats like the following:
      
        BUG: KASAN: slab-out-of-bounds in xhci_find_raw_port_number+0x98/0x170
                                             at addr ffff8801d9311670
        Read of size 8 by task kworker/2:1/87
        [...]
        Workqueue: usb_hub_wq hub_event
         0000000000000188 000000005814b877 ffff8800cba17588 ffffffff8191447e
         0000000041b58ab3 ffffffff82a03209 ffffffff819143a2 ffffffff82a252f4
         ffff8801d93115e0 0000000000000188 ffff8801d9311628 ffff8800cba17588
        Call Trace:
         [<ffffffff8191447e>] dump_stack+0xdc/0x15e
         [<ffffffff819143a2>] ? _atomic_dec_and_lock+0xa2/0xa2
         [<ffffffff814e2cd1>] ? print_section+0x61/0xb0
         [<ffffffff814e4939>] print_trailer+0x179/0x2c0
         [<ffffffff814f0d84>] object_err+0x34/0x40
         [<ffffffff814f4388>] kasan_report_error+0x2f8/0x8b0
         [<ffffffff814eb91e>] ? __slab_alloc+0x5e/0x90
         [<ffffffff812178c0>] ? __lock_is_held+0x90/0x130
         [<ffffffff814f5091>] kasan_report+0x71/0xa0
         [<ffffffff814ec082>] ? kmem_cache_alloc_trace+0x212/0x560
         [<ffffffff81d99468>] ? xhci_find_raw_port_number+0x98/0x170
         [<ffffffff814f33d4>] __asan_load8+0x64/0x70
         [<ffffffff81d99468>] xhci_find_raw_port_number+0x98/0x170
         [<ffffffff81db0105>] xhci_setup_addressable_virt_dev+0x235/0xa10
         [<ffffffff81d9ea51>] xhci_setup_device+0x3c1/0x1430
         [<ffffffff8121cddd>] ? trace_hardirqs_on+0xd/0x10
         [<ffffffff81d9fac0>] ? xhci_setup_device+0x1430/0x1430
         [<ffffffff81d9fad3>] xhci_address_device+0x13/0x20
         [<ffffffff81d2081a>] hub_port_init+0x55a/0x1550
         [<ffffffff81d28705>] hub_event+0xef5/0x24d0
         [<ffffffff81d27810>] ? hub_port_debounce+0x2f0/0x2f0
         [<ffffffff8195e1ee>] ? debug_object_deactivate+0x1be/0x270
         [<ffffffff81210203>] ? print_rt_rq+0x53/0x2d0
         [<ffffffff8121657d>] ? trace_hardirqs_off+0xd/0x10
         [<ffffffff8226acfb>] ? _raw_spin_unlock_irqrestore+0x5b/0x60
         [<ffffffff81250000>] ? irq_domain_set_hwirq_and_chip+0x30/0xb0
         [<ffffffff81256339>] ? debug_lockdep_rcu_enabled+0x39/0x40
         [<ffffffff812178c0>] ? __lock_is_held+0x90/0x130
         [<ffffffff81196877>] process_one_work+0x567/0xec0
        [...]
      
      Afterwards, xhci reports some functional errors:
      
        xhci_hcd 0000:00:14.0: ERROR: unexpected setup address command completion
                                      code 0x11.
        xhci_hcd 0000:00:14.0: ERROR: unexpected setup address command completion
                                      code 0x11.
        usb 4-3: device not accepting address 2, error -22
      
      Fix this by not overwriting the port1 argument in usb_alloc_dev(), but
      storing the raw port number as required by OF in an additional variable,
      raw_port.
      
      Fixes: 69bec725 ("USB: core: let USB device know device node")
      Signed-off-by: NNicolai Stange <nicstange@gmail.com>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7222c832
  16. 06 3月, 2016 1 次提交
  17. 04 2月, 2016 1 次提交
  18. 25 1月, 2016 2 次提交
  19. 08 1月, 2016 1 次提交
  20. 05 12月, 2015 1 次提交
  21. 23 9月, 2015 1 次提交
  22. 19 8月, 2015 1 次提交
  23. 15 8月, 2015 1 次提交
  24. 26 3月, 2015 2 次提交
  25. 10 1月, 2015 1 次提交
    • S
      usb: core: buffer: smallest buffer should start at ARCH_DMA_MINALIGN · 5efd2ea8
      Sebastian Andrzej Siewior 提交于
      the following error pops up during "testusb -a -t 10"
      | musb-hdrc musb-hdrc.1.auto: dma_pool_free buffer-128,	f134e000/be842000 (bad dma)
      hcd_buffer_create() creates a few buffers, the smallest has 32 bytes of
      size. ARCH_KMALLOC_MINALIGN is set to 64 bytes. This combo results in
      hcd_buffer_alloc() returning memory which is 32 bytes aligned and it
      might by identified by buffer_offset() as another buffer. This means the
      buffer which is on a 32 byte boundary will not get freed, instead it
      tries to free another buffer with the error message.
      
      This patch fixes the issue by creating the smallest DMA buffer with the
      size of ARCH_KMALLOC_MINALIGN (or 32 in case ARCH_KMALLOC_MINALIGN is
      smaller). This might be 32, 64 or even 128 bytes. The next three pools
      will have the size 128, 512 and 2048.
      In case the smallest pool is 128 bytes then we have only three pools
      instead of four (and zero the first entry in the array).
      The last pool size is always 2048 bytes which is the assumed PAGE_SIZE /
      2 of 4096. I doubt it makes sense to continue using PAGE_SIZE / 2 where
      we would end up with 8KiB buffer in case we have 16KiB pages.
      Instead I think it makes sense to have a common size(s) and extend them
      if there is need to.
      There is a BUILD_BUG_ON() now in case someone has a minalign of more than
      128 bytes.
      
      Cc: stable@vger.kernel.org
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      5efd2ea8
  26. 04 12月, 2014 1 次提交
  27. 18 7月, 2014 1 次提交
  28. 12 10月, 2013 1 次提交
  29. 03 8月, 2013 1 次提交
  30. 21 5月, 2013 1 次提交
    • J
      usb: ehci: Only sleep for post-resume handover if devices use persist · 9b790915
      Julius Werner 提交于
      The current EHCI code sleeps a flat 110ms in the resume path if there
      was a USB 1.1 device connected to its companion controller during
      suspend, waiting for the device to reappear and reset so that it can be
      handed back to the companion. This is necessary if the device uses
      persist, so that the companion controller can actually see it during its
      own resume path.
      
      However, if the device doesn't use persist, this is entirely
      unnecessary. We might just as well ignore it and have the normal device
      detection/reset/handoff code handle it asynchronously when it eventually
      shows up. As USB 1.1 devices are almost exclusively HIDs these days (for
      which persist has no value), this can allow distros to shave another
      tenth of a second off their resume time.
      
      In order to enable this optimization, the patch also adds a new
      usb_for_each_dev() iterator that is exported by the USB core and wraps
      bus_for_each_dev() with the logic to differentiate between struct
      usb_device and struct usb_interface on the usb_bus_type bus.
      Signed-off-by: NJulius Werner <jwerner@chromium.org>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9b790915
  31. 12 4月, 2013 1 次提交
  32. 08 4月, 2013 1 次提交
    • K
      driver core: add uid and gid to devtmpfs · 3c2670e6
      Kay Sievers 提交于
      Some drivers want to tell userspace what uid and gid should be used for
      their device nodes, so allow that information to percolate through the
      driver core to userspace in order to make this happen.  This means that
      some systems (i.e.  Android and friends) will not need to even run a
      udev-like daemon for their device node manager and can just rely in
      devtmpfs fully, reducing their footprint even more.
      Signed-off-by: NKay Sievers <kay@vrfy.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      3c2670e6
  33. 29 3月, 2013 1 次提交
    • A
      USB: remove CONFIG_USB_SUSPEND option · 84ebc102
      Alan Stern 提交于
      This patch (as1675) removes the CONFIG_USB_SUSPEND option, essentially
      replacing it everywhere with CONFIG_PM_RUNTIME (except for one place
      in hub.c, where it is replaced with CONFIG_PM because the code needs
      to be used in both runtime and system PM).  The net result is code
      shrinkage and simplification.
      
      There's very little point in keeping CONFIG_USB_SUSPEND because almost
      everybody enables it.  The few that don't will find that the usbcore
      module has gotten somewhat bigger and they will have to take active
      measures if they want to prevent hubs from being runtime suspended.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      CC: Peter Chen <peter.chen@freescale.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      84ebc102
  34. 22 11月, 2012 1 次提交
  35. 25 10月, 2012 1 次提交