libpayload: usb: xhci: set ENT flag in last Normal TRB
If a TD is comprised of one or more Normal TRBs and terminated with an
Event Data TRB, then the transition to the Idle state (and associated
Stream state save) could occur after all the data for the TD has been
moved (e.g. after Transfer Event TRBs have been executed), but before the
Event Data TRB is executed. Under these conditions, the execution of the
Event Data TRB is necessary to complete the TD, otherwise it does not
occur until the nexttime the Stream is scheduled. This could lead to the
lock up.
The Evaluate Next TRB(ENT) flag provides a means of forcing the execution
of a terminating Event Data TRB. Setting ENT flag in last Normal TRB makes
the xHC to evaluate the Even Data TRB.
BUG=chrome-os-partner:29375
TEST=Verified kernel boot-up on storm from previously failing USB stick.
USB stick model: Sandisk Ultra USB 3.0 Pen Drive 32 GB
Strontium Jet USB 3.0 Pen Drive(32 GB)
Change-Id: I4e123577ec5a5996d87d2fc52cb6cf5c571c9fae
Signed-off-by: Sourabh Banerjee <sbanerje@codeaurora.org>
Reviewed-on: https://chromium-review.googlesource.com/220123
Reviewed-by: Julius Werner <jwerner@chromium.org>
Commit-Queue: Vadim Bendebury <vbendeb@chromium.org>
Tested-by: Vadim Bendebury <vbendeb@chromium.org>
This commit is contained in:
parent
66518fd86e
commit
7eefb3b285
2 changed files with 11 additions and 0 deletions
|
|
@ -525,6 +525,14 @@ xhci_enqueue_td(transfer_ring_t *const tr, const int ep, const size_t mps,
|
|||
} else {
|
||||
TRB_SET(TT, trb, TRB_NORMAL);
|
||||
}
|
||||
/*
|
||||
* This is a workaround for Synopsys DWC3. If the ENT flag is
|
||||
* not set for the Normal and Data Stage TRBs. We get Event TRB
|
||||
* with length 0x20d from the controller when We enqueue a TRB
|
||||
* for the IN endpoint with length 0x200.
|
||||
*/
|
||||
if (!length)
|
||||
TRB_SET(ENT, trb, 1);
|
||||
|
||||
xhci_enqueue_trb(tr);
|
||||
|
||||
|
|
|
|||
|
|
@ -94,6 +94,9 @@ enum { TRB_DIR_OUT = 0, TRB_DIR_IN = 1 };
|
|||
#define TRB_TC_FIELD control /* TC - Toggle Cycle */
|
||||
#define TRB_TC_START 1
|
||||
#define TRB_TC_LEN 1
|
||||
#define TRB_ENT_FIELD control /* ENT - Evaluate Next TRB */
|
||||
#define TRB_ENT_START 1
|
||||
#define TRB_ENT_LEN 1
|
||||
#define TRB_ISP_FIELD control /* ISP - Interrupt-on Short Packet */
|
||||
#define TRB_ISP_START 2
|
||||
#define TRB_ISP_LEN 1
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue