usecs);
 }
 
-int qed_mcp_cmd(struct qed_hwfn *p_hwfn,
-               struct qed_ptt *p_ptt,
-               u32 cmd,
-               u32 param,
-               u32 *o_mcp_resp,
-               u32 *o_mcp_param)
+static int _qed_mcp_cmd(struct qed_hwfn *p_hwfn,
+                       struct qed_ptt *p_ptt,
+                       u32 cmd,
+                       u32 param,
+                       u32 *o_mcp_resp,
+                       u32 *o_mcp_param,
+                       bool can_sleep)
 {
        struct qed_mcp_mb_params mb_params;
        int rc;
        memset(&mb_params, 0, sizeof(mb_params));
        mb_params.cmd = cmd;
        mb_params.param = param;
+       mb_params.flags = can_sleep ? QED_MB_FLAG_CAN_SLEEP : 0;
 
        rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params);
        if (rc)
        return 0;
 }
 
+int qed_mcp_cmd(struct qed_hwfn *p_hwfn,
+               struct qed_ptt *p_ptt,
+               u32 cmd,
+               u32 param,
+               u32 *o_mcp_resp,
+               u32 *o_mcp_param)
+{
+       return (_qed_mcp_cmd(p_hwfn, p_ptt, cmd, param,
+                            o_mcp_resp, o_mcp_param, true));
+}
+
+int qed_mcp_cmd_nosleep(struct qed_hwfn *p_hwfn,
+                       struct qed_ptt *p_ptt,
+                       u32 cmd,
+                       u32 param,
+                       u32 *o_mcp_resp,
+                       u32 *o_mcp_param)
+{
+       return (_qed_mcp_cmd(p_hwfn, p_ptt, cmd, param,
+                            o_mcp_resp, o_mcp_param, false));
+}
+
 static int
 qed_mcp_nvm_wr_cmd(struct qed_hwfn *p_hwfn,
                   struct qed_ptt *p_ptt,
        qed_configure_pf_max_bandwidth(p_hwfn->cdev, p_info->bandwidth_max);
 
        /* Acknowledge the MFW */
-       qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_BW_UPDATE_ACK, 0, &resp,
-                   ¶m);
+       qed_mcp_cmd_nosleep(p_hwfn, p_ptt, DRV_MSG_CODE_BW_UPDATE_ACK, 0, &resp,
+                           ¶m);
 }
 
 static void qed_mcp_update_stag(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
                   p_hwfn->mcp_info->func_info.ovlan, p_hwfn->hw_info.hw_mode);
 
        /* Acknowledge the MFW */
-       qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_S_TAG_UPDATE_ACK, 0,
-                   &resp, ¶m);
+       qed_mcp_cmd_nosleep(p_hwfn, p_ptt, DRV_MSG_CODE_S_TAG_UPDATE_ACK, 0,
+                           &resp, ¶m);
 }
 
 static void qed_mcp_handle_fan_failure(struct qed_hwfn *p_hwfn,
 {
        int rc;
 
-       rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_RESOURCE_CMD, param,
-                        p_mcp_resp, p_mcp_param);
+       rc = qed_mcp_cmd_nosleep(p_hwfn, p_ptt, DRV_MSG_CODE_RESOURCE_CMD,
+                                param, p_mcp_resp, p_mcp_param);
        if (rc)
                return rc;
 
 
                             struct qed_ptt *p_ptt, u32 *p_board_config);
 
 /**
- * qed_mcp_cmd(): General function for sending commands to the MCP
+ * qed_mcp_cmd(): Sleepable function for sending commands to the MCP
  *                mailbox. It acquire mutex lock for the entire
  *                operation, from sending the request until the MCP
  *                response. Waiting for MCP response will be checked up
- *                to 5 seconds every 5ms.
+ *                to 5 seconds every 10ms. Should not be called from atomic
+ *                context.
  *
  * @p_hwfn: HW device data.
  * @p_ptt: PTT required for register access.
                u32 *o_mcp_resp,
                u32 *o_mcp_param);
 
+/**
+ * qed_mcp_cmd_nosleep(): Function for sending commands to the MCP
+ *                        mailbox. It acquire mutex lock for the entire
+ *                        operation, from sending the request until the MCP
+ *                        response. Waiting for MCP response will be checked up
+ *                        to 5 seconds every 10us. Should be called when sleep
+ *                        is not allowed.
+ *
+ * @p_hwfn: HW device data.
+ * @p_ptt: PTT required for register access.
+ * @cmd: command to be sent to the MCP.
+ * @param: Optional param
+ * @o_mcp_resp: The MCP response code (exclude sequence).
+ * @o_mcp_param: Optional parameter provided by the MCP
+ *                     response
+ *
+ * Return: Int - 0 - Operation was successul.
+ */
+int qed_mcp_cmd_nosleep(struct qed_hwfn *p_hwfn,
+                       struct qed_ptt *p_ptt,
+                       u32 cmd,
+                       u32 param,
+                       u32 *o_mcp_resp,
+                       u32 *o_mcp_param);
+
 /**
  * qed_mcp_drain(): drains the nig, allowing completion to pass in
  *                  case of pauses.