Loading drivers/net/ethernet/sfc/falcon/efx.c +51 −14 Original line number Diff line number Diff line Loading @@ -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)) { Loading @@ -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); } Loading Loading
drivers/net/ethernet/sfc/falcon/efx.c +51 −14 Original line number Diff line number Diff line Loading @@ -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)) { Loading @@ -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); } Loading