From: Takashi Iwai <tiwai@suse.de>
To: Rong Zhang <i@rong.moe>
Cc: Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>,
Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Cryolitia PukNgae <cryolitia@uniontech.com>,
Arun Raghavan <arunr@valvesoftware.com>,
linux-sound@vger.kernel.org, linux-doc@vger.kernel.org,
linux-kernel@vger.kernel.org, Icenowy Zheng <uwu@icenowy.me>
Subject: Re: [PATCH 4/9] ALSA: usb-audio: Support string-descriptor-based quirk table entry
Date: Mon, 02 Mar 2026 10:54:57 +0100 [thread overview]
Message-ID: <87ms0qmu8e.wl-tiwai@suse.de> (raw)
In-Reply-To: <20260301213726.428505-5-i@rong.moe>
On Sun, 01 Mar 2026 22:37:20 +0100,
Rong Zhang wrote:
> @@ -2558,14 +2585,69 @@ void snd_usb_apply_flag_dbg(const char *reason,
> }
> }
>
> +#define USB_STRING_SIZE 128
> +
> +static inline int snd_usb_get_strings(struct snd_usb_audio *chip,
> + char *manufacturer, char *product)
> +{
> + int ret;
> +
> + if (manufacturer) {
> + ret = usb_string(chip->dev, chip->dev->descriptor.iManufacturer,
> + manufacturer, USB_STRING_SIZE);
> + if (ret < 0) {
> + usb_audio_warn(chip, "failed to get manufacturer string: %d\n", ret);
> + return ret;
> + }
> + }
> +
> + if (product) {
> + ret = usb_string(chip->dev, chip->dev->descriptor.iProduct,
> + product, USB_STRING_SIZE);
> + if (ret < 0) {
> + usb_audio_warn(chip, "failed to get product string: %d\n", ret);
> + return ret;
> + }
> + }
> +
> + return 1; /* ok */
> +}
> +
> void snd_usb_init_quirk_flags_table(struct snd_usb_audio *chip)
> {
> const struct usb_audio_quirk_flags_table *p;
> + char manufacturer[USB_STRING_SIZE];
> + char product[USB_STRING_SIZE];
Keeping those a bit largish strings on the stack doesn't look good.
Maybe better to do kalloc with __free(kfree).
> + int got_usb_strings = 0; /* <0: error, 0: pending, >0: ok */
I think this global flag could go wrong since...
> for (p = quirk_flags_table; p->id; p++) {
> if (chip->usb_id == p->id ||
> (!USB_ID_PRODUCT(p->id) &&
> USB_ID_VENDOR(chip->usb_id) == USB_ID_VENDOR(p->id))) {
> + if (!p->usb_string_match)
> + goto apply; /* DEVICE_FLG or VENDOR_FLG */
> +
> + /* DEVICE_STRING_FLG or VENDOR_STRING_FLG */
> + if (!got_usb_strings) {
> + got_usb_strings = snd_usb_get_strings(chip,
> + p->usb_string_match->manufacturer ? manufacturer : NULL,
> + p->usb_string_match->product ? product : NULL);
... here you try to extract strings only once, but this retrieval
depends on the current entry. If the current entry has only
manufacturer and the next entry has only product, it won't work.
IMO, a simpler way would be something like:
#define USB_STRING_SIZE 128
static char *snd_usb_get_string(struct snd_usb_audio *chip, int id)
{
char *buf = kmalloc(USB_STRING_SIZE, GFP_KERNEL);
int ret;
if (!buf)
return ERR_PTR(-ENOMEM);
ret = usb_string(chip->dev, id, buf, USB_STRING_SIZE);
if (ret < 0) {
usb_audio_warn(chip, "failed to get string for id%d: %d\n", ret);
kfree(buf);
return ERR_PTR(ret);
}
return buf;
}
void snd_usb_init_quirk_flags_table(struct snd_usb_audio *chip)
{
....
char *manufacturer __free(kfree) = NULL;
char *product __free(kfree) = NULL;
for (p = quirk_flags_table; p->id; p++) {
....
if (p->usb_string_match->manufacturer) {
if (!manufacturer)
manufaturer =
snd_usb_get_string(chip,
chip->dev->descriptor.iManufacturer);
if (!IS_ERR_OR_NULL(manufacturer) &&
strcmp(p->usb_string_match->manufacturer, manufacturer))
continue;
}
if (p->usb_string_match->product) {
if (!product)
product =
snd_usb_get_string(chip,
chip->dev->descriptor.iProduct);
if (!IS_ERR_OR_NULL(product) &&
strcmp(p->usb_string_match->product, product))
continue;
}
thanks,
Takashi
next prev parent reply other threads:[~2026-03-02 9:54 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-01 21:37 [PATCH 0/9] ALSA: usb-audio: Add quirks for linear volume devices and deconflict VID Rong Zhang
2026-03-01 21:37 ` [PATCH 1/9] Revert "ALSA: usb: Increase volume range that triggers a warning" Rong Zhang
2026-03-01 21:37 ` [PATCH 2/9] ALSA: usb-audio: Add helper function for volume range checks Rong Zhang
2026-03-01 21:37 ` [PATCH 3/9] ALSA: usb-audio: Improve " Rong Zhang
2026-03-01 21:37 ` [PATCH 4/9] ALSA: usb-audio: Support string-descriptor-based quirk table entry Rong Zhang
2026-03-02 9:54 ` Takashi Iwai [this message]
2026-03-02 12:31 ` Rong Zhang
2026-03-05 6:13 ` Terry Junge
2026-03-05 12:06 ` Takashi Iwai
2026-03-05 12:24 ` Rong Zhang
2026-03-01 21:37 ` [PATCH 5/9] ALSA: usb-audio: Deconflict VID between Focusrite Novation & MV-SILICON Rong Zhang
2026-03-01 21:37 ` [PATCH 6/9] ALSA: doc: Add doc for QUIRK_FLAG_SKIP_IFACE_SETUP of snd-usb-audio Rong Zhang
2026-03-01 21:37 ` [PATCH 7/9] ALSA: usb-audio: Add QUIRK_FLAG_MIXER_{PLAYBACK,CAPTURE}_LINEAR_VOL Rong Zhang
2026-03-01 21:37 ` [PATCH 8/9] ALSA: usb-audio: Add linear volume quirk for Hotone Audio Pulze Mini Rong Zhang
2026-03-01 21:37 ` [PATCH 9/9] ALSA: usb-audio: Apply linear volume quirk on MV-SILICON devices Rong Zhang
2026-03-02 9:59 ` [PATCH 0/9] ALSA: usb-audio: Add quirks for linear volume devices and deconflict VID Takashi Iwai
2026-03-02 12:40 ` Rong Zhang
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=87ms0qmu8e.wl-tiwai@suse.de \
--to=tiwai@suse.de \
--cc=arunr@valvesoftware.com \
--cc=corbet@lwn.net \
--cc=cryolitia@uniontech.com \
--cc=i@rong.moe \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=perex@perex.cz \
--cc=skhan@linuxfoundation.org \
--cc=tiwai@suse.com \
--cc=uwu@icenowy.me \
/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