1df29c91cSHarman Kalra /* SPDX-License-Identifier: BSD-3-Clause 2df29c91cSHarman Kalra * Copyright(C) 2024 Marvell. 3df29c91cSHarman Kalra */ 4df29c91cSHarman Kalra 5df29c91cSHarman Kalra #include <arpa/inet.h> 6df29c91cSHarman Kalra 7df29c91cSHarman Kalra #include "roc_api.h" 8df29c91cSHarman Kalra #include "roc_priv.h" 9df29c91cSHarman Kalra 10df29c91cSHarman Kalra static int 11df29c91cSHarman Kalra eswitch_vlan_rx_cfg(uint16_t pcifunc, struct mbox *mbox) 12df29c91cSHarman Kalra { 13df29c91cSHarman Kalra struct nix_vtag_config *vtag_cfg; 14df29c91cSHarman Kalra int rc; 15df29c91cSHarman Kalra 16df29c91cSHarman Kalra vtag_cfg = mbox_alloc_msg_nix_vtag_cfg(mbox_get(mbox)); 17df29c91cSHarman Kalra if (!vtag_cfg) { 18df29c91cSHarman Kalra rc = -EINVAL; 19df29c91cSHarman Kalra goto exit; 20df29c91cSHarman Kalra } 21df29c91cSHarman Kalra 22df29c91cSHarman Kalra /* config strip, capture and size */ 23df29c91cSHarman Kalra vtag_cfg->hdr.pcifunc = pcifunc; 24df29c91cSHarman Kalra vtag_cfg->vtag_size = NIX_VTAGSIZE_T4; 25df29c91cSHarman Kalra vtag_cfg->cfg_type = VTAG_RX; /* rx vlan cfg */ 26df29c91cSHarman Kalra vtag_cfg->rx.vtag_type = NIX_RX_VTAG_TYPE0; 27df29c91cSHarman Kalra vtag_cfg->rx.strip_vtag = true; 28df29c91cSHarman Kalra vtag_cfg->rx.capture_vtag = true; 29df29c91cSHarman Kalra 30df29c91cSHarman Kalra rc = mbox_process(mbox); 31df29c91cSHarman Kalra if (rc) 32df29c91cSHarman Kalra goto exit; 33df29c91cSHarman Kalra 34df29c91cSHarman Kalra rc = 0; 35df29c91cSHarman Kalra exit: 36df29c91cSHarman Kalra mbox_put(mbox); 37df29c91cSHarman Kalra return rc; 38df29c91cSHarman Kalra } 39df29c91cSHarman Kalra 40df29c91cSHarman Kalra static int 41df29c91cSHarman Kalra eswitch_vlan_tx_cfg(struct roc_npc_flow *flow, uint16_t pcifunc, struct mbox *mbox, 42df29c91cSHarman Kalra uint16_t vlan_tci, uint16_t *vidx) 43df29c91cSHarman Kalra { 44df29c91cSHarman Kalra struct nix_vtag_config *vtag_cfg; 45df29c91cSHarman Kalra struct nix_vtag_config_rsp *rsp; 46df29c91cSHarman Kalra int rc; 47df29c91cSHarman Kalra 48df29c91cSHarman Kalra union { 49df29c91cSHarman Kalra uint64_t reg; 50df29c91cSHarman Kalra struct nix_tx_vtag_action_s act; 51df29c91cSHarman Kalra } tx_vtag_action; 52df29c91cSHarman Kalra 53df29c91cSHarman Kalra vtag_cfg = mbox_alloc_msg_nix_vtag_cfg(mbox_get(mbox)); 54df29c91cSHarman Kalra if (!vtag_cfg) { 55df29c91cSHarman Kalra rc = -EINVAL; 56df29c91cSHarman Kalra goto exit; 57df29c91cSHarman Kalra } 58df29c91cSHarman Kalra 59df29c91cSHarman Kalra /* Insert vlan tag */ 60df29c91cSHarman Kalra vtag_cfg->hdr.pcifunc = pcifunc; 61df29c91cSHarman Kalra vtag_cfg->vtag_size = NIX_VTAGSIZE_T4; 62df29c91cSHarman Kalra vtag_cfg->cfg_type = VTAG_TX; /* tx vlan cfg */ 63df29c91cSHarman Kalra vtag_cfg->tx.cfg_vtag0 = true; 64df29c91cSHarman Kalra vtag_cfg->tx.vtag0 = (((uint32_t)ROC_ESWITCH_VLAN_TPID << 16) | vlan_tci); 65df29c91cSHarman Kalra 66df29c91cSHarman Kalra rc = mbox_process_msg(mbox, (void *)&rsp); 67df29c91cSHarman Kalra if (rc) 68df29c91cSHarman Kalra goto exit; 69df29c91cSHarman Kalra 70df29c91cSHarman Kalra if (rsp->vtag0_idx < 0) { 71df29c91cSHarman Kalra plt_err("Failed to config TX VTAG action"); 72df29c91cSHarman Kalra rc = -EINVAL; 73df29c91cSHarman Kalra goto exit; 74df29c91cSHarman Kalra } 75df29c91cSHarman Kalra 76df29c91cSHarman Kalra *vidx = rsp->vtag0_idx; 77df29c91cSHarman Kalra tx_vtag_action.reg = 0; 78df29c91cSHarman Kalra tx_vtag_action.act.vtag0_def = rsp->vtag0_idx; 79df29c91cSHarman Kalra tx_vtag_action.act.vtag0_lid = NPC_LID_LA; 80df29c91cSHarman Kalra tx_vtag_action.act.vtag0_op = NIX_TX_VTAGOP_INSERT; 81df29c91cSHarman Kalra tx_vtag_action.act.vtag0_relptr = NIX_TX_VTAGACTION_VTAG0_RELPTR; 82df29c91cSHarman Kalra 83df29c91cSHarman Kalra flow->vtag_action = tx_vtag_action.reg; 84df29c91cSHarman Kalra 85df29c91cSHarman Kalra rc = 0; 86df29c91cSHarman Kalra exit: 87df29c91cSHarman Kalra mbox_put(mbox); 88df29c91cSHarman Kalra return rc; 89df29c91cSHarman Kalra } 90df29c91cSHarman Kalra 91df29c91cSHarman Kalra int 92df29c91cSHarman Kalra roc_eswitch_npc_mcam_tx_rule(struct roc_npc *roc_npc, struct roc_npc_flow *flow, uint16_t pcifunc, 93df29c91cSHarman Kalra uint32_t vlan_tci) 94df29c91cSHarman Kalra { 95df29c91cSHarman Kalra struct npc *npc = roc_npc_to_npc_priv(roc_npc); 96df29c91cSHarman Kalra struct npc_install_flow_req *req; 97df29c91cSHarman Kalra struct npc_install_flow_rsp *rsp; 98df29c91cSHarman Kalra struct mbox *mbox = npc->mbox; 99df29c91cSHarman Kalra uint16_t vidx = 0, lbkid; 100df29c91cSHarman Kalra int rc; 101df29c91cSHarman Kalra 102df29c91cSHarman Kalra rc = eswitch_vlan_tx_cfg(flow, roc_npc->pf_func, mbox, vlan_tci, &vidx); 103df29c91cSHarman Kalra if (rc) { 104df29c91cSHarman Kalra plt_err("Failed to configure VLAN TX, err %d", rc); 105df29c91cSHarman Kalra goto fail; 106df29c91cSHarman Kalra } 107df29c91cSHarman Kalra 108df29c91cSHarman Kalra req = mbox_alloc_msg_npc_install_flow(mbox_get(mbox)); 109df29c91cSHarman Kalra if (!req) { 110df29c91cSHarman Kalra rc = -EINVAL; 111df29c91cSHarman Kalra goto exit; 112df29c91cSHarman Kalra } 113df29c91cSHarman Kalra 114df29c91cSHarman Kalra lbkid = 0; 115df29c91cSHarman Kalra req->hdr.pcifunc = roc_npc->pf_func; /* Eswitch PF is requester */ 116df29c91cSHarman Kalra req->vf = pcifunc; 117df29c91cSHarman Kalra req->entry = flow->mcam_id; 118df29c91cSHarman Kalra req->intf = NPC_MCAM_TX; 119df29c91cSHarman Kalra req->op = NIX_TX_ACTIONOP_UCAST_CHAN; 120df29c91cSHarman Kalra req->index = (lbkid << 8) | ROC_ESWITCH_LBK_CHAN; 121df29c91cSHarman Kalra req->set_cntr = 1; 122df29c91cSHarman Kalra req->vtag0_def = vidx; 123df29c91cSHarman Kalra req->vtag0_op = 1; 124df29c91cSHarman Kalra rc = mbox_process_msg(mbox, (void *)&rsp); 125df29c91cSHarman Kalra if (rc) 126df29c91cSHarman Kalra goto exit; 127df29c91cSHarman Kalra 128df29c91cSHarman Kalra flow->nix_intf = NIX_INTF_TX; 129df29c91cSHarman Kalra exit: 130df29c91cSHarman Kalra mbox_put(mbox); 131df29c91cSHarman Kalra fail: 132df29c91cSHarman Kalra return rc; 133df29c91cSHarman Kalra } 134df29c91cSHarman Kalra 135df29c91cSHarman Kalra static int 136df29c91cSHarman Kalra eswitch_vtag_cfg_delete(struct roc_npc *roc_npc, struct roc_npc_flow *flow) 137df29c91cSHarman Kalra { 138df29c91cSHarman Kalra struct npc *npc = roc_npc_to_npc_priv(roc_npc); 139df29c91cSHarman Kalra struct nix_vtag_config *vtag_cfg; 140df29c91cSHarman Kalra struct nix_vtag_config_rsp *rsp; 141df29c91cSHarman Kalra struct mbox *mbox = npc->mbox; 142df29c91cSHarman Kalra int rc = 0; 143df29c91cSHarman Kalra 144df29c91cSHarman Kalra union { 145df29c91cSHarman Kalra uint64_t reg; 146df29c91cSHarman Kalra struct nix_tx_vtag_action_s act; 147df29c91cSHarman Kalra } tx_vtag_action; 148df29c91cSHarman Kalra 149df29c91cSHarman Kalra tx_vtag_action.reg = flow->vtag_action; 150df29c91cSHarman Kalra vtag_cfg = mbox_alloc_msg_nix_vtag_cfg(mbox_get(mbox)); 151df29c91cSHarman Kalra 152df29c91cSHarman Kalra if (vtag_cfg == NULL) { 153df29c91cSHarman Kalra rc = -ENOSPC; 154df29c91cSHarman Kalra goto exit; 155df29c91cSHarman Kalra } 156df29c91cSHarman Kalra 157df29c91cSHarman Kalra vtag_cfg->cfg_type = VTAG_TX; 158df29c91cSHarman Kalra vtag_cfg->vtag_size = NIX_VTAGSIZE_T4; 159df29c91cSHarman Kalra vtag_cfg->tx.vtag0_idx = tx_vtag_action.act.vtag0_def; 160df29c91cSHarman Kalra vtag_cfg->tx.free_vtag0 = true; 161df29c91cSHarman Kalra 162df29c91cSHarman Kalra rc = mbox_process_msg(mbox, (void *)&rsp); 163df29c91cSHarman Kalra if (rc) 164df29c91cSHarman Kalra goto exit; 165df29c91cSHarman Kalra 166df29c91cSHarman Kalra rc = rsp->hdr.rc; 167df29c91cSHarman Kalra exit: 168df29c91cSHarman Kalra mbox_put(mbox); 169df29c91cSHarman Kalra return rc; 170df29c91cSHarman Kalra } 171df29c91cSHarman Kalra 172df29c91cSHarman Kalra int 173df29c91cSHarman Kalra roc_eswitch_npc_mcam_delete_rule(struct roc_npc *roc_npc, struct roc_npc_flow *flow, 174df29c91cSHarman Kalra uint16_t pcifunc) 175df29c91cSHarman Kalra { 176df29c91cSHarman Kalra struct npc *npc = roc_npc_to_npc_priv(roc_npc); 177df29c91cSHarman Kalra struct npc_delete_flow_req *req; 178df29c91cSHarman Kalra struct msg_rsp *rsp; 179df29c91cSHarman Kalra struct mbox *mbox = npc->mbox; 180df29c91cSHarman Kalra int rc = 0; 181df29c91cSHarman Kalra 182df29c91cSHarman Kalra /* Removing the VLAN TX config */ 183df29c91cSHarman Kalra if (flow->nix_intf == NIX_INTF_TX) { 184df29c91cSHarman Kalra rc = eswitch_vtag_cfg_delete(roc_npc, flow); 185df29c91cSHarman Kalra if (rc) 186df29c91cSHarman Kalra plt_err("Failed to delete TX vtag config"); 187df29c91cSHarman Kalra } 188df29c91cSHarman Kalra 189df29c91cSHarman Kalra req = mbox_alloc_msg_npc_delete_flow(mbox_get(mbox)); 190df29c91cSHarman Kalra if (!req) { 191df29c91cSHarman Kalra rc = -EINVAL; 192df29c91cSHarman Kalra goto exit; 193df29c91cSHarman Kalra } 194df29c91cSHarman Kalra 195df29c91cSHarman Kalra req->entry = flow->mcam_id; 196df29c91cSHarman Kalra req->vf = pcifunc; 197df29c91cSHarman Kalra rc = mbox_process_msg(mbox, (void *)&rsp); 198df29c91cSHarman Kalra if (rc) 199df29c91cSHarman Kalra goto exit; 200df29c91cSHarman Kalra 201df29c91cSHarman Kalra rc = rsp->hdr.rc; 202df29c91cSHarman Kalra exit: 203df29c91cSHarman Kalra mbox_put(mbox); 204df29c91cSHarman Kalra return rc; 205df29c91cSHarman Kalra } 206df29c91cSHarman Kalra 207df29c91cSHarman Kalra int 208df29c91cSHarman Kalra roc_eswitch_npc_mcam_rx_rule(struct roc_npc *roc_npc, struct roc_npc_flow *flow, uint16_t pcifunc, 209df29c91cSHarman Kalra uint16_t vlan_tci, uint16_t vlan_tci_mask) 210df29c91cSHarman Kalra { 211df29c91cSHarman Kalra struct npc *npc = roc_npc_to_npc_priv(roc_npc); 212df29c91cSHarman Kalra struct npc_install_flow_req *req; 213df29c91cSHarman Kalra struct npc_install_flow_rsp *rsp; 214df29c91cSHarman Kalra struct mbox *mbox = npc->mbox; 215df29c91cSHarman Kalra bool is_esw_dev; 216df29c91cSHarman Kalra int rc; 217df29c91cSHarman Kalra 218df29c91cSHarman Kalra /* For ESW PF/VF */ 219df29c91cSHarman Kalra is_esw_dev = (dev_get_pf(roc_npc->pf_func) == dev_get_pf(pcifunc)); 220df29c91cSHarman Kalra /* VLAN Rx config */ 221df29c91cSHarman Kalra if (is_esw_dev) { 222df29c91cSHarman Kalra rc = eswitch_vlan_rx_cfg(roc_npc->pf_func, mbox); 223df29c91cSHarman Kalra if (rc) { 224df29c91cSHarman Kalra plt_err("Failed to configure VLAN RX rule, err %d", rc); 225df29c91cSHarman Kalra goto fail; 226df29c91cSHarman Kalra } 227df29c91cSHarman Kalra } 228df29c91cSHarman Kalra 229df29c91cSHarman Kalra req = mbox_alloc_msg_npc_install_flow(mbox_get(mbox)); 230df29c91cSHarman Kalra if (!req) { 231df29c91cSHarman Kalra rc = -EINVAL; 232df29c91cSHarman Kalra goto exit; 233df29c91cSHarman Kalra } 234df29c91cSHarman Kalra 235df29c91cSHarman Kalra req->vf = pcifunc; 236df29c91cSHarman Kalra /* Action */ 237df29c91cSHarman Kalra req->op = NIX_RX_ACTIONOP_DEFAULT; 238df29c91cSHarman Kalra req->index = 0; 239df29c91cSHarman Kalra req->entry = flow->mcam_id; 240df29c91cSHarman Kalra req->hdr.pcifunc = roc_npc->pf_func; /* Eswitch PF is requester */ 241df29c91cSHarman Kalra req->features = BIT_ULL(NPC_OUTER_VID) | BIT_ULL(NPC_VLAN_ETYPE_CTAG); 242df29c91cSHarman Kalra req->vtag0_valid = true; 243df29c91cSHarman Kalra /* For ESW PF/VF using configured vlan rx cfg while for other 244df29c91cSHarman Kalra * representees using standard vlan_type = 7 which is strip. 245df29c91cSHarman Kalra */ 246df29c91cSHarman Kalra req->vtag0_type = is_esw_dev ? NIX_RX_VTAG_TYPE0 : NIX_RX_VTAG_TYPE7; 247df29c91cSHarman Kalra req->packet.vlan_etype = ROC_ESWITCH_VLAN_TPID; 248df29c91cSHarman Kalra req->mask.vlan_etype = 0xFFFF; 249df29c91cSHarman Kalra req->packet.vlan_tci = ntohs(vlan_tci & 0xFFFF); 250df29c91cSHarman Kalra req->mask.vlan_tci = ntohs(vlan_tci_mask); 251df29c91cSHarman Kalra 252df29c91cSHarman Kalra req->channel = ROC_ESWITCH_LBK_CHAN; 253df29c91cSHarman Kalra req->chan_mask = 0xffff; 254df29c91cSHarman Kalra req->intf = NPC_MCAM_RX; 255df29c91cSHarman Kalra req->set_cntr = 1; 256df29c91cSHarman Kalra req->cntr_val = flow->ctr_id; 257df29c91cSHarman Kalra 258df29c91cSHarman Kalra rc = mbox_process_msg(mbox, (void *)&rsp); 259df29c91cSHarman Kalra if (rc) 260df29c91cSHarman Kalra goto exit; 261df29c91cSHarman Kalra 262df29c91cSHarman Kalra flow->nix_intf = NIX_INTF_RX; 263df29c91cSHarman Kalra exit: 264df29c91cSHarman Kalra mbox_put(mbox); 265df29c91cSHarman Kalra fail: 266df29c91cSHarman Kalra return rc; 267df29c91cSHarman Kalra } 268df29c91cSHarman Kalra 269df29c91cSHarman Kalra int 270df29c91cSHarman Kalra roc_eswitch_npc_rss_action_configure(struct roc_npc *roc_npc, struct roc_npc_flow *flow, 271df29c91cSHarman Kalra uint32_t flowkey_cfg, uint16_t *reta_tbl) 272df29c91cSHarman Kalra { 273df29c91cSHarman Kalra struct npc *npc = roc_npc_to_npc_priv(roc_npc); 274df29c91cSHarman Kalra struct roc_nix *roc_nix = roc_npc->roc_nix; 275df29c91cSHarman Kalra uint32_t rss_grp_idx; 276df29c91cSHarman Kalra uint8_t flowkey_algx; 277df29c91cSHarman Kalra int rc; 278df29c91cSHarman Kalra 279df29c91cSHarman Kalra rc = npc_rss_free_grp_get(npc, &rss_grp_idx); 280df29c91cSHarman Kalra /* RSS group :0 is not usable for flow rss action */ 281df29c91cSHarman Kalra if (rc < 0 || rss_grp_idx == 0) 282df29c91cSHarman Kalra return -ENOSPC; 283df29c91cSHarman Kalra 284df29c91cSHarman Kalra /* Populating reta table for the specific RSS group */ 285df29c91cSHarman Kalra rc = roc_nix_rss_reta_set(roc_nix, rss_grp_idx, reta_tbl); 286df29c91cSHarman Kalra if (rc) { 287df29c91cSHarman Kalra plt_err("Failed to init rss table rc = %d", rc); 288df29c91cSHarman Kalra return rc; 289df29c91cSHarman Kalra } 290df29c91cSHarman Kalra 291df29c91cSHarman Kalra rc = roc_nix_rss_flowkey_set(roc_nix, &flowkey_algx, flowkey_cfg, rss_grp_idx, 292df29c91cSHarman Kalra flow->mcam_id); 293df29c91cSHarman Kalra if (rc) { 294df29c91cSHarman Kalra plt_err("Failed to set rss hash function rc = %d", rc); 295df29c91cSHarman Kalra return rc; 296df29c91cSHarman Kalra } 297df29c91cSHarman Kalra 298df29c91cSHarman Kalra plt_bitmap_set(npc->rss_grp_entries, rss_grp_idx); 299df29c91cSHarman Kalra 300df29c91cSHarman Kalra flow->npc_action &= (~(0xfULL)); 301df29c91cSHarman Kalra flow->npc_action |= NIX_RX_ACTIONOP_RSS; 302df29c91cSHarman Kalra flow->npc_action |= 303df29c91cSHarman Kalra ((uint64_t)(flowkey_algx & NPC_RSS_ACT_ALG_MASK) << NPC_RSS_ACT_ALG_OFFSET) | 304df29c91cSHarman Kalra ((uint64_t)(rss_grp_idx & NPC_RSS_ACT_GRP_MASK) << NPC_RSS_ACT_GRP_OFFSET); 305df29c91cSHarman Kalra return 0; 306df29c91cSHarman Kalra } 3078ae147acSHarman Kalra 3088ae147acSHarman Kalra int 3098ae147acSHarman Kalra roc_eswitch_nix_vlan_tpid_set(struct roc_nix *roc_nix, uint32_t type, uint16_t tpid, bool is_vf) 3108ae147acSHarman Kalra { 3118ae147acSHarman Kalra struct nix *nix = roc_nix_to_nix_priv(roc_nix); 3128ae147acSHarman Kalra struct dev *dev = &nix->dev; 3138ae147acSHarman Kalra int rc; 3148ae147acSHarman Kalra 3158ae147acSHarman Kalra /* Configuring for PF/VF */ 3168ae147acSHarman Kalra rc = nix_vlan_tpid_set(dev->mbox, dev->pf_func | is_vf, type, tpid); 3178ae147acSHarman Kalra if (rc) 3188ae147acSHarman Kalra plt_err("Failed to set tpid for PF, rc %d", rc); 3198ae147acSHarman Kalra 3208ae147acSHarman Kalra return rc; 3218ae147acSHarman Kalra } 322d85c80b4SHarman Kalra 323d85c80b4SHarman Kalra int 324d85c80b4SHarman Kalra roc_eswitch_nix_process_repte_notify_cb_register(struct roc_nix *roc_nix, 325d85c80b4SHarman Kalra process_repte_notify_t proc_repte_nt) 326d85c80b4SHarman Kalra { 327d85c80b4SHarman Kalra struct nix *nix = roc_nix_to_nix_priv(roc_nix); 328d85c80b4SHarman Kalra struct dev *dev = &nix->dev; 329d85c80b4SHarman Kalra 330d85c80b4SHarman Kalra if (proc_repte_nt == NULL) 331d85c80b4SHarman Kalra return NIX_ERR_PARAM; 332d85c80b4SHarman Kalra 333d85c80b4SHarman Kalra dev->ops->repte_notify = (repte_notify_t)proc_repte_nt; 334d85c80b4SHarman Kalra return 0; 335d85c80b4SHarman Kalra } 336d85c80b4SHarman Kalra 337d85c80b4SHarman Kalra void 338d85c80b4SHarman Kalra roc_eswitch_nix_process_repte_notify_cb_unregister(struct roc_nix *roc_nix) 339d85c80b4SHarman Kalra { 340d85c80b4SHarman Kalra struct nix *nix = roc_nix_to_nix_priv(roc_nix); 341d85c80b4SHarman Kalra struct dev *dev = &nix->dev; 342d85c80b4SHarman Kalra 343d85c80b4SHarman Kalra dev->ops->repte_notify = NULL; 344d85c80b4SHarman Kalra } 345d921b1bbSHarman Kalra 346d921b1bbSHarman Kalra int 347d921b1bbSHarman Kalra roc_eswitch_nix_repte_stats(struct roc_nix *roc_nix, uint16_t pf_func, struct roc_nix_stats *stats) 348d921b1bbSHarman Kalra { 349d921b1bbSHarman Kalra struct nix *nix = roc_nix_to_nix_priv(roc_nix); 350d921b1bbSHarman Kalra struct dev *dev = &nix->dev; 351d921b1bbSHarman Kalra struct nix_get_lf_stats_req *req; 352d921b1bbSHarman Kalra struct nix_lf_stats_rsp *rsp; 353d921b1bbSHarman Kalra struct mbox *mbox; 354d921b1bbSHarman Kalra int rc; 355d921b1bbSHarman Kalra 356d921b1bbSHarman Kalra mbox = mbox_get(dev->mbox); 357d921b1bbSHarman Kalra req = mbox_alloc_msg_nix_get_lf_stats(mbox); 358d921b1bbSHarman Kalra if (!req) { 359d921b1bbSHarman Kalra rc = -ENOSPC; 360d921b1bbSHarman Kalra goto exit; 361d921b1bbSHarman Kalra } 362d921b1bbSHarman Kalra 363d921b1bbSHarman Kalra req->hdr.pcifunc = roc_nix_get_pf_func(roc_nix); 364d921b1bbSHarman Kalra req->pcifunc = pf_func; 365d921b1bbSHarman Kalra 366d921b1bbSHarman Kalra rc = mbox_process_msg(mbox, (void *)&rsp); 367d921b1bbSHarman Kalra if (rc) 368d921b1bbSHarman Kalra goto exit; 369d921b1bbSHarman Kalra 370d921b1bbSHarman Kalra stats->rx_octs = rsp->rx.octs; 371d921b1bbSHarman Kalra stats->rx_ucast = rsp->rx.ucast; 372d921b1bbSHarman Kalra stats->rx_bcast = rsp->rx.bcast; 373d921b1bbSHarman Kalra stats->rx_mcast = rsp->rx.mcast; 374d921b1bbSHarman Kalra stats->rx_drop = rsp->rx.drop; 375d921b1bbSHarman Kalra stats->rx_drop_octs = rsp->rx.drop_octs; 376d921b1bbSHarman Kalra stats->rx_drop_bcast = rsp->rx.drop_bcast; 377d921b1bbSHarman Kalra stats->rx_drop_mcast = rsp->rx.drop_mcast; 378d921b1bbSHarman Kalra stats->rx_err = rsp->rx.err; 379d921b1bbSHarman Kalra 380d921b1bbSHarman Kalra stats->tx_ucast = rsp->tx.ucast; 381d921b1bbSHarman Kalra stats->tx_bcast = rsp->tx.bcast; 382d921b1bbSHarman Kalra stats->tx_mcast = rsp->tx.mcast; 383d921b1bbSHarman Kalra stats->tx_drop = rsp->tx.drop; 384d921b1bbSHarman Kalra stats->tx_octs = rsp->tx.octs; 385d921b1bbSHarman Kalra 386d921b1bbSHarman Kalra exit: 387d921b1bbSHarman Kalra mbox_put(mbox); 388d921b1bbSHarman Kalra return rc; 389d921b1bbSHarman Kalra } 390*29a8df5cSHarman Kalra 391*29a8df5cSHarman Kalra int 392*29a8df5cSHarman Kalra roc_eswitch_is_repte_pfs_vf(uint16_t rep_pffunc, uint16_t pf_pffunc) 393*29a8df5cSHarman Kalra { 394*29a8df5cSHarman Kalra uint16_t rep_pf = dev_get_pf(rep_pffunc); 395*29a8df5cSHarman Kalra 396*29a8df5cSHarman Kalra if (roc_model_is_cn20k()) 397*29a8df5cSHarman Kalra return ((rep_pf << RVU_PFVF_PF_SHIFT_CN20K) == pf_pffunc); 398*29a8df5cSHarman Kalra else 399*29a8df5cSHarman Kalra return ((rep_pf << RVU_PFVF_PF_SHIFT) == pf_pffunc); 400*29a8df5cSHarman Kalra } 401