Merge tag 'usb-4.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB/PHY updates from Greg KH: "Here is the big USB and phy driver patch set for 4.19-rc1. Nothing huge but there was a lot of work that happened this development cycle: - lots of type-c work, with drivers graduating out of staging, and displayport support being added. - new PHY drivers - the normal collection of gadget driver updates and fixes - code churn to work on the urb handling path, using irqsave() everywhere in anticipation of making this codepath a lot simpler in the future. - usbserial driver fixes and reworks - other misc changes All of these have been in linux-next with no reported issues for a while" * tag 'usb-4.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (159 commits) USB: serial: pl2303: add a new device id for ATEN usb: renesas_usbhs: Kconfig: convert to SPDX identifiers usb: dwc3: gadget: Check MaxPacketSize from descriptor usb: dwc2: Turn on uframe_sched on "stm32f4x9_fsotg" platforms usb: dwc2: Turn on uframe_sched on "amlogic" platforms usb: dwc2: Turn on uframe_sched on "his" platforms usb: dwc2: Turn on uframe_sched on "bcm" platforms usb: dwc2: gadget: ISOC's starting flow improvement usb: dwc2: Make dwc2_readl/writel functions endianness-agnostic. usb: dwc3: core: Enable AutoRetry feature in the controller usb: dwc3: Set default mode for dwc_usb31 usb: gadget: udc: renesas_usb3: Add register of usb role switch usb: dwc2: replace ioread32/iowrite32_rep with dwc2_readl/writel_rep usb: dwc2: Modify dwc2_readl/writel functions prototype usb: dwc3: pci: Intel Merrifield can be host usb: dwc3: pci: Supply device properties via driver data arm64: dts: dwc3: description of incr burst type usb: dwc3: Enable undefined length INCR burst type usb: dwc3: add global soc bus configuration reg0 usb: dwc3: Describe 'wakeup_work' field of struct dwc3_pci ...
This commit is contained in:
@@ -585,9 +585,10 @@ static void async_completed(struct urb *urb)
|
||||
struct siginfo sinfo;
|
||||
struct pid *pid = NULL;
|
||||
const struct cred *cred = NULL;
|
||||
unsigned long flags;
|
||||
int signr;
|
||||
|
||||
spin_lock(&ps->lock);
|
||||
spin_lock_irqsave(&ps->lock, flags);
|
||||
list_move_tail(&as->asynclist, &ps->async_completed);
|
||||
as->status = urb->status;
|
||||
signr = as->signr;
|
||||
@@ -611,7 +612,7 @@ static void async_completed(struct urb *urb)
|
||||
cancel_bulk_urbs(ps, as->bulk_addr);
|
||||
|
||||
wake_up(&ps->wait);
|
||||
spin_unlock(&ps->lock);
|
||||
spin_unlock_irqrestore(&ps->lock, flags);
|
||||
|
||||
if (signr) {
|
||||
kill_pid_info_as_cred(sinfo.si_signo, &sinfo, pid, cred);
|
||||
|
@@ -3660,12 +3660,54 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Report wakeup requests from the ports of a resuming root hub */
|
||||
static void report_wakeup_requests(struct usb_hub *hub)
|
||||
{
|
||||
struct usb_device *hdev = hub->hdev;
|
||||
struct usb_device *udev;
|
||||
struct usb_hcd *hcd;
|
||||
unsigned long resuming_ports;
|
||||
int i;
|
||||
|
||||
if (hdev->parent)
|
||||
return; /* Not a root hub */
|
||||
|
||||
hcd = bus_to_hcd(hdev->bus);
|
||||
if (hcd->driver->get_resuming_ports) {
|
||||
|
||||
/*
|
||||
* The get_resuming_ports() method returns a bitmap (origin 0)
|
||||
* of ports which have started wakeup signaling but have not
|
||||
* yet finished resuming. During system resume we will
|
||||
* resume all the enabled ports, regardless of any wakeup
|
||||
* signals, which means the wakeup requests would be lost.
|
||||
* To prevent this, report them to the PM core here.
|
||||
*/
|
||||
resuming_ports = hcd->driver->get_resuming_ports(hcd);
|
||||
for (i = 0; i < hdev->maxchild; ++i) {
|
||||
if (test_bit(i, &resuming_ports)) {
|
||||
udev = hub->ports[i]->child;
|
||||
if (udev)
|
||||
pm_wakeup_event(&udev->dev, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int hub_resume(struct usb_interface *intf)
|
||||
{
|
||||
struct usb_hub *hub = usb_get_intfdata(intf);
|
||||
|
||||
dev_dbg(&intf->dev, "%s\n", __func__);
|
||||
hub_activate(hub, HUB_RESUME);
|
||||
|
||||
/*
|
||||
* This should be called only for system resume, not runtime resume.
|
||||
* We can't tell the difference here, so some wakeup requests will be
|
||||
* reported at the wrong time or more than once. This shouldn't
|
||||
* matter much, so long as they do get reported.
|
||||
*/
|
||||
report_wakeup_requests(hub);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -269,10 +269,11 @@ static void sg_clean(struct usb_sg_request *io)
|
||||
|
||||
static void sg_complete(struct urb *urb)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct usb_sg_request *io = urb->context;
|
||||
int status = urb->status;
|
||||
|
||||
spin_lock(&io->lock);
|
||||
spin_lock_irqsave(&io->lock, flags);
|
||||
|
||||
/* In 2.5 we require hcds' endpoint queues not to progress after fault
|
||||
* reports, until the completion callback (this!) returns. That lets
|
||||
@@ -306,7 +307,7 @@ static void sg_complete(struct urb *urb)
|
||||
* unlink pending urbs so they won't rx/tx bad data.
|
||||
* careful: unlink can sometimes be synchronous...
|
||||
*/
|
||||
spin_unlock(&io->lock);
|
||||
spin_unlock_irqrestore(&io->lock, flags);
|
||||
for (i = 0, found = 0; i < io->entries; i++) {
|
||||
if (!io->urbs[i])
|
||||
continue;
|
||||
@@ -323,7 +324,7 @@ static void sg_complete(struct urb *urb)
|
||||
} else if (urb == io->urbs[i])
|
||||
found = 1;
|
||||
}
|
||||
spin_lock(&io->lock);
|
||||
spin_lock_irqsave(&io->lock, flags);
|
||||
}
|
||||
|
||||
/* on the last completion, signal usb_sg_wait() */
|
||||
@@ -332,7 +333,7 @@ static void sg_complete(struct urb *urb)
|
||||
if (!io->count)
|
||||
complete(&io->complete);
|
||||
|
||||
spin_unlock(&io->lock);
|
||||
spin_unlock_irqrestore(&io->lock, flags);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user