ALSA: firewire-lib: add a restriction for a transaction at once
Currently, when waiting for a response, callers can start another
transaction by scheduling another work. This is not good for error
processing of transaction, especially the first response is too late.
This commit serialize request/response transactions, by adding one
boolean member to represent idling state.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
diff --git a/sound/firewire/lib.c b/sound/firewire/lib.c
index 03ada3f..ddc3e88 100644
--- a/sound/firewire/lib.c
+++ b/sound/firewire/lib.c
@@ -76,6 +76,8 @@
if (rcode == RCODE_COMPLETE && substream != NULL)
snd_rawmidi_transmit_ack(substream, port->consume_bytes);
+
+ port->idling = true;
}
static void midi_port_work(struct work_struct *work)
@@ -86,6 +88,10 @@
int generation;
int type;
+ /* Under transacting. */
+ if (!port->idling)
+ return;
+
/* Nothing to do. */
if (substream == NULL || snd_rawmidi_transmit_empty(substream))
return;
@@ -110,6 +116,8 @@
type = TCODE_WRITE_BLOCK_REQUEST;
/* Start this transaction. */
+ port->idling = false;
+
/*
* In Linux FireWire core, when generation is updated with memory
* barrier, node id has already been updated. In this module, After
@@ -150,6 +158,7 @@
port->parent = fw_parent_device(unit);
port->addr = addr;
port->fill = fill;
+ port->idling = true;
INIT_WORK(&port->work, midi_port_work);