aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2010-12-24 08:42:46 -0500
committerStefan Richter <stefanr@s5r6.in-berlin.de>2011-01-04 02:48:33 -0500
commit386a4153a2c1455e424f280d636efa3c91864466 (patch)
treeb99bc0351da1d37808d633cb8d64c1030dc37479 /drivers/firewire
parent78dec56d6a56322e1b728d51f3a7def416d36b34 (diff)
firewire: ohci: cache the context run bit
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>
Diffstat (limited to 'drivers/firewire')
-rw-r--r--drivers/firewire/ohci.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c
index cfe5afe359c6..3ae84e2c5192 100644
--- a/drivers/firewire/ohci.c
+++ b/drivers/firewire/ohci.c
@@ -125,6 +125,7 @@ struct context {
125 struct fw_ohci *ohci; 125 struct fw_ohci *ohci;
126 u32 regs; 126 u32 regs;
127 int total_allocation; 127 int total_allocation;
128 bool running;
128 bool flushing; 129 bool flushing;
129 130
130 /* 131 /*
@@ -1174,6 +1175,7 @@ static void context_run(struct context *ctx, u32 extra)
1174 le32_to_cpu(ctx->last->branch_address)); 1175 le32_to_cpu(ctx->last->branch_address));
1175 reg_write(ohci, CONTROL_CLEAR(ctx->regs), ~0); 1176 reg_write(ohci, CONTROL_CLEAR(ctx->regs), ~0);
1176 reg_write(ohci, CONTROL_SET(ctx->regs), CONTEXT_RUN | extra); 1177 reg_write(ohci, CONTROL_SET(ctx->regs), CONTEXT_RUN | extra);
1178 ctx->running = true;
1177 flush_writes(ohci); 1179 flush_writes(ohci);
1178} 1180}
1179 1181
@@ -1202,6 +1204,7 @@ static void context_stop(struct context *ctx)
1202 1204
1203 ctx->active = false; 1205 ctx->active = false;
1204 reg_write(ctx->ohci, CONTROL_CLEAR(ctx->regs), CONTEXT_RUN); 1206 reg_write(ctx->ohci, CONTROL_CLEAR(ctx->regs), CONTEXT_RUN);
1207 ctx->running = false;
1205 flush_writes(ctx->ohci); 1208 flush_writes(ctx->ohci);
1206 1209
1207 for (i = 0; i < 10; i++) { 1210 for (i = 0; i < 10; i++) {
@@ -1232,7 +1235,6 @@ static int at_context_queue_packet(struct context *ctx,
1232 struct descriptor *d, *last; 1235 struct descriptor *d, *last;
1233 __le32 *header; 1236 __le32 *header;
1234 int z, tcode; 1237 int z, tcode;
1235 u32 reg;
1236 1238
1237 d = context_get_descriptors(ctx, 4, &d_bus); 1239 d = context_get_descriptors(ctx, 4, &d_bus);
1238 if (d == NULL) { 1240 if (d == NULL) {
@@ -1351,9 +1353,7 @@ static int at_context_queue_packet(struct context *ctx,
1351 1353
1352 context_append(ctx, d, z, 4 - z); 1354 context_append(ctx, d, z, 4 - z);
1353 1355
1354 /* If the context isn't already running, start it up. */ 1356 if (!ctx->running)
1355 reg = reg_read(ctx->ohci, CONTROL_SET(ctx->regs));
1356 if ((reg & CONTEXT_RUN) == 0)
1357 context_run(ctx, 0); 1357 context_run(ctx, 0);
1358 1358
1359 return 0; 1359 return 0;