linux-usb.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Eli Billauer <eli.billauer@gmail.com>
To: Mathias Nyman <mathias.nyman@linux.intel.com>
Cc: mathias.nyman@intel.com, linux-usb@vger.kernel.org
Subject: Re: [PATCH] xhci: No XHCI_TRUST_TX_LENGTH check in the absence of matching TD
Date: Tue, 19 Nov 2019 13:48:25 +0200	[thread overview]
Message-ID: <5DD3D689.8000609@gmail.com> (raw)
In-Reply-To: <6ad6dceb-a938-a2b7-c535-32bd3404e53d@linux.intel.com>

Hello,

I've taken the liberty to add parentheses for sake of clarity, so I 
tested the following patch (against kernel 5.3.0) with my Resesas USB 
controller. And as expected, it does the job: The warnings are not printed.

diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index 9741cdeea9d7..b062e3a19e95 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -2378,7 +2378,8 @@ static int handle_tx_event(struct xhci_hcd *xhci,
      case COMP_SUCCESS:
          if (EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)) == 0)
              break;
-        if (xhci->quirks & XHCI_TRUST_TX_LENGTH)
+        if ((xhci->quirks & XHCI_TRUST_TX_LENGTH) ||
+            ep_ring->last_td_was_short)
              trb_comp_code = COMP_SHORT_PACKET;
          else
              xhci_warn_ratelimited(xhci,

So it solves the problem for me, and hopefully for future Renesas 
controllers with the same issue.

Regards,
    Eli

On 18/11/19 18:08, Mathias Nyman wrote:
> On 13.11.2019 15.06, eli.billauer@gmail.com wrote:
>> From: Eli Billauer <eli.billauer@gmail.com>
>>
>> When an IN transfer ends with a short packet, the xHCI controller is
>> required to submit an event TRB with Completion Code COMP_SHORT_PACKET
>> against the data TRB that was in effect when the short packet 
>> arrived, as
>> well as any event TRBs it submits on behalf of this transfer.
>>
>> Alas, some controllers (e.g. Renesas) mark the subsequent events TRBs 
>> (if
>> any) with COMP_SUCCESS. As these subsequent event TRBs are useless, they
>> are ignored on the basis that they have no matching TD queued (it was
>> dequeued in response to the first COMP_SHORT_PACKET event TRB).
>>
>> Accordingly, the quirk handling and kernel log warning is moved to after
>> the TD match check, in particular in order to avoid unnecessary warnings
>> messages.
>>
>> Signed-off-by: Eli Billauer <eli.billauer@gmail.com>
>> ---
>>   drivers/usb/host/xhci-ring.c | 19 +++++++++++--------
>>   1 file changed, 11 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
>> index 9741cdeea9d7..96680eb71a45 100644
>> --- a/drivers/usb/host/xhci-ring.c
>> +++ b/drivers/usb/host/xhci-ring.c
>> @@ -2376,14 +2376,6 @@ static int handle_tx_event(struct xhci_hcd *xhci,
>>        * transfer type
>>        */
>>       case COMP_SUCCESS:
>> -        if (EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)) == 0)
>> -            break;
>> -        if (xhci->quirks & XHCI_TRUST_TX_LENGTH)
>> -            trb_comp_code = COMP_SHORT_PACKET;
>> -        else
>> -            xhci_warn_ratelimited(xhci,
>> -                          "WARN Successful completion on short TX 
>> for slot %u ep %u: needs XHCI_TRUST_TX_LENGTH quirk?\n",
>> -                          slot_id, ep_index);
>>       case COMP_SHORT_PACKET:
>>           break;
>>       /* Completion codes for endpoint stopped state */
>> @@ -2586,6 +2578,17 @@ static int handle_tx_event(struct xhci_hcd *xhci,
>>               skip_isoc_td(xhci, td, event, ep, &status);
>>               goto cleanup;
>>           }
>> +
>> +        if ((trb_comp_code == COMP_SUCCESS) &&
>> +            (EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)) != 0)) {
>> +            if (xhci->quirks & XHCI_TRUST_TX_LENGTH)
>> +                trb_comp_code = COMP_SHORT_PACKET;
>> +            else
>> +                xhci_warn_ratelimited(xhci,
>> +                              "WARN Successful completion on short 
>> TX for slot %u ep %u: needs XHCI_TRUST_TX_LENGTH quirk?\n",
>> +                              slot_id, ep_index);
>> +        }
>> +
>>           if (trb_comp_code == COMP_SHORT_PACKET)
>>               ep_ring->last_td_was_short = true;
>>           else
>>
>
> I'd hate to rip out the success case from the switch statement where 
> the other
> completion codes are handled. We're still only making a choice about a 
> warning
> message
>
> How about handling all COMP_SUCCESS cases with remaining data after a 
> short
> transfer as COMP_SHORT_PACKET by default?
>
> The code below won't behave exactly the same as in your patch, but should
> do the trick in your Renesas case as well. Can you try it out?
>
> diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
> index 9ebaa8e132a9..d23f7408c81f 100644
> --- a/drivers/usb/host/xhci-ring.c
> +++ b/drivers/usb/host/xhci-ring.c
> @@ -2381,7 +2381,8 @@ static int handle_tx_event(struct xhci_hcd *xhci,
>         case COMP_SUCCESS:
>                 if (EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)) == 0)
>                         break;
> -               if (xhci->quirks & XHCI_TRUST_TX_LENGTH)
> +               if (xhci->quirks & XHCI_TRUST_TX_LENGTH ||
> +                   ep_ring->last_td_was_short)
>                         trb_comp_code = COMP_SHORT_PACKET;
>                 else
>                         xhci_warn_ratelimited(xhci,
>
>


      reply	other threads:[~2019-11-19 11:48 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-13 13:06 [PATCH] xhci: No XHCI_TRUST_TX_LENGTH check in the absence of matching TD eli.billauer
2019-11-18 16:08 ` Mathias Nyman
2019-11-19 11:48   ` Eli Billauer [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5DD3D689.8000609@gmail.com \
    --to=eli.billauer@gmail.com \
    --cc=linux-usb@vger.kernel.org \
    --cc=mathias.nyman@intel.com \
    --cc=mathias.nyman@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).