aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-07-11 13:06:00 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-07-11 13:06:00 -0400
commit24d5b287cdd3f9c063b34b18776bb88274e8b34d (patch)
treee3b69ba5bb4533346dce39ff07a3b93c3e51a38b
parentf1454959ad89f9fe2b6862fa3c41070feaffeab9 (diff)
parentf1e255d60ae66a9f672ff9a207ee6cd8e33d2679 (diff)
Merge tag 'usb-4.18-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB fixes from Greg KH: "Here are a number of small USB fixes for 4.18-rc5. Nothing major here, just the normal set of new device ids, xhci fixes, and some typec fixes. The typec fix required some tiny changes in an i2c driver, which that maintainer acked to come through my tree. All of these have been in linux-next for a while with no reported issues" * tag 'usb-4.18-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: USB: yurex: fix out-of-bounds uaccess in read handler usb: quirks: add delay quirks for Corsair Strafe xhci: xhci-mem: off by one in xhci_stream_id_to_ring() usb/gadget: aspeed-vhub: add USB_LIBCOMPOSITE dependency docs: kernel-parameters.txt: document xhci-hcd.quirks parameter USB: serial: mos7840: fix status-register error handling USB: serial: keyspan_pda: fix modem-status error handling USB: serial: cp210x: add another USB ID for Qivicon ZigBee stick USB: serial: ch341: fix type promotion bug in ch341_control_in() i2c-cht-wc: Fix bq24190 supplier typec: tcpm: Correctly report power_supply current and voltage for non pd supply usb: xhci: dbc: Don't decrement runtime PM counter if DBC is not started
-rw-r--r--Documentation/admin-guide/kernel-parameters.txt5
-rw-r--r--drivers/i2c/busses/i2c-cht-wc.c3
-rw-r--r--drivers/usb/core/quirks.c4
-rw-r--r--drivers/usb/gadget/udc/aspeed-vhub/Kconfig1
-rw-r--r--drivers/usb/host/xhci-dbgcap.c12
-rw-r--r--drivers/usb/host/xhci-mem.c2
-rw-r--r--drivers/usb/misc/yurex.c23
-rw-r--r--drivers/usb/serial/ch341.c2
-rw-r--r--drivers/usb/serial/cp210x.c1
-rw-r--r--drivers/usb/serial/keyspan_pda.c4
-rw-r--r--drivers/usb/serial/mos7840.c3
-rw-r--r--drivers/usb/typec/tcpm.c5
12 files changed, 38 insertions, 27 deletions
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index efc7aa7a0670..533ff5c68970 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -4846,3 +4846,8 @@
4846 xirc2ps_cs= [NET,PCMCIA] 4846 xirc2ps_cs= [NET,PCMCIA]
4847 Format: 4847 Format:
4848 <irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]] 4848 <irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]]
4849
4850 xhci-hcd.quirks [USB,KNL]
4851 A hex value specifying bitmask with supplemental xhci
4852 host controller quirks. Meaning of each bit can be
4853 consulted in header drivers/usb/host/xhci.h.
diff --git a/drivers/i2c/busses/i2c-cht-wc.c b/drivers/i2c/busses/i2c-cht-wc.c
index 44cffad43701..c4d176f5ed79 100644
--- a/drivers/i2c/busses/i2c-cht-wc.c
+++ b/drivers/i2c/busses/i2c-cht-wc.c
@@ -234,7 +234,8 @@ static const struct irq_chip cht_wc_i2c_irq_chip = {
234 .name = "cht_wc_ext_chrg_irq_chip", 234 .name = "cht_wc_ext_chrg_irq_chip",
235}; 235};
236 236
237static const char * const bq24190_suppliers[] = { "fusb302-typec-source" }; 237static const char * const bq24190_suppliers[] = {
238 "tcpm-source-psy-i2c-fusb302" };
238 239
239static const struct property_entry bq24190_props[] = { 240static const struct property_entry bq24190_props[] = {
240 PROPERTY_ENTRY_STRING_ARRAY("supplied-from", bq24190_suppliers), 241 PROPERTY_ENTRY_STRING_ARRAY("supplied-from", bq24190_suppliers),
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
index c55def2f1320..097057d2eacf 100644
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -378,6 +378,10 @@ static const struct usb_device_id usb_quirk_list[] = {
378 /* Corsair K70 RGB */ 378 /* Corsair K70 RGB */
379 { USB_DEVICE(0x1b1c, 0x1b13), .driver_info = USB_QUIRK_DELAY_INIT }, 379 { USB_DEVICE(0x1b1c, 0x1b13), .driver_info = USB_QUIRK_DELAY_INIT },
380 380
381 /* Corsair Strafe */
382 { USB_DEVICE(0x1b1c, 0x1b15), .driver_info = USB_QUIRK_DELAY_INIT |
383 USB_QUIRK_DELAY_CTRL_MSG },
384
381 /* Corsair Strafe RGB */ 385 /* Corsair Strafe RGB */
382 { USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT | 386 { USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT |
383 USB_QUIRK_DELAY_CTRL_MSG }, 387 USB_QUIRK_DELAY_CTRL_MSG },
diff --git a/drivers/usb/gadget/udc/aspeed-vhub/Kconfig b/drivers/usb/gadget/udc/aspeed-vhub/Kconfig
index f0cdf89b8503..83ba8a2eb6af 100644
--- a/drivers/usb/gadget/udc/aspeed-vhub/Kconfig
+++ b/drivers/usb/gadget/udc/aspeed-vhub/Kconfig
@@ -2,6 +2,7 @@
2config USB_ASPEED_VHUB 2config USB_ASPEED_VHUB
3 tristate "Aspeed vHub UDC driver" 3 tristate "Aspeed vHub UDC driver"
4 depends on ARCH_ASPEED || COMPILE_TEST 4 depends on ARCH_ASPEED || COMPILE_TEST
5 depends on USB_LIBCOMPOSITE
5 help 6 help
6 USB peripheral controller for the Aspeed AST2500 family 7 USB peripheral controller for the Aspeed AST2500 family
7 SoCs supporting the "vHub" functionality and USB2.0 8 SoCs supporting the "vHub" functionality and USB2.0
diff --git a/drivers/usb/host/xhci-dbgcap.c b/drivers/usb/host/xhci-dbgcap.c
index 1fbfd89d0a0f..387f124a8334 100644
--- a/drivers/usb/host/xhci-dbgcap.c
+++ b/drivers/usb/host/xhci-dbgcap.c
@@ -508,16 +508,18 @@ static int xhci_do_dbc_start(struct xhci_hcd *xhci)
508 return 0; 508 return 0;
509} 509}
510 510
511static void xhci_do_dbc_stop(struct xhci_hcd *xhci) 511static int xhci_do_dbc_stop(struct xhci_hcd *xhci)
512{ 512{
513 struct xhci_dbc *dbc = xhci->dbc; 513 struct xhci_dbc *dbc = xhci->dbc;
514 514
515 if (dbc->state == DS_DISABLED) 515 if (dbc->state == DS_DISABLED)
516 return; 516 return -1;
517 517
518 writel(0, &dbc->regs->control); 518 writel(0, &dbc->regs->control);
519 xhci_dbc_mem_cleanup(xhci); 519 xhci_dbc_mem_cleanup(xhci);
520 dbc->state = DS_DISABLED; 520 dbc->state = DS_DISABLED;
521
522 return 0;
521} 523}
522 524
523static int xhci_dbc_start(struct xhci_hcd *xhci) 525static int xhci_dbc_start(struct xhci_hcd *xhci)
@@ -544,6 +546,7 @@ static int xhci_dbc_start(struct xhci_hcd *xhci)
544 546
545static void xhci_dbc_stop(struct xhci_hcd *xhci) 547static void xhci_dbc_stop(struct xhci_hcd *xhci)
546{ 548{
549 int ret;
547 unsigned long flags; 550 unsigned long flags;
548 struct xhci_dbc *dbc = xhci->dbc; 551 struct xhci_dbc *dbc = xhci->dbc;
549 struct dbc_port *port = &dbc->port; 552 struct dbc_port *port = &dbc->port;
@@ -556,10 +559,11 @@ static void xhci_dbc_stop(struct xhci_hcd *xhci)
556 xhci_dbc_tty_unregister_device(xhci); 559 xhci_dbc_tty_unregister_device(xhci);
557 560
558 spin_lock_irqsave(&dbc->lock, flags); 561 spin_lock_irqsave(&dbc->lock, flags);
559 xhci_do_dbc_stop(xhci); 562 ret = xhci_do_dbc_stop(xhci);
560 spin_unlock_irqrestore(&dbc->lock, flags); 563 spin_unlock_irqrestore(&dbc->lock, flags);
561 564
562 pm_runtime_put_sync(xhci_to_hcd(xhci)->self.controller); 565 if (!ret)
566 pm_runtime_put_sync(xhci_to_hcd(xhci)->self.controller);
563} 567}
564 568
565static void 569static void
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index 8a62eee9eee1..ef350c33dc4a 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -595,7 +595,7 @@ struct xhci_ring *xhci_stream_id_to_ring(
595 if (!ep->stream_info) 595 if (!ep->stream_info)
596 return NULL; 596 return NULL;
597 597
598 if (stream_id > ep->stream_info->num_streams) 598 if (stream_id >= ep->stream_info->num_streams)
599 return NULL; 599 return NULL;
600 return ep->stream_info->stream_rings[stream_id]; 600 return ep->stream_info->stream_rings[stream_id];
601} 601}
diff --git a/drivers/usb/misc/yurex.c b/drivers/usb/misc/yurex.c
index 8abb6cbbd98a..3be40eaa1ac9 100644
--- a/drivers/usb/misc/yurex.c
+++ b/drivers/usb/misc/yurex.c
@@ -396,8 +396,7 @@ static ssize_t yurex_read(struct file *file, char __user *buffer, size_t count,
396 loff_t *ppos) 396 loff_t *ppos)
397{ 397{
398 struct usb_yurex *dev; 398 struct usb_yurex *dev;
399 int retval = 0; 399 int len = 0;
400 int bytes_read = 0;
401 char in_buffer[20]; 400 char in_buffer[20];
402 unsigned long flags; 401 unsigned long flags;
403 402
@@ -405,26 +404,16 @@ static ssize_t yurex_read(struct file *file, char __user *buffer, size_t count,
405 404
406 mutex_lock(&dev->io_mutex); 405 mutex_lock(&dev->io_mutex);
407 if (!dev->interface) { /* already disconnected */ 406 if (!dev->interface) { /* already disconnected */
408 retval = -ENODEV; 407 mutex_unlock(&dev->io_mutex);
409 goto exit; 408 return -ENODEV;
410 } 409 }
411 410
412 spin_lock_irqsave(&dev->lock, flags); 411 spin_lock_irqsave(&dev->lock, flags);
413 bytes_read = snprintf(in_buffer, 20, "%lld\n", dev->bbu); 412 len = snprintf(in_buffer, 20, "%lld\n", dev->bbu);
414 spin_unlock_irqrestore(&dev->lock, flags); 413 spin_unlock_irqrestore(&dev->lock, flags);
415
416 if (*ppos < bytes_read) {
417 if (copy_to_user(buffer, in_buffer + *ppos, bytes_read - *ppos))
418 retval = -EFAULT;
419 else {
420 retval = bytes_read - *ppos;
421 *ppos += bytes_read;
422 }
423 }
424
425exit:
426 mutex_unlock(&dev->io_mutex); 414 mutex_unlock(&dev->io_mutex);
427 return retval; 415
416 return simple_read_from_buffer(buffer, count, ppos, in_buffer, len);
428} 417}
429 418
430static ssize_t yurex_write(struct file *file, const char __user *user_buffer, 419static ssize_t yurex_write(struct file *file, const char __user *user_buffer,
diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c
index bdd7a5ad3bf1..3bb1fff02bed 100644
--- a/drivers/usb/serial/ch341.c
+++ b/drivers/usb/serial/ch341.c
@@ -128,7 +128,7 @@ static int ch341_control_in(struct usb_device *dev,
128 r = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), request, 128 r = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), request,
129 USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, 129 USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
130 value, index, buf, bufsize, DEFAULT_TIMEOUT); 130 value, index, buf, bufsize, DEFAULT_TIMEOUT);
131 if (r < bufsize) { 131 if (r < (int)bufsize) {
132 if (r >= 0) { 132 if (r >= 0) {
133 dev_err(&dev->dev, 133 dev_err(&dev->dev,
134 "short control message received (%d < %u)\n", 134 "short control message received (%d < %u)\n",
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
index ee0cc1d90b51..626a29d9aa58 100644
--- a/drivers/usb/serial/cp210x.c
+++ b/drivers/usb/serial/cp210x.c
@@ -149,6 +149,7 @@ static const struct usb_device_id id_table[] = {
149 { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */ 149 { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */
150 { USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */ 150 { USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */
151 { USB_DEVICE(0x10C4, 0x89A4) }, /* CESINEL FTBC Flexible Thyristor Bridge Controller */ 151 { USB_DEVICE(0x10C4, 0x89A4) }, /* CESINEL FTBC Flexible Thyristor Bridge Controller */
152 { USB_DEVICE(0x10C4, 0x89FB) }, /* Qivicon ZigBee USB Radio Stick */
152 { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */ 153 { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */
153 { USB_DEVICE(0x10C4, 0x8A5E) }, /* CEL EM3588 ZigBee USB Stick Long Range */ 154 { USB_DEVICE(0x10C4, 0x8A5E) }, /* CEL EM3588 ZigBee USB Stick Long Range */
154 { USB_DEVICE(0x10C4, 0x8B34) }, /* Qivicon ZigBee USB Radio Stick */ 155 { USB_DEVICE(0x10C4, 0x8B34) }, /* Qivicon ZigBee USB Radio Stick */
diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c
index 5169624d8b11..38d43c4b7ce5 100644
--- a/drivers/usb/serial/keyspan_pda.c
+++ b/drivers/usb/serial/keyspan_pda.c
@@ -369,8 +369,10 @@ static int keyspan_pda_get_modem_info(struct usb_serial *serial,
369 3, /* get pins */ 369 3, /* get pins */
370 USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_IN, 370 USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_IN,
371 0, 0, data, 1, 2000); 371 0, 0, data, 1, 2000);
372 if (rc >= 0) 372 if (rc == 1)
373 *value = *data; 373 *value = *data;
374 else if (rc >= 0)
375 rc = -EIO;
374 376
375 kfree(data); 377 kfree(data);
376 return rc; 378 return rc;
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
index fdceb46d9fc6..b580b4c7fa48 100644
--- a/drivers/usb/serial/mos7840.c
+++ b/drivers/usb/serial/mos7840.c
@@ -468,6 +468,9 @@ static void mos7840_control_callback(struct urb *urb)
468 } 468 }
469 469
470 dev_dbg(dev, "%s urb buffer size is %d\n", __func__, urb->actual_length); 470 dev_dbg(dev, "%s urb buffer size is %d\n", __func__, urb->actual_length);
471 if (urb->actual_length < 1)
472 goto out;
473
471 dev_dbg(dev, "%s mos7840_port->MsrLsr is %d port %d\n", __func__, 474 dev_dbg(dev, "%s mos7840_port->MsrLsr is %d port %d\n", __func__,
472 mos7840_port->MsrLsr, mos7840_port->port_num); 475 mos7840_port->MsrLsr, mos7840_port->port_num);
473 data = urb->transfer_buffer; 476 data = urb->transfer_buffer;
diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c
index d961f1ec0e08..150f43668bec 100644
--- a/drivers/usb/typec/tcpm.c
+++ b/drivers/usb/typec/tcpm.c
@@ -725,6 +725,9 @@ static int tcpm_set_current_limit(struct tcpm_port *port, u32 max_ma, u32 mv)
725 725
726 tcpm_log(port, "Setting voltage/current limit %u mV %u mA", mv, max_ma); 726 tcpm_log(port, "Setting voltage/current limit %u mV %u mA", mv, max_ma);
727 727
728 port->supply_voltage = mv;
729 port->current_limit = max_ma;
730
728 if (port->tcpc->set_current_limit) 731 if (port->tcpc->set_current_limit)
729 ret = port->tcpc->set_current_limit(port->tcpc, max_ma, mv); 732 ret = port->tcpc->set_current_limit(port->tcpc, max_ma, mv);
730 733
@@ -2595,8 +2598,6 @@ static void tcpm_reset_port(struct tcpm_port *port)
2595 tcpm_set_attached_state(port, false); 2598 tcpm_set_attached_state(port, false);
2596 port->try_src_count = 0; 2599 port->try_src_count = 0;
2597 port->try_snk_count = 0; 2600 port->try_snk_count = 0;
2598 port->supply_voltage = 0;
2599 port->current_limit = 0;
2600 port->usb_type = POWER_SUPPLY_USB_TYPE_C; 2601 port->usb_type = POWER_SUPPLY_USB_TYPE_C;
2601 2602
2602 power_supply_changed(port->psy); 2603 power_supply_changed(port->psy);