Re: [PATCH 11/12] cxgb4: Search VPD with pci_vpd_find_ro_info_keyword()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Aug 22, 2021 at 03:59:21PM +0200, Heiner Kallweit wrote:
> Use pci_vpd_find_ro_info_keyword() to search for keywords in VPD to
> simplify the code.
> 
> Signed-off-by: Heiner Kallweit <hkallweit1@xxxxxxxxx>
> ---
>  drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | 67 +++++++++-------------
>  1 file changed, 27 insertions(+), 40 deletions(-)
> 
> diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
> index 2aeb2f80f..5e8ac42ac 100644
> --- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
> +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
> @@ -2743,10 +2743,9 @@ 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 sn, pn, na;
> +	unsigned int id_len, pn_len, sn_len, na_len;
> +	int sn, pn, na, addr, ret = 0;
>  	u8 *vpd, base_val = 0;
> -	unsigned int vpdr_len, kw_offset, id_len;
>  
>  	vpd = vmalloc(VPD_LEN);
>  	if (!vpd)
> @@ -2772,60 +2771,48 @@ 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 = pci_vpd_check_csum(vpd, VPD_LEN);
> +	if (ret) {
> +		dev_err(adapter->pdev_dev, "VPD checksum incorrect or missing\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;
> +	ret = pci_vpd_find_ro_info_keyword(vpd, VPD_LEN,
> +					   PCI_VPD_RO_KEYWORD_SERIALNO, &sn_len);
> +	if (ret < 0)
>  		goto out;
> -	}
> +	sn = ret;
>  
> -#define FIND_VPD_KW(var, name) do { \
> -	var = pci_vpd_find_info_keyword(vpd, kw_offset, vpdr_len, name); \
> -	if (var < 0) { \
> -		dev_err(adapter->pdev_dev, "missing VPD keyword " name "\n"); \

Just for the record, I guess this patch gives up these error messages
that mention the specific keyword that's missing?  Not really an issue
for *me*, since the people generating the VPD content should be able to
easily validate this and figure out any errors.  Just pointing it out
in case the cxgb4 folks are attached to the messages.

> -		ret = -EINVAL; \
> -		goto out; \
> -	} \
> -	var += PCI_VPD_INFO_FLD_HDR_SIZE; \
> -} while (0)
> -
> -	ret = pci_vpd_check_csum(vpd, VPD_LEN);
> -	if (ret) {
> -		dev_err(adapter->pdev_dev, "VPD checksum incorrect or missing\n");
> -		ret = -EINVAL;
> +	ret = pci_vpd_find_ro_info_keyword(vpd, VPD_LEN,
> +					   PCI_VPD_RO_KEYWORD_PARTNO, &pn_len);
> +	if (ret < 0)
>  		goto out;
> -	}
> +	pn = ret;
>  
> -	FIND_VPD_KW(sn, "SN");
> -	FIND_VPD_KW(pn, "PN");
> -	FIND_VPD_KW(na, "NA");
> -#undef FIND_VPD_KW
> +	ret = pci_vpd_find_ro_info_keyword(vpd, VPD_LEN, "NA", &na_len);
> +	if (ret < 0)
> +		goto out;
> +	na = ret;
>  
> -	memcpy(p->id, vpd + PCI_VPD_LRDT_TAG_SIZE, id_len);
> +	memcpy(p->id, vpd + PCI_VPD_LRDT_TAG_SIZE, min_t(int, id_len, ID_LEN));
>  	strim(p->id);
> -	i = pci_vpd_info_field_size(vpd + sn - PCI_VPD_INFO_FLD_HDR_SIZE);
> -	memcpy(p->sn, vpd + sn, min(i, SERNUM_LEN));
> +	memcpy(p->sn, vpd + sn, min_t(int, sn_len, 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));
> +	memcpy(p->pn, vpd + pn, min_t(int, pn_len, PN_LEN));
>  	strim(p->pn);
> -	memcpy(p->na, vpd + na, min(i, MACADDR_LEN));
> +	memcpy(p->na, vpd + na, min_t(int, na_len, MACADDR_LEN));
>  	strim((char *)p->na);
>  
>  out:
>  	vfree(vpd);
> -	return ret < 0 ? ret : 0;
> +	if (ret < 0) {
> +		dev_err(adapter->pdev_dev, "error reading VPD\n");
> +		return ret;
> +	}
> +
> +	return 0;
>  }
>  
>  /**
> -- 
> 2.33.0
> 
> 



[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux