History

Merge tag 'usb-5.1-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb

Pull USB fixes from Greg KH: "Here are some small USB fixes for a bunch of warnings/errors that the syzbot has been finding with it's new-found ability to stress-test the USB layer. All of these are tiny, but fix real issues, and are marked for stable as well. All of these have had lots of testing in linux-next as well" * tag 'usb-5.1-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: USB: w1 ds2490: Fix bug caused by improper use of altsetting array USB: yurex: Fix protection fault after device removal usb: usbip: fix isoc packet num validation in get_pipe USB: core: Fix bug caused by duplicate interface PM usage counter USB: dummy-hcd: Fix failure to give back unlinked URBs USB: core: Fix unterminated string returned by usb_string()

Linus Torvalds committed 7 years ago

Commit bf3bd962 parents fea27bc c11494410 files · +46 −45Browse files

Unified · Split

10 files
  1. Documentation/driver-api/usb/power-management.rst +9 −5
  2. drivers/usb/core/driver.c +0 −13
  3. drivers/usb/core/message.c +3 −1
  4. drivers/usb/gadget/udc/dummy_hcd.c +15 −4
  5. drivers/usb/misc/yurex.c +1 −0
  6. drivers/usb/storage/realtek_cr.c +5 −8
  7. drivers/usb/usbip/stub_rx.c +3 −9
  8. drivers/usb/usbip/usbip_common.h +7 −0
  9. drivers/w1/masters/ds2490.c +3 −3
  10. include/linux/usb.h +0 −2
Documentation/driver-api/usb/power-management.rst+9−5
@@ -370,11 +370,15 @@ autosuspend the interface's device. When the usage counter is = 0 · 369 unmodified lines
370370 then the interface is considered to be idle, and the kernel may
371371 autosuspend the device.
372372
373−Drivers need not be concerned about balancing changes to the usage
374−counter; the USB core will undo any remaining "get"s when a driver
375−is unbound from its interface. As a corollary, drivers must not call
376−any of the ``usb_autopm_*`` functions after their ``disconnect``
377−routine has returned.
373+Drivers must be careful to balance their overall changes to the usage
374+counter. Unbalanced "get"s will remain in effect when a driver is
375+unbound from its interface, preventing the device from going into
376+runtime suspend should the interface be bound to a driver again. On
377+the other hand, drivers are allowed to achieve this balance by calling
378+the ``usb_autopm_*`` functions even after their ``disconnect`` routine
379+has returned -- say from within a work-queue routine -- provided they
380+retain an active reference to the interface (via ``usb_get_intf`` and
381+``usb_put_intf``).
378382
379383 Drivers using the async routines are responsible for their own
380384 synchronization and mutual exclusion.
drivers/usb/core/driver.c+0−13
@@ -473,11 +473,6 @@ static int usb_unbind_interface(struct device *dev) · 472 unmodified lines
473473 pm_runtime_disable(dev);
474474 pm_runtime_set_suspended(dev);
475475
476− /* Undo any residual pm_autopm_get_interface_* calls */
477− for (r = atomic_read(&intf->pm_usage_cnt); r > 0; --r)
478− usb_autopm_put_interface_no_suspend(intf);
479− atomic_set(&intf->pm_usage_cnt, 0);
480−
481476 if (!error)
482477 usb_autosuspend_device(udev);
483478
@@ -1633,7 +1628,6 @@ void usb_autopm_put_interface(struct usb_interface *intf) · 1149 unmodified lines
16331628 int status;
16341629
16351630 usb_mark_last_busy(udev);
1636− atomic_dec(&intf->pm_usage_cnt);
16371631 status = pm_runtime_put_sync(&intf->dev);
16381632 dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n",
16391633 __func__, atomic_read(&intf->dev.power.usage_count),
@@ -1662,7 +1656,6 @@ void usb_autopm_put_interface_async(struct usb_interface *intf) · 22 unmodified lines
16621656 int status;
16631657
16641658 usb_mark_last_busy(udev);
1665− atomic_dec(&intf->pm_usage_cnt);
16661659 status = pm_runtime_put(&intf->dev);
16671660 dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n",
16681661 __func__, atomic_read(&intf->dev.power.usage_count),
@@ -1684,7 +1677,6 @@ void usb_autopm_put_interface_no_suspend(struct usb_interface *intf) · 15 unmodified lines
16841677 struct usb_device *udev = interface_to_usbdev(intf);
16851678
16861679 usb_mark_last_busy(udev);
1687− atomic_dec(&intf->pm_usage_cnt);
16881680 pm_runtime_put_noidle(&intf->dev);
16891681 }
16901682 EXPORT_SYMBOL_GPL(usb_autopm_put_interface_no_suspend);
@@ -1715,8 +1707,6 @@ int usb_autopm_get_interface(struct usb_interface *intf) · 24 unmodified lines
17151707 status = pm_runtime_get_sync(&intf->dev);
17161708 if (status < 0)
17171709 pm_runtime_put_sync(&intf->dev);
1718− else
1719− atomic_inc(&intf->pm_usage_cnt);
17201710 dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n",
17211711 __func__, atomic_read(&intf->dev.power.usage_count),
17221712 status);
@@ -1750,8 +1740,6 @@ int usb_autopm_get_interface_async(struct usb_interface *intf) · 27 unmodified lines
17501740 status = pm_runtime_get(&intf->dev);
17511741 if (status < 0 && status != -EINPROGRESS)
17521742 pm_runtime_put_noidle(&intf->dev);
1753− else
1754− atomic_inc(&intf->pm_usage_cnt);
17551743 dev_vdbg(&intf->dev, "%s: cnt %d -> %d\n",
17561744 __func__, atomic_read(&intf->dev.power.usage_count),
17571745 status);
@@ -1775,7 +1763,6 @@ void usb_autopm_get_interface_no_resume(struct usb_interface *intf) · 17 unmodified lines
17751763 struct usb_device *udev = interface_to_usbdev(intf);
17761764
17771765 usb_mark_last_busy(udev);
1778− atomic_inc(&intf->pm_usage_cnt);
17791766 pm_runtime_get_noresume(&intf->dev);
17801767 }
17811768 EXPORT_SYMBOL_GPL(usb_autopm_get_interface_no_resume);
drivers/usb/core/message.c+3−1
@@ -820,9 +820,11 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size) · 819 unmodified lines
820820
821821 if (dev->state == USB_STATE_SUSPENDED)
822822 return -EHOSTUNREACH;
823− if (size <= 0 || !buf || !index)
823+ if (size <= 0 || !buf)
824824 return -EINVAL;
825825 buf[0] = 0;
826+ if (index <= 0 || index >= 256)
827+ return -EINVAL;
826828 tbuf = kmalloc(256, GFP_NOIO);
827829 if (!tbuf)
828830 return -ENOMEM;
drivers/usb/gadget/udc/dummy_hcd.c+15−4
@@ -979,8 +979,18 @@ static int dummy_udc_start(struct usb_gadget *g, · 978 unmodified lines
979979 struct dummy_hcd *dum_hcd = gadget_to_dummy_hcd(g);
980980 struct dummy *dum = dum_hcd->dum;
981981
982− if (driver->max_speed == USB_SPEED_UNKNOWN)
982+ switch (g->speed) {
983+ /* All the speeds we support */
984+ case USB_SPEED_LOW:
985+ case USB_SPEED_FULL:
986+ case USB_SPEED_HIGH:
987+ case USB_SPEED_SUPER:
988+ break;
989+ default:
990+ dev_err(dummy_dev(dum_hcd), "Unsupported driver max speed %d\n",
991+ driver->max_speed);
983992 return -EINVAL;
993+ }
984994
985995 /*
986996 * SLAVE side init ... the layer above hardware, which
@@ -1784,9 +1794,10 @@ static void dummy_timer(struct timer_list *t) · 797 unmodified lines
17841794 /* Bus speed is 500000 bytes/ms, so use a little less */
17851795 total = 490000;
17861796 break;
1787− default:
1797+ default: /* Can't happen */
17881798 dev_err(dummy_dev(dum_hcd), "bogus device speed\n");
1789− return;
1799+ total = 0;
1800+ break;
17901801 }
17911802
17921803 /* FIXME if HZ != 1000 this will probably misbehave ... */
@@ -1828,7 +1839,7 @@ restart: · 35 unmodified lines
18281839
18291840 /* Used up this frame's bandwidth? */
18301841 if (total <= 0)
1831− break;
1842+ continue;
18321843
18331844 /* find the gadget's ep for this request (if configured) */
18341845 address = usb_pipeendpoint (urb->pipe);
drivers/usb/misc/yurex.c+1−0
@@ -314,6 +314,7 @@ static void yurex_disconnect(struct usb_interface *interface) · 313 unmodified lines
314314 usb_deregister_dev(interface, &yurex_class);
315315
316316 /* prevent more I/O from starting */
317+ usb_poison_urb(dev->urb);
317318 mutex_lock(&dev->io_mutex);
318319 dev->interface = NULL;
319320 mutex_unlock(&dev->io_mutex);
drivers/usb/storage/realtek_cr.c+5−8
@@ -763,18 +763,16 @@ static void rts51x_suspend_timer_fn(struct timer_list *t) · 762 unmodified lines
763763 break;
764764 case RTS51X_STAT_IDLE:
765765 case RTS51X_STAT_SS:
766− usb_stor_dbg(us, "RTS51X_STAT_SS, intf->pm_usage_cnt:%d, power.usage:%d\n",
767− atomic_read(&us->pusb_intf->pm_usage_cnt),
766+ usb_stor_dbg(us, "RTS51X_STAT_SS, power.usage:%d\n",
768767 atomic_read(&us->pusb_intf->dev.power.usage_count));
769768
770− if (atomic_read(&us->pusb_intf->pm_usage_cnt) > 0) {
769+ if (atomic_read(&us->pusb_intf->dev.power.usage_count) > 0) {
771770 usb_stor_dbg(us, "Ready to enter SS state\n");
772771 rts51x_set_stat(chip, RTS51X_STAT_SS);
773772 /* ignore mass storage interface's children */
774773 pm_suspend_ignore_children(&us->pusb_intf->dev, true);
775774 usb_autopm_put_interface_async(us->pusb_intf);
776− usb_stor_dbg(us, "RTS51X_STAT_SS 01, intf->pm_usage_cnt:%d, power.usage:%d\n",
777− atomic_read(&us->pusb_intf->pm_usage_cnt),
775+ usb_stor_dbg(us, "RTS51X_STAT_SS 01, power.usage:%d\n",
778776 atomic_read(&us->pusb_intf->dev.power.usage_count));
779777 }
780778 break;
@@ -807,11 +805,10 @@ static void rts51x_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) · 26 unmodified lines
807805 int ret;
808806
809807 if (working_scsi(srb)) {
810− usb_stor_dbg(us, "working scsi, intf->pm_usage_cnt:%d, power.usage:%d\n",
811− atomic_read(&us->pusb_intf->pm_usage_cnt),
808+ usb_stor_dbg(us, "working scsi, power.usage:%d\n",
812809 atomic_read(&us->pusb_intf->dev.power.usage_count));
813810
814− if (atomic_read(&us->pusb_intf->pm_usage_cnt) <= 0) {
811+ if (atomic_read(&us->pusb_intf->dev.power.usage_count) <= 0) {
815812 ret = usb_autopm_get_interface(us->pusb_intf);
816813 usb_stor_dbg(us, "working scsi, ret=%d\n", ret);
817814 }
drivers/usb/usbip/stub_rx.c+3−9
@@ -361,16 +361,10 @@ static int get_pipe(struct stub_device *sdev, struct usbip_header *pdu) · 360 unmodified lines
361361 }
362362
363363 if (usb_endpoint_xfer_isoc(epd)) {
364− /* validate packet size and number of packets */
365− unsigned int maxp, packets, bytes;
366−
367− maxp = usb_endpoint_maxp(epd);
368− maxp *= usb_endpoint_maxp_mult(epd);
369− bytes = pdu->u.cmd_submit.transfer_buffer_length;
370− packets = DIV_ROUND_UP(bytes, maxp);
371−
364+ /* validate number of packets */
372365 if (pdu->u.cmd_submit.number_of_packets < 0 ||
373− pdu->u.cmd_submit.number_of_packets > packets) {
366+ pdu->u.cmd_submit.number_of_packets >
367+ USBIP_MAX_ISO_PACKETS) {
374368 dev_err(&sdev->udev->dev,
375369 "CMD_SUBMIT: isoc invalid num packets %d\n",
376370 pdu->u.cmd_submit.number_of_packets);
drivers/usb/usbip/usbip_common.h+7−0
@@ -121,6 +121,13 @@ extern struct device_attribute dev_attr_usbip_debug; · 120 unmodified lines
121121 #define USBIP_DIR_OUT 0x00
122122 #define USBIP_DIR_IN 0x01
123123
124+/*
125+ * Arbitrary limit for the maximum number of isochronous packets in an URB,
126+ * compare for example the uhci_submit_isochronous function in
127+ * drivers/usb/host/uhci-q.c
128+ */
129+#define USBIP_MAX_ISO_PACKETS 1024
130+
124131 /**
125132 * struct usbip_header_basic - data pertinent to every request
126133 * @command: the usbip request type
drivers/w1/masters/ds2490.c+3−3
@@ -1016,15 +1016,15 @@ static int ds_probe(struct usb_interface *intf, · 1015 unmodified lines
10161016 /* alternative 3, 1ms interrupt (greatly speeds search), 64 byte bulk */
10171017 alt = 3;
10181018 err = usb_set_interface(dev->udev,
1019− intf->altsetting[alt].desc.bInterfaceNumber, alt);
1019+ intf->cur_altsetting->desc.bInterfaceNumber, alt);
10201020 if (err) {
10211021 dev_err(&dev->udev->dev, "Failed to set alternative setting %d "
10221022 "for %d interface: err=%d.\n", alt,
1023− intf->altsetting[alt].desc.bInterfaceNumber, err);
1023+ intf->cur_altsetting->desc.bInterfaceNumber, err);
10241024 goto err_out_clear;
10251025 }
10261026
1027− iface_desc = &intf->altsetting[alt];
1027+ iface_desc = intf->cur_altsetting;
10281028 if (iface_desc->desc.bNumEndpoints != NUM_EP-1) {
10291029 pr_info("Num endpoints=%d. It is not DS9490R.\n",
10301030 iface_desc->desc.bNumEndpoints);
include/linux/usb.h+0−2
@@ -200,7 +200,6 @@ usb_find_last_int_out_endpoint(struct usb_host_interface *alt, · 199 unmodified lines
200200 * @dev: driver model's view of this device
201201 * @usb_dev: if an interface is bound to the USB major, this will point
202202 * to the sysfs representation for that device.
203− * @pm_usage_cnt: PM usage counter for this interface
204203 * @reset_ws: Used for scheduling resets from atomic context.
205204 * @resetting_device: USB core reset the device, so use alt setting 0 as
206205 * current; needs bandwidth alloc after reset.
@@ -257,7 +256,6 @@ struct usb_interface { · 50 unmodified lines
257256
258257 struct device dev; /* interface specific device info */
259258 struct device *usb_dev;
260− atomic_t pm_usage_cnt; /* usage counter for autosuspend */
261259 struct work_struct reset_ws; /* for resets in atomic context */
262260 };
263261 #define to_usb_interface(d) container_of(d, struct usb_interface, dev)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t