octeon: add support for mac address update 69/40669/6
authorAlok Mishra <almishra@marvell.com>
Wed, 10 Apr 2024 07:34:51 +0000 (13:04 +0530)
committerDamjan Marion <dmarion@0xa5.net>
Mon, 13 May 2024 09:00:20 +0000 (09:00 +0000)
This patch adds support for updating primary hardware address
on octeon port.

Type: feature

Change-Id: Ib0ff6aaa6dafc209eb71c44b8a6504d3df9aa5c8
Signed-off-by: Alok Mishra <almishra@marvell.com>
src/plugins/dev_octeon/port.c

index d5f7830..98a4c28 100644 (file)
@@ -416,6 +416,44 @@ oct_op_config_promisc_mode (vlib_main_t *vm, vnet_dev_port_t *port, int enable)
   return VNET_DEV_OK;
 }
 
+static vnet_dev_rv_t
+oct_port_add_del_eth_addr (vlib_main_t *vm, vnet_dev_port_t *port,
+                          vnet_dev_hw_addr_t *addr, int is_add,
+                          int is_primary)
+{
+  vnet_dev_t *dev = port->dev;
+  oct_device_t *cd = vnet_dev_get_data (dev);
+  struct roc_nix *nix = cd->nix;
+  vnet_dev_rv_t rv = VNET_DEV_OK;
+
+  i32 rrv;
+
+  if (is_primary)
+    {
+      if (is_add)
+       {
+         /* Update mac address at NPC */
+         rrv = roc_nix_npc_mac_addr_set (nix, (u8 *) addr);
+         if (rrv)
+           rv = oct_roc_err (dev, rrv, "roc_nix_npc_mac_addr_set() failed");
+
+         /* Update mac address at CGX for PFs only */
+         if (!roc_nix_is_vf_or_sdp (nix))
+           {
+             rrv = roc_nix_mac_addr_set (nix, (u8 *) addr);
+             if (rrv)
+               {
+                 /* Rollback to previous mac address */
+                 roc_nix_npc_mac_addr_set (nix,
+                                           (u8 *) &port->primary_hw_addr);
+                 rv = oct_roc_err (dev, rrv, "roc_nix_mac_addr_set() failed");
+               }
+           }
+       }
+    }
+  return rv;
+}
+
 vnet_dev_rv_t
 oct_port_cfg_change_validate (vlib_main_t *vm, vnet_dev_port_t *port,
                              vnet_dev_port_cfg_change_req_t *req)
@@ -465,6 +503,9 @@ oct_port_cfg_change (vlib_main_t *vm, vnet_dev_port_t *port,
       break;
 
     case VNET_DEV_PORT_CFG_CHANGE_PRIMARY_HW_ADDR:
+      rv = oct_port_add_del_eth_addr (vm, port, &req->addr,
+                                     /* is_add */ 1,
+                                     /* is_primary */ 1);
       break;
 
     case VNET_DEV_PORT_CFG_ADD_SECONDARY_HW_ADDR: