summaryrefslogtreecommitdiff
path: root/sound/firewire/lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/firewire/lib.c')
-rw-r--r--sound/firewire/lib.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/sound/firewire/lib.c b/sound/firewire/lib.c
index 9a98c7c..edf1c8b 100644
--- a/sound/firewire/lib.c
+++ b/sound/firewire/lib.c
@@ -79,6 +79,9 @@ static void async_midi_port_callback(struct fw_card *card, int rcode,
else if (!rcode_is_permanent_error(rcode))
/* To start next transaction immediately for recovery. */
port->next_ktime = ktime_set(0, 0);
+ else
+ /* Don't continue processing. */
+ port->error = true;
port->idling = true;
@@ -94,8 +97,8 @@ static void midi_port_work(struct work_struct *work)
int generation;
int type;
- /* Under transacting. */
- if (!port->idling)
+ /* Under transacting or error state. */
+ if (!port->idling || port->error)
return;
/* Nothing to do. */
@@ -119,6 +122,9 @@ static void midi_port_work(struct work_struct *work)
if (port->consume_bytes == 0) {
port->next_ktime = ktime_set(0, 0);
schedule_work(&port->work);
+ } else {
+ /* Fatal error. */
+ port->error = true;
}
return;
}
@@ -178,6 +184,7 @@ int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port,
port->fill = fill;
port->idling = true;
port->next_ktime = ktime_set(0, 0);
+ port->error = false;
INIT_WORK(&port->work, midi_port_work);