Skip to content

Commit

Permalink
firewire: ohci: cache the context run bit
Browse files Browse the repository at this point in the history
The DMA context run control bit is entirely controlled by software, so
it is safe to cache it.  This allows the driver to avoid doing an
additional MMIO read when queueing an AT packet.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
  • Loading branch information
Clemens Ladisch authored and Stefan Richter committed Jan 4, 2011
1 parent 78dec56 commit 386a415
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions drivers/firewire/ohci.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ struct context {
struct fw_ohci *ohci;
u32 regs;
int total_allocation;
bool running;
bool flushing;

/*
Expand Down Expand Up @@ -1174,6 +1175,7 @@ static void context_run(struct context *ctx, u32 extra)
le32_to_cpu(ctx->last->branch_address));
reg_write(ohci, CONTROL_CLEAR(ctx->regs), ~0);
reg_write(ohci, CONTROL_SET(ctx->regs), CONTEXT_RUN | extra);
ctx->running = true;
flush_writes(ohci);
}

Expand Down Expand Up @@ -1202,6 +1204,7 @@ static void context_stop(struct context *ctx)

ctx->active = false;
reg_write(ctx->ohci, CONTROL_CLEAR(ctx->regs), CONTEXT_RUN);
ctx->running = false;
flush_writes(ctx->ohci);

for (i = 0; i < 10; i++) {
Expand Down Expand Up @@ -1232,7 +1235,6 @@ static int at_context_queue_packet(struct context *ctx,
struct descriptor *d, *last;
__le32 *header;
int z, tcode;
u32 reg;

d = context_get_descriptors(ctx, 4, &d_bus);
if (d == NULL) {
Expand Down Expand Up @@ -1351,9 +1353,7 @@ static int at_context_queue_packet(struct context *ctx,

context_append(ctx, d, z, 4 - z);

/* If the context isn't already running, start it up. */
reg = reg_read(ctx->ohci, CONTROL_SET(ctx->regs));
if ((reg & CONTEXT_RUN) == 0)
if (!ctx->running)
context_run(ctx, 0);

return 0;
Expand Down

0 comments on commit 386a415

Please sign in to comment.