firewire: ohci: Make cycleMatch ISO transmission work
Calling the START_ISO ioctl with a nonnegative cycle paramater has never worked. Last night I got around to figuring out why. Most of this patch is a big comment explaining why we enable an interrupt source then don't actually do anything when we get one. As the comment says, we should do more, but we don't have a way to tell userspace what happened. . . Signed-off-by: Jay Fenlason <fenlason@redhat.com> Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> (edited comment)
This commit is contained in:
Родитель
eaf76e0d02
Коммит
5ed1f321a7
|
@ -275,7 +275,7 @@ static void log_irqs(u32 evt)
|
||||||
!(evt & OHCI1394_busReset))
|
!(evt & OHCI1394_busReset))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fw_notify("IRQ %08x%s%s%s%s%s%s%s%s%s%s%s%s%s\n", evt,
|
fw_notify("IRQ %08x%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", evt,
|
||||||
evt & OHCI1394_selfIDComplete ? " selfID" : "",
|
evt & OHCI1394_selfIDComplete ? " selfID" : "",
|
||||||
evt & OHCI1394_RQPkt ? " AR_req" : "",
|
evt & OHCI1394_RQPkt ? " AR_req" : "",
|
||||||
evt & OHCI1394_RSPkt ? " AR_resp" : "",
|
evt & OHCI1394_RSPkt ? " AR_resp" : "",
|
||||||
|
@ -286,6 +286,7 @@ static void log_irqs(u32 evt)
|
||||||
evt & OHCI1394_postedWriteErr ? " postedWriteErr" : "",
|
evt & OHCI1394_postedWriteErr ? " postedWriteErr" : "",
|
||||||
evt & OHCI1394_cycleTooLong ? " cycleTooLong" : "",
|
evt & OHCI1394_cycleTooLong ? " cycleTooLong" : "",
|
||||||
evt & OHCI1394_cycle64Seconds ? " cycle64Seconds" : "",
|
evt & OHCI1394_cycle64Seconds ? " cycle64Seconds" : "",
|
||||||
|
evt & OHCI1394_cycleInconsistent ? " cycleInconsistent" : "",
|
||||||
evt & OHCI1394_regAccessFail ? " regAccessFail" : "",
|
evt & OHCI1394_regAccessFail ? " regAccessFail" : "",
|
||||||
evt & OHCI1394_busReset ? " busReset" : "",
|
evt & OHCI1394_busReset ? " busReset" : "",
|
||||||
evt & ~(OHCI1394_selfIDComplete | OHCI1394_RQPkt |
|
evt & ~(OHCI1394_selfIDComplete | OHCI1394_RQPkt |
|
||||||
|
@ -293,6 +294,7 @@ static void log_irqs(u32 evt)
|
||||||
OHCI1394_respTxComplete | OHCI1394_isochRx |
|
OHCI1394_respTxComplete | OHCI1394_isochRx |
|
||||||
OHCI1394_isochTx | OHCI1394_postedWriteErr |
|
OHCI1394_isochTx | OHCI1394_postedWriteErr |
|
||||||
OHCI1394_cycleTooLong | OHCI1394_cycle64Seconds |
|
OHCI1394_cycleTooLong | OHCI1394_cycle64Seconds |
|
||||||
|
OHCI1394_cycleInconsistent |
|
||||||
OHCI1394_regAccessFail | OHCI1394_busReset)
|
OHCI1394_regAccessFail | OHCI1394_busReset)
|
||||||
? " ?" : "");
|
? " ?" : "");
|
||||||
}
|
}
|
||||||
|
@ -1439,6 +1441,17 @@ static irqreturn_t irq_handler(int irq, void *data)
|
||||||
OHCI1394_LinkControl_cycleMaster);
|
OHCI1394_LinkControl_cycleMaster);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (unlikely(event & OHCI1394_cycleInconsistent)) {
|
||||||
|
/*
|
||||||
|
* We need to clear this event bit in order to make
|
||||||
|
* cycleMatch isochronous I/O work. In theory we should
|
||||||
|
* stop active cycleMatch iso contexts now and restart
|
||||||
|
* them at least two cycles later. (FIXME?)
|
||||||
|
*/
|
||||||
|
if (printk_ratelimit())
|
||||||
|
fw_notify("isochronous cycle inconsistent\n");
|
||||||
|
}
|
||||||
|
|
||||||
if (event & OHCI1394_cycle64Seconds) {
|
if (event & OHCI1394_cycle64Seconds) {
|
||||||
cycle_time = reg_read(ohci, OHCI1394_IsochronousCycleTimer);
|
cycle_time = reg_read(ohci, OHCI1394_IsochronousCycleTimer);
|
||||||
if ((cycle_time & 0x80000000) == 0)
|
if ((cycle_time & 0x80000000) == 0)
|
||||||
|
@ -1528,6 +1541,7 @@ static int ohci_enable(struct fw_card *card, u32 *config_rom, size_t length)
|
||||||
OHCI1394_reqTxComplete | OHCI1394_respTxComplete |
|
OHCI1394_reqTxComplete | OHCI1394_respTxComplete |
|
||||||
OHCI1394_isochRx | OHCI1394_isochTx |
|
OHCI1394_isochRx | OHCI1394_isochTx |
|
||||||
OHCI1394_postedWriteErr | OHCI1394_cycleTooLong |
|
OHCI1394_postedWriteErr | OHCI1394_cycleTooLong |
|
||||||
|
OHCI1394_cycleInconsistent |
|
||||||
OHCI1394_cycle64Seconds | OHCI1394_regAccessFail |
|
OHCI1394_cycle64Seconds | OHCI1394_regAccessFail |
|
||||||
OHCI1394_masterIntEnable);
|
OHCI1394_masterIntEnable);
|
||||||
if (param_debug & OHCI_PARAM_DEBUG_BUSRESETS)
|
if (param_debug & OHCI_PARAM_DEBUG_BUSRESETS)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче