diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2009-11-18 14:01:14 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-12-05 15:41:44 -0500 |
commit | b1d33f4b0ae319ca79b6bafd6e815cbe0dcd7c14 (patch) | |
tree | 5a86b5661e363b3d1fd3ce5a3b25cf9c03b7ee64 /drivers/media/dvb/firewire | |
parent | a8aeb7836edac3e0cce1286eefbca793c54cbad0 (diff) |
V4L/DVB (13409): firedtv: packet requeuing is likely to succeed
Packet DMA buffers are queued either initially all at once (then, a
queueing failure will cause firedtv to release the DMA context as a
whole) or subsequently one by one as they recycled after use (then a
failure is extremely unlikely). Therefore we can be a little less
cautious when counting at which packet buffer to set the interrupt flag.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb/firewire')
-rw-r--r-- | drivers/media/dvb/firewire/firedtv-fw.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/drivers/media/dvb/firewire/firedtv-fw.c b/drivers/media/dvb/firewire/firedtv-fw.c index 6954848b5803..d8408cea335f 100644 --- a/drivers/media/dvb/firewire/firedtv-fw.c +++ b/drivers/media/dvb/firewire/firedtv-fw.c | |||
@@ -79,19 +79,14 @@ struct firedtv_receive_context { | |||
79 | static int queue_iso(struct firedtv_receive_context *ctx, int index) | 79 | static int queue_iso(struct firedtv_receive_context *ctx, int index) |
80 | { | 80 | { |
81 | struct fw_iso_packet p; | 81 | struct fw_iso_packet p; |
82 | int err; | ||
83 | 82 | ||
84 | p.payload_length = MAX_PACKET_SIZE; | 83 | p.payload_length = MAX_PACKET_SIZE; |
85 | p.interrupt = !(ctx->interrupt_packet & (IRQ_INTERVAL - 1)); | 84 | p.interrupt = !(++ctx->interrupt_packet & (IRQ_INTERVAL - 1)); |
86 | p.skip = 0; | 85 | p.skip = 0; |
87 | p.header_length = ISO_HEADER_SIZE; | 86 | p.header_length = ISO_HEADER_SIZE; |
88 | 87 | ||
89 | err = fw_iso_context_queue(ctx->context, &p, &ctx->buffer, | 88 | return fw_iso_context_queue(ctx->context, &p, &ctx->buffer, |
90 | index * MAX_PACKET_SIZE); | 89 | index * MAX_PACKET_SIZE); |
91 | if (!err) | ||
92 | ctx->interrupt_packet++; | ||
93 | |||
94 | return err; | ||
95 | } | 90 | } |
96 | 91 | ||
97 | static void handle_iso(struct fw_iso_context *context, u32 cycle, | 92 | static void handle_iso(struct fw_iso_context *context, u32 cycle, |
@@ -150,7 +145,7 @@ static int start_iso(struct firedtv *fdtv) | |||
150 | if (err) | 145 | if (err) |
151 | goto fail_context_destroy; | 146 | goto fail_context_destroy; |
152 | 147 | ||
153 | ctx->interrupt_packet = 1; | 148 | ctx->interrupt_packet = 0; |
154 | ctx->current_packet = 0; | 149 | ctx->current_packet = 0; |
155 | 150 | ||
156 | for (i = 0; i < N_PAGES; i++) | 151 | for (i = 0; i < N_PAGES; i++) |