tg3: Add legacy bootcode version decoding
authorMatt Carlson <mcarlson@broadcom.com>
Wed, 25 Feb 2009 14:26:58 +0000 (14:26 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 27 Feb 2009 07:16:38 +0000 (23:16 -0800)
This patch adds code to obtain the bootcode version for versions
of bootcode that do not use the new method.

Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
Signed-off-by: Benjamin Li <benli@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/tg3.c
drivers/net/tg3.h

index 2e8375587ee807c7c116aa46b788a2ea936ff674..43859e4db2feac549592ca0f3597f86dca86d1eb 100644 (file)
@@ -11463,8 +11463,9 @@ static int __devinit tg3_fw_img_is_valid(struct tg3 *tp, u32 offset)
 
 static void __devinit tg3_read_bc_ver(struct tg3 *tp)
 {
-       u32 offset, start, ver_offset;
+       u32 val, offset, start, ver_offset;
        int i;
+       bool newver = false;
 
        if (tg3_nvram_read(tp, 0xc, &offset) ||
            tg3_nvram_read(tp, 0x4, &start))
@@ -11472,17 +11473,39 @@ static void __devinit tg3_read_bc_ver(struct tg3 *tp)
 
        offset = tg3_nvram_logical_addr(tp, offset);
 
-       if (!tg3_fw_img_is_valid(tp, offset) ||
-           tg3_nvram_read(tp, offset + 8, &ver_offset))
+       if (tg3_nvram_read(tp, offset, &val))
                return;
 
-       offset = offset + ver_offset - start;
-       for (i = 0; i < 16; i += 4) {
-               __be32 v;
-               if (tg3_nvram_read_be32(tp, offset + i, &v))
+       if ((val & 0xfc000000) == 0x0c000000) {
+               if (tg3_nvram_read(tp, offset + 4, &val))
+                       return;
+
+               if (val == 0)
+                       newver = true;
+       }
+
+       if (newver) {
+               if (tg3_nvram_read(tp, offset + 8, &ver_offset))
+                       return;
+
+               offset = offset + ver_offset - start;
+               for (i = 0; i < 16; i += 4) {
+                       __be32 v;
+                       if (tg3_nvram_read_be32(tp, offset + i, &v))
+                               return;
+
+                       memcpy(tp->fw_ver + i, &v, sizeof(v));
+               }
+       } else {
+               u32 major, minor;
+
+               if (tg3_nvram_read(tp, TG3_NVM_PTREV_BCVER, &ver_offset))
                        return;
 
-               memcpy(tp->fw_ver + i, &v, sizeof(v));
+               major = (ver_offset & TG3_NVM_BCVER_MAJMSK) >>
+                       TG3_NVM_BCVER_MAJSFT;
+               minor = ver_offset & TG3_NVM_BCVER_MINMSK;
+               snprintf(&tp->fw_ver[0], 32, "v%d.%02d", major, minor);
        }
 }
 
index 508def3e077f9e1d86e5c4d8e1da7c8132157601..34dfaaaed3aadc996d67da898617cfdf12715f52 100644 (file)
 #define TG3_NVM_DIRENT_SIZE            0xc
 #define TG3_NVM_DIRTYPE_SHIFT          24
 #define TG3_NVM_DIRTYPE_ASFINI         1
+#define TG3_NVM_PTREV_BCVER            0x94
+#define TG3_NVM_BCVER_MAJMSK           0x0000ff00
+#define TG3_NVM_BCVER_MAJSFT           8
+#define TG3_NVM_BCVER_MINMSK           0x000000ff
 
 #define TG3_EEPROM_SB_F1R0_EDH_OFF     0x10
 #define TG3_EEPROM_SB_F1R2_EDH_OFF     0x14