mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 14:24:11 +08:00
usb: gadget: midi2: Fix incorrect default MIDI2 protocol setup
commit3eb27d3e32
upstream. 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
82c94e6a7b
commit
0c77797849
@ -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