mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-04 04:06:26 +00:00
usb: gadget: midi2: Fix incorrect default MIDI2 protocol setup
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: 29ee7a4ddd
("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>
This commit is contained in:
parent
179264157b
commit
3eb27d3e32
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user