Merge 4.18-rc3 into usb-next
We want the USB and other fixes in here as well to make merges and testing easier. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
@@ -886,12 +886,12 @@ void xhci_free_virt_device(struct xhci_hcd *xhci, int slot_id)
|
||||
|
||||
dev = xhci->devs[slot_id];
|
||||
|
||||
trace_xhci_free_virt_device(dev);
|
||||
|
||||
xhci->dcbaa->dev_context_ptrs[slot_id] = 0;
|
||||
if (!dev)
|
||||
return;
|
||||
|
||||
trace_xhci_free_virt_device(dev);
|
||||
|
||||
if (dev->tt_info)
|
||||
old_active_eps = dev->tt_info->active_eps;
|
||||
|
||||
|
@@ -481,7 +481,7 @@ static void tegra_xusb_mbox_handle(struct tegra_xusb *tegra,
|
||||
unsigned long mask;
|
||||
unsigned int port;
|
||||
bool idle, enable;
|
||||
int err;
|
||||
int err = 0;
|
||||
|
||||
memset(&rsp, 0, sizeof(rsp));
|
||||
|
||||
@@ -1223,10 +1223,10 @@ disable_rpm:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
usb_put_hcd(tegra->hcd);
|
||||
disable_xusbc:
|
||||
if (!&pdev->dev.pm_domain)
|
||||
if (!pdev->dev.pm_domain)
|
||||
tegra_powergate_power_off(TEGRA_POWERGATE_XUSBC);
|
||||
disable_xusba:
|
||||
if (!&pdev->dev.pm_domain)
|
||||
if (!pdev->dev.pm_domain)
|
||||
tegra_powergate_power_off(TEGRA_POWERGATE_XUSBA);
|
||||
put_padctl:
|
||||
tegra_xusb_padctl_put(tegra->padctl);
|
||||
|
@@ -171,6 +171,37 @@ DEFINE_EVENT(xhci_log_trb, xhci_dbc_gadget_ep_queue,
|
||||
TP_ARGS(ring, trb)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(xhci_log_free_virt_dev,
|
||||
TP_PROTO(struct xhci_virt_device *vdev),
|
||||
TP_ARGS(vdev),
|
||||
TP_STRUCT__entry(
|
||||
__field(void *, vdev)
|
||||
__field(unsigned long long, out_ctx)
|
||||
__field(unsigned long long, in_ctx)
|
||||
__field(u8, fake_port)
|
||||
__field(u8, real_port)
|
||||
__field(u16, current_mel)
|
||||
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->vdev = vdev;
|
||||
__entry->in_ctx = (unsigned long long) vdev->in_ctx->dma;
|
||||
__entry->out_ctx = (unsigned long long) vdev->out_ctx->dma;
|
||||
__entry->fake_port = (u8) vdev->fake_port;
|
||||
__entry->real_port = (u8) vdev->real_port;
|
||||
__entry->current_mel = (u16) vdev->current_mel;
|
||||
),
|
||||
TP_printk("vdev %p ctx %llx | %llx fake_port %d real_port %d current_mel %d",
|
||||
__entry->vdev, __entry->in_ctx, __entry->out_ctx,
|
||||
__entry->fake_port, __entry->real_port, __entry->current_mel
|
||||
)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(xhci_log_free_virt_dev, xhci_free_virt_device,
|
||||
TP_PROTO(struct xhci_virt_device *vdev),
|
||||
TP_ARGS(vdev)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(xhci_log_virt_dev,
|
||||
TP_PROTO(struct xhci_virt_device *vdev),
|
||||
TP_ARGS(vdev),
|
||||
@@ -208,11 +239,6 @@ DEFINE_EVENT(xhci_log_virt_dev, xhci_alloc_virt_device,
|
||||
TP_ARGS(vdev)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(xhci_log_virt_dev, xhci_free_virt_device,
|
||||
TP_PROTO(struct xhci_virt_device *vdev),
|
||||
TP_ARGS(vdev)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(xhci_log_virt_dev, xhci_setup_device,
|
||||
TP_PROTO(struct xhci_virt_device *vdev),
|
||||
TP_ARGS(vdev)
|
||||
|
@@ -908,6 +908,41 @@ static void xhci_disable_port_wake_on_bits(struct xhci_hcd *xhci)
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
}
|
||||
|
||||
static bool xhci_pending_portevent(struct xhci_hcd *xhci)
|
||||
{
|
||||
struct xhci_port **ports;
|
||||
int port_index;
|
||||
u32 status;
|
||||
u32 portsc;
|
||||
|
||||
status = readl(&xhci->op_regs->status);
|
||||
if (status & STS_EINT)
|
||||
return true;
|
||||
/*
|
||||
* Checking STS_EINT is not enough as there is a lag between a change
|
||||
* bit being set and the Port Status Change Event that it generated
|
||||
* being written to the Event Ring. See note in xhci 1.1 section 4.19.2.
|
||||
*/
|
||||
|
||||
port_index = xhci->usb2_rhub.num_ports;
|
||||
ports = xhci->usb2_rhub.ports;
|
||||
while (port_index--) {
|
||||
portsc = readl(ports[port_index]->addr);
|
||||
if (portsc & PORT_CHANGE_MASK ||
|
||||
(portsc & PORT_PLS_MASK) == XDEV_RESUME)
|
||||
return true;
|
||||
}
|
||||
port_index = xhci->usb3_rhub.num_ports;
|
||||
ports = xhci->usb3_rhub.ports;
|
||||
while (port_index--) {
|
||||
portsc = readl(ports[port_index]->addr);
|
||||
if (portsc & PORT_CHANGE_MASK ||
|
||||
(portsc & PORT_PLS_MASK) == XDEV_RESUME)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Stop HC (not bus-specific)
|
||||
*
|
||||
@@ -1009,7 +1044,7 @@ EXPORT_SYMBOL_GPL(xhci_suspend);
|
||||
*/
|
||||
int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
||||
{
|
||||
u32 command, temp = 0, status;
|
||||
u32 command, temp = 0;
|
||||
struct usb_hcd *hcd = xhci_to_hcd(xhci);
|
||||
struct usb_hcd *secondary_hcd;
|
||||
int retval = 0;
|
||||
@@ -1043,8 +1078,13 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
||||
command = readl(&xhci->op_regs->command);
|
||||
command |= CMD_CRS;
|
||||
writel(command, &xhci->op_regs->command);
|
||||
/*
|
||||
* Some controllers take up to 55+ ms to complete the controller
|
||||
* restore so setting the timeout to 100ms. Xhci specification
|
||||
* doesn't mention any timeout value.
|
||||
*/
|
||||
if (xhci_handshake(&xhci->op_regs->status,
|
||||
STS_RESTORE, 0, 10 * 1000)) {
|
||||
STS_RESTORE, 0, 100 * 1000)) {
|
||||
xhci_warn(xhci, "WARN: xHC restore state timeout\n");
|
||||
spin_unlock_irq(&xhci->lock);
|
||||
return -ETIMEDOUT;
|
||||
@@ -1134,8 +1174,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
||||
done:
|
||||
if (retval == 0) {
|
||||
/* Resume root hubs only when have pending events. */
|
||||
status = readl(&xhci->op_regs->status);
|
||||
if (status & STS_EINT) {
|
||||
if (xhci_pending_portevent(xhci)) {
|
||||
usb_hcd_resume_root_hub(xhci->shared_hcd);
|
||||
usb_hcd_resume_root_hub(hcd);
|
||||
}
|
||||
|
@@ -382,6 +382,10 @@ struct xhci_op_regs {
|
||||
#define PORT_PLC (1 << 22)
|
||||
/* port configure error change - port failed to configure its link partner */
|
||||
#define PORT_CEC (1 << 23)
|
||||
#define PORT_CHANGE_MASK (PORT_CSC | PORT_PEC | PORT_WRC | PORT_OCC | \
|
||||
PORT_RC | PORT_PLC | PORT_CEC)
|
||||
|
||||
|
||||
/* Cold Attach Status - xHC can set this bit to report device attached during
|
||||
* Sx state. Warm port reset should be perfomed to clear this bit and move port
|
||||
* to connected state.
|
||||
|
Reference in New Issue
Block a user