summaryrefslogtreecommitdiff
path: root/drivers/firewire/ohci.c
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2024-09-12 22:30:34 +0900
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>2024-09-12 22:30:34 +0900
commitc45b9a07b6392fa224ca76b89f24dae1046eef09 (patch)
tree9471d2dbdf0b4fe564f250effb59c1f949e33138 /drivers/firewire/ohci.c
parentf877f1d81b2ffcac341ff62ae076d7ad5ba83f46 (diff)
Revert "firewire: core: use mutex to coordinate concurrent calls to flush completions"
This reverts commit d9605d67562505e27dcc0f71af418118d3db91e5, since this commit is on the following reverted changes. Link: https://lore.kernel.org/r/20240912133038.238786-2-o-takashi@sakamocchi.jp Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Diffstat (limited to 'drivers/firewire/ohci.c')
-rw-r--r--drivers/firewire/ohci.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c
index b182998a77f4..02ff0363d3ad 100644
--- a/drivers/firewire/ohci.c
+++ b/drivers/firewire/ohci.c
@@ -166,6 +166,7 @@ struct iso_context {
struct context context;
void *header;
size_t header_length;
+ unsigned long flushing_completions;
u32 mc_buffer_bus;
u16 mc_completed;
u16 last_timestamp;
@@ -3578,23 +3579,31 @@ static void ohci_flush_queue_iso(struct fw_iso_context *base)
static int ohci_flush_iso_completions(struct fw_iso_context *base)
{
struct iso_context *ctx = container_of(base, struct iso_context, base);
+ int ret = 0;
- // Note that tasklet softIRQ is not used to process isochronous context anymore.
- context_tasklet((unsigned long)&ctx->context);
+ if (!test_and_set_bit_lock(0, &ctx->flushing_completions)) {
+ // Note that tasklet softIRQ is not used to process isochronous context anymore.
+ context_tasklet((unsigned long)&ctx->context);
- switch (base->type) {
- case FW_ISO_CONTEXT_TRANSMIT:
- case FW_ISO_CONTEXT_RECEIVE:
- if (ctx->header_length != 0)
- flush_iso_completions(ctx, FW_ISO_CONTEXT_COMPLETIONS_CAUSE_FLUSH);
- return 0;
- case FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL:
- if (ctx->mc_completed != 0)
- flush_ir_buffer_fill(ctx);
- return 0;
- default:
- return -ENOSYS;
+ switch (base->type) {
+ case FW_ISO_CONTEXT_TRANSMIT:
+ case FW_ISO_CONTEXT_RECEIVE:
+ if (ctx->header_length != 0)
+ flush_iso_completions(ctx, FW_ISO_CONTEXT_COMPLETIONS_CAUSE_FLUSH);
+ break;
+ case FW_ISO_CONTEXT_RECEIVE_MULTICHANNEL:
+ if (ctx->mc_completed != 0)
+ flush_ir_buffer_fill(ctx);
+ break;
+ default:
+ ret = -ENOSYS;
+ }
+
+ clear_bit_unlock(0, &ctx->flushing_completions);
+ smp_mb__after_atomic();
}
+
+ return ret;
}
static const struct fw_card_driver ohci_driver = {