diff options
author | David S. Miller <davem@davemloft.net> | 2021-08-23 11:15:34 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2021-08-23 11:15:34 +0100 |
commit | a7eeb7a7dd9d718a36747ae0d7ab97e6e8000d3f (patch) | |
tree | 52ff7740d308711fb35bfe871fee6b2331dacbe8 /drivers/net/ethernet/sfc | |
parent | cd3d5d68819d224e588162404fcd70ab535b93ea (diff) | |
download | linux-a7eeb7a7dd9d718a36747ae0d7ab97e6e8000d3f.tar.bz2 |
Revert "sfc: falcon: Search VPD with pci_vpd_find_ro_info_keyword()"
This reverts commit 01dbe7129d9ccd5fe940897888645f06327b34ff.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/sfc')
-rw-r--r-- | drivers/net/ethernet/sfc/falcon/efx.c | 65 |
1 files changed, 51 insertions, 14 deletions
diff --git a/drivers/net/ethernet/sfc/falcon/efx.c b/drivers/net/ethernet/sfc/falcon/efx.c index 423bdf81200f..5ab1e863da14 100644 --- a/drivers/net/ethernet/sfc/falcon/efx.c +++ b/drivers/net/ethernet/sfc/falcon/efx.c @@ -2785,9 +2785,9 @@ static void ef4_pci_remove(struct pci_dev *pci_dev) static void ef4_probe_vpd_strings(struct ef4_nic *efx) { struct pci_dev *dev = efx->pci_dev; - unsigned int vpd_size, kw_len; + int ro_start, ro_size, i, j; + unsigned int vpd_size; u8 *vpd_data; - int start; vpd_data = pci_vpd_alloc(dev, &vpd_size); if (IS_ERR(vpd_data)) { @@ -2795,20 +2795,57 @@ static void ef4_probe_vpd_strings(struct ef4_nic *efx) return; } - start = pci_vpd_find_ro_info_keyword(vpd_data, vpd_size, - PCI_VPD_RO_KEYWORD_PARTNO, &kw_len); - if (start < 0) - pci_warn(dev, "Part number not found or incomplete\n"); - else - pci_info(dev, "Part Number : %.*s\n", kw_len, vpd_data + start); + /* Get the Read only section */ + ro_start = pci_vpd_find_tag(vpd_data, vpd_size, PCI_VPD_LRDT_RO_DATA); + if (ro_start < 0) { + netif_err(efx, drv, efx->net_dev, "VPD Read-only not found\n"); + goto out; + } - start = pci_vpd_find_ro_info_keyword(vpd_data, vpd_size, - PCI_VPD_RO_KEYWORD_SERIALNO, &kw_len); - if (start < 0) - pci_warn(dev, "Serial number not found or incomplete\n"); - else - efx->vpd_sn = kmemdup_nul(vpd_data + start, kw_len, GFP_KERNEL); + ro_size = pci_vpd_lrdt_size(&vpd_data[ro_start]); + j = ro_size; + i = ro_start + PCI_VPD_LRDT_TAG_SIZE; + if (i + j > vpd_size) + j = vpd_size - i; + + /* Get the Part number */ + i = pci_vpd_find_info_keyword(vpd_data, i, j, "PN"); + if (i < 0) { + netif_err(efx, drv, efx->net_dev, "Part number not found\n"); + goto out; + } + + j = pci_vpd_info_field_size(&vpd_data[i]); + i += PCI_VPD_INFO_FLD_HDR_SIZE; + if (i + j > vpd_size) { + netif_err(efx, drv, efx->net_dev, "Incomplete part number\n"); + goto out; + } + netif_info(efx, drv, efx->net_dev, + "Part Number : %.*s\n", j, &vpd_data[i]); + + i = ro_start + PCI_VPD_LRDT_TAG_SIZE; + j = ro_size; + i = pci_vpd_find_info_keyword(vpd_data, i, j, "SN"); + if (i < 0) { + netif_err(efx, drv, efx->net_dev, "Serial number not found\n"); + goto out; + } + + j = pci_vpd_info_field_size(&vpd_data[i]); + i += PCI_VPD_INFO_FLD_HDR_SIZE; + if (i + j > vpd_size) { + netif_err(efx, drv, efx->net_dev, "Incomplete serial number\n"); + goto out; + } + + efx->vpd_sn = kmalloc(j + 1, GFP_KERNEL); + if (!efx->vpd_sn) + goto out; + + snprintf(efx->vpd_sn, j + 1, "%s", &vpd_data[i]); +out: kfree(vpd_data); } |