public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Alexander Tsoy <alexander@tsoy.me>, Takashi Iwai <tiwai@suse.de>,
	Sasha Levin <sashal@kernel.org>,
	perex@perex.cz, tiwai@suse.com, linux-sound@vger.kernel.org
Subject: [PATCH AUTOSEL 6.1 10/29] ALSA: usb-audio: Check presence of valid altsetting control
Date: Wed,  7 Feb 2024 16:24:35 -0500	[thread overview]
Message-ID: <20240207212505.3169-10-sashal@kernel.org> (raw)
In-Reply-To: <20240207212505.3169-1-sashal@kernel.org>

From: Alexander Tsoy <alexander@tsoy.me>

[ Upstream commit 346f59d1e8ed0eed41c80e1acb657e484c308e6a ]

Many devices with a single alternate setting do not have a Valid
Alternate Setting Control and validation performed by
validate_sample_rate_table_v2v3() doesn't work on them and is not
really needed. So check the presense of control before sending
altsetting validation requests.

MOTU Microbook IIc is suffering the most without this check. It
takes up to 40 seconds to bootup due to how slow it switches
sampling rates:

[ 2659.164824] usb 3-2: New USB device found, idVendor=07fd, idProduct=0004, bcdDevice= 0.60
[ 2659.164827] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 2659.164829] usb 3-2: Product: MicroBook IIc
[ 2659.164830] usb 3-2: Manufacturer: MOTU
[ 2659.166204] usb 3-2: Found last interface = 3
[ 2679.322298] usb 3-2: No valid sample rate available for 1:1, assuming a firmware bug
[ 2679.322306] usb 3-2: 1:1: add audio endpoint 0x3
[ 2679.322321] usb 3-2: Creating new data endpoint #3
[ 2679.322552] usb 3-2: 1:1 Set sample rate 96000, clock 1
[ 2684.362250] usb 3-2: 2:1: cannot get freq (v2/v3): err -110
[ 2694.444700] usb 3-2: No valid sample rate available for 2:1, assuming a firmware bug
[ 2694.444707] usb 3-2: 2:1: add audio endpoint 0x84
[ 2694.444721] usb 3-2: Creating new data endpoint #84
[ 2699.482103] usb 3-2: 2:1 Set sample rate 96000, clock 1

Signed-off-by: Alexander Tsoy <alexander@tsoy.me>
Link: https://lore.kernel.org/r/20240129121254.3454481-1-alexander@tsoy.me
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 sound/usb/format.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/sound/usb/format.c b/sound/usb/format.c
index ab5fed9f55b6..3b45d0ee7693 100644
--- a/sound/usb/format.c
+++ b/sound/usb/format.c
@@ -470,9 +470,11 @@ static int validate_sample_rate_table_v2v3(struct snd_usb_audio *chip,
 					   int clock)
 {
 	struct usb_device *dev = chip->dev;
+	struct usb_host_interface *alts;
 	unsigned int *table;
 	unsigned int nr_rates;
 	int i, err;
+	u32 bmControls;
 
 	/* performing the rate verification may lead to unexpected USB bus
 	 * behavior afterwards by some unknown reason.  Do this only for the
@@ -481,6 +483,24 @@ static int validate_sample_rate_table_v2v3(struct snd_usb_audio *chip,
 	if (!(chip->quirk_flags & QUIRK_FLAG_VALIDATE_RATES))
 		return 0; /* don't perform the validation as default */
 
+	alts = snd_usb_get_host_interface(chip, fp->iface, fp->altsetting);
+	if (!alts)
+		return 0;
+
+	if (fp->protocol == UAC_VERSION_3) {
+		struct uac3_as_header_descriptor *as = snd_usb_find_csint_desc(
+				alts->extra, alts->extralen, NULL, UAC_AS_GENERAL);
+		bmControls = le32_to_cpu(as->bmControls);
+	} else {
+		struct uac2_as_header_descriptor *as = snd_usb_find_csint_desc(
+				alts->extra, alts->extralen, NULL, UAC_AS_GENERAL);
+		bmControls = as->bmControls;
+	}
+
+	if (!uac_v2v3_control_is_readable(bmControls,
+				UAC2_AS_VAL_ALT_SETTINGS))
+		return 0;
+
 	table = kcalloc(fp->nr_rates, sizeof(*table), GFP_KERNEL);
 	if (!table)
 		return -ENOMEM;
-- 
2.43.0


  parent reply	other threads:[~2024-02-07 21:25 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-07 21:24 [PATCH AUTOSEL 6.1 01/29] ext4: avoid dividing by 0 in mb_update_avg_fragment_size() when block bitmap corrupt Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 02/29] ext4: avoid allocating blocks from corrupted group in ext4_mb_try_best_found() Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 03/29] ext4: avoid allocating blocks from corrupted group in ext4_mb_find_by_goal() Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 04/29] Input: goodix - accept ACPI resources with gpio_count == 3 && gpio_int_idx == 0 Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 05/29] dmaengine: ti: edma: Add some null pointer checks to the edma_probe Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 06/29] ASoC: codecs: wcd934x: drop unneeded regulator include Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 07/29] regulator: pwm-regulator: Add validity checks in continuous .get_voltage Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 08/29] nvmet-tcp: fix nvme tcp ida memory leak Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 09/29] usb: ucsi_acpi: Quirk to ack a connector change ack cmd Sasha Levin
2024-02-07 21:24 ` Sasha Levin [this message]
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 11/29] ASoC: sunxi: sun4i-spdif: Add support for Allwinner H616 Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 12/29] spi: sh-msiof: avoid integer overflow in constants Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 13/29] Input: xpad - add Lenovo Legion Go controllers Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 14/29] misc: open-dice: Fix spurious lockdep warning Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 15/29] netfilter: conntrack: check SCTP_CID_SHUTDOWN_ACK for vtag setting in sctp_new Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 16/29] drm/amd/display: increased min_dcfclk_mhz and min_fclk_mhz Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 17/29] ASoC: wm_adsp: Don't overwrite fwf_name with the default Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 18/29] ALSA: usb-audio: Ignore clock selector errors for single connection Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 19/29] nvme-fc: do not wait in vain when unloading module Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 20/29] nvmet-fcloop: swap the list_add_tail arguments Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 21/29] nvmet-fc: release reference on target port Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 22/29] nvmet-fc: defer cleanup using RCU properly Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 23/29] nvmet-fc: hold reference on hostport match Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 24/29] nvmet-fc: abort command when there is no binding Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 25/29] nvmet-fc: avoid deadlock on delete association path Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 26/29] nvmet-fc: take ref count on tgtport before delete assoc Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 27/29] smb: client: increase number of PDUs allowed in a compound request Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 28/29] ext4: correct the hole length returned by ext4_map_blocks() Sasha Levin
2024-02-07 21:24 ` [PATCH AUTOSEL 6.1 29/29] Input: i8042 - add Fujitsu Lifebook U728 to i8042 quirk table 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=20240207212505.3169-10-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=alexander@tsoy.me \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sound@vger.kernel.org \
    --cc=perex@perex.cz \
    --cc=stable@vger.kernel.org \
    --cc=tiwai@suse.com \
    --cc=tiwai@suse.de \
    /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