Skip to content

Commit bf3bd96

Browse files
committed
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()
2 parents fea27bc + c114944 commit bf3bd96

File tree

10 files changed

+46
-45
lines changed

10 files changed

+46
-45
lines changed

Documentation/driver-api/usb/power-management.rst

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -370,11 +370,15 @@ autosuspend the interface's device. When the usage counter is = 0
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

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -473,11 +473,6 @@ static int usb_unbind_interface(struct device *dev)
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)
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)
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)
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)
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)
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)
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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -820,9 +820,11 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size)
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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -979,8 +979,18 @@ static int dummy_udc_start(struct usb_gadget *g,
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)
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 @@ static void dummy_timer(struct timer_list *t)
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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ static void yurex_disconnect(struct usb_interface *interface)
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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -763,18 +763,16 @@ static void rts51x_suspend_timer_fn(struct timer_list *t)
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)
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

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -361,16 +361,10 @@ static int get_pipe(struct stub_device *sdev, struct usbip_header *pdu)
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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,13 @@ extern struct device_attribute dev_attr_usbip_debug;
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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,15 +1016,15 @@ static int ds_probe(struct usb_interface *intf,
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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,6 @@ usb_find_last_int_out_endpoint(struct usb_host_interface *alt,
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 {
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)

0 commit comments

Comments
 (0)