firewire: ohci: optimize TSB41BA3D detection
authorStefan Richter <stefanr@s5r6.in-berlin.de>
Mon, 19 Sep 2011 07:29:30 +0000 (09:29 +0200)
committerStefan Richter <stefanr@s5r6.in-berlin.de>
Sun, 9 Oct 2011 15:00:17 +0000 (17:00 +0200)
Takes less source code and machine code, and less runtime with PHYs
other than TSB41BA3D (e.g. TSB81BA3 with device ID 0x831304 which takes
one instead of six read_paged_phy_reg now).

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

index 862fdf3..399d592 100644 (file)
@@ -2159,38 +2159,26 @@ static int configure_1394a_enhancements(struct fw_ohci *ohci)
        return 0;
 }
 
-#define TSB41BA3D_VID 0x00080028
-#define TSB41BA3D_PID 0x00833005
-
 static int probe_tsb41ba3d(struct fw_ohci *ohci)
 {
-       int reg, i, vendor_id, product_id;
+       /* TI vendor ID = 0x080028, TSB41BA3D product ID = 0x833005 (sic) */
+       static const u8 id[] = { 0x08, 0x00, 0x28, 0x83, 0x30, 0x05, };
+       int reg, i;
 
        reg = read_phy_reg(ohci, 2);
        if (reg < 0)
                return reg;
+       if ((reg & PHY_EXTENDED_REGISTERS) != PHY_EXTENDED_REGISTERS)
+               return 0;
 
-       if ((reg & PHY_EXTENDED_REGISTERS) == PHY_EXTENDED_REGISTERS) {
-               vendor_id = 0;
-               for (i = 10; i < 13; i++) {
-                       reg = read_paged_phy_reg(ohci, 1, i);
-                       if (reg < 0)
-                               return reg;
-                       vendor_id = (vendor_id << 8) | reg;
-               }
-               product_id = 0;
-               for (i = 13; i < 16; i++) {
-                       reg = read_paged_phy_reg(ohci, 1, i);
-                       if (reg < 0)
-                               return reg;
-                       product_id = (product_id << 8) | reg;
-               }
-
-               if ((vendor_id == TSB41BA3D_VID) &&
-                   (product_id == TSB41BA3D_PID))
-                       return 1;
+       for (i = ARRAY_SIZE(id) - 1; i >= 0; i--) {
+               reg = read_paged_phy_reg(ohci, 1, i + 10);
+               if (reg < 0)
+                       return reg;
+               if (reg != id[i])
+                       return 0;
        }
-       return 0;
+       return 1;
 }
 
 static int ohci_enable(struct fw_card *card,