diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2010-06-05 05:46:49 -0400 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2010-06-09 13:42:18 -0400 |
commit | 148c7866c31d93f8c79366189075f5a26ad4556c (patch) | |
tree | 2b82bfd64fcdf04a2fbb6bfca78e27c9c609110f /drivers/firewire | |
parent | d8c1fa4af0f311363d9f9cf1014b11d31a99ff10 (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.c | 24 |
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); |