Skip to content

Commit 77b7721

Browse files
Liu Longwenlingz
authored andcommitted
DM USB: xHCI: Drop commands if the slot is disabled
From xHCI spec 4.5.3.2, the only command that software is allowed to issue for the slot in disabled state is the Enable Slot Command. Drop other commands in command handle function. Tracked-On: #4711 Signed-off-by: Liu Long <longliu@intel.com> Acked-by: Wang, Yu1 <yu1.wang@intel.com>
1 parent 16e33b3 commit 77b7721

File tree

1 file changed

+37
-8
lines changed

1 file changed

+37
-8
lines changed

devicemodel/hw/pci/xhci.c

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2572,44 +2572,73 @@ pci_xhci_complete_commands(struct pci_xhci_vdev *xdev)
25722572

25732573
case XHCI_TRB_TYPE_DISABLE_SLOT: /* 0x0A */
25742574
slot = XHCI_TRB_3_SLOT_GET(trb->dwTrb3);
2575-
cmderr = pci_xhci_cmd_disable_slot(xdev, slot);
2575+
/*
2576+
* From spec 4.5.3.2 The only command that software is
2577+
* allowed to issue for the slot in disabled state
2578+
* is Enable Slot Command.
2579+
* */
2580+
if (xdev->slot_allocated[slot])
2581+
cmderr = pci_xhci_cmd_disable_slot(xdev, slot);
2582+
else
2583+
cmderr = XHCI_TRB_ERROR_SLOT_NOT_ON;
25762584
break;
25772585

25782586
case XHCI_TRB_TYPE_ADDRESS_DEVICE: /* 0x0B */
25792587
slot = XHCI_TRB_3_SLOT_GET(trb->dwTrb3);
2580-
cmderr = pci_xhci_cmd_address_device(xdev, slot, trb);
2588+
if (xdev->slot_allocated[slot])
2589+
cmderr = pci_xhci_cmd_address_device(xdev, slot, trb);
2590+
else
2591+
cmderr = XHCI_TRB_ERROR_SLOT_NOT_ON;
25812592
break;
25822593

25832594
case XHCI_TRB_TYPE_CONFIGURE_EP: /* 0x0C */
25842595
slot = XHCI_TRB_3_SLOT_GET(trb->dwTrb3);
2585-
cmderr = pci_xhci_cmd_config_ep(xdev, slot, trb);
2596+
if (xdev->slot_allocated[slot])
2597+
cmderr = pci_xhci_cmd_config_ep(xdev, slot, trb);
2598+
else
2599+
cmderr = XHCI_TRB_ERROR_SLOT_NOT_ON;
25862600
break;
25872601

25882602
case XHCI_TRB_TYPE_EVALUATE_CTX: /* 0x0D */
25892603
slot = XHCI_TRB_3_SLOT_GET(trb->dwTrb3);
2590-
cmderr = pci_xhci_cmd_eval_ctx(xdev, slot, trb);
2604+
if (xdev->slot_allocated[slot])
2605+
cmderr = pci_xhci_cmd_eval_ctx(xdev, slot, trb);
2606+
else
2607+
cmderr = XHCI_TRB_ERROR_SLOT_NOT_ON;
25912608
break;
25922609

25932610
case XHCI_TRB_TYPE_RESET_EP: /* 0x0E */
25942611
UPRINTF(LDBG, "Reset Endpoint on slot %d\r\n", slot);
25952612
slot = XHCI_TRB_3_SLOT_GET(trb->dwTrb3);
2596-
cmderr = pci_xhci_cmd_reset_ep(xdev, slot, trb);
2613+
if (xdev->slot_allocated[slot])
2614+
cmderr = pci_xhci_cmd_reset_ep(xdev, slot, trb);
2615+
else
2616+
cmderr = XHCI_TRB_ERROR_SLOT_NOT_ON;
25972617
break;
25982618

25992619
case XHCI_TRB_TYPE_STOP_EP: /* 0x0F */
26002620
UPRINTF(LDBG, "Stop Endpoint on slot %d\r\n", slot);
26012621
slot = XHCI_TRB_3_SLOT_GET(trb->dwTrb3);
2602-
cmderr = pci_xhci_cmd_reset_ep(xdev, slot, trb);
2622+
if (xdev->slot_allocated[slot])
2623+
cmderr = pci_xhci_cmd_reset_ep(xdev, slot, trb);
2624+
else
2625+
cmderr = XHCI_TRB_ERROR_SLOT_NOT_ON;
26032626
break;
26042627

26052628
case XHCI_TRB_TYPE_SET_TR_DEQUEUE: /* 0x10 */
26062629
slot = XHCI_TRB_3_SLOT_GET(trb->dwTrb3);
2607-
cmderr = pci_xhci_cmd_set_tr(xdev, slot, trb);
2630+
if (xdev->slot_allocated[slot])
2631+
cmderr = pci_xhci_cmd_set_tr(xdev, slot, trb);
2632+
else
2633+
cmderr = XHCI_TRB_ERROR_SLOT_NOT_ON;
26082634
break;
26092635

26102636
case XHCI_TRB_TYPE_RESET_DEVICE: /* 0x11 */
26112637
slot = XHCI_TRB_3_SLOT_GET(trb->dwTrb3);
2612-
cmderr = pci_xhci_cmd_reset_device(xdev, slot);
2638+
if (xdev->slot_allocated[slot])
2639+
cmderr = pci_xhci_cmd_reset_device(xdev, slot);
2640+
else
2641+
cmderr = XHCI_TRB_ERROR_SLOT_NOT_ON;
26132642
break;
26142643

26152644
case XHCI_TRB_TYPE_FORCE_EVENT: /* 0x12 */

0 commit comments

Comments
 (0)