From: Aarnav JP <[email protected]>

With inbound CPT CQ events, port_id is unavailable since the inline
device has no roc_nix. Resolve eth_dev for inbound CQ events in the
cn20k PMD callback via the SA private data chain instead of relying
on port_id.

Add an eth_dev back pointer to cnxk_eth_sec_sess, populated at
session creation, to complete the SA-to-ethdev lookup path
(inb_priv->eth_sec->eth_dev).

Signed-off-by: Aarnav JP <[email protected]>
---
Changes in v2: No change.

 drivers/net/cnxk/cn20k_ethdev_sec.c | 22 ++++++++++++++++++++--
 drivers/net/cnxk/cnxk_ethdev.h      |  3 +++
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/drivers/net/cnxk/cn20k_ethdev_sec.c 
b/drivers/net/cnxk/cn20k_ethdev_sec.c
index 31f2518ea3..a5be85901f 100644
--- a/drivers/net/cnxk/cn20k_ethdev_sec.c
+++ b/drivers/net/cnxk/cn20k_ethdev_sec.c
@@ -541,7 +541,6 @@ cn20k_eth_sec_sso_work_cb(uint64_t *gw, void *args, enum 
nix_inl_event_type type
        uintptr_t nixtx;
        uint8_t port;

-       RTE_SET_USED(args);
        plt_nix_dbg("Received %s event", get_inl_event_type(type));

        switch ((gw[0] >> 28) & 0xF) {
@@ -561,8 +560,26 @@ cn20k_eth_sec_sso_work_cb(uint64_t *gw, void *args, enum 
nix_inl_event_type type
                /* Fall through */
        default:
                if (type) {
-                       eth_dev = &rte_eth_devices[port_id];
                        struct cpt_cq_s *cqs = (struct cpt_cq_s *)cq_s;
+
+                       if (type == NIX_INL_INB_CPT_CQ) {
+                               struct cn20k_inb_priv_data *inb_priv;
+
+                               inb_priv = 
roc_nix_inl_ow_ipsec_inb_sa_sw_rsvd(args);
+                               if (inb_priv->eth_sec && 
inb_priv->eth_sec->eth_dev) {
+                                       eth_dev = inb_priv->eth_sec->eth_dev;
+                               } else {
+                                       plt_err("Inbound CPT CQ event: no 
eth_dev in SA priv");
+                                       return;
+                               }
+                       } else {
+                               if (port_id >= RTE_MAX_ETHPORTS) {
+                                       plt_err("CPT CQ event: invalid port_id 
%u", port_id);
+                                       return;
+                               }
+                               eth_dev = &rte_eth_devices[port_id];
+                       }
+
                        if (type < NIX_INL_SSO) {
                                cn20k_eth_sec_post_event(eth_dev, args, type,
                                                         
(uint16_t)cqs->w0.s.uc_compcode,
@@ -804,6 +821,7 @@ cn20k_eth_sec_session_create(void *device, struct 
rte_security_session_conf *con
        inl_dev = !!dev->inb.inl_dev;

        memset(eth_sec, 0, sizeof(struct cnxk_eth_sec_sess));
+       eth_sec->eth_dev = eth_dev;
        sess_priv.u64 = 0;

        lock = inbound ? &dev->inb.lock : &dev->outb.lock;
diff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h
index ea6a2be30e..6686fdba31 100644
--- a/drivers/net/cnxk/cnxk_ethdev.h
+++ b/drivers/net/cnxk/cnxk_ethdev.h
@@ -225,6 +225,9 @@ struct cnxk_eth_sec_sess {

        /* Out-Of-Place processing */
        bool inb_oop;
+
+       /* Back pointer to eth_dev for port_id derivation in CQ callbacks */
+       struct rte_eth_dev *eth_dev;
 };

 TAILQ_HEAD(cnxk_eth_sec_sess_list, cnxk_eth_sec_sess);
--
2.34.1

Reply via email to