firewire: Fix start on cycle 0 for IT, implement start on cycle for IR.
Signed-off-by: Kristian Høgsberg <krh@redhat.com> Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
This commit is contained in:
committed by
Stefan Richter
parent
ef370ee74b
commit
8a2f7d932f
@@ -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;
|
||||||
|
Reference in New Issue
Block a user