The original discussion is likely: http://marc.info/?l=openbsd-misc&m=132742309809128&w=2
What I present here is based on a recent, garbled, post on misc@ roughly describing the symptoms: (http://marc.info/?l=openbsd-misc&m=138691667303787&w=2) Dec 12 17:09:16 genetraveller /bsd: uaudio0: sync ep address mismatch Dec 12 17:09:16 genetraveller /bsd: uaudio0: sync ep address mismatch Dec 12 17:09:16 genetraveller /bsd: uaudio0: no usable endpoint found Dec 12 17:09:16 genetraveller /bsd: uaudio0: audio descriptors make no sense, error=4 I also retrieved lsusb output from a follow-up HTML mail: Bus 000 Device 005: ID 27ac:1002 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 16 idVendor 0x27ac idProduct 0x1002 bcdDevice 1.07 iManufacturer 1 KEF iProduct 2 KEF X300A Speaker iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 220 bNumInterfaces 3 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 1 Audio bInterfaceSubClass 1 Control Device bInterfaceProtocol 0 iInterface 0 AudioControl Interface Descriptor: bLength 9 bDescriptorType 36 bDescriptorSubtype 1 (HEADER) bcdADC 1.00 wTotalLength 40 bInCollection 1 baInterfaceNr( 0) 1 AudioControl Interface Descriptor: bLength 12 bDescriptorType 36 bDescriptorSubtype 2 (INPUT_TERMINAL) bTerminalID 1 wTerminalType 0x0101 USB Streaming bAssocTerminal 0 bNrChannels 2 wChannelConfig 0x0003 Left Front (L) Right Front (R) iChannelNames 0 iTerminal 0 AudioControl Interface Descriptor: bLength 9 bDescriptorType 36 bDescriptorSubtype 3 (OUTPUT_TERMINAL) bTerminalID 2 wTerminalType 0x0301 Speaker bAssocTerminal 0 bSourceID 3 iTerminal 0 AudioControl Interface Descriptor: bLength 10 bDescriptorType 36 bDescriptorSubtype 6 (FEATURE_UNIT) bUnitID 3 bSourceID 1 bControlSize 1 bmaControls( 0) 0x01 Mute Control bmaControls( 1) 0x02 Volume Control bmaControls( 2) 0x02 Volume Control iFeature 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 1 Audio bInterfaceSubClass 2 Streaming bInterfaceProtocol 0 iInterface 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 1 bNumEndpoints 2 bInterfaceClass 1 Audio bInterfaceSubClass 2 Streaming bInterfaceProtocol 0 iInterface 0 AudioStreaming Interface Descriptor: bLength 7 bDescriptorType 36 bDescriptorSubtype 1 (AS_GENERAL) bTerminalLink 1 bDelay 1 frames wFormatTag 1 PCM AudioStreaming Interface Descriptor: bLength 23 bDescriptorType 36 bDescriptorSubtype 2 (FORMAT_TYPE) bFormatType 1 (FORMAT_TYPE_I) bNrChannels 2 bSubframeSize 2 bBitResolution 16 bSamFreqType 5 Discrete tSamFreq[ 0] 32000 tSamFreq[ 1] 44100 tSamFreq[ 2] 48000 tSamFreq[ 3] 88200 tSamFreq[ 4] 96000 Endpoint Descriptor: bLength 9 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 5 Transfer Type Isochronous Synch Type Asynchronous Usage Type Data wMaxPacketSize 0x0184 1x 388 bytes bInterval 1 bRefresh 0 bSynchAddress 129 AudioControl Endpoint Descriptor: bLength 7 bDescriptorType 37 bDescriptorSubtype 1 (EP_GENERAL) bmAttributes 0x01 Sampling Frequency bLockDelayUnits 0 Undefined wLockDelay 0 Undefined Endpoint Descriptor: bLength 9 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 17 Transfer Type Isochronous Synch Type None Usage Type Feedback wMaxPacketSize 0x0003 1x 3 bytes bInterval 1 bRefresh 5 bSynchAddress 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 2 bNumEndpoints 2 bInterfaceClass 1 Audio bInterfaceSubClass 2 Streaming bInterfaceProtocol 0 iInterface 0 AudioStreaming Interface Descriptor: bLength 7 bDescriptorType 36 bDescriptorSubtype 1 (AS_GENERAL) bTerminalLink 1 bDelay 1 frames wFormatTag 1 PCM AudioStreaming Interface Descriptor: bLength 23 bDescriptorType 36 bDescriptorSubtype 2 (FORMAT_TYPE) bFormatType 1 (FORMAT_TYPE_I) bNrChannels 2 bSubframeSize 3 bBitResolution 24 bSamFreqType 5 Discrete tSamFreq[ 0] 32000 tSamFreq[ 1] 44100 tSamFreq[ 2] 48000 tSamFreq[ 3] 88200 tSamFreq[ 4] 96000 Endpoint Descriptor: bLength 9 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 5 Transfer Type Isochronous Synch Type Asynchronous Usage Type Data wMaxPacketSize 0x0246 1x 582 bytes bInterval 1 bRefresh 0 bSynchAddress 129 AudioControl Endpoint Descriptor: bLength 7 bDescriptorType 37 bDescriptorSubtype 1 (EP_GENERAL) bmAttributes 0x01 Sampling Frequency bLockDelayUnits 0 Undefined wLockDelay 0 Undefined Endpoint Descriptor: bLength 9 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 17 Transfer Type Isochronous Synch Type None Usage Type Feedback wMaxPacketSize 0x0003 1x 3 bytes bInterval 1 bRefresh 5 bSynchAddress 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 No Subclass bInterfaceProtocol 0 None iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.00 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 69 Report Descriptor: (length is 69) Item(Global): Usage Page, data= [ 0x0c ] 12 Consumer Item(Local ): Usage, data= [ 0x01 ] 1 Consumer Control Item(Main ): Collection, data= [ 0x01 ] 1 Application Item(Global): Report ID, data= [ 0x01 ] 1 Item(Global): Logical Minimum, data= [ 0x00 ] 0 Item(Global): Logical Maximum, data= [ 0x01 ] 1 Item(Local ): Usage, data= [ 0xe9 ] 233 Volume Increment Item(Local ): Usage, data= [ 0xea ] 234 Volume Decrement Item(Global): Report Size, data= [ 0x01 ] 1 Item(Global): Report Count, data= [ 0x02 ] 2 Item(Main ): Input, data= [ 0x42 ] 66 Data Variable Absolute No_Wrap Linear Preferred_State Null_State Non_Volatile Bitfield Item(Local ): Usage, data= [ 0xe2 ] 226 Mute Item(Global): Report Count, data= [ 0x01 ] 1 Item(Main ): Input, data= [ 0x06 ] 6 Data Variable Relative No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Usage Page, data= [ 0xff 0x01 ] 511 (null) Item(Local ): Usage, data= [ 0x01 ] 1 (null) Item(Global): Report Count, data= [ 0x09 ] 9 Item(Main ): Input, data= [ 0x06 ] 6 Data Variable Relative No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Usage Page, data= [ 0x0c ] 12 Consumer Item(Local ): Usage, data= [ 0xcd ] 205 Play/Pause Item(Local ): Usage, data= [ 0xb7 ] 183 Stop Item(Local ): Usage, data= [ 0xb5 ] 181 Scan Next Track Item(Local ): Usage, data= [ 0xb6 ] 182 Scan Previous Track Item(Global): Report Count, data= [ 0x04 ] 4 Item(Main ): Input, data= [ 0x06 ] 6 Data Variable Relative No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Global): Usage Page, data= [ 0xff 0x07 ] 2047 (null) Item(Local ): Usage, data= [ 0x01 ] 1 (null) Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x0d ] 13 Item(Main ): Input, data= [ 0x06 ] 6 Data Variable Relative No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Local ): Usage, data= [ 0x00 ] 0 (null) Item(Global): Report Count, data= [ 0x0f ] 15 Item(Main ): Output, data= [ 0x02 ] 2 Data Variable Absolute No_Wrap Linear Preferred_State No_Null_Position Non_Volatile Bitfield Item(Main ): End Collection, data=none Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x87 EP 7 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0010 1x 16 bytes bInterval 1 Device Status: 0x0000 (Bus Powered) In uaudio revision 1.96 two USB endpoint addresses are compared. On one side of the comparison the direction bit gets masked off. AFAICT this results in comparing an endpoint number, with the direction bit masked off, to an endpoint address, which includes the direction bit. To me this is like comparing apples to oranges and therefor I think it's wrong. e.g., in the KEF X300A Speaker example shown above: The endpoint "EP 1 OUT", with bEndpointAddress 0x01, has bSynchAddress 129. The endpoint "EP 1 IN", with bEndpointAddress 0x81, is defined after that and appears to be the one referenced by endpoint 0x01's bSynchAddress. If I understand the code correctly the check will compare UE_GET_ADDR(0x81) to 129 which won't match. Had the comparison been 0x81 to 129, the two numbers would have matched. To make the comparison a fair one I think either the endpoints' full addresses should be compared or just their endpoint numbers. To me it makes the most sense to compare full addresses, meaning reverting uaudio.c revision 1.96. If it's considered necessary to just compare endpoint numbers, without involving the direction bit, I think the following patch should implement that. (the patch doesn't seem to hurt my USB audio devices, though I don't think any of them hit this code path ... very briefly tested on OpenBSD 5.4) Lacking the problematic hardware myself, I don't know exactly what was fixed originally and what might break by changing something, however I hope my story makes sense. Regards, Remco Index: uaudio.c =================================================================== RCS file: /home/cvs/src/sys/dev/usb/uaudio.c,v retrieving revision 1.96 diff -u -r1.96 uaudio.c --- uaudio.c 1 Mar 2012 08:49:22 -0000 1.96 +++ uaudio.c 13 Dec 2013 17:38:02 -0000 @@ -1769,7 +1769,8 @@ return (USBD_NORMAL_COMPLETION); } if (sync_addr && - UE_GET_ADDR(sync_ed->bEndpointAddress) != sync_addr) { + UE_GET_ADDR(sync_ed->bEndpointAddress) != + UE_GET_ADDR(sync_addr)) { printf("%s: sync ep address mismatch\n", sc->sc_dev.dv_xname); return (USBD_NORMAL_COMPLETION);
