Add support for OEM subsystem vendor ID.

Signed-off-by: Jiawen Wu <jiawe...@trustnetic.com>
---
 doc/guides/rel_notes/release_22_07.rst |  1 +
 drivers/net/ngbe/base/ngbe_hw.c        | 13 +++++++------
 drivers/net/ngbe/base/ngbe_type.h      |  2 +-
 drivers/net/ngbe/ngbe_ethdev.c         | 14 +++++++++++++-
 4 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/doc/guides/rel_notes/release_22_07.rst 
b/doc/guides/rel_notes/release_22_07.rst
index 96db85a707..b26efb8719 100644
--- a/doc/guides/rel_notes/release_22_07.rst
+++ b/doc/guides/rel_notes/release_22_07.rst
@@ -166,6 +166,7 @@ New Features
 * **Updated Wangxun ngbe driver.**
 
   * Added support for yt8531s PHY.
+  * Added support for OEM subsystem vendor ID.
 
 * **Updated Wangxun txgbe driver.**
 
diff --git a/drivers/net/ngbe/base/ngbe_hw.c b/drivers/net/ngbe/base/ngbe_hw.c
index c1114ba3b1..283cdca367 100644
--- a/drivers/net/ngbe/base/ngbe_hw.c
+++ b/drivers/net/ngbe/base/ngbe_hw.c
@@ -1822,22 +1822,23 @@ s32 ngbe_enable_rx_dma(struct ngbe_hw *hw, u32 regval)
 /* cmd_addr is used for some special command:
  * 1. to be sector address, when implemented erase sector command
  * 2. to be flash address when implemented read, write flash address
+ *
+ * Return 0 on success, return 1 on failure.
  */
 u32 ngbe_fmgr_cmd_op(struct ngbe_hw *hw, u32 cmd, u32 cmd_addr)
 {
-       u32 cmd_val = 0;
-       u32 i = 0;
+       u32 cmd_val, i;
 
        cmd_val = NGBE_SPICMD_CMD(cmd) | NGBE_SPICMD_CLK(3) | cmd_addr;
        wr32(hw, NGBE_SPICMD, cmd_val);
 
-       for (i = 0; i < 10000; i++) {
+       for (i = 0; i < NGBE_SPI_TIMEOUT; i++) {
                if (rd32(hw, NGBE_SPISTAT) & NGBE_SPISTAT_OPDONE)
                        break;
 
                usec_delay(10);
        }
-       if (i == 10000)
+       if (i == NGBE_SPI_TIMEOUT)
                return 1;
 
        return 0;
@@ -1845,10 +1846,10 @@ u32 ngbe_fmgr_cmd_op(struct ngbe_hw *hw, u32 cmd, u32 
cmd_addr)
 
 u32 ngbe_flash_read_dword(struct ngbe_hw *hw, u32 addr)
 {
-       u32 status = 0;
+       u32 status;
 
        status = ngbe_fmgr_cmd_op(hw, 1, addr);
-       if (status) {
+       if (status == 0x1) {
                DEBUGOUT("Read flash timeout.");
                return status;
        }
diff --git a/drivers/net/ngbe/base/ngbe_type.h 
b/drivers/net/ngbe/base/ngbe_type.h
index 0ad4766d2a..4a6c273f1e 100644
--- a/drivers/net/ngbe/base/ngbe_type.h
+++ b/drivers/net/ngbe/base/ngbe_type.h
@@ -18,7 +18,7 @@
 #define NGBE_MAX_UTA              128
 
 #define NGBE_PCI_MASTER_DISABLE_TIMEOUT        800
-
+#define NGBE_SPI_TIMEOUT       10000
 
 #define NGBE_ALIGN             128 /* as intel did */
 #define NGBE_ISB_SIZE          16
diff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c
index 5ac1c27a58..ee09d54c2f 100644
--- a/drivers/net/ngbe/ngbe_ethdev.c
+++ b/drivers/net/ngbe/ngbe_ethdev.c
@@ -359,7 +359,19 @@ eth_ngbe_dev_init(struct rte_eth_dev *eth_dev, void 
*init_params __rte_unused)
        hw->back = pci_dev;
        hw->device_id = pci_dev->id.device_id;
        hw->vendor_id = pci_dev->id.vendor_id;
-       hw->sub_system_id = pci_dev->id.subsystem_device_id;
+       if (pci_dev->id.subsystem_vendor_id == PCI_VENDOR_ID_WANGXUN) {
+               hw->sub_system_id = pci_dev->id.subsystem_device_id;
+       } else {
+               u32 ssid;
+
+               ssid = ngbe_flash_read_dword(hw, 0xFFFDC);
+               if (ssid == 0x1) {
+                       PMD_INIT_LOG(ERR,
+                               "Read of internal subsystem device id 
failed\n");
+                       return -ENODEV;
+               }
+               hw->sub_system_id = (u16)ssid >> 8 | (u16)ssid << 8;
+       }
        ngbe_map_device_id(hw);
        hw->hw_addr = (void *)pci_dev->mem_resource[0].addr;
 
-- 
2.27.0



Reply via email to