Commit 9a71eb56 authored by Michal Nazarewicz's avatar Michal Nazarewicz Committed by Felipe Balbi

usb: gadget: f_midi: move some of f_midi_transmit to separate func

Move some of the f_midi_transmit to a separate f_midi_do_transmit
function so the massive indention levels are not so jarring.  This
introduces no changes in behaviour.
Signed-off-by: default avatarMichal Nazarewicz <mina86@mina86.com>
Signed-off-by: default avatarFelipe Balbi <balbi@kernel.org>
parent f297e86c
...@@ -531,84 +531,99 @@ static void f_midi_drop_out_substreams(struct f_midi *midi) ...@@ -531,84 +531,99 @@ static void f_midi_drop_out_substreams(struct f_midi *midi)
} }
} }
static void f_midi_transmit(struct f_midi *midi) static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep)
{ {
struct usb_ep *ep = midi->in_ep; struct usb_request *req = NULL;
bool active; unsigned int len, i;
bool active = false;
int err;
/* We only care about USB requests if IN endpoint is enabled */ /*
if (!ep || !ep->enabled) * We peek the request in order to reuse it if it fails to enqueue on
goto drop_out; * its endpoint
*/
len = kfifo_peek(&midi->in_req_fifo, &req);
if (len != 1) {
ERROR(midi, "%s: Couldn't get usb request\n", __func__);
return -1;
}
do { /*
struct usb_request *req = NULL; * If buffer overrun, then we ignore this transmission.
unsigned int len, i; * IMPORTANT: This will cause the user-space rawmidi device to block
* until a) usb requests have been completed or b) snd_rawmidi_write()
* times out.
*/
if (req->length > 0)
return 0;
active = false; for (i = midi->in_last_port; i < MAX_PORTS; i++) {
struct gmidi_in_port *port = midi->in_port[i];
struct snd_rawmidi_substream *substream = midi->in_substream[i];
/* We peek the request in order to reuse it if it fails if (!port) {
* to enqueue on its endpoint */ /* Reset counter when we reach the last available port */
len = kfifo_peek(&midi->in_req_fifo, &req); midi->in_last_port = 0;
if (len != 1) { break;
ERROR(midi, "%s: Couldn't get usb request\n", __func__);
goto drop_out;
} }
/* If buffer overrun, then we ignore this transmission. if (!port->active || !substream)
* IMPORTANT: This will cause the user-space rawmidi device to block until a) usb continue;
* requests have been completed or b) snd_rawmidi_write() times out. */
if (req->length > 0)
return;
for (i = midi->in_last_port; i < MAX_PORTS; i++) { while (req->length + 3 < midi->buflen) {
struct gmidi_in_port *port = midi->in_port[i]; uint8_t b;
struct snd_rawmidi_substream *substream = midi->in_substream[i];
if (!port) { if (snd_rawmidi_transmit(substream, &b, 1) != 1) {
/* Reset counter when we reach the last available port */ port->active = 0;
midi->in_last_port = 0;
break; break;
} }
f_midi_transmit_byte(req, port, b);
}
active = !!port->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;
}
}
if (!port->active || !substream) if (req->length <= 0)
continue; return active;
while (req->length + 3 < midi->buflen) { err = usb_ep_queue(ep, req, GFP_ATOMIC);
uint8_t b; if (err < 0) {
ERROR(midi, "%s failed to queue req: %d\n",
midi->in_ep->name, err);
req->length = 0; /* Re-use request next time. */
} else {
/* Upon success, put request at the back of the queue. */
kfifo_skip(&midi->in_req_fifo);
kfifo_put(&midi->in_req_fifo, req);
}
if (snd_rawmidi_transmit(substream, &b, 1) != 1) { return active;
port->active = 0; }
break;
}
f_midi_transmit_byte(req, port, b);
}
active = !!port->active; static void f_midi_transmit(struct f_midi *midi)
/* Check if last port is still active, which means that {
* there is still data on that substream but this current struct usb_ep *ep = midi->in_ep;
* request run out of space. */ int ret;
if (active) {
midi->in_last_port = i;
/* There is no need to re-iterate though midi ports. */
break;
}
}
if (req->length > 0) { /* We only care about USB requests if IN endpoint is enabled */
int err; if (!ep || !ep->enabled)
goto drop_out;
err = usb_ep_queue(ep, req, GFP_ATOMIC); do {
if (err < 0) { ret = f_midi_do_transmit(midi, ep);
ERROR(midi, "%s failed to queue req: %d\n", if (ret < 0)
midi->in_ep->name, err); goto drop_out;
req->length = 0; /* Re-use request next time. */ } while (ret);
} else {
/* Upon success, put request at the back of the queue. */
kfifo_skip(&midi->in_req_fifo);
kfifo_put(&midi->in_req_fifo, req);
}
}
} while (active);
return; return;
......
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