Commit b07c2e76 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'usb-5.6-rc7' 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 5.6-rc7. And there's a thunderbolt
  driver fix thrown in for good measure as well.

  These fixes are:
   - new device ids for usb-serial drivers
   - thunderbolt error code fix
   - xhci driver fixes
   - typec fixes
   - cdc-acm driver fixes
   - chipidea driver fix
   - more USB quirks added for devices that need them.

  All of these have been in linux-next with no reported issues"

* tag 'usb-5.6-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
  USB: cdc-acm: fix rounding error in TIOCSSERIAL
  USB: cdc-acm: fix close_delay and closing_wait units in TIOCSSERIAL
  usb: quirks: add NO_LPM quirk for RTL8153 based ethernet adapters
  usb: chipidea: udc: fix sleeping function called from invalid context
  USB: serial: pl2303: add device-id for HP LD381
  USB: serial: option: add ME910G1 ECM composition 0x110b
  usb: host: xhci-plat: add a shutdown
  usb: typec: ucsi: displayport: Fix a potential race during registration
  usb: typec: ucsi: displayport: Fix NULL pointer dereference
  USB: Disable LPM on WD19's Realtek Hub
  usb: xhci: apply XHCI_SUSPEND_DELAY to AMD XHCI controller 1022:145c
  xhci: Do not open code __print_symbolic() in xhci trace events
  thunderbolt: Fix error code in tb_port_is_width_supported()
parents fa91418b 2866ce86
...@@ -954,7 +954,7 @@ static bool tb_port_is_width_supported(struct tb_port *port, int width) ...@@ -954,7 +954,7 @@ static bool tb_port_is_width_supported(struct tb_port *port, int width)
ret = tb_port_read(port, &phy, TB_CFG_PORT, ret = tb_port_read(port, &phy, TB_CFG_PORT,
port->cap_phy + LANE_ADP_CS_0, 1); port->cap_phy + LANE_ADP_CS_0, 1);
if (ret) if (ret)
return ret; return false;
widths = (phy & LANE_ADP_CS_0_SUPPORTED_WIDTH_MASK) >> widths = (phy & LANE_ADP_CS_0_SUPPORTED_WIDTH_MASK) >>
LANE_ADP_CS_0_SUPPORTED_WIDTH_SHIFT; LANE_ADP_CS_0_SUPPORTED_WIDTH_SHIFT;
......
...@@ -1530,18 +1530,19 @@ static const struct usb_ep_ops usb_ep_ops = { ...@@ -1530,18 +1530,19 @@ static const struct usb_ep_ops usb_ep_ops = {
static void ci_hdrc_gadget_connect(struct usb_gadget *_gadget, int is_active) static void ci_hdrc_gadget_connect(struct usb_gadget *_gadget, int is_active)
{ {
struct ci_hdrc *ci = container_of(_gadget, struct ci_hdrc, gadget); struct ci_hdrc *ci = container_of(_gadget, struct ci_hdrc, gadget);
unsigned long flags;
if (is_active) { if (is_active) {
pm_runtime_get_sync(&_gadget->dev); pm_runtime_get_sync(&_gadget->dev);
hw_device_reset(ci); hw_device_reset(ci);
spin_lock_irqsave(&ci->lock, flags); spin_lock_irq(&ci->lock);
if (ci->driver) { if (ci->driver) {
hw_device_state(ci, ci->ep0out->qh.dma); hw_device_state(ci, ci->ep0out->qh.dma);
usb_gadget_set_state(_gadget, USB_STATE_POWERED); usb_gadget_set_state(_gadget, USB_STATE_POWERED);
spin_unlock_irq(&ci->lock);
usb_udc_vbus_handler(_gadget, true); usb_udc_vbus_handler(_gadget, true);
} else {
spin_unlock_irq(&ci->lock);
} }
spin_unlock_irqrestore(&ci->lock, flags);
} else { } else {
usb_udc_vbus_handler(_gadget, false); usb_udc_vbus_handler(_gadget, false);
if (ci->driver) if (ci->driver)
......
...@@ -896,10 +896,10 @@ static int get_serial_info(struct tty_struct *tty, struct serial_struct *ss) ...@@ -896,10 +896,10 @@ static int get_serial_info(struct tty_struct *tty, struct serial_struct *ss)
ss->xmit_fifo_size = acm->writesize; ss->xmit_fifo_size = acm->writesize;
ss->baud_base = le32_to_cpu(acm->line.dwDTERate); ss->baud_base = le32_to_cpu(acm->line.dwDTERate);
ss->close_delay = acm->port.close_delay / 10; ss->close_delay = jiffies_to_msecs(acm->port.close_delay) / 10;
ss->closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? ss->closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
ASYNC_CLOSING_WAIT_NONE : ASYNC_CLOSING_WAIT_NONE :
acm->port.closing_wait / 10; jiffies_to_msecs(acm->port.closing_wait) / 10;
return 0; return 0;
} }
...@@ -907,24 +907,32 @@ static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss) ...@@ -907,24 +907,32 @@ static int set_serial_info(struct tty_struct *tty, struct serial_struct *ss)
{ {
struct acm *acm = tty->driver_data; struct acm *acm = tty->driver_data;
unsigned int closing_wait, close_delay; unsigned int closing_wait, close_delay;
unsigned int old_closing_wait, old_close_delay;
int retval = 0; int retval = 0;
close_delay = ss->close_delay * 10; close_delay = msecs_to_jiffies(ss->close_delay * 10);
closing_wait = ss->closing_wait == ASYNC_CLOSING_WAIT_NONE ? closing_wait = ss->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
ASYNC_CLOSING_WAIT_NONE : ss->closing_wait * 10; ASYNC_CLOSING_WAIT_NONE :
msecs_to_jiffies(ss->closing_wait * 10);
/* we must redo the rounding here, so that the values match */
old_close_delay = jiffies_to_msecs(acm->port.close_delay) / 10;
old_closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
ASYNC_CLOSING_WAIT_NONE :
jiffies_to_msecs(acm->port.closing_wait) / 10;
mutex_lock(&acm->port.mutex); mutex_lock(&acm->port.mutex);
if (!capable(CAP_SYS_ADMIN)) { if ((ss->close_delay != old_close_delay) ||
if ((close_delay != acm->port.close_delay) || (ss->closing_wait != old_closing_wait)) {
(closing_wait != acm->port.closing_wait)) if (!capable(CAP_SYS_ADMIN))
retval = -EPERM; retval = -EPERM;
else else {
retval = -EOPNOTSUPP; acm->port.close_delay = close_delay;
} else { acm->port.closing_wait = closing_wait;
acm->port.close_delay = close_delay; }
acm->port.closing_wait = closing_wait; } else
} retval = -EOPNOTSUPP;
mutex_unlock(&acm->port.mutex); mutex_unlock(&acm->port.mutex);
return retval; return retval;
......
...@@ -378,6 +378,12 @@ static const struct usb_device_id usb_quirk_list[] = { ...@@ -378,6 +378,12 @@ static const struct usb_device_id usb_quirk_list[] = {
{ USB_DEVICE(0x0b05, 0x17e0), .driver_info = { USB_DEVICE(0x0b05, 0x17e0), .driver_info =
USB_QUIRK_IGNORE_REMOTE_WAKEUP }, USB_QUIRK_IGNORE_REMOTE_WAKEUP },
/* Realtek hub in Dell WD19 (Type-C) */
{ USB_DEVICE(0x0bda, 0x0487), .driver_info = USB_QUIRK_NO_LPM },
/* Generic RTL8153 based ethernet adapters */
{ USB_DEVICE(0x0bda, 0x8153), .driver_info = USB_QUIRK_NO_LPM },
/* Action Semiconductor flash disk */ /* Action Semiconductor flash disk */
{ USB_DEVICE(0x10d6, 0x2200), .driver_info = { USB_DEVICE(0x10d6, 0x2200), .driver_info =
USB_QUIRK_STRING_FETCH_255 }, USB_QUIRK_STRING_FETCH_255 },
......
...@@ -136,7 +136,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) ...@@ -136,7 +136,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
xhci->quirks |= XHCI_AMD_PLL_FIX; xhci->quirks |= XHCI_AMD_PLL_FIX;
if (pdev->vendor == PCI_VENDOR_ID_AMD && if (pdev->vendor == PCI_VENDOR_ID_AMD &&
(pdev->device == 0x15e0 || (pdev->device == 0x145c ||
pdev->device == 0x15e0 ||
pdev->device == 0x15e1 || pdev->device == 0x15e1 ||
pdev->device == 0x43bb)) pdev->device == 0x43bb))
xhci->quirks |= XHCI_SUSPEND_DELAY; xhci->quirks |= XHCI_SUSPEND_DELAY;
......
...@@ -445,6 +445,7 @@ MODULE_DEVICE_TABLE(acpi, usb_xhci_acpi_match); ...@@ -445,6 +445,7 @@ MODULE_DEVICE_TABLE(acpi, usb_xhci_acpi_match);
static struct platform_driver usb_xhci_driver = { static struct platform_driver usb_xhci_driver = {
.probe = xhci_plat_probe, .probe = xhci_plat_probe,
.remove = xhci_plat_remove, .remove = xhci_plat_remove,
.shutdown = usb_hcd_platform_shutdown,
.driver = { .driver = {
.name = "xhci-hcd", .name = "xhci-hcd",
.pm = &xhci_plat_pm_ops, .pm = &xhci_plat_pm_ops,
......
...@@ -289,23 +289,12 @@ DECLARE_EVENT_CLASS(xhci_log_urb, ...@@ -289,23 +289,12 @@ DECLARE_EVENT_CLASS(xhci_log_urb,
), ),
TP_printk("ep%d%s-%s: urb %p pipe %u slot %d length %d/%d sgs %d/%d stream %d flags %08x", TP_printk("ep%d%s-%s: urb %p pipe %u slot %d length %d/%d sgs %d/%d stream %d flags %08x",
__entry->epnum, __entry->dir_in ? "in" : "out", __entry->epnum, __entry->dir_in ? "in" : "out",
({ char *s; __print_symbolic(__entry->type,
switch (__entry->type) { { USB_ENDPOINT_XFER_INT, "intr" },
case USB_ENDPOINT_XFER_INT: { USB_ENDPOINT_XFER_CONTROL, "control" },
s = "intr"; { USB_ENDPOINT_XFER_BULK, "bulk" },
break; { USB_ENDPOINT_XFER_ISOC, "isoc" }),
case USB_ENDPOINT_XFER_CONTROL: __entry->urb, __entry->pipe, __entry->slot_id,
s = "control";
break;
case USB_ENDPOINT_XFER_BULK:
s = "bulk";
break;
case USB_ENDPOINT_XFER_ISOC:
s = "isoc";
break;
default:
s = "UNKNOWN";
} s; }), __entry->urb, __entry->pipe, __entry->slot_id,
__entry->actual, __entry->length, __entry->num_mapped_sgs, __entry->actual, __entry->length, __entry->num_mapped_sgs,
__entry->num_sgs, __entry->stream, __entry->flags __entry->num_sgs, __entry->stream, __entry->flags
) )
......
...@@ -1183,6 +1183,8 @@ static const struct usb_device_id option_ids[] = { ...@@ -1183,6 +1183,8 @@ static const struct usb_device_id option_ids[] = {
.driver_info = NCTRL(0) }, .driver_info = NCTRL(0) },
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x110a, 0xff), /* Telit ME910G1 */ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x110a, 0xff), /* Telit ME910G1 */
.driver_info = NCTRL(0) | RSVD(3) }, .driver_info = NCTRL(0) | RSVD(3) },
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x110b, 0xff), /* Telit ME910G1 (ECM) */
.driver_info = NCTRL(0) },
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910), { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910),
.driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4), { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4),
......
...@@ -99,6 +99,7 @@ static const struct usb_device_id id_table[] = { ...@@ -99,6 +99,7 @@ static const struct usb_device_id id_table[] = {
{ USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) }, { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
{ USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
{ USB_DEVICE(HP_VENDOR_ID, HP_LD220TA_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LD220TA_PRODUCT_ID) },
{ USB_DEVICE(HP_VENDOR_ID, HP_LD381_PRODUCT_ID) },
{ USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) },
{ USB_DEVICE(HP_VENDOR_ID, HP_LD960TA_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LD960TA_PRODUCT_ID) },
{ USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) },
......
...@@ -130,6 +130,7 @@ ...@@ -130,6 +130,7 @@
#define HP_LM920_PRODUCT_ID 0x026b #define HP_LM920_PRODUCT_ID 0x026b
#define HP_TD620_PRODUCT_ID 0x0956 #define HP_TD620_PRODUCT_ID 0x0956
#define HP_LD960_PRODUCT_ID 0x0b39 #define HP_LD960_PRODUCT_ID 0x0b39
#define HP_LD381_PRODUCT_ID 0x0f7f
#define HP_LCM220_PRODUCT_ID 0x3139 #define HP_LCM220_PRODUCT_ID 0x3139
#define HP_LCM960_PRODUCT_ID 0x3239 #define HP_LCM960_PRODUCT_ID 0x3239
#define HP_LD220_PRODUCT_ID 0x3524 #define HP_LD220_PRODUCT_ID 0x3524
......
...@@ -271,6 +271,9 @@ void ucsi_displayport_remove_partner(struct typec_altmode *alt) ...@@ -271,6 +271,9 @@ void ucsi_displayport_remove_partner(struct typec_altmode *alt)
return; return;
dp = typec_altmode_get_drvdata(alt); dp = typec_altmode_get_drvdata(alt);
if (!dp)
return;
dp->data.conf = 0; dp->data.conf = 0;
dp->data.status = 0; dp->data.status = 0;
dp->initialized = false; dp->initialized = false;
...@@ -285,6 +288,8 @@ struct typec_altmode *ucsi_register_displayport(struct ucsi_connector *con, ...@@ -285,6 +288,8 @@ struct typec_altmode *ucsi_register_displayport(struct ucsi_connector *con,
struct typec_altmode *alt; struct typec_altmode *alt;
struct ucsi_dp *dp; struct ucsi_dp *dp;
mutex_lock(&con->lock);
/* We can't rely on the firmware with the capabilities. */ /* We can't rely on the firmware with the capabilities. */
desc->vdo |= DP_CAP_DP_SIGNALING | DP_CAP_RECEPTACLE; desc->vdo |= DP_CAP_DP_SIGNALING | DP_CAP_RECEPTACLE;
...@@ -293,12 +298,15 @@ struct typec_altmode *ucsi_register_displayport(struct ucsi_connector *con, ...@@ -293,12 +298,15 @@ struct typec_altmode *ucsi_register_displayport(struct ucsi_connector *con,
desc->vdo |= all_assignments << 16; desc->vdo |= all_assignments << 16;
alt = typec_port_register_altmode(con->port, desc); alt = typec_port_register_altmode(con->port, desc);
if (IS_ERR(alt)) if (IS_ERR(alt)) {
mutex_unlock(&con->lock);
return alt; return alt;
}
dp = devm_kzalloc(&alt->dev, sizeof(*dp), GFP_KERNEL); dp = devm_kzalloc(&alt->dev, sizeof(*dp), GFP_KERNEL);
if (!dp) { if (!dp) {
typec_unregister_altmode(alt); typec_unregister_altmode(alt);
mutex_unlock(&con->lock);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
} }
...@@ -311,5 +319,7 @@ struct typec_altmode *ucsi_register_displayport(struct ucsi_connector *con, ...@@ -311,5 +319,7 @@ struct typec_altmode *ucsi_register_displayport(struct ucsi_connector *con,
alt->ops = &ucsi_displayport_ops; alt->ops = &ucsi_displayport_ops;
typec_altmode_set_drvdata(alt, dp); typec_altmode_set_drvdata(alt, dp);
mutex_unlock(&con->lock);
return alt; return alt;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment