提交 184b8904 编写于 作者: M Matt Carlson 提交者: David S. Miller

tg3: Use VPD fw version when present

This patch extracts the firmware version from the VPD area and changes
the code to prefer that version version over the manually extracted
version.
Signed-off-by: NMatt Carlson <mcarlson@broadcom.com>
Reviewed-by: NMichael Chan <mchan@broadcom.com>
Reviewed-by: NBenjamin Li <benli@broadcom.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 75f9936e
...@@ -12563,11 +12563,11 @@ static int __devinit tg3_phy_probe(struct tg3 *tp) ...@@ -12563,11 +12563,11 @@ static int __devinit tg3_phy_probe(struct tg3 *tp)
return err; return err;
} }
static void __devinit tg3_read_partno(struct tg3 *tp) static void __devinit tg3_read_vpd(struct tg3 *tp)
{ {
unsigned char vpd_data[TG3_NVM_VPD_LEN]; /* in little-endian format */ u8 vpd_data[TG3_NVM_VPD_LEN];
unsigned int block_end, rosize, len; unsigned int block_end, rosize, len;
int i = 0; int j, i = 0;
u32 magic; u32 magic;
if ((tp->tg3_flags3 & TG3_FLG3_NO_NVRAM) || if ((tp->tg3_flags3 & TG3_FLG3_NO_NVRAM) ||
...@@ -12616,6 +12616,32 @@ static void __devinit tg3_read_partno(struct tg3 *tp) ...@@ -12616,6 +12616,32 @@ static void __devinit tg3_read_partno(struct tg3 *tp)
if (block_end > TG3_NVM_VPD_LEN) if (block_end > TG3_NVM_VPD_LEN)
goto out_not_found; goto out_not_found;
j = pci_vpd_find_info_keyword(vpd_data, i, rosize,
PCI_VPD_RO_KEYWORD_MFR_ID);
if (j > 0) {
len = pci_vpd_info_field_size(&vpd_data[j]);
j += PCI_VPD_INFO_FLD_HDR_SIZE;
if (j + len > block_end || len != 4 ||
memcmp(&vpd_data[j], "1028", 4))
goto partno;
j = pci_vpd_find_info_keyword(vpd_data, i, rosize,
PCI_VPD_RO_KEYWORD_VENDOR0);
if (j < 0)
goto partno;
len = pci_vpd_info_field_size(&vpd_data[j]);
j += PCI_VPD_INFO_FLD_HDR_SIZE;
if (j + len > block_end)
goto partno;
memcpy(tp->fw_ver, &vpd_data[j], len);
strncat(tp->fw_ver, " bc ", TG3_NVM_VPD_LEN - len - 1);
}
partno:
i = pci_vpd_find_info_keyword(vpd_data, i, rosize, i = pci_vpd_find_info_keyword(vpd_data, i, rosize,
PCI_VPD_RO_KEYWORD_PARTNO); PCI_VPD_RO_KEYWORD_PARTNO);
if (i < 0) if (i < 0)
...@@ -13626,7 +13652,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) ...@@ -13626,7 +13652,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
tg3_mdio_fini(tp); tg3_mdio_fini(tp);
} }
tg3_read_partno(tp); tg3_read_vpd(tp);
tg3_read_fw_ver(tp); tg3_read_fw_ver(tp);
if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) { if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册