xhci: Change xhci_find_slot_id_by_port() API.
xhci_find_slot_id_by_port() tries to map the port index to the slot ID for the USB device. In the future, there will be two xHCI roothubs, and their port indices will overlap. Therefore, xhci_find_slot_id_by_port() will need to use information in the roothub's usb_hcd structure to map the port index and roothub speed to the right slot ID. Add a new parameter to xhci_find_slot_id_by_port(), in order to pass in the roothub's usb_hcd structure. Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
This commit is contained in:
Родитель
20b67cf51f
Коммит
5233630fcd
|
@ -135,7 +135,8 @@ u32 xhci_port_state_to_neutral(u32 state)
|
||||||
/*
|
/*
|
||||||
* find slot id based on port number.
|
* find slot id based on port number.
|
||||||
*/
|
*/
|
||||||
int xhci_find_slot_id_by_port(struct xhci_hcd *xhci, u16 port)
|
int xhci_find_slot_id_by_port(struct usb_hcd *hcd, struct xhci_hcd *xhci,
|
||||||
|
u16 port)
|
||||||
{
|
{
|
||||||
int slot_id;
|
int slot_id;
|
||||||
int i;
|
int i;
|
||||||
|
@ -349,7 +350,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
||||||
|
|
||||||
xhci_dbg(xhci, "set port %d resume\n",
|
xhci_dbg(xhci, "set port %d resume\n",
|
||||||
wIndex + 1);
|
wIndex + 1);
|
||||||
slot_id = xhci_find_slot_id_by_port(xhci,
|
slot_id = xhci_find_slot_id_by_port(hcd, xhci,
|
||||||
wIndex + 1);
|
wIndex + 1);
|
||||||
if (!slot_id) {
|
if (!slot_id) {
|
||||||
xhci_dbg(xhci, "slot_id is zero\n");
|
xhci_dbg(xhci, "slot_id is zero\n");
|
||||||
|
@ -404,7 +405,8 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
slot_id = xhci_find_slot_id_by_port(xhci, wIndex + 1);
|
slot_id = xhci_find_slot_id_by_port(hcd, xhci,
|
||||||
|
wIndex + 1);
|
||||||
if (!slot_id) {
|
if (!slot_id) {
|
||||||
xhci_warn(xhci, "slot_id is zero\n");
|
xhci_warn(xhci, "slot_id is zero\n");
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -498,7 +500,8 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
||||||
bus_state->port_c_suspend |= 1 << wIndex;
|
bus_state->port_c_suspend |= 1 << wIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
slot_id = xhci_find_slot_id_by_port(xhci, wIndex + 1);
|
slot_id = xhci_find_slot_id_by_port(hcd, xhci,
|
||||||
|
wIndex + 1);
|
||||||
if (!slot_id) {
|
if (!slot_id) {
|
||||||
xhci_dbg(xhci, "slot_id is zero\n");
|
xhci_dbg(xhci, "slot_id is zero\n");
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -632,7 +635,7 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
|
||||||
|
|
||||||
if ((t1 & PORT_PE) && !(t1 & PORT_PLS_MASK)) {
|
if ((t1 & PORT_PE) && !(t1 & PORT_PLS_MASK)) {
|
||||||
xhci_dbg(xhci, "port %d not suspended\n", port_index);
|
xhci_dbg(xhci, "port %d not suspended\n", port_index);
|
||||||
slot_id = xhci_find_slot_id_by_port(xhci,
|
slot_id = xhci_find_slot_id_by_port(hcd, xhci,
|
||||||
port_index + 1);
|
port_index + 1);
|
||||||
if (slot_id) {
|
if (slot_id) {
|
||||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||||
|
@ -748,7 +751,8 @@ int xhci_bus_resume(struct usb_hcd *hcd)
|
||||||
temp |= PORT_LINK_STROBE | XDEV_U0;
|
temp |= PORT_LINK_STROBE | XDEV_U0;
|
||||||
xhci_writel(xhci, temp, port_array[port_index]);
|
xhci_writel(xhci, temp, port_array[port_index]);
|
||||||
}
|
}
|
||||||
slot_id = xhci_find_slot_id_by_port(xhci, port_index + 1);
|
slot_id = xhci_find_slot_id_by_port(hcd,
|
||||||
|
xhci, port_index + 1);
|
||||||
if (slot_id)
|
if (slot_id)
|
||||||
xhci_ring_device(xhci, slot_id);
|
xhci_ring_device(xhci, slot_id);
|
||||||
} else
|
} else
|
||||||
|
|
|
@ -1213,7 +1213,8 @@ static void handle_port_status(struct xhci_hcd *xhci,
|
||||||
temp &= ~PORT_PLS_MASK;
|
temp &= ~PORT_PLS_MASK;
|
||||||
temp |= PORT_LINK_STROBE | XDEV_U0;
|
temp |= PORT_LINK_STROBE | XDEV_U0;
|
||||||
xhci_writel(xhci, temp, port_array[faked_port_index]);
|
xhci_writel(xhci, temp, port_array[faked_port_index]);
|
||||||
slot_id = xhci_find_slot_id_by_port(xhci, port_id);
|
slot_id = xhci_find_slot_id_by_port(hcd, xhci,
|
||||||
|
faked_port_index);
|
||||||
if (!slot_id) {
|
if (!slot_id) {
|
||||||
xhci_dbg(xhci, "slot_id is zero\n");
|
xhci_dbg(xhci, "slot_id is zero\n");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
|
@ -1533,7 +1533,8 @@ int xhci_bus_resume(struct usb_hcd *hcd);
|
||||||
#endif /* CONFIG_PM */
|
#endif /* CONFIG_PM */
|
||||||
|
|
||||||
u32 xhci_port_state_to_neutral(u32 state);
|
u32 xhci_port_state_to_neutral(u32 state);
|
||||||
int xhci_find_slot_id_by_port(struct xhci_hcd *xhci, u16 port);
|
int xhci_find_slot_id_by_port(struct usb_hcd *hcd, struct xhci_hcd *xhci,
|
||||||
|
u16 port);
|
||||||
void xhci_ring_device(struct xhci_hcd *xhci, int slot_id);
|
void xhci_ring_device(struct xhci_hcd *xhci, int slot_id);
|
||||||
|
|
||||||
/* xHCI contexts */
|
/* xHCI contexts */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче