mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			60 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 6f84467f66ba847e643489a3d18b1cf81bad87d0 Mon Sep 17 00:00:00 2001
 | |
| From: P33M <p33m@github.com>
 | |
| Date: Mon, 8 Apr 2019 12:45:23 +0100
 | |
| Subject: [PATCH 423/432] dwc_otg: only do_split when we actually need to do a
 | |
|  split
 | |
| 
 | |
| The previous test would fail if the root port was in fullspeed mode
 | |
| and there was a hub between the FS device and the root port. While
 | |
| the transfer worked, the schedule mangling performed for high-speed
 | |
| split transfers would break leading to an 8ms polling interval.
 | |
| ---
 | |
|  drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c | 9 ++++-----
 | |
|  1 file changed, 4 insertions(+), 5 deletions(-)
 | |
| 
 | |
| diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c
 | |
| index fe8e8f841f03..2823dc9af63f 100644
 | |
| --- a/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c
 | |
| +++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c
 | |
| @@ -167,8 +167,10 @@ void qh_init(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh, dwc_otg_hcd_urb_t * urb)
 | |
|  	char *speed, *type;
 | |
|  	int dev_speed;
 | |
|  	uint32_t hub_addr, hub_port;
 | |
| +	hprt0_data_t hprt;
 | |
|  
 | |
|  	dwc_memset(qh, 0, sizeof(dwc_otg_qh_t));
 | |
| +	hprt.d32 = DWC_READ_REG32(hcd->core_if->host_if->hprt0);
 | |
|  
 | |
|  	/* Initialize QH */
 | |
|  	qh->ep_type = dwc_otg_hcd_get_pipe_type(&urb->pipe_info);
 | |
| @@ -191,9 +193,8 @@ void qh_init(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh, dwc_otg_hcd_urb_t * urb)
 | |
|  
 | |
|  	qh->nak_frame = 0xffff;
 | |
|  
 | |
| -	if (((dev_speed == USB_SPEED_LOW) ||
 | |
| -	     (dev_speed == USB_SPEED_FULL)) &&
 | |
| -	    (hub_addr != 0 && hub_addr != 1)) {
 | |
| +	if (hprt.b.prtspd == DWC_HPRT0_PRTSPD_HIGH_SPEED &&
 | |
| +			dev_speed != USB_SPEED_HIGH) {
 | |
|  		DWC_DEBUGPL(DBG_HCD,
 | |
|  			    "QH init: EP %d: TT found at hub addr %d, for port %d\n",
 | |
|  			    dwc_otg_hcd_get_ep_num(&urb->pipe_info), hub_addr,
 | |
| @@ -204,7 +205,6 @@ void qh_init(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh, dwc_otg_hcd_urb_t * urb)
 | |
|  
 | |
|  	if (qh->ep_type == UE_INTERRUPT || qh->ep_type == UE_ISOCHRONOUS) {
 | |
|  		/* Compute scheduling parameters once and save them. */
 | |
| -		hprt0_data_t hprt;
 | |
|  
 | |
|  		/** @todo Account for split transfers in the bus time. */
 | |
|  		int bytecount =
 | |
| @@ -219,7 +219,6 @@ void qh_init(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh, dwc_otg_hcd_urb_t * urb)
 | |
|  						    SCHEDULE_SLOP);
 | |
|  		qh->interval = urb->interval;
 | |
|  
 | |
| -		hprt.d32 = DWC_READ_REG32(hcd->core_if->host_if->hprt0);
 | |
|  		if (hprt.b.prtspd == DWC_HPRT0_PRTSPD_HIGH_SPEED) {
 | |
|  			if (dev_speed == USB_SPEED_LOW ||
 | |
|  					dev_speed == USB_SPEED_FULL) {
 | |
| -- 
 | |
| 2.19.1
 | |
| 
 |