]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Octeontx2-af: Add programmed macaddr to RVU pfvf
authorHariprasad Kelam <hkelam@marvell.com>
Sun, 20 Jul 2025 16:36:35 +0000 (22:06 +0530)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 22 Jul 2025 13:36:39 +0000 (15:36 +0200)
Octeontx2/CN10k MAC block supports DMAC filters. DMAC filters
can be installed on the interface through ethtool.

When a user installs a DMAC filter, the interface's MAC address
is implicitly added to the filter list. To ensure consistency,
this MAC address must be kept in sync with the pfvf->mac_addr field,
which is used to install MAC-based NPC rules.

This patch updates the pfvf->mac_addr field with the programmed MAC
address and also enables VF interfaces to install DMAC filters.

Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250720163638.1560323-2-hkelam@marvell.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c

index 890a1a5df2ded717c6101e51238065f2afc1a659..3303c475414a609e232ff3e2e1a8d555eaeeff70 100644 (file)
@@ -682,16 +682,19 @@ int rvu_mbox_handler_cgx_mac_addr_set(struct rvu *rvu,
                                      struct cgx_mac_addr_set_or_get *rsp)
 {
        int pf = rvu_get_pf(rvu->pdev, req->hdr.pcifunc);
+       struct rvu_pfvf *pfvf;
        u8 cgx_id, lmac_id;
 
-       if (!is_cgx_config_permitted(rvu, req->hdr.pcifunc))
-               return -EPERM;
+       if (!is_pf_cgxmapped(rvu, pf))
+               return LMAC_AF_ERR_PF_NOT_MAPPED;
 
        if (rvu_npc_exact_has_match_table(rvu))
                return rvu_npc_exact_mac_addr_set(rvu, req, rsp);
 
        rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_id, &lmac_id);
 
+       pfvf = &rvu->pf[pf];
+       ether_addr_copy(pfvf->mac_addr, req->mac_addr);
        cgx_lmac_addr_set(cgx_id, lmac_id, req->mac_addr);
 
        return 0;
@@ -769,20 +772,12 @@ int rvu_mbox_handler_cgx_mac_addr_get(struct rvu *rvu,
                                      struct cgx_mac_addr_set_or_get *req,
                                      struct cgx_mac_addr_set_or_get *rsp)
 {
-       int pf = rvu_get_pf(rvu->pdev, req->hdr.pcifunc);
-       u8 cgx_id, lmac_id;
-       int rc = 0;
-       u64 cfg;
+       struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, req->hdr.pcifunc);
 
-       if (!is_cgx_config_permitted(rvu, req->hdr.pcifunc))
-               return -EPERM;
-
-       rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_id, &lmac_id);
+       if (!is_pf_cgxmapped(rvu, rvu_get_pf(rvu->pdev, req->hdr.pcifunc)))
+               return LMAC_AF_ERR_PF_NOT_MAPPED;
 
-       rsp->hdr.rc = rc;
-       cfg = cgx_lmac_addr_get(cgx_id, lmac_id);
-       /* copy 48 bit mac address to req->mac_addr */
-       u64_to_ether_addr(cfg, rsp->mac_addr);
+       ether_addr_copy(rsp->mac_addr, pfvf->mac_addr);
        return 0;
 }