linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: John Keeping <john@metanate.com>, Takashi Iwai <tiwai@suse.de>,
	Sasha Levin <sashal@kernel.org>,
	perex@perex.cz, tiwai@suse.com, aichao@kylinos.cn,
	wanjiabing@vivo.com, ubizjak@gmail.com, sdoregor@sdore.me,
	john-linux@pelago.org.uk, cyrozap@gmail.com,
	connerknoxpublic@gmail.com, bp@suse.de,
	alsa-devel@alsa-project.org
Subject: [PATCH AUTOSEL 6.1 63/85] ALSA: usb-audio: Add quirk for Tascam Model 12
Date: Sun, 18 Dec 2022 11:01:20 -0500	[thread overview]
Message-ID: <20221218160142.925394-63-sashal@kernel.org> (raw)
In-Reply-To: <20221218160142.925394-1-sashal@kernel.org>

From: John Keeping <john@metanate.com>

[ Upstream commit 67df411db3f0209e4bb5227d4dd9d41b21368b9d ]

Tascam's Model 12 is a mixer which can also operate as a USB audio
interface.  The audio interface uses explicit feedback but it seems that
it does not correctly handle missing isochronous frames.

When injecting an xrun (or doing anything else that pauses the playback
stream) the feedback rate climbs (for example, at 44,100Hz nominal, I
see a stable rate around 44,099 but xrun injection sees this peak at
around 44,135 in most cases) and glitches are heard in the audio stream
for several seconds - this is significantly worse than the single glitch
expected for an underrun.

While the stream does normally recover and the feedback rate returns to
a stable value, I have seen some occurrences where this does not happen
and the rate continues to increase while no audio is heard from the
output.  I have not found a solid reproduction for this.

This misbehaviour can be avoided by totally resetting the stream state
by switching the interface to alt 0 and back before restarting the
playback stream.

Add a new quirk flag which forces the endpoint and interface to be
reconfigured whenever the stream is stopped, and use this for the Tascam
Model 12.

Separate interfaces are used for the playback and capture endpoints, so
resetting the playback interface here will not affect the capture stream
if it is running.  While there are two endpoints on the interface,
these are the OUT data endpoint and the IN explicit feedback endpoint
corresponding to it and these are always stopped and started together.

Signed-off-by: John Keeping <john@metanate.com>
Link: https://lore.kernel.org/r/20221129130100.1257904-1-john@metanate.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 sound/usb/endpoint.c | 7 +++++++
 sound/usb/quirks.c   | 2 ++
 sound/usb/usbaudio.h | 4 ++++
 3 files changed, 13 insertions(+)

diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
index 310cd6fb0038..4aaf0784940b 100644
--- a/sound/usb/endpoint.c
+++ b/sound/usb/endpoint.c
@@ -1673,6 +1673,13 @@ void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep, bool keep_pending)
 		stop_urbs(ep, false, keep_pending);
 		if (ep->clock_ref)
 			atomic_dec(&ep->clock_ref->locked);
+
+		if (ep->chip->quirk_flags & QUIRK_FLAG_FORCE_IFACE_RESET &&
+		    usb_pipeout(ep->pipe)) {
+			ep->need_prepare = true;
+			if (ep->iface_ref)
+				ep->iface_ref->need_setup = true;
+		}
 	}
 }
 
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index 0f4dd3503a6a..58b37bfc885c 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -2044,6 +2044,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
 	DEVICE_FLG(0x0644, 0x804a, /* TEAC UD-301 */
 		   QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY |
 		   QUIRK_FLAG_IFACE_DELAY),
+	DEVICE_FLG(0x0644, 0x805f, /* TEAC Model 12 */
+		   QUIRK_FLAG_FORCE_IFACE_RESET),
 	DEVICE_FLG(0x06f8, 0xb000, /* Hercules DJ Console (Windows Edition) */
 		   QUIRK_FLAG_IGNORE_CTL_ERROR),
 	DEVICE_FLG(0x06f8, 0xd002, /* Hercules DJ Console (Macintosh Edition) */
diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
index e97141ef730a..2aba508a4831 100644
--- a/sound/usb/usbaudio.h
+++ b/sound/usb/usbaudio.h
@@ -172,6 +172,9 @@ extern bool snd_usb_skip_validation;
  *  Don't apply implicit feedback sync mode
  * QUIRK_FLAG_IFACE_SKIP_CLOSE
  *  Don't closed interface during setting sample rate
+ * QUIRK_FLAG_FORCE_IFACE_RESET
+ *  Force an interface reset whenever stopping & restarting a stream
+ *  (e.g. after xrun)
  */
 
 #define QUIRK_FLAG_GET_SAMPLE_RATE	(1U << 0)
@@ -194,5 +197,6 @@ extern bool snd_usb_skip_validation;
 #define QUIRK_FLAG_GENERIC_IMPLICIT_FB	(1U << 17)
 #define QUIRK_FLAG_SKIP_IMPLICIT_FB	(1U << 18)
 #define QUIRK_FLAG_IFACE_SKIP_CLOSE	(1U << 19)
+#define QUIRK_FLAG_FORCE_IFACE_RESET	(1U << 20)
 
 #endif /* __USBAUDIO_H */
-- 
2.35.1


  parent reply	other threads:[~2022-12-18 16:15 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-18 16:00 [PATCH AUTOSEL 6.1 01/85] drm/etnaviv: add missing quirks for GC300 Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 02/85] media: imx-jpeg: Disable useless interrupt to avoid kernel panic Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 03/85] brcmfmac: return error when getting invalid max_flowrings from dongle Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 04/85] wifi: ath9k: verify the expected usb_endpoints are present Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 05/85] wifi: ar5523: Fix use-after-free on ar5523_cmd() timed out Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 06/85] ASoC: codecs: rt298: Add quirk for KBL-R RVP platform Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 07/85] ASoC: Intel: avs: " Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 08/85] ipmi: fix memleak when unload ipmi driver Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 09/85] wifi: ath10k: Delay the unmapping of the buffer Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 10/85] openvswitch: Use kmalloc_size_roundup() to match ksize() usage Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 11/85] bnx2: " Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 12/85] drm/amd/display: skip commit minimal transition state Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 13/85] drm/amd/display: prevent memory leak Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 14/85] drm/edid: add a quirk for two LG monitors to get them to work on 10bpc Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 15/85] Revert "drm/amd/display: Limit max DSC target bpp for specific monitors" Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 16/85] drm/rockchip: use pm_runtime_resume_and_get() instead of pm_runtime_get_sync() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 17/85] blk-mq: avoid double ->queue_rq() because of early timeout Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 18/85] HID: apple: fix key translations where multiple quirks attempt to translate the same key Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 19/85] HID: apple: enable APPLE_ISO_TILDE_QUIRK for the keyboards of Macs with the T2 chip Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 20/85] wifi: ath11k: Fix qmi_msg_handler data structure initialization Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 21/85] qed (gcc13): use u16 for fid to be big enough Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 22/85] drm/meson: Fix return type of meson_encoder_cvbs_mode_valid() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 23/85] bpf: make sure skb->len != 0 when redirecting to a tunneling device Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 24/85] net: ethernet: ti: Fix return type of netcp_ndo_start_xmit() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 25/85] hamradio: baycom_epp: Fix return type of baycom_send_packet() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 26/85] wifi: brcmfmac: Fix potential shift-out-of-bounds in brcmf_fw_alloc_request() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 27/85] wifi: brcmfmac: Fix potential NULL pointer dereference in 'brcmf_c_preinit_dcmds()' Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 28/85] HID: input: do not query XP-PEN Deco LW battery Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 29/85] HID: uclogic: Add support for XP-PEN Deco LW Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 30/85] igb: Do not free q_vector unless new one was allocated Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 31/85] drm/amdgpu: Fix type of second parameter in trans_msg() callback Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 32/85] drm/amdgpu: Fix type of second parameter in odn_edit_dpm_table() callback Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 33/85] s390/ctcm: Fix return type of ctc{mp,}m_tx() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 34/85] s390/netiucv: Fix return type of netiucv_tx() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 35/85] s390/lcs: Fix return type of lcs_start_xmit() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 36/85] drm/amd/display: Use min transition for SubVP into MPO Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 37/85] drm/amd/display: Disable DRR actions during state commit Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 38/85] drm/msm: Use drm_mode_copy() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 39/85] drm/rockchip: " Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 40/85] drm/sti: " Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 41/85] drm/mediatek: Fix return type of mtk_hdmi_bridge_mode_valid() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 42/85] drivers/md/md-bitmap: check the return value of md_bitmap_get_counter() Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 43/85] md/raid0, raid10: Don't set discard sectors for request queue Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 44/85] md/raid1: stop mdx_raid1 thread when raid1 array run failed Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 45/85] drm/amd/display: Workaround to increase phantom pipe vactive in pipesplit Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 46/85] drm/amd/display: fix array index out of bound error in bios parser Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 47/85] nvme-auth: don't override ctrl keys before validation Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 48/85] net: add atomic_long_t to net_device_stats fields Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 49/85] ipv6/sit: use DEV_STATS_INC() to avoid data-races Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 50/85] mrp: introduce active flags to prevent UAF when applicant uninit Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 51/85] net: ethernet: mtk_eth_soc: drop packets to WDMA if the ring is full Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 52/85] bpf/verifier: Use kmalloc_size_roundup() to match ksize() usage Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 53/85] ppp: associate skb with a device at tx Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 54/85] drm/amd/display: Fix display corruption w/ VSR enable Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 55/85] bpf: Fix a BTF_ID_LIST bug with CONFIG_DEBUG_INFO_BTF not set Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 56/85] bpf: Prevent decl_tag from being referenced in func_proto arg Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 57/85] ethtool: avoiding integer overflow in ethtool_phys_id() Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 58/85] media: dvb-frontends: fix leak of memory fw Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 59/85] media: dvbdev: adopts refcnt to avoid UAF Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 60/85] media: dvb-usb: fix memory leak in dvb_usb_adapter_init() Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 61/85] media: mediatek: vcodec: Can't set dst buffer to done when lat decode error Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 62/85] blk-mq: fix possible memleak when register 'hctx' failed Sasha Levin
2022-12-18 16:01 ` Sasha Levin [this message]
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 64/85] drm/amdgpu: Fix potential double free and null pointer dereference Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 65/85] drm/amd/display: Use the largest vready_offset in pipe group Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 66/85] drm/amd/display: Fix DTBCLK disable requests and SRC_SEL programming Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 67/85] ASoC: amd: yc: Add Xiaomi Redmi Book Pro 14 2022 into DMI table Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 68/85] libbpf: Avoid enum forward-declarations in public API in C++ mode Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 69/85] regulator: core: fix use_count leakage when handling boot-on Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 70/85] net: dpaa2: publish MAC stringset to ethtool -S even if MAC is missing Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 71/85] wifi: mt76: do not run mt76u_status_worker if the device is not running Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 72/85] hwmon: (nct6775) add ASUS CROSSHAIR VIII/TUF/ProArt B550M Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 73/85] selftests/bpf: Fix conflicts with built-in functions in bpf_iter_ksym Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 74/85] nfs: fix possible null-ptr-deref when parsing param Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 75/85] mmc: f-sdh30: Add quirks for broken timeout clock capability Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 76/85] mmc: renesas_sdhi: add quirk for broken register layout Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 77/85] mmc: renesas_sdhi: better reset from HS400 mode Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 78/85] mmc: sdhci-tegra: Issue CMD and DAT resets together Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 79/85] media: si470x: Fix use-after-free in si470x_int_in_callback() Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 80/85] clk: st: Fix memory leak in st_of_quadfs_setup() Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 81/85] regulator: core: Use different devices for resource allocation and DT lookup Sasha Levin
2022-12-19  1:08   ` ChiYuan Huang
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 82/85] ice: synchronize the misc IRQ when tearing down Tx tracker Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 83/85] Bluetooth: hci_bcm: Add CYW4373A0 support Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 84/85] Bluetooth: Add quirk to disable extended scanning Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 85/85] Bluetooth: Add quirk to disable MWS Transport Configuration Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221218160142.925394-63-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=aichao@kylinos.cn \
    --cc=alsa-devel@alsa-project.org \
    --cc=bp@suse.de \
    --cc=connerknoxpublic@gmail.com \
    --cc=cyrozap@gmail.com \
    --cc=john-linux@pelago.org.uk \
    --cc=john@metanate.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=perex@perex.cz \
    --cc=sdoregor@sdore.me \
    --cc=stable@vger.kernel.org \
    --cc=tiwai@suse.com \
    --cc=tiwai@suse.de \
    --cc=ubizjak@gmail.com \
    --cc=wanjiabing@vivo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).