diff options
Diffstat (limited to 'drivers/usb/host/xhci-ring.c')
| -rw-r--r-- | drivers/usb/host/xhci-ring.c | 18 | 
1 files changed, 11 insertions, 7 deletions
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index c239c688076c..c5cbc685c691 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -2477,12 +2477,16 @@ static int handle_tx_event(struct xhci_hcd *xhci,  		 */  		if (list_empty(&ep_ring->td_list)) {  			/* -			 * A stopped endpoint may generate an extra completion -			 * event if the device was suspended.  Don't print -			 * warnings. +			 * Don't print wanings if it's due to a stopped endpoint +			 * generating an extra completion event if the device +			 * was suspended. Or, a event for the last TRB of a +			 * short TD we already got a short event for. +			 * The short TD is already removed from the TD list.  			 */ +  			if (!(trb_comp_code == COMP_STOPPED || -				trb_comp_code == COMP_STOPPED_LENGTH_INVALID)) { +			      trb_comp_code == COMP_STOPPED_LENGTH_INVALID || +			      ep_ring->last_td_was_short)) {  				xhci_warn(xhci, "WARN Event TRB for slot %d ep %d with no TDs queued?\n",  						TRB_TO_SLOT_ID(le32_to_cpu(event->flags)),  						ep_index); @@ -3108,7 +3112,7 @@ static u32 xhci_td_remainder(struct xhci_hcd *xhci, int transferred,  {  	u32 maxp, total_packet_count; -	/* MTK xHCI is mostly 0.97 but contains some features from 1.0 */ +	/* MTK xHCI 0.96 contains some features from 1.0 */  	if (xhci->hci_version < 0x100 && !(xhci->quirks & XHCI_MTK_HOST))  		return ((td_total_len - transferred) >> 10); @@ -3117,8 +3121,8 @@ static u32 xhci_td_remainder(struct xhci_hcd *xhci, int transferred,  	    trb_buff_len == td_total_len)  		return 0; -	/* for MTK xHCI, TD size doesn't include this TRB */ -	if (xhci->quirks & XHCI_MTK_HOST) +	/* for MTK xHCI 0.96, TD size include this TRB, but not in 1.x */ +	if ((xhci->quirks & XHCI_MTK_HOST) && (xhci->hci_version < 0x100))  		trb_buff_len = 0;  	maxp = usb_endpoint_maxp(&urb->ep->desc);  | 

