]> git.baikalelectronics.ru Git - kernel.git/commitdiff
cxgb4: Properly revert VPD changes
authorNathan Chancellor <nathan@kernel.org>
Tue, 24 Aug 2021 20:51:04 +0000 (13:51 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 25 Aug 2021 10:03:13 +0000 (11:03 +0100)
Clang warns:

drivers/net/ethernet/chelsio/cxgb4/t4_hw.c:2785:2: error: variable 'kw_offset' is uninitialized when used here [-Werror,-Wuninitialized]
        FIND_VPD_KW(i, "RV");
        ^~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/chelsio/cxgb4/t4_hw.c:2776:39: note: expanded from macro 'FIND_VPD_KW'
        var = pci_vpd_find_info_keyword(vpd, kw_offset, vpdr_len, name); \
                                             ^~~~~~~~~
drivers/net/ethernet/chelsio/cxgb4/t4_hw.c:2748:34: note: initialize the variable 'kw_offset' to silence this warning
        unsigned int vpdr_len, kw_offset, id_len;
                                        ^
                                         = 0
drivers/net/ethernet/chelsio/cxgb4/t4_hw.c:2785:2: error: variable 'vpdr_len' is uninitialized when used here [-Werror,-Wuninitialized]
        FIND_VPD_KW(i, "RV");
        ^~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/chelsio/cxgb4/t4_hw.c:2776:50: note: expanded from macro 'FIND_VPD_KW'
        var = pci_vpd_find_info_keyword(vpd, kw_offset, vpdr_len, name); \
                                                        ^~~~~~~~
drivers/net/ethernet/chelsio/cxgb4/t4_hw.c:2748:23: note: initialize the variable 'vpdr_len' to silence this warning
        unsigned int vpdr_len, kw_offset, id_len;
                             ^
                              = 0
2 errors generated.

The series "PCI/VPD: Convert more users to the new VPD API functions"
was applied to net-next when it should have been applied to the PCI tree
because of build errors. However, commit 92261b59ba07 ("Revert "Revert
"cxgb4: Search VPD with pci_vpd_find_ro_info_keyword()""") reapplied a
change, resulting in the warning above.

Properly revert commit 5dfdba581c5d ("cxgb4: Search VPD with
pci_vpd_find_ro_info_keyword()") to fix the warning and restore proper
functionality. This also reverts commit 2d210a3066b2 ("cxgb4: Remove
unused vpd_param member ec") to avoid future merge conflicts, as that
change has been applied to the PCI tree.

Link: https://lore.kernel.org/r/20210823120929.7c6f7a4f@canb.auug.org.au/
Link: https://lore.kernel.org/r/1ca29408-7bc7-4da5-59c7-87893c9e0442@gmail.com/
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
drivers/net/ethernet/chelsio/cxgb4/t4_hw.c

index ecea3cdd30b3f77e2477d1c722548e5a72e5a0ba..9058f09f921ee6faff2aa0041b8c3cc0513c502a 100644 (file)
@@ -84,6 +84,7 @@ extern struct mutex uld_mutex;
 enum {
        MAX_NPORTS      = 4,     /* max # of ports */
        SERNUM_LEN      = 24,    /* Serial # length */
+       EC_LEN          = 16,    /* E/C length */
        ID_LEN          = 16,    /* ID length */
        PN_LEN          = 16,    /* Part Number length */
        MACADDR_LEN     = 12,    /* MAC Address length */
@@ -390,6 +391,7 @@ struct tp_params {
 
 struct vpd_params {
        unsigned int cclk;
+       u8 ec[EC_LEN + 1];
        u8 sn[SERNUM_LEN + 1];
        u8 id[ID_LEN + 1];
        u8 pn[PN_LEN + 1];
index 70bb057320e4807aad95b14fcc800b8bc8a8154a..6606fb8b3e4245c4a54b0caf681c79d8714c3e1b 100644 (file)
@@ -2744,6 +2744,7 @@ int t4_seeprom_wp(struct adapter *adapter, bool enable)
 int t4_get_raw_vpd_params(struct adapter *adapter, struct vpd_params *p)
 {
        int i, ret = 0, addr;
+       int ec, sn, pn, na;
        u8 *vpd, csum, base_val = 0;
        unsigned int vpdr_len, kw_offset, id_len;
 
@@ -2771,6 +2772,23 @@ int t4_get_raw_vpd_params(struct adapter *adapter, struct vpd_params *p)
        }
 
        id_len = pci_vpd_lrdt_size(vpd);
+       if (id_len > ID_LEN)
+               id_len = ID_LEN;
+
+       i = pci_vpd_find_tag(vpd, VPD_LEN, PCI_VPD_LRDT_RO_DATA);
+       if (i < 0) {
+               dev_err(adapter->pdev_dev, "missing VPD-R section\n");
+               ret = -EINVAL;
+               goto out;
+       }
+
+       vpdr_len = pci_vpd_lrdt_size(&vpd[i]);
+       kw_offset = i + PCI_VPD_LRDT_TAG_SIZE;
+       if (vpdr_len + kw_offset > VPD_LEN) {
+               dev_err(adapter->pdev_dev, "bad VPD-R length %u\n", vpdr_len);
+               ret = -EINVAL;
+               goto out;
+       }
 
 #define FIND_VPD_KW(var, name) do { \
        var = pci_vpd_find_info_keyword(vpd, kw_offset, vpdr_len, name); \
@@ -2793,14 +2811,28 @@ int t4_get_raw_vpd_params(struct adapter *adapter, struct vpd_params *p)
                goto out;
        }
 
+       FIND_VPD_KW(ec, "EC");
+       FIND_VPD_KW(sn, "SN");
+       FIND_VPD_KW(pn, "PN");
+       FIND_VPD_KW(na, "NA");
+#undef FIND_VPD_KW
+
+       memcpy(p->id, vpd + PCI_VPD_LRDT_TAG_SIZE, id_len);
+       strim(p->id);
+       memcpy(p->ec, vpd + ec, EC_LEN);
+       strim(p->ec);
+       i = pci_vpd_info_field_size(vpd + sn - PCI_VPD_INFO_FLD_HDR_SIZE);
+       memcpy(p->sn, vpd + sn, min(i, SERNUM_LEN));
+       strim(p->sn);
+       i = pci_vpd_info_field_size(vpd + pn - PCI_VPD_INFO_FLD_HDR_SIZE);
+       memcpy(p->pn, vpd + pn, min(i, PN_LEN));
+       strim(p->pn);
+       memcpy(p->na, vpd + na, min(i, MACADDR_LEN));
+       strim((char *)p->na);
+
 out:
        vfree(vpd);
-       if (ret < 0) {
-               dev_err(adapter->pdev_dev, "error reading VPD\n");
-               return ret;
-       }
-
-       return 0;
+       return ret < 0 ? ret : 0;
 }
 
 /**