- Open the physical DMA filter in the top half of the IRQ handler...
and flush the necessary MMIO writes. This is to open the filter
as soon as possible after bus reset.
--- linux.orig/drivers/firewire/fw-ohci.c
+++ linux/drivers/firewire/fw-ohci.c
@@ -1309,11 +1309,6 @@ static void bus_reset_tasklet(unsigned l
reg_write(ohci, OHCI1394_ConfigROMhdr, ohci->next_header);
}
-#ifdef CONFIG_FIREWIRE_OHCI_REMOTE_DMA
- reg_write(ohci, OHCI1394_PhyReqFilterHiSet, ~0);
- reg_write(ohci, OHCI1394_PhyReqFilterLoSet, ~0);
-#endif
-
spin_unlock_irqrestore(&ohci->lock, flags);
if (free_rom)
@@ -1341,8 +1336,14 @@ static irqreturn_t irq_handler(int irq, reg_write(ohci, OHCI1394_IntEventClear, event & ~OHCI1394_busReset);
log_irqs(event);
- if (event & OHCI1394_selfIDComplete)
+ if (event & OHCI1394_selfIDComplete) {
+#ifdef CONFIG_FIREWIRE_OHCI_REMOTE_DMA
+ reg_write(ohci, OHCI1394_PhyReqFilterHiSet, ~0);
+ reg_write(ohci, OHCI1394_PhyReqFilterLoSet, ~0);
+ flush_writes(ohci);
+#endif
tasklet_schedule(&ohci->bus_reset_tasklet);
+ }