usb-linux: fix max_packet_size for highspeed.
Calculate the max packet size correctly. Only bits 0..11 specify the size, bits 11+12 specify the number of (highspeed) microframes the endpoint wants to use. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
		
							parent
							
								
									71138531d3
								
							
						
					
					
						commit
						6dfcdccb09
					
				
							
								
								
									
										19
									
								
								usb-linux.c
								
								
								
								
							
							
						
						
									
										19
									
								
								usb-linux.c
								
								
								
								
							|  | @ -213,6 +213,22 @@ static int get_iso_buffer_used(USBHostDevice *s, int ep) | ||||||
|     return s->endp_table[ep - 1].iso_buffer_used; |     return s->endp_table[ep - 1].iso_buffer_used; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void set_max_packet_size(USBHostDevice *s, int ep, uint8_t *descriptor) | ||||||
|  | { | ||||||
|  |     int raw = descriptor[4] + (descriptor[5] << 8); | ||||||
|  |     int size, microframes; | ||||||
|  | 
 | ||||||
|  |     size = raw & 0x7ff; | ||||||
|  |     switch ((raw >> 11) & 3) { | ||||||
|  |     case 1:  microframes = 2; break; | ||||||
|  |     case 2:  microframes = 3; break; | ||||||
|  |     default: microframes = 1; break; | ||||||
|  |     } | ||||||
|  |     DPRINTF("husb: max packet size: 0x%x -> %d x %d\n", | ||||||
|  |             raw, microframes, size); | ||||||
|  |     s->endp_table[ep - 1].max_packet_size = size * microframes; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int get_max_packet_size(USBHostDevice *s, int ep) | static int get_max_packet_size(USBHostDevice *s, int ep) | ||||||
| { | { | ||||||
|     return s->endp_table[ep - 1].max_packet_size; |     return s->endp_table[ep - 1].max_packet_size; | ||||||
|  | @ -1008,8 +1024,7 @@ static int usb_linux_update_endp_table(USBHostDevice *s) | ||||||
|                 break; |                 break; | ||||||
|             case 0x01: |             case 0x01: | ||||||
|                 type = USBDEVFS_URB_TYPE_ISO; |                 type = USBDEVFS_URB_TYPE_ISO; | ||||||
|                 s->endp_table[(devep & 0xf) - 1].max_packet_size = |                 set_max_packet_size(s, (devep & 0xf), descriptors + i); | ||||||
|                     descriptors[i + 4] + (descriptors[i + 5] << 8); |  | ||||||
|                 break; |                 break; | ||||||
|             case 0x02: |             case 0x02: | ||||||
|                 type = USBDEVFS_URB_TYPE_BULK; |                 type = USBDEVFS_URB_TYPE_BULK; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Gerd Hoffmann
						Gerd Hoffmann