Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bnxt_en: Read partno and serialno of the board from VPD

Store the part number and serial number information from VPD in
the bnxt structure. Follow up patch will add the support to display
the information via devlink command.

Signed-off-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Vasundhara Volam and committed by
David S. Miller
a0d0fd70 16efafa3

+63
+59
drivers/net/ethernet/broadcom/bnxt/bnxt.c
··· 11752 11752 return rc; 11753 11753 } 11754 11754 11755 + #define BNXT_VPD_LEN 512 11756 + static void bnxt_vpd_read_info(struct bnxt *bp) 11757 + { 11758 + struct pci_dev *pdev = bp->pdev; 11759 + int i, len, pos, ro_size; 11760 + ssize_t vpd_size; 11761 + u8 *vpd_data; 11762 + 11763 + vpd_data = kmalloc(BNXT_VPD_LEN, GFP_KERNEL); 11764 + if (!vpd_data) 11765 + return; 11766 + 11767 + vpd_size = pci_read_vpd(pdev, 0, BNXT_VPD_LEN, vpd_data); 11768 + if (vpd_size <= 0) { 11769 + netdev_err(bp->dev, "Unable to read VPD\n"); 11770 + goto exit; 11771 + } 11772 + 11773 + i = pci_vpd_find_tag(vpd_data, 0, vpd_size, PCI_VPD_LRDT_RO_DATA); 11774 + if (i < 0) { 11775 + netdev_err(bp->dev, "VPD READ-Only not found\n"); 11776 + goto exit; 11777 + } 11778 + 11779 + ro_size = pci_vpd_lrdt_size(&vpd_data[i]); 11780 + i += PCI_VPD_LRDT_TAG_SIZE; 11781 + if (i + ro_size > vpd_size) 11782 + goto exit; 11783 + 11784 + pos = pci_vpd_find_info_keyword(vpd_data, i, ro_size, 11785 + PCI_VPD_RO_KEYWORD_PARTNO); 11786 + if (pos < 0) 11787 + goto read_sn; 11788 + 11789 + len = pci_vpd_info_field_size(&vpd_data[pos]); 11790 + pos += PCI_VPD_INFO_FLD_HDR_SIZE; 11791 + if (len + pos > vpd_size) 11792 + goto read_sn; 11793 + 11794 + strlcpy(bp->board_partno, &vpd_data[pos], min(len, BNXT_VPD_FLD_LEN)); 11795 + 11796 + read_sn: 11797 + pos = pci_vpd_find_info_keyword(vpd_data, i, ro_size, 11798 + PCI_VPD_RO_KEYWORD_SERIALNO); 11799 + if (pos < 0) 11800 + goto exit; 11801 + 11802 + len = pci_vpd_info_field_size(&vpd_data[pos]); 11803 + pos += PCI_VPD_INFO_FLD_HDR_SIZE; 11804 + if (len + pos > vpd_size) 11805 + goto exit; 11806 + 11807 + strlcpy(bp->board_serialno, &vpd_data[pos], min(len, BNXT_VPD_FLD_LEN)); 11808 + exit: 11809 + kfree(vpd_data); 11810 + } 11811 + 11755 11812 static int bnxt_pcie_dsn_get(struct bnxt *bp, u8 dsn[]) 11756 11813 { 11757 11814 struct pci_dev *pdev = bp->pdev; ··· 11865 11808 dev->watchdog_timeo = BNXT_TX_TIMEOUT; 11866 11809 dev->ethtool_ops = &bnxt_ethtool_ops; 11867 11810 pci_set_drvdata(pdev, dev); 11811 + 11812 + bnxt_vpd_read_info(bp); 11868 11813 11869 11814 rc = bnxt_alloc_hwrm_resources(bp); 11870 11815 if (rc)
+4
drivers/net/ethernet/broadcom/bnxt/bnxt.h
··· 1500 1500 (chip_num) == CHIP_NUM_58804 || \ 1501 1501 (chip_num) == CHIP_NUM_58808) 1502 1502 1503 + #define BNXT_VPD_FLD_LEN 32 1504 + char board_partno[BNXT_VPD_FLD_LEN]; 1505 + char board_serialno[BNXT_VPD_FLD_LEN]; 1506 + 1503 1507 struct net_device *dev; 1504 1508 struct pci_dev *pdev; 1505 1509