]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
usb: gadget: midi2: Fix incorrect default MIDI2 protocol setup
authorTakashi Iwai <tiwai@suse.de>
Mon, 8 Jul 2024 09:57:17 +0000 (11:57 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 10 Jul 2024 11:55:50 +0000 (13:55 +0200)
The MIDI2 gadget driver handled the default MIDI protocol version
incorrectly due to the confusion of the protocol version passed via
configfs (either 1 or 2) and UMP protocol bits (0x100 / 0x200).
As a consequence, the default protocol always resulted in MIDI1.

This patch addresses the misunderstanding of the protocol handling.

Fixes: 29ee7a4dddd5 ("usb: gadget: midi2: Add configfs support")
Cc: stable <stable@kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://lore.kernel.org/r/20240708095719.25627-1-tiwai@suse.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/function/f_midi2.c

index c765f54e613dce9d0182d48e45e5677d23ab564f..38e8ed3144f0603ce69cb33fa488a36ebdb4e388 100644 (file)
@@ -150,6 +150,9 @@ struct f_midi2 {
 
 #define func_to_midi2(f)       container_of(f, struct f_midi2, func)
 
+/* convert from MIDI protocol number (1 or 2) to SNDRV_UMP_EP_INFO_PROTO_* */
+#define to_ump_protocol(v)     (((v) & 3) << 8)
+
 /* get EP name string */
 static const char *ump_ep_name(const struct f_midi2_ep *ep)
 {
@@ -564,8 +567,7 @@ static void reply_ump_stream_ep_config(struct f_midi2_ep *ep)
                .status = UMP_STREAM_MSG_STATUS_STREAM_CFG,
        };
 
-       if ((ep->info.protocol & SNDRV_UMP_EP_INFO_PROTO_MIDI_MASK) ==
-           SNDRV_UMP_EP_INFO_PROTO_MIDI2)
+       if (ep->info.protocol == 2)
                rep.protocol = UMP_STREAM_MSG_EP_INFO_CAP_MIDI2 >> 8;
        else
                rep.protocol = UMP_STREAM_MSG_EP_INFO_CAP_MIDI1 >> 8;
@@ -627,13 +629,13 @@ static void process_ump_stream_msg(struct f_midi2_ep *ep, const u32 *data)
                return;
        case UMP_STREAM_MSG_STATUS_STREAM_CFG_REQUEST:
                if (*data & UMP_STREAM_MSG_EP_INFO_CAP_MIDI2) {
-                       ep->info.protocol = SNDRV_UMP_EP_INFO_PROTO_MIDI2;
+                       ep->info.protocol = 2;
                        DBG(midi2, "Switching Protocol to MIDI2\n");
                } else {
-                       ep->info.protocol = SNDRV_UMP_EP_INFO_PROTO_MIDI1;
+                       ep->info.protocol = 1;
                        DBG(midi2, "Switching Protocol to MIDI1\n");
                }
-               snd_ump_switch_protocol(ep->ump, ep->info.protocol);
+               snd_ump_switch_protocol(ep->ump, to_ump_protocol(ep->info.protocol));
                reply_ump_stream_ep_config(ep);
                return;
        case UMP_STREAM_MSG_STATUS_FB_DISCOVERY:
@@ -1065,7 +1067,8 @@ static void f_midi2_midi1_ep_out_complete(struct usb_ep *usb_ep,
                group = midi2->out_cable_mapping[cable].group;
                bytes = midi1_packet_bytes[*buf & 0x0f];
                for (c = 0; c < bytes; c++) {
-                       snd_ump_convert_to_ump(cvt, group, ep->info.protocol,
+                       snd_ump_convert_to_ump(cvt, group,
+                                              to_ump_protocol(ep->info.protocol),
                                               buf[c + 1]);
                        if (cvt->ump_bytes) {
                                snd_ump_receive(ep->ump, cvt->ump,
@@ -1375,7 +1378,7 @@ static void assign_block_descriptors(struct f_midi2 *midi2,
                        desc->nNumGroupTrm = b->num_groups;
                        desc->iBlockItem = ep->blks[blk].string_id;
 
-                       if (ep->info.protocol & SNDRV_UMP_EP_INFO_PROTO_MIDI2)
+                       if (ep->info.protocol == 2)
                                desc->bMIDIProtocol = USB_MS_MIDI_PROTO_2_0;
                        else
                                desc->bMIDIProtocol = USB_MS_MIDI_PROTO_1_0_128;
@@ -1552,7 +1555,7 @@ static int f_midi2_create_card(struct f_midi2 *midi2)
                if (midi2->info.static_block)
                        ump->info.flags |= SNDRV_UMP_EP_INFO_STATIC_BLOCKS;
                ump->info.protocol_caps = (ep->info.protocol_caps & 3) << 8;
-               ump->info.protocol = (ep->info.protocol & 3) << 8;
+               ump->info.protocol = to_ump_protocol(ep->info.protocol);
                ump->info.version = 0x0101;
                ump->info.family_id = ep->info.family;
                ump->info.model_id = ep->info.model;