Merge tag 'usb-5.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB/PHY updates from Greg KH: "Here is the big set of USB and PHY driver patches for 5.2-rc1 There is the usual set of: - USB gadget updates - PHY driver updates and additions - USB serial driver updates and fixes - typec updates and new chips supported - mtu3 driver updates - xhci driver updates - other tiny driver updates Nothing really interesting, just constant forward progress. All of these have been in linux-next for a while with no reported issues. The usb-gadget and usb-serial trees were merged a bit "late", but both of them had been in linux-next before they got merged here last Friday" * tag 'usb-5.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (206 commits) USB: serial: f81232: implement break control USB: serial: f81232: add high baud rate support USB: serial: f81232: clear overrun flag USB: serial: f81232: fix interrupt worker not stop usb: dwc3: Rename DWC3_DCTL_LPM_ERRATA usb: dwc3: Fix default lpm_nyet_threshold value usb: dwc3: debug: Print GET_STATUS(device) tracepoint usb: dwc3: Do core validation early on probe usb: dwc3: gadget: Set lpm_capable usb: gadget: atmel: tie wake lock to running clock usb: gadget: atmel: support USB suspend usb: gadget: atmel_usba_udc: simplify setting of interrupt-enabled mask dwc2: gadget: Fix completed transfer size calculation in DDMA usb: dwc2: Set lpm mode parameters depend on HW configuration usb: dwc2: Fix channel disable flow usb: dwc2: Set actual frame number for completed ISOC transfer usb: gadget: do not use __constant_cpu_to_le16 usb: dwc2: gadget: Increase descriptors count for ISOC's usb: introduce usb_ep_type_string() function usb: dwc3: move synchronize_irq() out of the spinlock protected block ...
This commit is contained in:
@@ -1878,23 +1878,10 @@ rescan:
|
||||
/* kick hcd */
|
||||
unlink1(hcd, urb, -ESHUTDOWN);
|
||||
dev_dbg (hcd->self.controller,
|
||||
"shutdown urb %pK ep%d%s%s\n",
|
||||
"shutdown urb %pK ep%d%s-%s\n",
|
||||
urb, usb_endpoint_num(&ep->desc),
|
||||
is_in ? "in" : "out",
|
||||
({ char *s;
|
||||
|
||||
switch (usb_endpoint_type(&ep->desc)) {
|
||||
case USB_ENDPOINT_XFER_CONTROL:
|
||||
s = ""; break;
|
||||
case USB_ENDPOINT_XFER_BULK:
|
||||
s = "-bulk"; break;
|
||||
case USB_ENDPOINT_XFER_INT:
|
||||
s = "-intr"; break;
|
||||
default:
|
||||
s = "-iso"; break;
|
||||
};
|
||||
s;
|
||||
}));
|
||||
usb_ep_type_string(usb_endpoint_type(&ep->desc)));
|
||||
usb_put_urb (urb);
|
||||
|
||||
/* list contents may have changed */
|
||||
@@ -2448,6 +2435,19 @@ EXPORT_SYMBOL_GPL(usb_hcd_irq);
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/* Workqueue routine for when the root-hub has died. */
|
||||
static void hcd_died_work(struct work_struct *work)
|
||||
{
|
||||
struct usb_hcd *hcd = container_of(work, struct usb_hcd, died_work);
|
||||
static char *env[] = {
|
||||
"ERROR=DEAD",
|
||||
NULL
|
||||
};
|
||||
|
||||
/* Notify user space that the host controller has died */
|
||||
kobject_uevent_env(&hcd->self.root_hub->dev.kobj, KOBJ_OFFLINE, env);
|
||||
}
|
||||
|
||||
/**
|
||||
* usb_hc_died - report abnormal shutdown of a host controller (bus glue)
|
||||
* @hcd: pointer to the HCD representing the controller
|
||||
@@ -2488,6 +2488,13 @@ void usb_hc_died (struct usb_hcd *hcd)
|
||||
usb_kick_hub_wq(hcd->self.root_hub);
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle the case where this function gets called with a shared HCD */
|
||||
if (usb_hcd_is_primary_hcd(hcd))
|
||||
schedule_work(&hcd->died_work);
|
||||
else
|
||||
schedule_work(&hcd->primary_hcd->died_work);
|
||||
|
||||
spin_unlock_irqrestore (&hcd_root_hub_lock, flags);
|
||||
/* Make sure that the other roothub is also deallocated. */
|
||||
}
|
||||
@@ -2555,6 +2562,8 @@ struct usb_hcd *__usb_create_hcd(const struct hc_driver *driver,
|
||||
INIT_WORK(&hcd->wakeup_work, hcd_resume_work);
|
||||
#endif
|
||||
|
||||
INIT_WORK(&hcd->died_work, hcd_died_work);
|
||||
|
||||
hcd->driver = driver;
|
||||
hcd->speed = driver->flags & HCD_MASK;
|
||||
hcd->product_desc = (driver->product_desc) ? driver->product_desc :
|
||||
@@ -2908,6 +2917,7 @@ error_create_attr_group:
|
||||
#ifdef CONFIG_PM
|
||||
cancel_work_sync(&hcd->wakeup_work);
|
||||
#endif
|
||||
cancel_work_sync(&hcd->died_work);
|
||||
mutex_lock(&usb_bus_idr_lock);
|
||||
usb_disconnect(&rhdev); /* Sets rhdev to NULL */
|
||||
mutex_unlock(&usb_bus_idr_lock);
|
||||
@@ -2968,6 +2978,7 @@ void usb_remove_hcd(struct usb_hcd *hcd)
|
||||
#ifdef CONFIG_PM
|
||||
cancel_work_sync(&hcd->wakeup_work);
|
||||
#endif
|
||||
cancel_work_sync(&hcd->died_work);
|
||||
|
||||
mutex_lock(&usb_bus_idr_lock);
|
||||
usb_disconnect(&rhdev); /* Sets rhdev to NULL */
|
||||
@@ -3020,6 +3031,9 @@ usb_hcd_platform_shutdown(struct platform_device *dev)
|
||||
{
|
||||
struct usb_hcd *hcd = platform_get_drvdata(dev);
|
||||
|
||||
/* No need for pm_runtime_put(), we're shutting down */
|
||||
pm_runtime_get_sync(&dev->dev);
|
||||
|
||||
if (hcd->driver->shutdown)
|
||||
hcd->driver->shutdown(hcd);
|
||||
}
|
||||
|
@@ -3174,13 +3174,14 @@ static int usb_disable_remote_wakeup(struct usb_device *udev)
|
||||
}
|
||||
|
||||
/* Count of wakeup-enabled devices at or below udev */
|
||||
static unsigned wakeup_enabled_descendants(struct usb_device *udev)
|
||||
unsigned usb_wakeup_enabled_descendants(struct usb_device *udev)
|
||||
{
|
||||
struct usb_hub *hub = usb_hub_to_struct_hub(udev);
|
||||
|
||||
return udev->do_remote_wakeup +
|
||||
(hub ? hub->wakeup_enabled_descendants : 0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usb_wakeup_enabled_descendants);
|
||||
|
||||
/*
|
||||
* usb_port_suspend - suspend a usb device's upstream port
|
||||
@@ -3282,7 +3283,7 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
|
||||
* Therefore we will turn on the suspend feature if udev or any of its
|
||||
* descendants is enabled for remote wakeup.
|
||||
*/
|
||||
else if (PMSG_IS_AUTO(msg) || wakeup_enabled_descendants(udev) > 0)
|
||||
else if (PMSG_IS_AUTO(msg) || usb_wakeup_enabled_descendants(udev) > 0)
|
||||
status = set_port_feature(hub->hdev, port1,
|
||||
USB_PORT_FEAT_SUSPEND);
|
||||
else {
|
||||
@@ -3668,7 +3669,6 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg)
|
||||
struct usb_hub *hub = usb_get_intfdata(intf);
|
||||
struct usb_device *hdev = hub->hdev;
|
||||
unsigned port1;
|
||||
int status;
|
||||
|
||||
/*
|
||||
* Warn if children aren't already suspended.
|
||||
@@ -3687,7 +3687,7 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg)
|
||||
}
|
||||
if (udev)
|
||||
hub->wakeup_enabled_descendants +=
|
||||
wakeup_enabled_descendants(udev);
|
||||
usb_wakeup_enabled_descendants(udev);
|
||||
}
|
||||
|
||||
if (hdev->do_remote_wakeup && hub->quirk_check_port_auto_suspend) {
|
||||
@@ -3702,12 +3702,12 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg)
|
||||
if (hub_is_superspeed(hdev) && hdev->do_remote_wakeup) {
|
||||
/* Enable hub to send remote wakeup for all ports. */
|
||||
for (port1 = 1; port1 <= hdev->maxchild; port1++) {
|
||||
status = set_port_feature(hdev,
|
||||
port1 |
|
||||
USB_PORT_FEAT_REMOTE_WAKE_CONNECT |
|
||||
USB_PORT_FEAT_REMOTE_WAKE_DISCONNECT |
|
||||
USB_PORT_FEAT_REMOTE_WAKE_OVER_CURRENT,
|
||||
USB_PORT_FEAT_REMOTE_WAKE_MASK);
|
||||
set_port_feature(hdev,
|
||||
port1 |
|
||||
USB_PORT_FEAT_REMOTE_WAKE_CONNECT |
|
||||
USB_PORT_FEAT_REMOTE_WAKE_DISCONNECT |
|
||||
USB_PORT_FEAT_REMOTE_WAKE_OVER_CURRENT,
|
||||
USB_PORT_FEAT_REMOTE_WAKE_MASK);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5902,7 +5902,10 @@ int usb_reset_device(struct usb_device *udev)
|
||||
cintf->needs_binding = 1;
|
||||
}
|
||||
}
|
||||
usb_unbind_and_rebind_marked_interfaces(udev);
|
||||
|
||||
/* If the reset failed, hub_wq will unbind drivers later */
|
||||
if (ret == 0)
|
||||
usb_unbind_and_rebind_marked_interfaces(udev);
|
||||
}
|
||||
|
||||
usb_autosuspend_device(udev);
|
||||
|
Reference in New Issue
Block a user