aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire/fw-ohci.c
diff options
context:
space:
mode:
authorStefan Richter <stefanr@s5r6.in-berlin.de>2007-12-22 16:14:52 -0500
committerStefan Richter <stefanr@s5r6.in-berlin.de>2008-01-30 16:22:24 -0500
commitbb9f2206b60ace29e49a057fbd9be86d79d86200 (patch)
tree588dcd6a1b8ae1c3fecbf2d6c210c7f7d8bfc820 /drivers/firewire/fw-ohci.c
parent478b233eda81bfe41307512b8336fd688c6553e0 (diff)
firewire: fw-ohci: CycleTooLong interrupt management
The firewire-ohci driver so far lacked the ability to resume cycle master duty after that condition happened, as added to ohci1394 in Linux 2.6.18 by commit 57fdb58fa5a140bdd52cf4c4ffc30df73676f0a5. This ports this patch to fw-ohci. The "cycle too long" condition has been seen in practice - with IIDC cameras if a mode with packets too large for a speed is chosen, - sporadically when capturing DV on a VIA VT6306 card with ohci1394/ ieee1394/ raw1394/ dvgrab 2. https://bugzilla.redhat.com/show_bug.cgi?id=415841#c7 (This does not fix Fedora bug 415841.) Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire/fw-ohci.c')
-rw-r--r--drivers/firewire/fw-ohci.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c
index a9f2d07e7c65..74d5d945f200 100644
--- a/drivers/firewire/fw-ohci.c
+++ b/drivers/firewire/fw-ohci.c
@@ -1079,6 +1079,13 @@ static irqreturn_t irq_handler(int irq, void *data)
1079 if (unlikely(event & OHCI1394_postedWriteErr)) 1079 if (unlikely(event & OHCI1394_postedWriteErr))
1080 fw_error("PCI posted write error\n"); 1080 fw_error("PCI posted write error\n");
1081 1081
1082 if (unlikely(event & OHCI1394_cycleTooLong)) {
1083 if (printk_ratelimit())
1084 fw_notify("isochronous cycle too long\n");
1085 reg_write(ohci, OHCI1394_LinkControlSet,
1086 OHCI1394_LinkControl_cycleMaster);
1087 }
1088
1082 if (event & OHCI1394_cycle64Seconds) { 1089 if (event & OHCI1394_cycle64Seconds) {
1083 cycle_time = reg_read(ohci, OHCI1394_IsochronousCycleTimer); 1090 cycle_time = reg_read(ohci, OHCI1394_IsochronousCycleTimer);
1084 if ((cycle_time & 0x80000000) == 0) 1091 if ((cycle_time & 0x80000000) == 0)
@@ -1152,8 +1159,8 @@ static int ohci_enable(struct fw_card *card, u32 *config_rom, size_t length)
1152 OHCI1394_RQPkt | OHCI1394_RSPkt | 1159 OHCI1394_RQPkt | OHCI1394_RSPkt |
1153 OHCI1394_reqTxComplete | OHCI1394_respTxComplete | 1160 OHCI1394_reqTxComplete | OHCI1394_respTxComplete |
1154 OHCI1394_isochRx | OHCI1394_isochTx | 1161 OHCI1394_isochRx | OHCI1394_isochTx |
1155 OHCI1394_postedWriteErr | OHCI1394_cycle64Seconds | 1162 OHCI1394_postedWriteErr | OHCI1394_cycleTooLong |
1156 OHCI1394_masterIntEnable); 1163 OHCI1394_cycle64Seconds | OHCI1394_masterIntEnable);
1157 1164
1158 /* Activate link_on bit and contender bit in our self ID packets.*/ 1165 /* Activate link_on bit and contender bit in our self ID packets.*/
1159 if (ohci_update_phy_reg(card, 4, 0, 1166 if (ohci_update_phy_reg(card, 4, 0,