Commit 8a2f7d93 authored by Kristian Høgsberg's avatar Kristian Høgsberg Committed by Stefan Richter

firewire: Fix start on cycle 0 for IT, implement start on cycle for IR.

Signed-off-by: default avatarKristian Høgsberg <krh@redhat.com>
Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
parent ef370ee7
...@@ -1362,28 +1362,32 @@ static int ohci_start_iso(struct fw_iso_context *base, ...@@ -1362,28 +1362,32 @@ static int ohci_start_iso(struct fw_iso_context *base,
{ {
struct iso_context *ctx = container_of(base, struct iso_context, base); struct iso_context *ctx = container_of(base, struct iso_context, base);
struct fw_ohci *ohci = ctx->context.ohci; struct fw_ohci *ohci = ctx->context.ohci;
u32 cycle_match = 0; u32 control, match;
int index; int index;
if (ctx->base.type == FW_ISO_CONTEXT_TRANSMIT) { if (ctx->base.type == FW_ISO_CONTEXT_TRANSMIT) {
index = ctx - ohci->it_context_list; index = ctx - ohci->it_context_list;
if (cycle > 0) match = 0;
cycle_match = IT_CONTEXT_CYCLE_MATCH_ENABLE | if (cycle >= 0)
match = IT_CONTEXT_CYCLE_MATCH_ENABLE |
(cycle & 0x7fff) << 16; (cycle & 0x7fff) << 16;
reg_write(ohci, OHCI1394_IsoXmitIntEventClear, 1 << index); reg_write(ohci, OHCI1394_IsoXmitIntEventClear, 1 << index);
reg_write(ohci, OHCI1394_IsoXmitIntMaskSet, 1 << index); reg_write(ohci, OHCI1394_IsoXmitIntMaskSet, 1 << index);
context_run(&ctx->context, cycle_match); context_run(&ctx->context, match);
} else { } else {
index = ctx - ohci->ir_context_list; index = ctx - ohci->ir_context_list;
control = IR_CONTEXT_DUAL_BUFFER_MODE | IR_CONTEXT_ISOCH_HEADER;
match = (tags << 28) | (sync << 8) | ctx->base.channel;
if (cycle >= 0) {
match |= (cycle & 0x07fff) << 12;
control |= IR_CONTEXT_CYCLE_MATCH_ENABLE;
}
reg_write(ohci, OHCI1394_IsoRecvIntEventClear, 1 << index); reg_write(ohci, OHCI1394_IsoRecvIntEventClear, 1 << index);
reg_write(ohci, OHCI1394_IsoRecvIntMaskSet, 1 << index); reg_write(ohci, OHCI1394_IsoRecvIntMaskSet, 1 << index);
reg_write(ohci, context_match(ctx->context.regs), reg_write(ohci, context_match(ctx->context.regs), match);
(tags << 28) | (sync << 8) | ctx->base.channel); context_run(&ctx->context, control);
context_run(&ctx->context,
IR_CONTEXT_DUAL_BUFFER_MODE |
IR_CONTEXT_ISOCH_HEADER);
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment