firewire: ohci: fix PHY reg access after card ejection
authorStefan Richter <stefanr@s5r6.in-berlin.de>
Wed, 22 Jun 2011 19:05:08 +0000 (21:05 +0200)
committerStefan Richter <stefanr@s5r6.in-berlin.de>
Sat, 9 Jul 2011 15:12:08 +0000 (17:12 +0200)
Detect and handle ejection of FireWire CardBus cards in PHY register
accesses:

  - The last attempt of firewire-core to reset the bus during shutdown
    caused a spurious "firewire_ohci: failed to write phy reg" error
    message in the log.  Skip this message as well as the prior retry
    loop that needlessly took 100 milliseconds.

  - In the unlikely case that a PHY register was read right after card
    ejection, a bogus value was obtained and possibly acted upon.
    Instead, fail the read attempt.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
drivers/firewire/ohci.c

index a818dc8..4485988 100644 (file)
@@ -527,6 +527,9 @@ static int read_phy_reg(struct fw_ohci *ohci, int addr)
        reg_write(ohci, OHCI1394_PhyControl, OHCI1394_PhyControl_Read(addr));
        for (i = 0; i < 3 + 100; i++) {
                val = reg_read(ohci, OHCI1394_PhyControl);
+               if (!~val)
+                       return -ENODEV; /* Card was ejected. */
+
                if (val & OHCI1394_PhyControl_ReadDone)
                        return OHCI1394_PhyControl_ReadData(val);
 
@@ -550,6 +553,9 @@ static int write_phy_reg(const struct fw_ohci *ohci, int addr, u32 val)
                  OHCI1394_PhyControl_Write(addr, val));
        for (i = 0; i < 3 + 100; i++) {
                val = reg_read(ohci, OHCI1394_PhyControl);
+               if (!~val)
+                       return -ENODEV; /* Card was ejected. */
+
                if (!(val & OHCI1394_PhyControl_WritePending))
                        return 0;