tg3: Return size from tg3_vpd_readblock()
[firefly-linux-kernel-4.4.55.git] / drivers / net / tg3.c
index f2b0839f981018384eaf6ad9fa0063118de01616..bce0f22677c130e2aba822adc5f9262cc315ec91 100644 (file)
@@ -10573,7 +10573,7 @@ static void tg3_get_ethtool_stats(struct net_device *dev,
        memcpy(tmp_stats, tg3_get_estats(tp), sizeof(tp->estats));
 }
 
-static __be32 * tg3_vpd_readblock(struct tg3 *tp)
+static __be32 *tg3_vpd_readblock(struct tg3 *tp, u32 *vpdlen)
 {
        int i;
        __be32 *buf;
@@ -10640,6 +10640,8 @@ static __be32 * tg3_vpd_readblock(struct tg3 *tp)
                        goto error;
        }
 
+       *vpdlen = len;
+
        return buf;
 
 error:
@@ -10659,7 +10661,7 @@ error:
 
 static int tg3_test_nvram(struct tg3 *tp)
 {
-       u32 csum, magic;
+       u32 csum, magic, len;
        __be32 *buf;
        int i, j, k, err = 0, size;
 
@@ -10800,18 +10802,17 @@ static int tg3_test_nvram(struct tg3 *tp)
 
        kfree(buf);
 
-       buf = tg3_vpd_readblock(tp);
+       buf = tg3_vpd_readblock(tp, &len);
        if (!buf)
                return -ENOMEM;
 
-       i = pci_vpd_find_tag((u8 *)buf, 0, TG3_NVM_VPD_LEN,
-                            PCI_VPD_LRDT_RO_DATA);
+       i = pci_vpd_find_tag((u8 *)buf, 0, len, PCI_VPD_LRDT_RO_DATA);
        if (i > 0) {
                j = pci_vpd_lrdt_size(&((u8 *)buf)[i]);
                if (j < 0)
                        goto out;
 
-               if (i + PCI_VPD_LRDT_TAG_SIZE + j > TG3_NVM_VPD_LEN)
+               if (i + PCI_VPD_LRDT_TAG_SIZE + j > len)
                        goto out;
 
                i += PCI_VPD_LRDT_TAG_SIZE;
@@ -13209,14 +13210,14 @@ static void __devinit tg3_read_vpd(struct tg3 *tp)
 {
        u8 *vpd_data;
        unsigned int block_end, rosize, len;
+       u32 vpdlen;
        int j, i = 0;
 
-       vpd_data = (u8 *)tg3_vpd_readblock(tp);
+       vpd_data = (u8 *)tg3_vpd_readblock(tp, &vpdlen);
        if (!vpd_data)
                goto out_no_vpd;
 
-       i = pci_vpd_find_tag(vpd_data, 0, TG3_NVM_VPD_LEN,
-                            PCI_VPD_LRDT_RO_DATA);
+       i = pci_vpd_find_tag(vpd_data, 0, vpdlen, PCI_VPD_LRDT_RO_DATA);
        if (i < 0)
                goto out_not_found;
 
@@ -13224,7 +13225,7 @@ static void __devinit tg3_read_vpd(struct tg3 *tp)
        block_end = i + PCI_VPD_LRDT_TAG_SIZE + rosize;
        i += PCI_VPD_LRDT_TAG_SIZE;
 
-       if (block_end > TG3_NVM_VPD_LEN)
+       if (block_end > vpdlen)
                goto out_not_found;
 
        j = pci_vpd_find_info_keyword(vpd_data, i, rosize,
@@ -13249,7 +13250,7 @@ static void __devinit tg3_read_vpd(struct tg3 *tp)
                        goto partno;
 
                memcpy(tp->fw_ver, &vpd_data[j], len);
-               strncat(tp->fw_ver, " bc ", TG3_NVM_VPD_LEN - len - 1);
+               strncat(tp->fw_ver, " bc ", vpdlen - len - 1);
        }
 
 partno:
@@ -13262,7 +13263,7 @@ partno:
 
        i += PCI_VPD_INFO_FLD_HDR_SIZE;
        if (len > TG3_BPN_SIZE ||
-           (len + i) > TG3_NVM_VPD_LEN)
+           (len + i) > vpdlen)
                goto out_not_found;
 
        memcpy(tp->board_part_number, &vpd_data[i], len);