aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire
diff options
context:
space:
mode:
authorStefan Richter <stefanr@s5r6.in-berlin.de>2010-06-05 05:46:49 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2010-06-09 13:42:18 -0400
commit148c7866c31d93f8c79366189075f5a26ad4556c (patch)
tree2b82bfd64fcdf04a2fbb6bfca78e27c9c609110f /drivers/firewire
parentd8c1fa4af0f311363d9f9cf1014b11d31a99ff10 (diff)
firewire: ohci: do not enable interrupts without the handler
On 26 Apr 2010, Clemens Ladisch wrote: > In theory, none of the interrupts should occur before the link is > enabled. In practice, I'd rather make sure to not set the master > interrupt enable bit until we have installed the interrupt handler. and proposed to move OHCI1394_masterIntEnable out of the present reg_write() into a new one before the HCControl.linkEnable reg_write(). Why not defer setting /all/ of the bits until right before linkEnable? Reviewed-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire')
-rw-r--r--drivers/firewire/ohci.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c
index 07deac77bc13..9743a405e69c 100644
--- a/drivers/firewire/ohci.c
+++ b/drivers/firewire/ohci.c
@@ -1594,7 +1594,7 @@ static int ohci_enable(struct fw_card *card,
1594{ 1594{
1595 struct fw_ohci *ohci = fw_ohci(card); 1595 struct fw_ohci *ohci = fw_ohci(card);
1596 struct pci_dev *dev = to_pci_dev(card->device); 1596 struct pci_dev *dev = to_pci_dev(card->device);
1597 u32 lps; 1597 u32 lps, irqs;
1598 int i, ret; 1598 int i, ret;
1599 1599
1600 if (software_reset(ohci)) { 1600 if (software_reset(ohci)) {
@@ -1648,16 +1648,6 @@ static int ohci_enable(struct fw_card *card,
1648 reg_write(ohci, OHCI1394_PhyUpperBound, 0x00010000); 1648 reg_write(ohci, OHCI1394_PhyUpperBound, 0x00010000);
1649 reg_write(ohci, OHCI1394_IntEventClear, ~0); 1649 reg_write(ohci, OHCI1394_IntEventClear, ~0);
1650 reg_write(ohci, OHCI1394_IntMaskClear, ~0); 1650 reg_write(ohci, OHCI1394_IntMaskClear, ~0);
1651 reg_write(ohci, OHCI1394_IntMaskSet,
1652 OHCI1394_selfIDComplete |
1653 OHCI1394_RQPkt | OHCI1394_RSPkt |
1654 OHCI1394_reqTxComplete | OHCI1394_respTxComplete |
1655 OHCI1394_isochRx | OHCI1394_isochTx |
1656 OHCI1394_postedWriteErr | OHCI1394_cycleTooLong |
1657 OHCI1394_cycleInconsistent | OHCI1394_regAccessFail |
1658 OHCI1394_masterIntEnable);
1659 if (param_debug & OHCI_PARAM_DEBUG_BUSRESETS)
1660 reg_write(ohci, OHCI1394_IntMaskSet, OHCI1394_busReset);
1661 1651
1662 ret = configure_1394a_enhancements(ohci); 1652 ret = configure_1394a_enhancements(ohci);
1663 if (ret < 0) 1653 if (ret < 0)
@@ -1723,6 +1713,18 @@ static int ohci_enable(struct fw_card *card,
1723 return -EIO; 1713 return -EIO;
1724 } 1714 }
1725 1715
1716 irqs = OHCI1394_reqTxComplete | OHCI1394_respTxComplete |
1717 OHCI1394_RQPkt | OHCI1394_RSPkt |
1718 OHCI1394_isochTx | OHCI1394_isochRx |
1719 OHCI1394_postedWriteErr |
1720 OHCI1394_selfIDComplete |
1721 OHCI1394_regAccessFail |
1722 OHCI1394_cycleInconsistent | OHCI1394_cycleTooLong |
1723 OHCI1394_masterIntEnable;
1724 if (param_debug & OHCI_PARAM_DEBUG_BUSRESETS)
1725 irqs |= OHCI1394_busReset;
1726 reg_write(ohci, OHCI1394_IntMaskSet, irqs);
1727
1726 reg_write(ohci, OHCI1394_HCControlSet, 1728 reg_write(ohci, OHCI1394_HCControlSet,
1727 OHCI1394_HCControl_linkEnable | 1729 OHCI1394_HCControl_linkEnable |
1728 OHCI1394_HCControl_BIBimageValid); 1730 OHCI1394_HCControl_BIBimageValid);