Re: USB2 / USB3 compatibility problems: xhci_hcd 0000:00:06.0: WARN Wrong bounce buffer write length: 0 != 512

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 26.01.21 at 22:16 Andreas Hartmann wrote:
> Hello Mathias!
> 
> On 26.01.21 at 18:29 Mathias Nyman wrote:
>> Got a first iteration ready,
>> any change you could try it out?
>>
>> Thanks
>> -Mathias
>>
>> 8<---
>>
>> diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
>> index 5677b81c0915..8df30618aaf1 100644
>> --- a/drivers/usb/host/xhci-ring.c
>> +++ b/drivers/usb/host/xhci-ring.c
>> @@ -699,11 +699,16 @@ static void xhci_unmap_td_bounce_buffer(struct xhci_hcd *xhci,
>>  	dma_unmap_single(dev, seg->bounce_dma, ring->bounce_buf_len,
>>  			 DMA_FROM_DEVICE);
>>  	/* for in tranfers we need to copy the data from bounce to sg */
>> -	len = sg_pcopy_from_buffer(urb->sg, urb->num_sgs, seg->bounce_buf,
>> -			     seg->bounce_len, seg->bounce_offs);
>> -	if (len != seg->bounce_len)
>> -		xhci_warn(xhci, "WARN Wrong bounce buffer read length: %zu != %d\n",
>> -				len, seg->bounce_len);
>> +	if (urb->num_sgs) {
>> +		len = sg_pcopy_from_buffer(urb->sg, urb->num_sgs, seg->bounce_buf,
>> +					   seg->bounce_len, seg->bounce_offs);
>> +		if (len != seg->bounce_len)
>> +			xhci_warn(xhci, "WARN Wrong bounce buffer read length: %zu != %d\n",
>> +				  len, seg->bounce_len);
>> +	} else {
>> +		memcpy(urb->transfer_buffer + seg->bounce_offs, seg->bounce_buf,
>> +		       seg->bounce_len);
>> +	}
>>  	seg->bounce_len = 0;
>>  	seg->bounce_offs = 0;
>>  }
>> @@ -3275,12 +3280,16 @@ static int xhci_align_td(struct xhci_hcd *xhci, struct urb *urb, u32 enqd_len,
>>  
>>  	/* create a max max_pkt sized bounce buffer pointed to by last trb */
>>  	if (usb_urb_dir_out(urb)) {
>> -		len = sg_pcopy_to_buffer(urb->sg, urb->num_sgs,
>> -				   seg->bounce_buf, new_buff_len, enqd_len);
>> -		if (len != new_buff_len)
>> -			xhci_warn(xhci,
>> -				"WARN Wrong bounce buffer write length: %zu != %d\n",
>> -				len, new_buff_len);
>> +		if (urb->num_sgs) {
>> +			len = sg_pcopy_to_buffer(urb->sg, urb->num_sgs,
>> +						 seg->bounce_buf, new_buff_len, enqd_len);
>> +			if (len != new_buff_len)
>> +				xhci_warn(xhci, "WARN Wrong bounce buffer write length: %zu != %d\n",
>> +					  len, new_buff_len);
>> +		} else {
>> +			memcpy(seg->bounce_buf, urb->transfer_buffer + enqd_len, new_buff_len);
>> +		}
>> +
> 
> If I'm understanding it correctly, you're always creating a bounce
> buffer though it is not necessary (at least in my case - my test patch
> proofed, that no changes at all are necessary). Why aren't you checking
> for URB_NO_TRANSFER_DMA_MAP at the very beginning? Or is it your purpose
> to first basically test your new code path? That would be ok.
> 
> I tested with the notebook (in both directions) - it seems to work - I
> didn't get any problems though I used 24 kB bulk packets. Throughput was
> unaltered high.
> 
> I'm doing the same test tomorrow with the other USB 3.1 controller!

Successfully tested on the other USB 3.1 host.

> 
>>  		seg->bounce_dma = dma_map_single(dev, seg->bounce_buf,
>>  						 max_pkt, DMA_TO_DEVICE);
>>  	} else {
>>
> 
> Thanks
> Andreas
> 




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux