}
 
        /* Set MBX Tag state to Active */
-       spin_lock(&phba->ctrl.mbox_lock);
+       mutex_lock(&phba->ctrl.mbox_lock);
        phba->ctrl.ptag_state[tag].tag_state = MCC_TAG_STATE_RUNNING;
-       spin_unlock(&phba->ctrl.mbox_lock);
+       mutex_unlock(&phba->ctrl.mbox_lock);
 
        /* wait for the mccq completion */
        rc = wait_event_interruptible_timeout(
        if (rc <= 0) {
                struct be_dma_mem *tag_mem;
                /* Set MBX Tag state to timeout */
-               spin_lock(&phba->ctrl.mbox_lock);
+               mutex_lock(&phba->ctrl.mbox_lock);
                phba->ctrl.ptag_state[tag].tag_state = MCC_TAG_STATE_TIMEOUT;
-               spin_unlock(&phba->ctrl.mbox_lock);
+               mutex_unlock(&phba->ctrl.mbox_lock);
 
                /* Store resource addr to be freed later */
                tag_mem = &phba->ctrl.ptag_state[tag].tag_mem_state;
        } else {
                rc = 0;
                /* Set MBX Tag state to completed */
-               spin_lock(&phba->ctrl.mbox_lock);
+               mutex_lock(&phba->ctrl.mbox_lock);
                phba->ctrl.ptag_state[tag].tag_state = MCC_TAG_STATE_COMPLETED;
-               spin_unlock(&phba->ctrl.mbox_lock);
+               mutex_unlock(&phba->ctrl.mbox_lock);
        }
 
        mcc_tag_response = phba->ctrl.mcc_numtag[tag];
                                            tag_mem->va, tag_mem->dma);
 
                /* Change tag state */
-               spin_lock(&phba->ctrl.mbox_lock);
+               mutex_lock(&phba->ctrl.mbox_lock);
                ctrl->ptag_state[tag].tag_state = MCC_TAG_STATE_COMPLETED;
-               spin_unlock(&phba->ctrl.mbox_lock);
+               mutex_unlock(&phba->ctrl.mbox_lock);
 
                /* Free MCC Tag */
                free_mcc_tag(ctrl, tag);
        struct be_dma_mem *q_mem = &eq->dma_mem;
        int status;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        memset(wrb, 0, sizeof(*wrb));
 
        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
                eq->id = le16_to_cpu(resp->eq_id);
                eq->created = true;
        }
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return status;
 }
 
        int status;
        u8 *endian_check;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        memset(wrb, 0, sizeof(*wrb));
 
        endian_check = (u8 *) wrb;
                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
                            "BC_%d : be_cmd_fw_initialize Failed\n");
 
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return status;
 }
 
        int status;
        u8 *endian_check;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        memset(wrb, 0, sizeof(*wrb));
 
        endian_check = (u8 *) wrb;
                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
                            "BC_%d : be_cmd_fw_uninit Failed\n");
 
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return status;
 }
 
        void *ctxt = &req->context;
        int status;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        memset(wrb, 0, sizeof(*wrb));
 
        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
                            "BC_%d : In be_cmd_cq_create, status=ox%08x\n",
                            status);
 
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
 
        return status;
 }
        void *ctxt;
        int status;
 
-       spin_lock(&phba->ctrl.mbox_lock);
+       mutex_lock(&phba->ctrl.mbox_lock);
        ctrl = &phba->ctrl;
        wrb = wrb_from_mbox(&ctrl->mbox_mem);
        memset(wrb, 0, sizeof(*wrb));
                mccq->id = le16_to_cpu(resp->id);
                mccq->created = true;
        }
-       spin_unlock(&phba->ctrl.mbox_lock);
+       mutex_unlock(&phba->ctrl.mbox_lock);
 
        return status;
 }
                    "BC_%d : In beiscsi_cmd_q_destroy "
                    "queue_type : %d\n", queue_type);
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        memset(wrb, 0, sizeof(*wrb));
        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
 
                opcode = OPCODE_COMMON_ISCSI_CFG_REMOVE_SGL_PAGES;
                break;
        default:
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                BUG();
                return -ENXIO;
        }
 
        status = be_mbox_notify(ctrl);
 
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return status;
 }
 
        void *ctxt = &req->context;
        int status;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        memset(wrb, 0, sizeof(*wrb));
 
        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
                        defq_ring->doorbell_offset = resp->doorbell_offset;
                }
        }
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
 
        return status;
 }
        struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
        int status;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        memset(wrb, 0, sizeof(*wrb));
 
        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
                        pwrb_context->doorbell_offset = resp->doorbell_offset;
                }
        }
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return status;
 }
 
        struct be_post_template_pages_req *req = embedded_payload(wrb);
        int status;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
 
        memset(wrb, 0, sizeof(*wrb));
        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
        be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
 
        status = be_mbox_notify(ctrl);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return status;
 }
 
        struct be_remove_template_pages_req *req = embedded_payload(wrb);
        int status;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
 
        memset(wrb, 0, sizeof(*wrb));
        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
        req->type = BEISCSI_TEMPLATE_HDR_TYPE_ISCSI;
 
        status = be_mbox_notify(ctrl);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return status;
 }
 
        if (num_pages == 0xff)
                num_pages = 1;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        do {
                memset(wrb, 0, sizeof(*wrb));
                be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
                }
        } while (num_pages > 0);
 error:
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        if (status != 0)
                beiscsi_cmd_q_destroy(ctrl, NULL, QTYPE_SGL);
        return status;
        struct be_post_sgl_pages_req *req = embedded_payload(wrb);
        int status;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
 
        req = embedded_payload(wrb);
        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
                           OPCODE_COMMON_FUNCTION_RESET, sizeof(*req));
        status = be_mbox_notify_wait(phba);
 
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return status;
 }
 
        struct be_cmd_set_vlan_req *req;
        struct be_ctrl_info *ctrl = &phba->ctrl;
 
-       spin_lock(&ctrl->mbox_lock);
+       if (mutex_lock_interruptible(&ctrl->mbox_lock))
+               return 0;
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                return tag;
        }
 
        req->vlan_priority = vlan_tag;
 
        be_mcc_notify(phba);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
 
        return tag;
 }
 
        unsigned int tag = 0;
        int i;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                return tag;
        }
 
        }
 
        be_mcc_notify(phba);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return tag;
 }
 
                    BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
                    "BG_%d : In bescsi_get_boot_target\n");
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                return tag;
        }
 
        req->session_handle = sess_handle;
 
        be_mcc_notify(phba);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return tag;
 }
 
                    BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
                    "BG_%d : In bescsi_get_boot_target\n");
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                return tag;
        }
 
                           sizeof(struct be_cmd_get_boot_target_resp));
 
        be_mcc_notify(phba);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return tag;
 }
 
                    BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
                    "BG_%d : In beiscsi_get_session_info\n");
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                return tag;
        }
 
        sge->len = cpu_to_le32(nonemb_cmd->size);
 
        be_mcc_notify(phba);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return tag;
 }
 
        struct be_fw_cfg *req = embedded_payload(wrb);
        int status = 0;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        memset(wrb, 0, sizeof(*wrb));
 
        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
                status = -EINVAL;
        }
 
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return status;
 }
 
        nonemb_cmd.size = sizeof(struct be_mgmt_controller_attributes);
        req = nonemb_cmd.va;
        memset(req, 0, sizeof(*req));
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        memset(wrb, 0, sizeof(*wrb));
        be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
        be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
        } else
                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
                            "BG_%d :  Failed in mgmt_check_supported_fw\n");
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        if (nonemb_cmd.va)
                pci_free_consistent(ctrl->pdev, nonemb_cmd.size,
                                    nonemb_cmd.va, nonemb_cmd.dma);
        req->region = region;
        req->sector = sector;
        req->offset = offset;
-       spin_lock(&ctrl->mbox_lock);
 
+       if (mutex_lock_interruptible(&ctrl->mbox_lock))
+               return 0;
        switch (bsg_req->rqst_data.h_vendor.vendor_cmd[0]) {
        case BEISCSI_WRITE_FLASH:
                offset = sector * sector_size + offset;
                            "BG_%d : Unsupported cmd = 0x%x\n\n",
                            bsg_req->rqst_data.h_vendor.vendor_cmd[0]);
 
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                return -ENOSYS;
        }
 
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                return tag;
        }
 
 
        be_mcc_notify(phba);
 
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return tag;
 }
 
        struct iscsi_cleanup_req *req = embedded_payload(wrb);
        int status = 0;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
 
        be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
        be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
        if (status)
                beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT,
                            "BG_%d : mgmt_epfw_cleanup , FAILED\n");
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return status;
 }
 
        struct invalidate_commands_params_in *req;
        unsigned int i, tag = 0;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                return tag;
        }
 
        sge->len = cpu_to_le32(nonemb_cmd->size);
 
        be_mcc_notify(phba);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return tag;
 }
 
        struct iscsi_invalidate_connection_params_in *req;
        unsigned int tag = 0;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                return tag;
        }
        wrb = wrb_from_mccq(phba);
                req->cleanup_type = CMD_ISCSI_CONNECTION_INVALIDATE;
        req->save_cfg = savecfg_flag;
        be_mcc_notify(phba);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return tag;
 }
 
        struct tcp_upload_params_in *req;
        unsigned int tag = 0;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                return tag;
        }
        wrb = wrb_from_mccq(phba);
        req->id = (unsigned short)cid;
        req->upload_type = (unsigned char)upload_flag;
        be_mcc_notify(phba);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return tag;
 }
 
 
        ptemplate_address = &template_address;
        ISCSI_GET_PDU_TEMPLATE_ADDRESS(phba, ptemplate_address);
-       spin_lock(&ctrl->mbox_lock);
+       if (mutex_lock_interruptible(&ctrl->mbox_lock))
+               return 0;
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                return tag;
        }
        wrb = wrb_from_mccq(phba);
                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
                            "BG_%d : unknown addr family %d\n",
                            dst_addr->sa_family);
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                free_mcc_tag(&phba->ctrl, tag);
                return -EINVAL;
 
        }
 
        be_mcc_notify(phba);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return tag;
 }
 
        unsigned int tag;
        int status = 0;
 
-       spin_lock(&ctrl->mbox_lock);
+       if (mutex_lock_interruptible(&ctrl->mbox_lock))
+               return -EINTR;
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                return -ENOMEM;
        }
 
                           OPCODE_COMMON_ISCSI_NTWK_GET_ALL_IF_ID,
                           sizeof(*req));
        be_mcc_notify(phba);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
 
        status = beiscsi_mccq_compl(phba, tag, &wrb, NULL);
        if (status) {
        unsigned int tag;
        int rc = 0;
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                rc = -ENOMEM;
                goto free_cmd;
        }
        sge->len = cpu_to_le32(nonemb_cmd->size);
 
        be_mcc_notify(phba);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
 
        rc = beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd);
 
        struct be_cmd_hba_name *req;
        struct be_ctrl_info *ctrl = &phba->ctrl;
 
-       spin_lock(&ctrl->mbox_lock);
+       if (mutex_lock_interruptible(&ctrl->mbox_lock))
+               return 0;
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                return tag;
        }
 
                        sizeof(*req));
 
        be_mcc_notify(phba);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return tag;
 }
 
        struct be_cmd_ntwk_link_status_req *req;
        struct be_ctrl_info *ctrl = &phba->ctrl;
 
-       spin_lock(&ctrl->mbox_lock);
+       if (mutex_lock_interruptible(&ctrl->mbox_lock))
+               return 0;
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                return tag;
        }
 
                        sizeof(*req));
 
        be_mcc_notify(phba);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
        return tag;
 }
 
                    BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
                    "BG_%d : In bescsi_logout_fwboot_sess\n");
 
-       spin_lock(&ctrl->mbox_lock);
+       mutex_lock(&ctrl->mbox_lock);
        tag = alloc_mcc_tag(phba);
        if (!tag) {
-               spin_unlock(&ctrl->mbox_lock);
+               mutex_unlock(&ctrl->mbox_lock);
                beiscsi_log(phba, KERN_INFO,
                            BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
                            "BG_%d : MBX Tag Failure\n");
        /* Set the session handle */
        req->session_handle = fw_sess_handle;
        be_mcc_notify(phba);
-       spin_unlock(&ctrl->mbox_lock);
+       mutex_unlock(&ctrl->mbox_lock);
 
        rc = beiscsi_mccq_compl(phba, tag, &wrb, NULL);
        if (rc) {