]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
usb: gadget: midi2: Fix the response for FB info with block 0xff
authorTakashi Iwai <tiwai@suse.de>
Wed, 17 Jul 2024 09:50:53 +0000 (11:50 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 31 Jul 2024 08:38:53 +0000 (10:38 +0200)
When the block number 0xff is given to Function Block Discovery
message, the device should return the information of all Function
Blocks, but currently the gadget driver treats it as an error.

Implement the proper behavior for the block 0xff instead.

Fixes: 8b645922b223 ("usb: gadget: Add support for USB MIDI 2.0 function driver")
Cc: stable@vger.kernel.org
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://lore.kernel.org/r/20240717095102.10493-1-tiwai@suse.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/function/f_midi2.c

index 38e8ed3144f0603ce69cb33fa488a36ebdb4e388..3f63253ad3e074e7baf7f95d07173e627893e6cc 100644 (file)
@@ -642,12 +642,21 @@ static void process_ump_stream_msg(struct f_midi2_ep *ep, const u32 *data)
                if (format)
                        return; // invalid
                blk = (*data >> 8) & 0xff;
-               if (blk >= ep->num_blks)
-                       return;
-               if (*data & UMP_STREAM_MSG_REQUEST_FB_INFO)
-                       reply_ump_stream_fb_info(ep, blk);
-               if (*data & UMP_STREAM_MSG_REQUEST_FB_NAME)
-                       reply_ump_stream_fb_name(ep, blk);
+               if (blk == 0xff) {
+                       /* inquiry for all blocks */
+                       for (blk = 0; blk < ep->num_blks; blk++) {
+                               if (*data & UMP_STREAM_MSG_REQUEST_FB_INFO)
+                                       reply_ump_stream_fb_info(ep, blk);
+                               if (*data & UMP_STREAM_MSG_REQUEST_FB_NAME)
+                                       reply_ump_stream_fb_name(ep, blk);
+                       }
+               } else if (blk < ep->num_blks) {
+                       /* only the specified block */
+                       if (*data & UMP_STREAM_MSG_REQUEST_FB_INFO)
+                               reply_ump_stream_fb_info(ep, blk);
+                       if (*data & UMP_STREAM_MSG_REQUEST_FB_NAME)
+                               reply_ump_stream_fb_name(ep, blk);
+               }
                return;
        }
 }