Commit 06cd928b authored by Michal Nazarewicz's avatar Michal Nazarewicz Committed by Felipe Balbi

usb: gadget: f_midi: fix in_last_port looping logic

In general case, all of midi->in_port pointers may be non-NULL which
implies that the ‘if (\!port)’ condition will never execute thus never
zeroing midi->in_last_port.  Fix by rewriting the loop such that the
field is set to zero if \!port or end of loop has been reached.
Signed-off-by: default avatarMichal Nazarewicz <mina86@mina86.com>
Signed-off-by: default avatarFelipe Balbi <balbi@kernel.org>
parent 9a71eb56
...@@ -534,6 +534,7 @@ static void f_midi_drop_out_substreams(struct f_midi *midi) ...@@ -534,6 +534,7 @@ static void f_midi_drop_out_substreams(struct f_midi *midi)
static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep) static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep)
{ {
struct usb_request *req = NULL; struct usb_request *req = NULL;
struct gmidi_in_port *port;
unsigned int len, i; unsigned int len, i;
bool active = false; bool active = false;
int err; int err;
...@@ -557,16 +558,9 @@ static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep) ...@@ -557,16 +558,9 @@ static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep)
if (req->length > 0) if (req->length > 0)
return 0; return 0;
for (i = midi->in_last_port; i < MAX_PORTS; i++) { i = midi->in_last_port;
struct gmidi_in_port *port = midi->in_port[i]; for (; i < MAX_PORTS && (port = midi->in_port[i]); ++i) {
struct snd_rawmidi_substream *substream = midi->in_substream[i]; struct snd_rawmidi_substream *substream = midi->in_substream[i];
if (!port) {
/* Reset counter when we reach the last available port */
midi->in_last_port = 0;
break;
}
if (!port->active || !substream) if (!port->active || !substream)
continue; continue;
...@@ -581,20 +575,13 @@ static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep) ...@@ -581,20 +575,13 @@ static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep)
} }
active = !!port->active; active = !!port->active;
/* if (active)
* Check if last port is still active, which means that there is
* still data on that substream but this current request run out
* of space.
*/
if (active) {
midi->in_last_port = i;
/* There is no need to re-iterate though midi ports. */
break; break;
}
} }
midi->in_last_port = active ? i : 0;
if (req->length <= 0) if (req->length <= 0)
return active; goto done;
err = usb_ep_queue(ep, req, GFP_ATOMIC); err = usb_ep_queue(ep, req, GFP_ATOMIC);
if (err < 0) { if (err < 0) {
...@@ -607,6 +594,7 @@ static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep) ...@@ -607,6 +594,7 @@ static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep)
kfifo_put(&midi->in_req_fifo, req); kfifo_put(&midi->in_req_fifo, req);
} }
done:
return active; return active;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment