if (oct_dev->watchdog_task)
                kthread_stop(oct_dev->watchdog_task);
 
+       if (!oct_dev->octeon_id &&
+           oct_dev->fw_info.app_cap_flags & LIQUIDIO_SWITCHDEV_CAP)
+               lio_vf_rep_modexit();
+
        if (oct_dev->app_mode && (oct_dev->app_mode == CVM_DRV_NIC_APP))
                liquidio_stop_nic_module(oct_dev);
 
                goto octnet_init_failure;
        }
 
+       /* Call vf_rep_modinit if the firmware is switchdev capable
+        * and do it from the first liquidio function probed.
+        */
+       if (!oct->octeon_id &&
+           oct->fw_info.app_cap_flags & LIQUIDIO_SWITCHDEV_CAP) {
+               if (lio_vf_rep_modinit()) {
+                       liquidio_stop_nic_module(oct);
+                       goto octnet_init_failure;
+               }
+       }
+
        liquidio_ptp_init(oct);
 
        dev_dbg(&oct->pci_dev->dev, "Network interfaces ready\n");
 
 
        oct->vf_rep_list.num_vfs = 0;
 }
+
+static int
+lio_vf_rep_netdev_event(struct notifier_block *nb,
+                       unsigned long event, void *ptr)
+{
+       struct net_device *ndev = netdev_notifier_info_to_dev(ptr);
+       struct lio_vf_rep_desc *vf_rep;
+       struct lio_vf_rep_req rep_cfg;
+       struct octeon_device *oct;
+       int ret;
+
+       switch (event) {
+       case NETDEV_REGISTER:
+       case NETDEV_CHANGENAME:
+               break;
+
+       default:
+               return NOTIFY_DONE;
+       }
+
+       if (ndev->netdev_ops != &lio_vf_rep_ndev_ops)
+               return NOTIFY_DONE;
+
+       vf_rep = netdev_priv(ndev);
+       oct = vf_rep->oct;
+
+       if (strlen(ndev->name) > LIO_IF_NAME_SIZE) {
+               dev_err(&oct->pci_dev->dev,
+                       "Device name change sync failed as the size is > %d\n",
+                       LIO_IF_NAME_SIZE);
+               return NOTIFY_DONE;
+       }
+
+       memset(&rep_cfg, 0, sizeof(rep_cfg));
+       rep_cfg.req_type = LIO_VF_REP_REQ_DEVNAME;
+       rep_cfg.ifidx = vf_rep->ifidx;
+       strncpy(rep_cfg.rep_name.name, ndev->name, LIO_IF_NAME_SIZE);
+
+       ret = lio_vf_rep_send_soft_command(oct, &rep_cfg,
+                                          sizeof(rep_cfg), NULL, 0);
+       if (ret)
+               dev_err(&oct->pci_dev->dev,
+                       "vf_rep netdev name change failed with err %d\n", ret);
+
+       return NOTIFY_DONE;
+}
+
+static struct notifier_block lio_vf_rep_netdev_notifier = {
+       .notifier_call = lio_vf_rep_netdev_event,
+};
+
+int
+lio_vf_rep_modinit(void)
+{
+       if (register_netdevice_notifier(&lio_vf_rep_netdev_notifier)) {
+               pr_err("netdev notifier registration failed\n");
+               return -EFAULT;
+       }
+
+       return 0;
+}
+
+void
+lio_vf_rep_modexit(void)
+{
+       if (unregister_netdevice_notifier(&lio_vf_rep_netdev_notifier))
+               pr_err("netdev notifier unregister failed\n");
+}