linux-usb.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Michał Pecio" <michal.pecio@gmail.com>
To: Niklas Neronin <niklas.neronin@linux.intel.com>
Cc: mathias.nyman@linux.intel.com, linux-usb@vger.kernel.org
Subject: Re: [PATCH v2] usb: xhci: improve TR Dequeue Pointer mask
Date: Thu, 28 Aug 2025 10:12:07 +0200	[thread overview]
Message-ID: <20250828101207.49aea3b5.michal.pecio@gmail.com> (raw)
In-Reply-To: <20250826130656.277633-1-niklas.neronin@linux.intel.com>

On Tue, 26 Aug 2025 15:06:56 +0200, Niklas Neronin wrote:
> Address the naming and usage of the TR Dequeue Pointer mask in the xhci
> driver. The Endpoint Context Field at offset 0x08 is defined as follows:
>  Bit 0		Dequeue Cycle State (DCS)
>  Bits 3:1	RsvdZ (Reserved and Zero)
>  Bits 63:4	TR Dequeue Pointer
> 
> When extracting the TR Dequeue Pointer for an Endpoint without Streams,
> in xhci_handle_cmd_set_deq(), the inverted Dequeue Cycle State mask
> (~EP_CTX_CYCLE_MASK) is used, inadvertently including the Reserved bits.
> Although bits 3:1 are typically zero, using the incorrect mask could cause
> issues.
> 
> The existing mask, named "SCTX_DEQ_MASK," is misleading because "SCTX"
> implies exclusivity to Stream Contexts, whereas the TR Dequeue Pointer is
> applicable to both Stream and non-Stream Contexts.
> 
> Rename the mask to "TR_DEQ_PTR_MASK", utilize GENMASK_ULL() macro and use
> the mask when handling the TR Dequeue Pointer field.
> 
> Function xhci_get_hw_deq() returns the Endpoint Context Field 0x08, either
> directly from the Endpoint context or a Stream.
> 
> Signed-off-by: Niklas Neronin <niklas.neronin@linux.intel.com>
> ---
> v2:
> * Rebased on top of 6.16.
> * Combined all 3 patches from v1 into one patch.
> 
>  drivers/usb/host/xhci-ring.c | 12 ++++++------
>  drivers/usb/host/xhci.h      |  3 ++-
>  2 files changed, 8 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
> index ecd757d482c5..d2ccf19292aa 100644
> --- a/drivers/usb/host/xhci-ring.c
> +++ b/drivers/usb/host/xhci-ring.c
> @@ -711,7 +711,7 @@ static int xhci_move_dequeue_past_td(struct xhci_hcd *xhci,
>  		return -ENODEV;
>  	}
>  
> -	hw_dequeue = xhci_get_hw_deq(xhci, dev, ep_index, stream_id);
> +	hw_dequeue = xhci_get_hw_deq(xhci, dev, ep_index, stream_id) & TR_DEQ_PTR_MASK;
>  	new_seg = ep_ring->deq_seg;
>  	new_deq = ep_ring->dequeue;
>  	new_cycle = le32_to_cpu(td->end_trb->generic.field[3]) & TRB_CYCLE;
> @@ -723,7 +723,7 @@ static int xhci_move_dequeue_past_td(struct xhci_hcd *xhci,
>  	 */
>  	do {
>  		if (!hw_dequeue_found && xhci_trb_virt_to_dma(new_seg, new_deq)
> -		    == (dma_addr_t)(hw_dequeue & ~0xf)) {
> +		    == (dma_addr_t)hw_dequeue) {
>  			hw_dequeue_found = true;
>  			if (td_last_trb_found)
>  				break;
> @@ -1066,7 +1066,7 @@ static int xhci_invalidate_cancelled_tds(struct xhci_virt_ep *ep)
>  		 */
>  		hw_deq = xhci_get_hw_deq(xhci, ep->vdev, ep->ep_index,
>  					 td->urb->stream_id);
> -		hw_deq &= ~0xf;
> +		hw_deq &= TR_DEQ_PTR_MASK;
>  
>  		if (td->cancel_status == TD_HALTED || trb_in_td(td, hw_deq)) {
>  			switch (td->cancel_status) {
> @@ -1156,7 +1156,7 @@ static struct xhci_td *find_halted_td(struct xhci_virt_ep *ep)
>  
>  	if (!list_empty(&ep->ring->td_list)) { /* Not streams compatible */
>  		hw_deq = xhci_get_hw_deq(ep->xhci, ep->vdev, ep->ep_index, 0);
> -		hw_deq &= ~0xf;
> +		hw_deq &= TR_DEQ_PTR_MASK;
>  		td = list_first_entry(&ep->ring->td_list, struct xhci_td, td_list);
>  		if (trb_in_td(td, hw_deq))
>  			return td;
> @@ -1481,7 +1481,7 @@ static void xhci_handle_cmd_set_deq(struct xhci_hcd *xhci, int slot_id,
>  		u64 deq;
>  		/* 4.6.10 deq ptr is written to the stream ctx for streams */
>  		if (ep->ep_state & EP_HAS_STREAMS) {
> -			deq = le64_to_cpu(stream_ctx->stream_ring) & SCTX_DEQ_MASK;
> +			deq = le64_to_cpu(stream_ctx->stream_ring) & TR_DEQ_PTR_MASK;
>  
>  			/*
>  			 * Cadence xHCI controllers store some endpoint state
> @@ -1497,7 +1497,7 @@ static void xhci_handle_cmd_set_deq(struct xhci_hcd *xhci, int slot_id,
>  				stream_ctx->reserved[1] = 0;
>  			}
>  		} else {
> -			deq = le64_to_cpu(ep_ctx->deq) & ~EP_CTX_CYCLE_MASK;
> +			deq = le64_to_cpu(ep_ctx->deq) & TR_DEQ_PTR_MASK;
>  		}
>  		xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb,
>  			"Successful Set TR Deq Ptr cmd, deq = @%08llx", deq);

Looks good and I see no more 0xf contstants remaining in this file.

> diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
> index a20f4e7cd43a..59ff84ba2d4a 100644
> --- a/drivers/usb/host/xhci.h
> +++ b/drivers/usb/host/xhci.h
> @@ -500,7 +500,8 @@ struct xhci_ep_ctx {
>  
>  /* deq bitmasks */
>  #define EP_CTX_CYCLE_MASK		(1 << 0)
> -#define SCTX_DEQ_MASK			(~0xfL)
> +/* bits 63:4 - TR Dequeue Pointer */
> +#define TR_DEQ_PTR_MASK			GENMASK_ULL(63, 4)

I don't care much about this rename, but I can't help but notice that
naming is not consistent with the related EP_CTX_CYCLE_MASK above and
that it too applies to both types of contexts.

If I wanted to fix this, I would just drop the 'EP_' and 'S' prefixes.

  reply	other threads:[~2025-08-28  8:12 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-26 13:06 [PATCH v2] usb: xhci: improve TR Dequeue Pointer mask Niklas Neronin
2025-08-28  8:12 ` Michał Pecio [this message]
2025-09-02 12:26   ` Neronin, Niklas

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=20250828101207.49aea3b5.michal.pecio@gmail.com \
    --to=michal.pecio@gmail.com \
    --cc=linux-usb@vger.kernel.org \
    --cc=mathias.nyman@linux.intel.com \
    --cc=niklas.neronin@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).