forked from luck/tmp_suning_uos_patched
xhci: Clarify some expressions in the TRB math
This makes it easier to spot 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. Note: This patch changes the expressions containing "((1 << TRB_MAX_BUFF_SHIFT) - 1)" to use the equivalent "(TRB_MAX_BUFF_SIZE - 1)". No change in behavior is intended for those expressions. This patch should be queued for stable kernels back to 2.6.31. Signed-off-by: Paul Zimmerman <paulz@synopsys.com> Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> Cc: stable@kernel.org
This commit is contained in:
parent
68e41c5d03
commit
a249018701
|
@ -2368,7 +2368,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++;
|
||||
|
||||
|
@ -2399,11 +2399,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,
|
||||
|
@ -2538,8 +2538,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
|
||||
|
@ -2705,8 +2704,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;
|
||||
|
@ -2884,8 +2883,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++;
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user