diff options
Diffstat (limited to 'patches/1447-xhci-change-xhci_set_link_state-to-work-with-port-st.patch')
-rw-r--r-- | patches/1447-xhci-change-xhci_set_link_state-to-work-with-port-st.patch | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/patches/1447-xhci-change-xhci_set_link_state-to-work-with-port-st.patch b/patches/1447-xhci-change-xhci_set_link_state-to-work-with-port-st.patch new file mode 100644 index 00000000000000..e34b7eb6e17a1c --- /dev/null +++ b/patches/1447-xhci-change-xhci_set_link_state-to-work-with-port-st.patch @@ -0,0 +1,163 @@ +From 0251503d5d7b9e01f59702d87ec5d1f3744aaa16 Mon Sep 17 00:00:00 2001 +From: Mathias Nyman <mathias.nyman@linux.intel.com> +Date: Mon, 21 May 2018 16:39:59 +0300 +Subject: [PATCH 1447/1795] xhci: change xhci_set_link_state() to work with + port structures + +Remove old iomem port array and index as parameters, just +send a ponter to a port strucure instread + +Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +(cherry picked from commit 6b7f40f712344ec8fdca10450834825094e797fb) +Signed-off-by: Simon Horman <horms+renesas@verge.net.au> +Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> +--- + drivers/usb/host/xhci-hub.c | 34 ++++++++++++++++------------------ + drivers/usb/host/xhci-ring.c | 3 +-- + drivers/usb/host/xhci.h | 4 ++-- + 3 files changed, 19 insertions(+), 22 deletions(-) + +diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c +index 372b4486c52a..e3be8d15c078 100644 +--- a/drivers/usb/host/xhci-hub.c ++++ b/drivers/usb/host/xhci-hub.c +@@ -678,16 +678,16 @@ static int xhci_exit_test_mode(struct xhci_hcd *xhci) + return xhci_reset(xhci); + } + +-void xhci_set_link_state(struct xhci_hcd *xhci, __le32 __iomem **port_array, +- int port_id, u32 link_state) ++void xhci_set_link_state(struct xhci_hcd *xhci, struct xhci_port *port, ++ u32 link_state) + { + u32 temp; + +- temp = readl(port_array[port_id]); ++ temp = readl(port->addr); + temp = xhci_port_state_to_neutral(temp); + temp &= ~PORT_PLS_MASK; + temp |= PORT_LINK_STROBE | link_state; +- writel(temp, port_array[port_id]); ++ writel(temp, port->addr); + } + + static void xhci_set_remote_wake_mask(struct xhci_hcd *xhci, +@@ -932,8 +932,7 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, + + xhci_test_and_clear_bit(xhci, port_array, wIndex, + PORT_PLC); +- xhci_set_link_state(xhci, port_array, wIndex, +- XDEV_U0); ++ xhci_set_link_state(xhci, port, XDEV_U0); + + spin_unlock_irqrestore(&xhci->lock, flags); + time_left = wait_for_completion_timeout( +@@ -1142,7 +1141,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + temp = readl(ports[wIndex]->addr); + if ((temp & PORT_PLS_MASK) != XDEV_U0) { + /* Resume the port to U0 first */ +- xhci_set_link_state(xhci, port_array, wIndex, ++ xhci_set_link_state(xhci, ports[wIndex], + XDEV_U0); + spin_unlock_irqrestore(&xhci->lock, flags); + msleep(10); +@@ -1170,7 +1169,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + xhci_stop_device(xhci, slot_id, 1); + spin_lock_irqsave(&xhci->lock, flags); + +- xhci_set_link_state(xhci, port_array, wIndex, XDEV_U3); ++ xhci_set_link_state(xhci, ports[wIndex], XDEV_U3); + + spin_unlock_irqrestore(&xhci->lock, flags); + msleep(10); /* wait device to enter */ +@@ -1200,8 +1199,8 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + /* Put link in RxDetect (enable port) */ + if (link_state == USB_SS_PORT_LS_RX_DETECT) { + xhci_dbg(xhci, "Enable port %d\n", wIndex); +- xhci_set_link_state(xhci, port_array, wIndex, +- link_state); ++ xhci_set_link_state(xhci, ports[wIndex], ++ link_state); + temp = readl(ports[wIndex]->addr); + break; + } +@@ -1233,8 +1232,9 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + + xhci_dbg(xhci, "Enable compliance mode transition for port %d\n", + wIndex); +- xhci_set_link_state(xhci, port_array, wIndex, ++ xhci_set_link_state(xhci, ports[wIndex], + link_state); ++ + temp = readl(ports[wIndex]->addr); + break; + } +@@ -1262,8 +1262,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + } + } + +- xhci_set_link_state(xhci, port_array, wIndex, +- link_state); ++ xhci_set_link_state(xhci, ports[wIndex], link_state); + + spin_unlock_irqrestore(&xhci->lock, flags); + msleep(20); /* wait device to enter */ +@@ -1357,12 +1356,12 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, + goto error; + + set_bit(wIndex, &bus_state->resuming_ports); +- xhci_set_link_state(xhci, port_array, wIndex, +- XDEV_RESUME); ++ xhci_set_link_state(xhci, ports[wIndex], ++ XDEV_RESUME); + spin_unlock_irqrestore(&xhci->lock, flags); + msleep(USB_RESUME_TIMEOUT); + spin_lock_irqsave(&xhci->lock, flags); +- xhci_set_link_state(xhci, port_array, wIndex, ++ xhci_set_link_state(xhci, ports[wIndex], + XDEV_U0); + clear_bit(wIndex, &bus_state->resuming_ports); + } +@@ -1676,8 +1675,7 @@ int xhci_bus_resume(struct usb_hcd *hcd) + /* Clear PLC to poll it later for U0 transition */ + xhci_test_and_clear_bit(xhci, port_array, port_index, + PORT_PLC); +- xhci_set_link_state(xhci, port_array, port_index, +- XDEV_U0); ++ xhci_set_link_state(xhci, ports[port_index], XDEV_U0); + } + } + +diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c +index 31b72133d7a3..6e4211eea0e2 100644 +--- a/drivers/usb/host/xhci-ring.c ++++ b/drivers/usb/host/xhci-ring.c +@@ -1591,8 +1591,7 @@ static void handle_port_status(struct xhci_hcd *xhci, + bus_state->port_remote_wakeup |= 1 << hcd_portnum; + xhci_test_and_clear_bit(xhci, port_array, + hcd_portnum, PORT_PLC); +- xhci_set_link_state(xhci, port_array, hcd_portnum, +- XDEV_U0); ++ xhci_set_link_state(xhci, port, XDEV_U0); + /* Need to wait until the next link state change + * indicates the device is actually in U0. + */ +diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h +index d90b97ec20a2..11f8f747fe56 100644 +--- a/drivers/usb/host/xhci.h ++++ b/drivers/usb/host/xhci.h +@@ -2106,8 +2106,8 @@ void inc_deq(struct xhci_hcd *xhci, struct xhci_ring *ring); + unsigned int count_trbs(u64 addr, u64 len); + + /* xHCI roothub code */ +-void xhci_set_link_state(struct xhci_hcd *xhci, __le32 __iomem **port_array, +- int port_id, u32 link_state); ++void xhci_set_link_state(struct xhci_hcd *xhci, struct xhci_port *port, ++ u32 link_state); + void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array, + int port_id, u32 port_bit); + int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex, +-- +2.19.0 + |