if (bp->eswitch_mode != DEVLINK_ESWITCH_MODE_SWITCHDEV)
                return;
 
-       for (i = 0; i < pci_num_vf(bp->pdev); i++)
-               bnxt_vf_rep_open(bp->vf_reps[i]->dev);
+       for (i = 0; i < pci_num_vf(bp->pdev); i++) {
+               /* Open the VF-Rep only if it is allocated in the FW */
+               if (bp->vf_reps[i]->tx_cfa_action != CFA_HANDLE_INVALID)
+                       bnxt_vf_rep_open(bp->vf_reps[i]->dev);
+       }
 }
 
 static void __bnxt_free_one_vf_rep(struct bnxt *bp, struct bnxt_vf_rep *vf_rep)
        __bnxt_vf_reps_destroy(bp);
 }
 
+/* Free the VF-Reps in firmware, during firmware hot-reset processing.
+ * Note that the VF-Rep netdevs are still active (not unregistered) during
+ * this process. As the mode transition from SWITCHDEV to LEGACY happens
+ * under the rtnl_lock() this routine is safe under the rtnl_lock().
+ */
+void bnxt_vf_reps_free(struct bnxt *bp)
+{
+       u16 num_vfs = pci_num_vf(bp->pdev);
+       int i;
+
+       if (bp->eswitch_mode != DEVLINK_ESWITCH_MODE_SWITCHDEV)
+               return;
+
+       for (i = 0; i < num_vfs; i++)
+               __bnxt_free_one_vf_rep(bp, bp->vf_reps[i]);
+}
+
 static int bnxt_alloc_vf_rep(struct bnxt *bp, struct bnxt_vf_rep *vf_rep,
                             u16 *cfa_code_map)
 {
        return 0;
 }
 
+/* Allocate the VF-Reps in firmware, during firmware hot-reset processing.
+ * Note that the VF-Rep netdevs are still active (not unregistered) during
+ * this process. As the mode transition from SWITCHDEV to LEGACY happens
+ * under the rtnl_lock() this routine is safe under the rtnl_lock().
+ */
+int bnxt_vf_reps_alloc(struct bnxt *bp)
+{
+       u16 *cfa_code_map = bp->cfa_code_map, num_vfs = pci_num_vf(bp->pdev);
+       struct bnxt_vf_rep *vf_rep;
+       int rc, i;
+
+       if (bp->eswitch_mode != DEVLINK_ESWITCH_MODE_SWITCHDEV)
+               return 0;
+
+       if (!cfa_code_map)
+               return -EINVAL;
+
+       for (i = 0; i < MAX_CFA_CODE; i++)
+               cfa_code_map[i] = VF_IDX_INVALID;
+
+       for (i = 0; i < num_vfs; i++) {
+               vf_rep = bp->vf_reps[i];
+               vf_rep->vf_idx = i;
+
+               rc = bnxt_alloc_vf_rep(bp, vf_rep, cfa_code_map);
+               if (rc)
+                       goto err;
+       }
+
+       return 0;
+
+err:
+       netdev_info(bp->dev, "%s error=%d\n", __func__, rc);
+       bnxt_vf_reps_free(bp);
+       return rc;
+}
+
 /* Use the OUI of the PF's perm addr and report the same mac addr
  * for the same VF-rep each time
  */
 
 void bnxt_vf_reps_open(struct bnxt *bp);
 void bnxt_vf_rep_rx(struct bnxt *bp, struct sk_buff *skb);
 struct net_device *bnxt_get_vf_rep(struct bnxt *bp, u16 cfa_code);
+int bnxt_vf_reps_alloc(struct bnxt *bp);
+void bnxt_vf_reps_free(struct bnxt *bp);
 
 static inline u16 bnxt_vf_rep_get_fid(struct net_device *dev)
 {
 {
        return false;
 }
+
+static inline int bnxt_vf_reps_alloc(struct bnxt *bp)
+{
+       return 0;
+}
+
+static inline void bnxt_vf_reps_free(struct bnxt *bp)
+{
+}
+
 #endif /* CONFIG_BNXT_SRIOV */
 #endif /* BNXT_VFR_H */