summaryrefslogtreecommitdiff
path: root/sound/usb
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2023-05-23 09:53:37 +0200
committerTakashi Iwai <tiwai@suse.de>2023-05-23 12:11:13 +0200
commitf4487c42aae596f02e0cb02a028d2a107ec1737d (patch)
tree2cc72df2d5c71f98a28562f9f9c97cf2932dedcd /sound/usb
parentec362b63c4b560006666998c582edc76a2f77910 (diff)
ALSA: usb-audio: Inform inconsistent protocols in GTBs
When parsing Group Terminal Blocks, we overwrote the preferred protocol and the protocol capabilities silently from the last parsed GTB. This patch adds the information print indicating the unexpected overrides instead of silent action. Reviewed-by: Jaroslav Kysela <perex@perex.cz> Link: https://lore.kernel.org/r/20230523075358.9672-17-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/usb')
-rw-r--r--sound/usb/midi2.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/sound/usb/midi2.c b/sound/usb/midi2.c
index f3fba8b07cb3..341783418a6a 100644
--- a/sound/usb/midi2.c
+++ b/sound/usb/midi2.c
@@ -581,6 +581,7 @@ static int parse_group_terminal_block(struct snd_usb_midi2_ump *rmidi,
const struct usb_ms20_gr_trm_block_descriptor *desc)
{
struct snd_ump_endpoint *ump = rmidi->ump;
+ unsigned int protocol, protocol_caps;
/* set default protocol */
switch (desc->bMIDIProtocol) {
@@ -588,24 +589,40 @@ static int parse_group_terminal_block(struct snd_usb_midi2_ump *rmidi,
case USB_MS_MIDI_PROTO_1_0_64_JRTS:
case USB_MS_MIDI_PROTO_1_0_128:
case USB_MS_MIDI_PROTO_1_0_128_JRTS:
- ump->info.protocol = SNDRV_UMP_EP_INFO_PROTO_MIDI1;
+ protocol = SNDRV_UMP_EP_INFO_PROTO_MIDI1;
break;
case USB_MS_MIDI_PROTO_2_0:
case USB_MS_MIDI_PROTO_2_0_JRTS:
- ump->info.protocol = SNDRV_UMP_EP_INFO_PROTO_MIDI2;
+ protocol = SNDRV_UMP_EP_INFO_PROTO_MIDI2;
break;
+ default:
+ return 0;
}
- ump->info.protocol_caps = ump->info.protocol;
+ if (ump->info.protocol && ump->info.protocol != protocol)
+ usb_audio_info(rmidi->umidi->chip,
+ "Overriding preferred MIDI protocol in GTB %d: %x -> %x\n",
+ rmidi->usb_block_id, ump->info.protocol,
+ protocol);
+ ump->info.protocol = protocol;
+
+ protocol_caps = protocol;
switch (desc->bMIDIProtocol) {
case USB_MS_MIDI_PROTO_1_0_64_JRTS:
case USB_MS_MIDI_PROTO_1_0_128_JRTS:
case USB_MS_MIDI_PROTO_2_0_JRTS:
- ump->info.protocol_caps |= SNDRV_UMP_EP_INFO_PROTO_JRTS_TX |
+ protocol_caps |= SNDRV_UMP_EP_INFO_PROTO_JRTS_TX |
SNDRV_UMP_EP_INFO_PROTO_JRTS_RX;
break;
}
+ if (ump->info.protocol_caps && ump->info.protocol_caps != protocol_caps)
+ usb_audio_info(rmidi->umidi->chip,
+ "Overriding MIDI protocol caps in GTB %d: %x -> %x\n",
+ rmidi->usb_block_id, ump->info.protocol_caps,
+ protocol_caps);
+ ump->info.protocol_caps = protocol_caps;
+
return 0;
}