[dpdk-dev] [PATCH v2] net/ice: fix incorrect EEPROM data

Jiang, YuX yux.jiang at intel.com
Wed Jul 1 04:46:53 CEST 2020


Tested-by: Jiang, YuX <yux.jiang at intel.com>

-----Original Message-----
From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Shougang Wang
Sent: Sunday, June 28, 2020 11:38 AM
To: dev at dpdk.org
Cc: Xing, Beilei <beilei.xing at intel.com>; Yang, Qiming <qiming.yang at intel.com>; Wang, ShougangX <shougangx.wang at intel.com>; stable at dpdk.org
Subject: [dpdk-dev] [PATCH v2] net/ice: fix incorrect EEPROM data

Kernel driver reads EEPROM data from flash but DPDK reads from shadow ram. This patch fixes the issue by changing method to get EEPROM data from flash.

Fixes: 68a1ab82ad74 ("net/ice: speed up to retrieve EEPROM")
Cc: stable at dpdk.org

Signed-off-by: Shougang Wang <shougangx.wang at intel.com>
---
 drivers/net/ice/ice_ethdev.c | 25 +++++++++++--------------
 1 file changed, 11 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c index 5a89a1955..eaffb6578 100644
--- a/drivers/net/ice/ice_ethdev.c
+++ b/drivers/net/ice/ice_ethdev.c
@@ -3956,8 +3956,7 @@ ice_get_eeprom_length(struct rte_eth_dev *dev)  {
 	struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
-	/* Convert word count to byte count */
-	return hw->nvm.sr_words << 1;
+	return hw->nvm.flash_size;
 }
 
 static int
@@ -3965,26 +3964,24 @@ ice_get_eeprom(struct rte_eth_dev *dev,
 	       struct rte_dev_eeprom_info *eeprom)  {
 	struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	uint16_t *data = eeprom->data;
-	uint16_t first_word, last_word, nwords;
 	enum ice_status status = ICE_SUCCESS;
+	uint8_t *data = eeprom->data;
 
-	first_word = eeprom->offset >> 1;
-	last_word = (eeprom->offset + eeprom->length - 1) >> 1;
-	nwords = last_word - first_word + 1;
+	eeprom->magic = hw->vendor_id | (hw->device_id << 16);
 
-	if (first_word >= hw->nvm.sr_words ||
-	    last_word >= hw->nvm.sr_words) {
-		PMD_DRV_LOG(ERR, "Requested EEPROM bytes out of range.");
-		return -EINVAL;
+	status = ice_acquire_nvm(hw, ICE_RES_READ);
+	if (status) {
+		PMD_DRV_LOG(ERR, "acquire nvm failed.");
+		return -EIO;
 	}
 
-	eeprom->magic = hw->vendor_id | (hw->device_id << 16);
+	status = ice_read_flat_nvm(hw, eeprom->offset, &eeprom->length,
+				   data, false);
+
+	ice_release_nvm(hw);
 
-	status = ice_read_sr_buf(hw, first_word, &nwords, data);
 	if (status) {
 		PMD_DRV_LOG(ERR, "EEPROM read failed.");
-		eeprom->length = sizeof(uint16_t) * nwords;
 		return -EIO;
 	}
 
--
2.17.1



More information about the dev mailing list