Hi Paul, On Fri, Jan 14, 2011 at 05:20:03PM -0800, Paul Zimmerman wrote: > xhci: Clarify some expressions in the TRB math. This makes it easier to spot ^^^^ Did you mean to have "xhci" here? > some problems which will be fixed by the next patch in the series. Also change > dev_dbg to dev_err in check_trb_math(), so any math errors will be visible even > when running with debug disabled. Can you please add a note that (TRB_MAX_BUFF_SIZE - 1)) is equivalent to ((1 << TRB_MAX_BUFF_SHIFT) - 1)) since xhci.h includes these three lines: /* TRB buffer pointers can't cross 64KB boundaries */ #define TRB_MAX_BUFF_SHIFT 16 #define TRB_MAX_BUFF_SIZE (1 << TRB_MAX_BUFF_SHIFT) I think that will make it clear to the casual observer that this patch doesn't change any behavior. Sarah Sharp > Cc: Greg Kroah-Hartman <gregkh@xxxxxxx> > > Signed-off-by: Paul Zimmerman <paulz@xxxxxxxxxxxx> > --- > drivers/usb/host/xhci-ring.c | 22 ++++++++++------------ > 1 files changed, 10 insertions(+), 12 deletions(-) > > diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c > index b4be841..fe6dd81 100644 > --- a/drivers/usb/host/xhci-ring.c > +++ b/drivers/usb/host/xhci-ring.c > @@ -2374,7 +2374,7 @@ static unsigned int count_sg_trbs_needed(struct xhci_hcd *xhci, struct urb *urb) > > /* Scatter gather list entries may cross 64KB boundaries */ > running_total = TRB_MAX_BUFF_SIZE - > - (sg_dma_address(sg) & ((1 << TRB_MAX_BUFF_SHIFT) - 1)); > + (sg_dma_address(sg) & (TRB_MAX_BUFF_SIZE - 1)); > if (running_total != 0) > num_trbs++; > > @@ -2404,11 +2404,11 @@ static unsigned int count_sg_trbs_needed(struct xhci_hcd *xhci, struct urb *urb) > static void check_trb_math(struct urb *urb, int num_trbs, int running_total) > { > if (num_trbs != 0) > - dev_dbg(&urb->dev->dev, "%s - ep %#x - Miscalculated number of " > + dev_err(&urb->dev->dev, "%s - ep %#x - Miscalculated number of " > "TRBs, %d left\n", __func__, > urb->ep->desc.bEndpointAddress, num_trbs); > if (running_total != urb->transfer_buffer_length) > - dev_dbg(&urb->dev->dev, "%s - ep %#x - Miscalculated tx length, " > + dev_err(&urb->dev->dev, "%s - ep %#x - Miscalculated tx length, " > "queued %#x (%d), asked for %#x (%d)\n", > __func__, > urb->ep->desc.bEndpointAddress, > @@ -2540,8 +2540,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, > sg = urb->sg; > addr = (u64) sg_dma_address(sg); > this_sg_len = sg_dma_len(sg); > - trb_buff_len = TRB_MAX_BUFF_SIZE - > - (addr & ((1 << TRB_MAX_BUFF_SHIFT) - 1)); > + trb_buff_len = TRB_MAX_BUFF_SIZE - (addr & (TRB_MAX_BUFF_SIZE - 1)); > trb_buff_len = min_t(int, trb_buff_len, this_sg_len); > if (trb_buff_len > urb->transfer_buffer_length) > trb_buff_len = urb->transfer_buffer_length; > @@ -2577,7 +2576,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, > (unsigned int) (addr + TRB_MAX_BUFF_SIZE) & ~(TRB_MAX_BUFF_SIZE - 1), > (unsigned int) addr + trb_buff_len); > if (TRB_MAX_BUFF_SIZE - > - (addr & ((1 << TRB_MAX_BUFF_SHIFT) - 1)) < trb_buff_len) { > + (addr & (TRB_MAX_BUFF_SIZE - 1)) < trb_buff_len) { > xhci_warn(xhci, "WARN: sg dma xfer crosses 64KB boundaries!\n"); > xhci_dbg(xhci, "Next boundary at %#x, end dma = %#x\n", > (unsigned int) (addr + TRB_MAX_BUFF_SIZE) & ~(TRB_MAX_BUFF_SIZE - 1), > @@ -2621,7 +2620,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, > } > > trb_buff_len = TRB_MAX_BUFF_SIZE - > - (addr & ((1 << TRB_MAX_BUFF_SHIFT) - 1)); > + (addr & (TRB_MAX_BUFF_SIZE - 1)); > trb_buff_len = min_t(int, trb_buff_len, this_sg_len); > if (running_total + trb_buff_len > urb->transfer_buffer_length) > trb_buff_len = > @@ -2661,7 +2660,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, > num_trbs = 0; > /* How much data is (potentially) left before the 64KB boundary? */ > running_total = TRB_MAX_BUFF_SIZE - > - (urb->transfer_dma & ((1 << TRB_MAX_BUFF_SHIFT) - 1)); > + (urb->transfer_dma & (TRB_MAX_BUFF_SIZE - 1)); > > /* If there's some data on this 64KB chunk, or we have to send a > * zero-length transfer, we need at least one TRB > @@ -2704,8 +2703,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, > /* How much data is in the first TRB? */ > addr = (u64) urb->transfer_dma; > trb_buff_len = TRB_MAX_BUFF_SIZE - > - (urb->transfer_dma & ((1 << TRB_MAX_BUFF_SHIFT) - 1)); > - if (urb->transfer_buffer_length < trb_buff_len) > + (urb->transfer_dma & (TRB_MAX_BUFF_SIZE - 1)); > + if (trb_buff_len > urb->transfer_buffer_length) > trb_buff_len = urb->transfer_buffer_length; > > first_trb = true; > @@ -2877,8 +2876,7 @@ static int count_isoc_trbs_needed(struct xhci_hcd *xhci, > addr = (u64) (urb->transfer_dma + urb->iso_frame_desc[i].offset); > td_len = urb->iso_frame_desc[i].length; > > - running_total = TRB_MAX_BUFF_SIZE - > - (addr & ((1 << TRB_MAX_BUFF_SHIFT) - 1)); > + running_total = TRB_MAX_BUFF_SIZE - (addr & (TRB_MAX_BUFF_SIZE - 1)); > if (running_total != 0) > num_trbs++; > > -- > 1.6.5.1.69.g36942 > > > -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html