teac ud-501/ud-503 usb delay
PATCH 1/1 teac ud-501/ud-503 usb delay
Hello,
This is a small patch against sound/usb/quirks.c to correct "Teac Corp." products delay.
Tested on Teac UD-501 and UD-503 products, could not harm other Teac products.
It corrects the "clock source 41 is not valid, cannot use" error for both devices.
And more critically on the new UD-503, a complete freeze of the teac usb interface when switching between different rate/format. (Freeze only solved by a power switch of the device...)
The patch matches the problem of the "Playback Design" products. I just refactored a bit the code to include Teac products properly.
Regards,
Guillaume
--- sound/usb/quirks.c | 58 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 25 deletions(-)
sound/usb/quirks.c +33 -25
@@ -1202,40 +1202,48 @@ void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep)void snd_usb_set_interface_quirk (struct usb_device *dev) {/* -* "Playback Design" products need a 50ms delay after setting the +* Products needing a 50ms delay after setting the * USB interface. */ -if (le16_to_cpu (dev->descriptor.idVendor) ==0x23ba ) -mdelay (50 ); +switch (le16_to_cpu (dev->descriptor.idVendor)) { +case 0x23ba :/* Playback Design */ +case 0x0644 :/* TEAC Corp. */ +mdelay (50 ); + } }void snd_usb_ctl_msg_quirk (struct usb_device *dev,unsigned int pipe,__u8 request,__u8 requesttype,__u16 value,__u16 index,void *data,__u16 size) { -/* -* "Playback Design" products need a 20ms delay after each -* class compliant request -*/ -if ((le16_to_cpu (dev->descriptor.idVendor) ==0x23ba ) && - (requesttype &USB_TYPE_MASK ) ==USB_TYPE_CLASS ) -mdelay (20 ); - -/* Marantz/Denon devices with USB DAC functionality need a delay -* after each class compliant request -*/ -if (is_marantz_denon_dac (USB_ID (le16_to_cpu (dev->descriptor.idVendor), -le16_to_cpu (dev->descriptor.idProduct))) - && (requesttype &USB_TYPE_MASK ) ==USB_TYPE_CLASS ) -mdelay (20 ); +if ((requesttype &USB_TYPE_MASK ) ==USB_TYPE_CLASS ) { +switch (le16_to_cpu (dev->descriptor.idVendor)) { +/* +* "Playback Design"/"TEAC Corp." products need a 20ms delay after each +* class compliant request +*/ +case 0x23ba :/* "Playback Design" */ +case 0x0644 :/* TEAC Corp. */ +mdelay (20 ); +return ; + +/* Zoom R16/24 needs a tiny delay here, otherwise requests like +* get/set frequency return as failed despite actually succeeding. +*/ +case 0x1686 : +/* restrict to 0x00dd */ +if (le16_to_cpu (dev->descriptor.idProduct) ==0x00dd ) +mdelay (1 ); +return ; + } -/* Zoom R16/24 needs a tiny delay here, otherwise requests like -* get/set frequency return as failed despite actually succeeding. -*/ -if ((le16_to_cpu (dev->descriptor.idVendor) ==0x1686 ) && - (le16_to_cpu (dev->descriptor.idProduct) ==0x00dd ) && - (requesttype &USB_TYPE_MASK ) ==USB_TYPE_CLASS ) -mdelay (1 ); +/* Marantz/Denon devices with USB DAC functionality need a delay +* after each class compliant request +*/ +if (is_marantz_denon_dac (USB_ID (le16_to_cpu (dev->descriptor.idVendor), +le16_to_cpu (dev->descriptor.idProduct)))) +mdelay (20 ); + } }/*
Signature · 1 line
2.6.4
Quoted 14 lines · Guillaume Fougnies
Hello,
This is a small patch against
sound/usb/quirks.cto correct "Teac Corp." products delay.
Tested on Teac UD-501 and UD-503 products, could not harm other Teac products.
It corrects the "clock source 41 is not valid, cannot use" error for both devices.
And more critically on the new UD-503, a complete freeze of the teac usb interface when switching between different rate/format. (Freeze only solved by a power switch of the device...)
Quoted 2 lines
The patch matches the problem of the "Playback Design" products. I just refactored a bit the code to include Teac products properly.
The changes look almost good to me. Could you fix small nitpick below and resubmit with a proper changelog, and most importantly, with your sign-off, in order to merge to upstream?
Quoted 16 lines
Regards,
Guillaume--- sound/usb/quirks.c | 58 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 25 deletions(-)sound/usb/quirks.c +0
-0@@ -1202,40 +1202,48 @@ void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep)void snd_usb_set_interface_quirk (struct usb_device *dev) {
sound/usb/quirks.c void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep) · line 1210
Quoted 10 lines
sound/usb/quirks.c +4
-3/* -* "Playback Design" products need a 50ms delay after setting the +* Products needing a 50ms delay after setting the * USB interface. */ -if (le16_to_cpu (dev->descriptor.idVendor) ==0x23ba ) -mdelay (50 ); +switch (le16_to_cpu (dev->descriptor.idVendor)) { +case 0x23ba :/* Playback Design */ +case 0x0644 :/* TEAC Corp. */
In the kernel code, case is has the same indent level as switch.
sound/usb/quirks.c void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep) · line 1212
Quoted 2 lines
sound/usb/quirks.c +2
-0+mdelay (50 ); + }
Put break after mdelay() call as the common practice.
Quoted 46 lines
sound/usb/quirks.c +20
-19}void snd_usb_ctl_msg_quirk (struct usb_device *dev,unsigned int pipe,__u8 request,__u8 requesttype,__u16 value,__u16 index,void *data,__u16 size) { -/* -* "Playback Design" products need a 20ms delay after each -* class compliant request -*/ -if ((le16_to_cpu (dev->descriptor.idVendor) ==0x23ba ) && - (requesttype &USB_TYPE_MASK ) ==USB_TYPE_CLASS ) -mdelay (20 ); - -/* Marantz/Denon devices with USB DAC functionality need a delay -* after each class compliant request -*/ -if (is_marantz_denon_dac (USB_ID (le16_to_cpu (dev->descriptor.idVendor), -le16_to_cpu (dev->descriptor.idProduct))) - && (requesttype &USB_TYPE_MASK ) ==USB_TYPE_CLASS ) -mdelay (20 ); +if ((requesttype &USB_TYPE_MASK ) ==USB_TYPE_CLASS ) { +switch (le16_to_cpu (dev->descriptor.idVendor)) { +/* +* "Playback Design"/"TEAC Corp." products need a 20ms delay after each +* class compliant request +*/ +case 0x23ba :/* "Playback Design" */ +case 0x0644 :/* TEAC Corp. */ +mdelay (20 ); +return ; + +/* Zoom R16/24 needs a tiny delay here, otherwise requests like +* get/set frequency return as failed despite actually succeeding. +*/ +case 0x1686 : +/* restrict to 0x00dd */ +if (le16_to_cpu (dev->descriptor.idProduct) ==0x00dd ) +mdelay (1 ); +return ; + } -/* Zoom R16/24 needs a tiny delay here, otherwise requests like -* get/set frequency return as failed despite actually succeeding. -*/ - if ((le16_to_cpu(dev->descriptor.idVendor) == 0x1686) &&
sound/usb/quirks.c void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep) · line 1246
Quoted 10 lines
sound/usb/quirks.c +7
-3- (le16_to_cpu(dev->descriptor.idProduct) == 0x00dd) && - (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS) -mdelay (1 ); +/* Marantz/Denon devices with USB DAC functionality need a delay +* after each class compliant request +*/ +if (is_marantz_denon_dac (USB_ID (le16_to_cpu (dev->descriptor.idVendor), +le16_to_cpu (dev->descriptor.idProduct)))) +mdelay (20 ); + }
In this case, I prefer keeping the old code as is. Just add the check for your device there in a new if block.
thanks,
Takashi
ALSA: usb: Fix TEAC UD-501/UD-503/NT-503 usb delay
TEAC UD-501/UD-503/NT-503 fail to switch properly between different rate/format. Similar to 'Playback Design', this patch corrects the invalid clock source error for TEAC products and avoids complete freeze of the usb interface of 503 series.
--- sound/usb/quirks.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
sound/usb/quirks.c +13 -1
@@ -1205,8 +1205,12 @@ void snd_usb_set_interface_quirk(struct usb_device *dev)* "Playback Design" products need a 50ms delay after setting the * USB interface. */ -if (le16_to_cpu (dev->descriptor.idVendor) ==0x23ba ) +switch (le16_to_cpu (dev->descriptor.idVendor)) { +case 0x23ba :/* Playback Design */ +case 0x0644 :/* TEAC Corp. */ mdelay (50 ); +break ; + } } void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
@@ -1221,6 +1225,14 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)mdelay (20 ); +/* +* "TEAC Corp." products need a 20ms delay after each +* class compliant request +*/ +if ((le16_to_cpu (dev->descriptor.idVendor) ==0x0644 ) && + (requesttype &USB_TYPE_MASK ) ==USB_TYPE_CLASS ) +mdelay (20 ); +/* Marantz/Denon devices with USB DAC functionality need a delay * after each class compliant request */
Signature · 1 line
2.7.0.rc3
Takashi Iwai
AppliedQuoted 8 lines · Guillaume Fougnies
ALSA: usb: Fix TEAC UD-501/UD-503/NT-503 usb delay
TEAC UD-501/UD-503/NT-503 fail to switch properly between different rate/format. Similar to 'Playback Design', this patch corrects the invalid clock source error for TEAC products and avoids complete freeze of the usb interface of 503 series.
Signed-off-by Guillaume Fougnies <[email protected]>
Applied, thanks.
Takashi
Quoted 40 lines
--- sound/usb/quirks.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)sound/usb/quirks.c +13
-1@@ -1205,8 +1205,12 @@ void snd_usb_set_interface_quirk(struct usb_device *dev)* "Playback Design" products need a 50ms delay after setting the * USB interface. */ -if (le16_to_cpu (dev->descriptor.idVendor) ==0x23ba ) +switch (le16_to_cpu (dev->descriptor.idVendor)) { +case 0x23ba :/* Playback Design */ +case 0x0644 :/* TEAC Corp. */ mdelay (50 ); +break ; + } } void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,@@ -1221,6 +1225,14 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)mdelay (20 ); +/* +* "TEAC Corp." products need a 20ms delay after each +* class compliant request +*/ +if ((le16_to_cpu (dev->descriptor.idVendor) ==0x0644 ) && + (requesttype &USB_TYPE_MASK ) ==USB_TYPE_CLASS ) +mdelay (20 ); +/* Marantz/Denon devices with USB DAC functionality need a delay * after each class compliant request */ Signature · 1 line
2.7.0.rc3
Hi,
I have a friend with a new UD 503 running on Fedora 23 (vortexbox) and is getting USB dropout issues. Can your fix be run in Fedora? Any tips to implement?
Thanks.
Rob.
Quoted 1 line · Rob O'Donnell
Can your fix be run in Fedora? Any tips to implement?
https://fedoraproject.org/wiki/Building_a_custom_kernel
Regards,
Clemens