diff mbox series

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

Message ID db576a3e-e877-b37b-98ed-cfc03d225ab3@gmail.com
State New
Headers show
Series [01/12] sfc: falcon: Read VPD with pci_vpd_alloc() | expand

Commit Message

Heiner Kallweit Aug. 22, 2021, 1:59 p.m. UTC
Use pci_vpd_find_ro_info_keyword() to search for keywords in VPD to
simplify the code.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | 67 +++++++++-------------
 1 file changed, 27 insertions(+), 40 deletions(-)

Comments

Bjorn Helgaas Aug. 24, 2021, 5:11 p.m. UTC | #1
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@gmail.com>

> ---

>  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

> 

>
Heiner Kallweit Aug. 24, 2021, 6:06 p.m. UTC | #2
On 24.08.2021 19:11, Bjorn Helgaas wrote:
> 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@gmail.com>

>> ---

>>  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.

> 

Right. My thought was: With userspace tools like "lspci -vv" or
"od <path>/vpd" it's easy to check the actual content of VPD and find
out which keyword is missing. Therefore the missing keyword doesn't
necessarily has to be referenced in an error message.

>> -		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

>>

>>
diff mbox series

Patch

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"); \
-		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;
 }
 
 /**