Identify the NIC type from its PCI device ID at initialization and store it
in the NIC private data, so per-model behaviour can be selected without
scattered PCI device ID comparisons.

Signed-off-by: Jiacheng Ye <[email protected]>
---
 drivers/net/hinic3/hinic3_ethdev.c | 17 +++++++++++++++++
 drivers/net/hinic3/hinic3_ethdev.h | 10 ++++++++++
 2 files changed, 27 insertions(+)

diff --git a/drivers/net/hinic3/hinic3_ethdev.c 
b/drivers/net/hinic3/hinic3_ethdev.c
index 9944edf978..678ed46454 100644
--- a/drivers/net/hinic3/hinic3_ethdev.c
+++ b/drivers/net/hinic3/hinic3_ethdev.c
@@ -482,6 +482,22 @@ hinic3_init_default_cos(struct hinic3_nic_dev *nic_dev)
        return 0;
 }
 
+static enum nic_type
+hinic3_get_nic_type(struct rte_pci_device *pci_dev)
+{
+       switch (pci_dev->id.device_id) {
+       case HINIC3_DEV_ID_SP620:
+       case HINIC3_DEV_ID_VF_SP620:
+       case HINIC3_DEV_ID_SP920: /* SP920 is the DPU card of SP620. */
+               return NIC_SP620;
+       case HINIC3_DEV_ID_SP230:
+       case HINIC3_DEV_ID_VF_SP230:
+               return NIC_SP230;
+       default:
+               return NIC_UNKNOWN;
+       }
+}
+
 /**
  * Initialize Class of Service (CoS). For PF devices, it also sync the link
  * status with the physical port.
@@ -3420,6 +3436,7 @@ hinic3_func_init(struct rte_eth_dev *eth_dev)
 
        nic_dev = HINIC3_ETH_DEV_TO_PRIVATE_NIC_DEV(eth_dev);
        memset(nic_dev, 0, sizeof(*nic_dev));
+       nic_dev->nic_type = hinic3_get_nic_type(pci_dev);
        snprintf(nic_dev->dev_name, sizeof(nic_dev->dev_name),
                "dbdf-%.4x:%.2x:%.2x.%x", pci_dev->addr.domain,
                pci_dev->addr.bus, pci_dev->addr.devid,
diff --git a/drivers/net/hinic3/hinic3_ethdev.h 
b/drivers/net/hinic3/hinic3_ethdev.h
index 9061e2b217..c46fcfcbec 100644
--- a/drivers/net/hinic3/hinic3_ethdev.h
+++ b/drivers/net/hinic3/hinic3_ethdev.h
@@ -106,6 +106,12 @@ enum nic_feature_cap {
 TAILQ_HEAD(hinic3_ethertype_filter_list, rte_flow);
 TAILQ_HEAD(hinic3_fdir_rule_filter_list, rte_flow);
 
+enum nic_type {
+       NIC_SP620 = 0,
+       NIC_SP230 = 1,
+       NIC_UNKNOWN = 2,
+};
+
 struct hinic3_nic_dev {
        struct hinic3_hwdev *hwdev; /**< Hardware device. */
        struct hinic3_txq **txqs;
@@ -152,9 +158,13 @@ struct hinic3_nic_dev {
        struct hinic3_nic_cmdq_ops *cmdq_ops;
        struct hinic3_nic_rx_ops *rx_ops;
        struct hinic3_nic_tx_ops *tx_ops;
+       enum nic_type nic_type; /**< NIC type. */
 
 };
 
+#define HINIC3_IS_SP620_NIC(nic_dev) ((nic_dev)->nic_type == NIC_SP620)
+#define HINIC3_IS_SP230_NIC(nic_dev) ((nic_dev)->nic_type == NIC_SP230)
+
 extern const struct rte_flow_ops hinic3_flow_ops;
 
 /**
-- 
2.33.0

Reply via email to