aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire/fw-ohci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firewire/fw-ohci.c')
-rw-r--r--drivers/firewire/fw-ohci.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c
index ba10203725c1..d6f0644b05d4 100644
--- a/drivers/firewire/fw-ohci.c
+++ b/drivers/firewire/fw-ohci.c
@@ -828,10 +828,10 @@ ohci_enable_phys_dma(struct fw_card *card, int node_id, int generation)
828{ 828{
829 struct fw_ohci *ohci = fw_ohci(card); 829 struct fw_ohci *ohci = fw_ohci(card);
830 unsigned long flags; 830 unsigned long flags;
831 int retval = 0; 831 int n, retval = 0;
832 832
833 /* FIXME: make sure this bitmask is cleared when we clear the 833 /* FIXME: Make sure this bitmask is cleared when we clear the busReset
834 * busReset interrupt bit. */ 834 * interrupt bit. Clear physReqResourceAllBuses on bus reset. */
835 835
836 spin_lock_irqsave(&ohci->lock, flags); 836 spin_lock_irqsave(&ohci->lock, flags);
837 837
@@ -840,12 +840,15 @@ ohci_enable_phys_dma(struct fw_card *card, int node_id, int generation)
840 goto out; 840 goto out;
841 } 841 }
842 842
843 if (node_id < 32) { 843 /* NOTE, if the node ID contains a non-local bus ID, physical DMA is
844 reg_write(ohci, OHCI1394_PhyReqFilterLoSet, 1 << node_id); 844 * enabled for _all_ nodes on remote buses. */
845 } else { 845
846 reg_write(ohci, OHCI1394_PhyReqFilterHiSet, 846 n = (node_id & 0xffc0) == LOCAL_BUS ? node_id & 0x3f : 63;
847 1 << (node_id - 32)); 847 if (n < 32)
848 } 848 reg_write(ohci, OHCI1394_PhyReqFilterLoSet, 1 << n);
849 else
850 reg_write(ohci, OHCI1394_PhyReqFilterHiSet, 1 << (n - 32));
851
849 flush_writes(ohci); 852 flush_writes(ohci);
850 out: 853 out:
851 spin_unlock_irqrestore(&ohci->lock, flags); 854 spin_unlock_irqrestore(&ohci->lock, flags);