]> git.ipfire.org Git - thirdparty/kernel/stable.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, 14 Aug 2024 13:34:27 +0000 (15:34 +0200)
commit 228a953e61d6d608a3facc1c3a27b9fb03c99de7 upstream.

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 0e38bb145e8f53229f39080b7a3be80794436fed..6908fdd4a83f3ae922fa19435da3e6db4ccd0f70 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;
        }
 }