int rc = 0;
 
        rtnl_lock();
+       mutex_lock(&edev->en_dev_lock);
        if (!bp->irq_tbl) {
                rc = -ENODEV;
                goto exit;
        bnxt_fill_msix_vecs(bp, bp->edev->msix_entries);
        edev->flags |= BNXT_EN_FLAG_MSIX_REQUESTED;
 exit:
+       mutex_unlock(&edev->en_dev_lock);
        rtnl_unlock();
        return rc;
 }
 
        ulp = edev->ulp_tbl;
        rtnl_lock();
+       mutex_lock(&edev->en_dev_lock);
        if (ulp->msix_requested)
                edev->flags &= ~BNXT_EN_FLAG_MSIX_REQUESTED;
        edev->ulp_tbl->msix_requested = 0;
                msleep(100);
                i++;
        }
+       mutex_unlock(&edev->en_dev_lock);
        rtnl_unlock();
        return;
 }
        if (!edev)
                return;
 
+       mutex_lock(&edev->en_dev_lock);
+       if (!bnxt_ulp_registered(edev)) {
+               mutex_unlock(&edev->en_dev_lock);
+               return;
+       }
+
        edev->flags |= BNXT_EN_FLAG_ULP_STOPPED;
        if (aux_priv) {
                struct auxiliary_device *adev;
                        adrv->suspend(adev, pm);
                }
        }
+       mutex_unlock(&edev->en_dev_lock);
 }
 
 void bnxt_ulp_start(struct bnxt *bp, int err)
        if (err)
                return;
 
+       mutex_lock(&edev->en_dev_lock);
+       if (!bnxt_ulp_registered(edev)) {
+               mutex_unlock(&edev->en_dev_lock);
+               return;
+       }
+
        if (edev->ulp_tbl->msix_requested)
                bnxt_fill_msix_vecs(bp, edev->msix_entries);
 
                        adrv->resume(adev);
                }
        }
-
+       mutex_unlock(&edev->en_dev_lock);
 }
 
 void bnxt_ulp_irq_stop(struct bnxt *bp)
        edev->l2_db_size = bp->db_size;
        edev->l2_db_size_nc = bp->db_size;
        edev->l2_db_offset = bp->db_offset;
+       mutex_init(&edev->en_dev_lock);
 
        if (bp->flags & BNXT_FLAG_ROCEV1_CAP)
                edev->flags |= BNXT_EN_FLAG_ROCEV1_CAP;