From nobody Tue Jun 16 08:57:37 2026 Received: from mail-dy1-f179.google.com (mail-dy1-f179.google.com [74.125.82.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 020D839936E for ; Fri, 17 Apr 2026 13:41:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776433307; cv=none; b=fyv5jMQe7OR6OyN2QuWuydLY13sLYQkUjgeYeUEq59jvMp+cLxBz1G34Wu8FydXLGJu2I3Em4k5Lg/nEu2XjeDodyOUBD2fwhUyylJ0cj17n8GWRdUqXk5sdwUFm0jIUuqY0pXmM1LVWaKRa5yeQrGixOzLWw+FLt6jt1rQ9s7k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776433307; c=relaxed/simple; bh=vAsdrN1qUjlvacNFFCfWkF4Ca43k/gLpHDrFlW9mC8M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=rs02E0JOYoGl/VLe4tAXtKL6EfZ4QBFwzeXdg3Fc1LDgR5y2V1cjQWl6Qa3WN5bAi0R+ZL9hiRmmaRwsYNry34/ihOAMGFwgOdwQkbluqr05anr7PFhS6eujyJh2SZrLOF+b6ZLUIIIxBG67i0BbcU+fXkEHq766jJzuQzMLi/Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=F6k6re/M; arc=none smtp.client-ip=74.125.82.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="F6k6re/M" Received: by mail-dy1-f179.google.com with SMTP id 5a478bee46e88-2d8ffdc31d0so1599546eec.0 for ; Fri, 17 Apr 2026 06:41:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776433305; x=1777038105; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=f1jlidpPjctYjeym7P6Lu8ZRVlY1+ZMJFmS1v/Na3+c=; b=F6k6re/MghHrbLw1lwB8jFsR0lTTaaBERq5DUbjzqqqSYGriMTx4+LLfeM5CivfmOQ lD0O3Z98JyK15gWnanswmnWaZ6T3Kf5lBhNFxNjKAncb2LW9b1uaup8iypS2SZEG0Nbt GsvHA5v7KFDz9WZvotoKcfd+ady9jMRGShpKJ3qBBpBO740NqMxhiTTWn0VmKmKZn2lk QJfuRUTjcUZzB/rJ1TZHfKS3TQqNPZk6l4t+y5QHfLuY/bGinS8z8eti6tIiiE+xCe8l v+Vi3tGamyr+19F3eDUNM2sS6egLyCrde1m9KMrwsGNKZi/9aupTmYtmk+fNlF4DHZSE TItg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776433305; x=1777038105; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=f1jlidpPjctYjeym7P6Lu8ZRVlY1+ZMJFmS1v/Na3+c=; b=PKNqtPqUux4wox9amRspQcDJYpEEUkCKbBJ3kbYzSECbNgKzQEo2ZR7Eb9TF/5YLFs ucgbyTxNYhT+y/nijxUzpj96DRnEeixbEWS3VwAA8wLUUqyZWAh/yKGHr8aW7LTsgllK QmWxtij70YSj5qHx1ntlQ9dbLqqgVTfi2LAzEjHVdgb4De5bc3mjWOL7BKEomxQpmHtm /poHzKjTTYb+nuK8UFHnuZ4sXxwxhj1urZaI6pTBnJw5dgGCeDngoWDqCec4bpNfOGtr M9dRmI8jqdbNmp/5BQd9806OyRvfvN0pqg9+qsqzZJ7StPRM2onVqKBBi4OeiAudBctg F6MQ== X-Forwarded-Encrypted: i=1; AFNElJ8hBMaZZCLIB0tUMuvbfmuxaxHdbzHE+/FW8ZSbAsUw1GIdwPOydJhMsIj7FxsdTfYq/rtLjTersm04z+Q=@vger.kernel.org X-Gm-Message-State: AOJu0YxKNlpxSkxCM84amXtMz3K2B+lGLsLPqoaJid9Hc4btf04lwiwq 6ihoSzoaW3uGwJUEnKtceNP0yJLd9Cicce7gZ/fglC7uW5UB+XepRotb X-Gm-Gg: AeBDiesbvtuN+u/3sPpvYzgNsOn5+/bwDmr5qnU21laIr7XzpBl33W4X3WxkOPEGa+U crM8SxxVxiM1fs2DexvZjC8CuxH9+wui1eXbbqM3H3T1QsipR+TtCutvDP311TP0xowRdMyRCFg n424CpEI1GRTB3llDjR/m1gR0Y8Vp5f9vKnzinIUoeplwIuT4vdYNAO5vESO91kkvUhEMsskHy+ m9eGGQ6l1qSPLowCMVpZ1Cr0piWv95mhZVUUDqVg1RIesm0lFVl34VwaNjnd9MUiKm6Ip4zz/sh oeCyorbN2Qu6blMcdHBSGQskPHjL3MscjAMVWZ4SRM4bcWSNhdwwOWjRYoOTTyutxgzy+LGM5Mu jqKCvFi0cdvgDmEDi75+1c6O8gUtNyE0BMlUT1MGFHWwyrYdYIf4Yh5YALwYp4ulJ3LdytKFi5z g3ABb2U9simvZyrMN7ajFTwdR0SB5BonkqNlr5bLziINz1Lgai4tuVVPO7RIBdwVN8+2/q1EzXF NOUrWNc1B/eqwM= X-Received: by 2002:a05:693c:3007:b0:2be:2cfe:68b7 with SMTP id 5a478bee46e88-2e465293e13mr1388314eec.11.1776433304833; Fri, 17 Apr 2026 06:41:44 -0700 (PDT) Received: from [192.168.1.18] (177-4-160-195.user3p.v-tal.net.br. [177.4.160.195]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2e539fa6134sm2153782eec.3.2026.04.17.06.41.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Apr 2026 06:41:44 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Fri, 17 Apr 2026 10:41:33 -0300 Subject: [PATCH] ALSA: caiaq: Fix control_put() result and cache rollback Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260417-caiaq-control-put-v1-1-c37826e92447@gmail.com> X-B4-Tracking: v=1; b=H4sIAAAAAAAC/yXMSwqEMBAA0atIr21I/ONVxEWMrbZIokkcBsS7T xyXb1F1gSfH5KFNLnD0Yc/WRMg0Ab0oMxPyGA2ZyCpRyAq1YnWgtiY4u+F+BizFQI2qRZHLEWK 3O5r4+392/Wt/Divp8Izgvn/h8AcSdQAAAA== X-Change-ID: 20260416-caiaq-control-put-50be8a70431d To: Takashi Iwai , Daniel Mack , Jaroslav Kysela Cc: Daniel Mack , linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org, =?utf-8?q?C=C3=A1ssio_Gabriel?= X-Mailer: b4 0.15.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=3795; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=vAsdrN1qUjlvacNFFCfWkF4Ca43k/gLpHDrFlW9mC8M=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDJmPLCZI2K57tyJ0pZTVlBVlMwRWM0ke0n4rG1df977nn mxmzWaXjlIWBjEuBlkxRZbVSYss93Q9uFoft8IDZg4rE8gQBi5OAZjIVjOG/9FyyWrM0928Nu9e /83D4NGk307Np52nasmZ7lZPrnByMWX4nxOpsvEp96N9Pbt5W+/N+F6wJmjOInud4v/nZU/tkL2 zhBMA X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 control_put() always returns 1 and updates cdev->control_state[] before sending the USB command. It also ignores transport errors from usb_bulk_msg(), snd_usb_caiaq_send_command(), and snd_usb_caiaq_send_command_bank(). That breaks the ALSA .put() contract and can leave control_get() reporting a cached value the device never accepted. Return 0 for unchanged values, propagate transport failures, and restore the cached byte when the write fails. Fixes: 8e3cd08ed8e59 ("[ALSA] caiaq - add control API and more input featur= es") Cc: stable@vger.kernel.org Signed-off-by: C=C3=A1ssio Gabriel --- sound/usb/caiaq/control.c | 52 ++++++++++++++++++++++++++++++++-----------= ---- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/sound/usb/caiaq/control.c b/sound/usb/caiaq/control.c index af459c49baf4..4598fb7e8be0 100644 --- a/sound/usb/caiaq/control.c +++ b/sound/usb/caiaq/control.c @@ -87,6 +87,7 @@ static int control_put(struct snd_kcontrol *kcontrol, struct snd_usb_caiaqdev *cdev =3D caiaqdev(chip->card); int pos =3D kcontrol->private_value; int v =3D ucontrol->value.integer.value[0]; + int ret; unsigned char cmd; =20 switch (cdev->chip.usb_id) { @@ -103,6 +104,10 @@ static int control_put(struct snd_kcontrol *kcontrol, =20 if (pos & CNT_INTVAL) { int i =3D pos & ~CNT_INTVAL; + unsigned char old =3D cdev->control_state[i]; + + if (old =3D=3D v) + return 0; =20 cdev->control_state[i] =3D v; =20 @@ -113,10 +118,11 @@ static int control_put(struct snd_kcontrol *kcontrol, cdev->ep8_out_buf[0] =3D i; cdev->ep8_out_buf[1] =3D v; =20 - usb_bulk_msg(cdev->chip.dev, - usb_sndbulkpipe(cdev->chip.dev, 8), - cdev->ep8_out_buf, sizeof(cdev->ep8_out_buf), - &actual_len, 200); + ret =3D usb_bulk_msg(cdev->chip.dev, + usb_sndbulkpipe(cdev->chip.dev, 8), + cdev->ep8_out_buf, + sizeof(cdev->ep8_out_buf), + &actual_len, 200); } else if (cdev->chip.usb_id =3D=3D USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER)) { =20 @@ -128,21 +134,36 @@ static int control_put(struct snd_kcontrol *kcontrol, offset =3D MASCHINE_BANK_SIZE; } =20 - snd_usb_caiaq_send_command_bank(cdev, cmd, bank, - cdev->control_state + offset, - MASCHINE_BANK_SIZE); + ret =3D snd_usb_caiaq_send_command_bank(cdev, cmd, bank, + cdev->control_state + offset, + MASCHINE_BANK_SIZE); } else { - snd_usb_caiaq_send_command(cdev, cmd, - cdev->control_state, sizeof(cdev->control_state)); + ret =3D snd_usb_caiaq_send_command(cdev, cmd, + cdev->control_state, + sizeof(cdev->control_state)); + } + + if (ret < 0) { + cdev->control_state[i] =3D old; + return ret; } } else { - if (v) - cdev->control_state[pos / 8] |=3D 1 << (pos % 8); - else - cdev->control_state[pos / 8] &=3D ~(1 << (pos % 8)); + int idx =3D pos / 8; + unsigned char mask =3D 1 << (pos % 8); + unsigned char old =3D cdev->control_state[idx]; + unsigned char val =3D v ? (old | mask) : (old & ~mask); =20 - snd_usb_caiaq_send_command(cdev, cmd, - cdev->control_state, sizeof(cdev->control_state)); + if (old =3D=3D val) + return 0; + + cdev->control_state[idx] =3D val; + ret =3D snd_usb_caiaq_send_command(cdev, cmd, + cdev->control_state, + sizeof(cdev->control_state)); + if (ret < 0) { + cdev->control_state[idx] =3D old; + return ret; + } } =20 return 1; @@ -640,4 +661,3 @@ int snd_usb_caiaq_control_init(struct snd_usb_caiaqdev = *cdev) =20 return ret; } - --- base-commit: c4643e7c7f45a07f26e01a4a617b859c01dabb3d change-id: 20260416-caiaq-control-put-50be8a70431d Best regards, -- =20 C=C3=A1ssio Gabriel