Skip to content

Commit

Permalink
firewire: ohci: Check LPS before register access on pci removal
Browse files Browse the repository at this point in the history
A pci device can be removed while in its suspended state. If the ohci
host controller is suspended, the PHY is also in low-power mode and
LPS is disabled. If LPS is disabled, most of the host registers aren't
accessible, including IntMaskClear. Furthermore, access to these registers
when LPS is disabled can cause hard lockups on some hardware. Since
interrupts are already disabled in this mode, further action is
unnecessary.

Test LPS before attempting to write IntMaskClear to disable interrupts.

[Stefan R: whitespace changes]

Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
  • Loading branch information
Peter Hurley authored and Stefan Richter committed Apr 28, 2013
1 parent 247fd50 commit 8db4914
Showing 1 changed file with 9 additions and 4 deletions.
13 changes: 9 additions & 4 deletions drivers/firewire/ohci.c
Original file line number Diff line number Diff line change
Expand Up @@ -3712,11 +3712,16 @@ static int pci_probe(struct pci_dev *dev,

static void pci_remove(struct pci_dev *dev)
{
struct fw_ohci *ohci;
struct fw_ohci *ohci = pci_get_drvdata(dev);

ohci = pci_get_drvdata(dev);
reg_write(ohci, OHCI1394_IntMaskClear, ~0);
flush_writes(ohci);
/*
* If the removal is happening from the suspend state, LPS won't be
* enabled and host registers (eg., IntMaskClear) won't be accessible.
*/
if (reg_read(ohci, OHCI1394_HCControlSet) & OHCI1394_HCControl_LPS) {
reg_write(ohci, OHCI1394_IntMaskClear, ~0);
flush_writes(ohci);
}
cancel_work_sync(&ohci->bus_reset_work);
fw_core_remove_card(&ohci->card);

Expand Down

0 comments on commit 8db4914

Please sign in to comment.