Commit c2d3d49b authored by Lu Baolu's avatar Lu Baolu Committed by Greg Kroah-Hartman

usb: xhci: move slot_id from xhci_hcd to xhci_command structure

xhci->slot_id is used for providing a way to pass slot id from the
command completion handler to the function waiting for completion.
It's shared by enumerations of all USB devices connected to an
xhci host. Hence, it's a source for possible races. Since we've
introduced command structure and the command queue to xhci driver.
It's better to move slot_id from xhci_hcd structure to xhci_command
structure. Hence the race source is removed.
Signed-off-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 87e44f2a
...@@ -1092,12 +1092,12 @@ static void xhci_handle_cmd_reset_ep(struct xhci_hcd *xhci, int slot_id, ...@@ -1092,12 +1092,12 @@ static void xhci_handle_cmd_reset_ep(struct xhci_hcd *xhci, int slot_id,
} }
static void xhci_handle_cmd_enable_slot(struct xhci_hcd *xhci, int slot_id, static void xhci_handle_cmd_enable_slot(struct xhci_hcd *xhci, int slot_id,
u32 cmd_comp_code) struct xhci_command *command, u32 cmd_comp_code)
{ {
if (cmd_comp_code == COMP_SUCCESS) if (cmd_comp_code == COMP_SUCCESS)
xhci->slot_id = slot_id; command->slot_id = slot_id;
else else
xhci->slot_id = 0; command->slot_id = 0;
} }
static void xhci_handle_cmd_disable_slot(struct xhci_hcd *xhci, int slot_id) static void xhci_handle_cmd_disable_slot(struct xhci_hcd *xhci, int slot_id)
...@@ -1366,7 +1366,7 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, ...@@ -1366,7 +1366,7 @@ static void handle_cmd_completion(struct xhci_hcd *xhci,
cmd_type = TRB_FIELD_TO_TYPE(le32_to_cpu(cmd_trb->generic.field[3])); cmd_type = TRB_FIELD_TO_TYPE(le32_to_cpu(cmd_trb->generic.field[3]));
switch (cmd_type) { switch (cmd_type) {
case TRB_ENABLE_SLOT: case TRB_ENABLE_SLOT:
xhci_handle_cmd_enable_slot(xhci, slot_id, cmd_comp_code); xhci_handle_cmd_enable_slot(xhci, slot_id, cmd, cmd_comp_code);
break; break;
case TRB_DISABLE_SLOT: case TRB_DISABLE_SLOT:
xhci_handle_cmd_disable_slot(xhci, slot_id); xhci_handle_cmd_disable_slot(xhci, slot_id);
......
...@@ -3706,7 +3706,7 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev) ...@@ -3706,7 +3706,7 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)
spin_unlock_irqrestore(&xhci->lock, flags); spin_unlock_irqrestore(&xhci->lock, flags);
wait_for_completion(command->completion); wait_for_completion(command->completion);
slot_id = xhci->slot_id; slot_id = command->slot_id;
mutex_unlock(&xhci->mutex); mutex_unlock(&xhci->mutex);
if (!slot_id || command->status != COMP_SUCCESS) { if (!slot_id || command->status != COMP_SUCCESS) {
......
...@@ -791,6 +791,7 @@ struct xhci_command { ...@@ -791,6 +791,7 @@ struct xhci_command {
/* Input context for changing device state */ /* Input context for changing device state */
struct xhci_container_ctx *in_ctx; struct xhci_container_ctx *in_ctx;
u32 status; u32 status;
int slot_id;
/* If completion is null, no one is waiting on this command /* If completion is null, no one is waiting on this command
* and the structure can be freed after the command completes. * and the structure can be freed after the command completes.
*/ */
...@@ -1584,7 +1585,6 @@ struct xhci_hcd { ...@@ -1584,7 +1585,6 @@ struct xhci_hcd {
/* slot enabling and address device helpers */ /* slot enabling and address device helpers */
/* these are not thread safe so use mutex */ /* these are not thread safe so use mutex */
struct mutex mutex; struct mutex mutex;
int slot_id;
/* For USB 3.0 LPM enable/disable. */ /* For USB 3.0 LPM enable/disable. */
struct xhci_command *lpm_command; struct xhci_command *lpm_command;
/* Internal mirror of the HW's dcbaa */ /* Internal mirror of the HW's dcbaa */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment