diff options
Diffstat (limited to 'drivers/usb/cdns3')
| -rw-r--r-- | drivers/usb/cdns3/cdnsp-ring.c | 19 | 
1 files changed, 11 insertions, 8 deletions
| diff --git a/drivers/usb/cdns3/cdnsp-ring.c b/drivers/usb/cdns3/cdnsp-ring.c index e45c3d6e1536..794e413800ae 100644 --- a/drivers/usb/cdns3/cdnsp-ring.c +++ b/drivers/usb/cdns3/cdnsp-ring.c @@ -1941,13 +1941,16 @@ int cdnsp_queue_bulk_tx(struct cdnsp_device *pdev, struct cdnsp_request *preq)  		}  		if (enqd_len + trb_buff_len >= full_len) { -			if (need_zero_pkt) -				zero_len_trb = !zero_len_trb; - -			field &= ~TRB_CHAIN; -			field |= TRB_IOC; -			more_trbs_coming = false; -			preq->td.last_trb = ring->enqueue; +			if (need_zero_pkt && !zero_len_trb) { +				zero_len_trb = true; +			} else { +				zero_len_trb = false; +				field &= ~TRB_CHAIN; +				field |= TRB_IOC; +				more_trbs_coming = false; +				need_zero_pkt = false; +				preq->td.last_trb = ring->enqueue; +			}  		}  		/* Only set interrupt on short packet for OUT endpoints. */ @@ -1962,7 +1965,7 @@ int cdnsp_queue_bulk_tx(struct cdnsp_device *pdev, struct cdnsp_request *preq)  		length_field = TRB_LEN(trb_buff_len) | TRB_TD_SIZE(remainder) |  			TRB_INTR_TARGET(0); -		cdnsp_queue_trb(pdev, ring, more_trbs_coming | zero_len_trb, +		cdnsp_queue_trb(pdev, ring, more_trbs_coming,  				lower_32_bits(send_addr),  				upper_32_bits(send_addr),  				length_field, | 
