summaryrefslogtreecommitdiff
path: root/drivers/net/tg3.c
diff options
context:
space:
mode:
authorMatt Carlson <mcarlson@broadcom.com>2009-02-25 14:26:58 +0000
committerDavid S. Miller <davem@davemloft.net>2009-02-26 23:16:38 -0800
commitff3a7cb25217bddcefd20e72af08a65481db4096 (patch)
tree8d8429ca67bb859acdb711fa6ee21b5fd1132410 /drivers/net/tg3.c
parentacd9c119cc663860fff4f1445ed0f87d82378d99 (diff)
tg3: Add legacy bootcode version decoding
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>
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r--drivers/net/tg3.c39
1 files changed, 31 insertions, 8 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index 2e8375587ee8..43859e4db2fe 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -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);
}
}