diff options
Diffstat (limited to 'drivers/usb/host/xhci-ring.c')
-rw-r--r-- | drivers/usb/host/xhci-ring.c | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 73f8db0ecc4b..766f6a615b2a 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
@@ -2741,6 +2741,11 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
2741 | td->last_trb = ep_ring->enqueue; | 2741 | td->last_trb = ep_ring->enqueue; |
2742 | field |= TRB_IOC; | 2742 | field |= TRB_IOC; |
2743 | } | 2743 | } |
2744 | |||
2745 | /* Only set interrupt on short packet for IN endpoints */ | ||
2746 | if (usb_urb_dir_in(urb)) | ||
2747 | field |= TRB_ISP; | ||
2748 | |||
2744 | xhci_dbg(xhci, " sg entry: dma = %#x, len = %#x (%d), " | 2749 | xhci_dbg(xhci, " sg entry: dma = %#x, len = %#x (%d), " |
2745 | "64KB boundary at %#x, end dma = %#x\n", | 2750 | "64KB boundary at %#x, end dma = %#x\n", |
2746 | (unsigned int) addr, trb_buff_len, trb_buff_len, | 2751 | (unsigned int) addr, trb_buff_len, trb_buff_len, |
@@ -2766,12 +2771,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
2766 | lower_32_bits(addr), | 2771 | lower_32_bits(addr), |
2767 | upper_32_bits(addr), | 2772 | upper_32_bits(addr), |
2768 | length_field, | 2773 | length_field, |
2769 | /* We always want to know if the TRB was short, | 2774 | field | TRB_TYPE(TRB_NORMAL)); |
2770 | * or we won't get an event when it completes. | ||
2771 | * (Unless we use event data TRBs, which are a | ||
2772 | * waste of space and HC resources.) | ||
2773 | */ | ||
2774 | field | TRB_ISP | TRB_TYPE(TRB_NORMAL)); | ||
2775 | --num_trbs; | 2775 | --num_trbs; |
2776 | running_total += trb_buff_len; | 2776 | running_total += trb_buff_len; |
2777 | 2777 | ||
@@ -2905,6 +2905,11 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
2905 | td->last_trb = ep_ring->enqueue; | 2905 | td->last_trb = ep_ring->enqueue; |
2906 | field |= TRB_IOC; | 2906 | field |= TRB_IOC; |
2907 | } | 2907 | } |
2908 | |||
2909 | /* Only set interrupt on short packet for IN endpoints */ | ||
2910 | if (usb_urb_dir_in(urb)) | ||
2911 | field |= TRB_ISP; | ||
2912 | |||
2908 | remainder = xhci_td_remainder(urb->transfer_buffer_length - | 2913 | remainder = xhci_td_remainder(urb->transfer_buffer_length - |
2909 | running_total); | 2914 | running_total); |
2910 | length_field = TRB_LEN(trb_buff_len) | | 2915 | length_field = TRB_LEN(trb_buff_len) | |
@@ -2918,12 +2923,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
2918 | lower_32_bits(addr), | 2923 | lower_32_bits(addr), |
2919 | upper_32_bits(addr), | 2924 | upper_32_bits(addr), |
2920 | length_field, | 2925 | length_field, |
2921 | /* We always want to know if the TRB was short, | 2926 | field | TRB_TYPE(TRB_NORMAL)); |
2922 | * or we won't get an event when it completes. | ||
2923 | * (Unless we use event data TRBs, which are a | ||
2924 | * waste of space and HC resources.) | ||
2925 | */ | ||
2926 | field | TRB_ISP | TRB_TYPE(TRB_NORMAL)); | ||
2927 | --num_trbs; | 2927 | --num_trbs; |
2928 | running_total += trb_buff_len; | 2928 | running_total += trb_buff_len; |
2929 | 2929 | ||
@@ -3009,7 +3009,12 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3009 | field); | 3009 | field); |
3010 | 3010 | ||
3011 | /* If there's data, queue data TRBs */ | 3011 | /* If there's data, queue data TRBs */ |
3012 | field = 0; | 3012 | /* Only set interrupt on short packet for IN endpoints */ |
3013 | if (usb_urb_dir_in(urb)) | ||
3014 | field = TRB_ISP | TRB_TYPE(TRB_DATA); | ||
3015 | else | ||
3016 | field = TRB_TYPE(TRB_DATA); | ||
3017 | |||
3013 | length_field = TRB_LEN(urb->transfer_buffer_length) | | 3018 | length_field = TRB_LEN(urb->transfer_buffer_length) | |
3014 | xhci_td_remainder(urb->transfer_buffer_length) | | 3019 | xhci_td_remainder(urb->transfer_buffer_length) | |
3015 | TRB_INTR_TARGET(0); | 3020 | TRB_INTR_TARGET(0); |
@@ -3020,8 +3025,7 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3020 | lower_32_bits(urb->transfer_dma), | 3025 | lower_32_bits(urb->transfer_dma), |
3021 | upper_32_bits(urb->transfer_dma), | 3026 | upper_32_bits(urb->transfer_dma), |
3022 | length_field, | 3027 | length_field, |
3023 | /* Event on short tx */ | 3028 | field | ep_ring->cycle_state); |
3024 | field | TRB_ISP | TRB_TYPE(TRB_DATA) | ep_ring->cycle_state); | ||
3025 | } | 3029 | } |
3026 | 3030 | ||
3027 | /* Save the DMA address of the last TRB in the TD */ | 3031 | /* Save the DMA address of the last TRB in the TD */ |
@@ -3145,6 +3149,10 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3145 | field |= ep_ring->cycle_state; | 3149 | field |= ep_ring->cycle_state; |
3146 | } | 3150 | } |
3147 | 3151 | ||
3152 | /* Only set interrupt on short packet for IN EPs */ | ||
3153 | if (usb_urb_dir_in(urb)) | ||
3154 | field |= TRB_ISP; | ||
3155 | |||
3148 | /* Chain all the TRBs together; clear the chain bit in | 3156 | /* Chain all the TRBs together; clear the chain bit in |
3149 | * the last TRB to indicate it's the last TRB in the | 3157 | * the last TRB to indicate it's the last TRB in the |
3150 | * chain. | 3158 | * chain. |
@@ -3172,12 +3180,7 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3172 | lower_32_bits(addr), | 3180 | lower_32_bits(addr), |
3173 | upper_32_bits(addr), | 3181 | upper_32_bits(addr), |
3174 | length_field, | 3182 | length_field, |
3175 | /* We always want to know if the TRB was short, | 3183 | field); |
3176 | * or we won't get an event when it completes. | ||
3177 | * (Unless we use event data TRBs, which are a | ||
3178 | * waste of space and HC resources.) | ||
3179 | */ | ||
3180 | field | TRB_ISP); | ||
3181 | running_total += trb_buff_len; | 3184 | running_total += trb_buff_len; |
3182 | 3185 | ||
3183 | addr += trb_buff_len; | 3186 | addr += trb_buff_len; |