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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user