Linux USB
 help / color / mirror / Atom feed
* [PATCH v3 0/3] usb: gadget: f_uac2: allow explicit channel count independent of channel mask
@ 2026-11-03 21:14 Kyle Farrell
  2026-11-03 21:14 ` [PATCH v3 1/3] usb: gadget: f_uac2: avoid truncating calculated bandwidth Kyle Farrell
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Kyle Farrell @ 2026-11-03 21:14 UTC (permalink / raw)
  To: nkapron, gregkh
  Cc: corbet, skhan, rdunlap, linux-usb, linux-doc, flavra,
	Kyle Farrell

USB Audio Class 2.0 permits up to 255 channels in an audio channel cluster
via bNrChannels. Independently, a channel-location bitmap is specified via
bmChannelConfig for up to 27 predefined spatial locations. Setting
bmChannelConfig to zero indicates that the channels have no predefined
spatial positions.

The current UAC2 gadget driver derives bNrChannels from the number of set
bits in bmChannelConfig. Since bmChannelConfig provides 27 predefined
spatial locations this limits playback and capture streams to 27 channels.

This series allows channel counts up to the UAC2 limit of 255 without
requiring predefined spatial channel locations in bmChannelConfig.
Existing ConfigFS channel-mask configuration continues to work unchanged.
New optional playback and capture count attributes allow the number of
channels to be specified separately from the channel-location bitmap.

The series first corrects bandwidth calculation truncation, then
updates the shared u_audio implementation to accept resolved channel
counts, and finally adds explicit channel-count configuration to UAC2:

Patch 1:
  Widen the bandwidth calculation to 32 bits to prevent truncation
  before the calculated packet size is checked against the endpoint
  maximum.

Patch 2:
  Pass resolved playback and capture channel counts explicitly into
  the UAC1/UAC2 shared u_audio implementation instead of deriving them
  from channel masks.

Patch 3:
  Add ConfigFS playback/capture channel counts to the UAC2 function
  driver and use them when generating descriptors and stream
  configuration, allowing counts beyond the 27 predefined channel
  locations.

Runtime dependency:
  A separately submitted fix for u_audio_iso_complete() prevents an
  additional residue frame from exceeding the endpoint's maxpacket
  size. With allowed channel counts increasing by ~10x this existing
  issue becomes more readily exposed. The fix is not included in this
  series and was submitted previously.
  Link: https://lore.kernel.org/linux-usb/20261026231026.721536-1-kaf@nwlink.com/


Testing
Testing was performed using a Raspberry Pi Zero 2 W running the
rpi-6.18.y kernel with this patch series applied. Streaming and
descriptor validation were performed against both Linux and macOS
hosts. Windows hosts were not tested.

UAC1
  - Verified playback/capture operation via alsaloop.
  - No descriptor or behavioral changes observed.

UAC2
  - Verified legacy channel-mask configuration (up to 27 channels).
  - Verified explicit channel-count mode with 2, 28, 61, 62, 96 channels.
  - Verified invalid channel-count/channel-mask combinations are rejected.
  - Verified Feature Unit descriptor size limits at 61/62 channel boundary.
  - Verified descriptors including:
      * bNrChannels
      * bmChannelConfig
      * Feature Unit presence and bLength
      * AudioControl wTotalLength
      * endpoint wMaxPacketSize
  - Verified ALSA-reported playback and capture channel counts.
  - Verified streaming using alsaloop.

Changes in v3:
  - Widen bandwidth calculation to 32-bit.
  - Remove now-unused channel mask fields from uac_params.
  - Document dependency on the separately submitted residue frame
    packet size fix (u_audio_iso_complete()).
  - Remove Assisted-by: LLM attribution
  - Link to v2: https://lore.kernel.org/linux-usb/20261016162534.384844-1-kaf@nwlink.com/

Changes in v2:
  - Edit commit messages for clarity and brevity.
  - Add Assisted-by: LLM attribution.
  - No code changes.
  - Link to v1: https://lore.kernel.org/linux-usb/20260729054115.889174-1-kaf@nwlink.com/

Kyle Farrell (3):
  usb: gadget: f_uac2: avoid truncating calculated bandwidth
  usb: gadget: u_audio: pass channel counts explicitly
  usb: gadget: f_uac2: allow explicit channel count independent of
    channel mask

 .../ABI/testing/configfs-usb-gadget-uac2      | 18 +++-
 Documentation/usb/gadget-testing.rst          | 18 +++-
 drivers/usb/gadget/function/f_uac1.c          |  4 +-
 drivers/usb/gadget/function/f_uac2.c          | 84 +++++++++++++------
 drivers/usb/gadget/function/u_audio.c         | 32 ++++---
 drivers/usb/gadget/function/u_audio.h         |  4 +-
 drivers/usb/gadget/function/u_uac2.h          |  4 +
 7 files changed, 113 insertions(+), 51 deletions(-)


base-commit: 6628e7d4c6b25c8d18f1345e3a20d21829aae7e4
prerequisite-patch-id: 252c6902eb4bd4f6456cd86e4c123e8001e70a11
-- 
2.34.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2026-11-03 21:25 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-03 21:14 [PATCH v3 0/3] usb: gadget: f_uac2: allow explicit channel count independent of channel mask Kyle Farrell
2026-11-03 21:14 ` [PATCH v3 1/3] usb: gadget: f_uac2: avoid truncating calculated bandwidth Kyle Farrell
2026-11-03 21:25   ` sashiko-bot
2026-11-03 21:14 ` [PATCH v3 2/3] usb: gadget: u_audio: pass channel counts explicitly Kyle Farrell
2026-11-03 21:24   ` sashiko-bot
2026-11-03 21:14 ` [PATCH v3 3/3] usb: gadget: f_uac2: allow explicit channel count independent of channel mask Kyle Farrell
2026-11-03 21:24   ` sashiko-bot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox