提交 c03a50f7 编写于 作者: J Jitendra Bhivare 提交者: Martin K. Petersen

be2iscsi: Fix mbox synchronization replacing spinlock with mutex

This is second part of actual fix for soft lockup.

All mbox cmds issued using BMBX and MCC are synchronized using mutex
mbox_lock instead of spin_lock. Used mutex_lock_interruptible where ever
possible.
Signed-off-by: NJitendra Bhivare <jitendra.bhivare@avagotech.com>
Reviewed-by: NShane Seymour <shane.seymour@hpe.com>
Reviewed-by: NHannes Reinicke <hare@suse.de>
Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
上级 6ac999ef
...@@ -124,7 +124,7 @@ struct be_ctrl_info { ...@@ -124,7 +124,7 @@ struct be_ctrl_info {
struct pci_dev *pdev; struct pci_dev *pdev;
/* Mbox used for cmd request/response */ /* Mbox used for cmd request/response */
spinlock_t mbox_lock; /* For serializing mbox cmds to BE card */ struct mutex mbox_lock; /* For serializing mbox cmds to BE card */
struct be_dma_mem mbox_mem; struct be_dma_mem mbox_mem;
/* Mbox mem is adjusted to align to 16 bytes. The allocated addr /* Mbox mem is adjusted to align to 16 bytes. The allocated addr
* is stored for freeing purpose */ * is stored for freeing purpose */
......
...@@ -164,9 +164,9 @@ int beiscsi_mccq_compl(struct beiscsi_hba *phba, ...@@ -164,9 +164,9 @@ int beiscsi_mccq_compl(struct beiscsi_hba *phba,
} }
/* Set MBX Tag state to Active */ /* 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; 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 */ /* wait for the mccq completion */
rc = wait_event_interruptible_timeout( rc = wait_event_interruptible_timeout(
...@@ -178,9 +178,9 @@ int beiscsi_mccq_compl(struct beiscsi_hba *phba, ...@@ -178,9 +178,9 @@ int beiscsi_mccq_compl(struct beiscsi_hba *phba,
if (rc <= 0) { if (rc <= 0) {
struct be_dma_mem *tag_mem; struct be_dma_mem *tag_mem;
/* Set MBX Tag state to timeout */ /* 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; 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 */ /* Store resource addr to be freed later */
tag_mem = &phba->ctrl.ptag_state[tag].tag_mem_state; tag_mem = &phba->ctrl.ptag_state[tag].tag_mem_state;
...@@ -199,9 +199,9 @@ int beiscsi_mccq_compl(struct beiscsi_hba *phba, ...@@ -199,9 +199,9 @@ int beiscsi_mccq_compl(struct beiscsi_hba *phba,
} else { } else {
rc = 0; rc = 0;
/* Set MBX Tag state to completed */ /* 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; 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]; mcc_tag_response = phba->ctrl.mcc_numtag[tag];
...@@ -390,9 +390,9 @@ int be_mcc_compl_process_isr(struct be_ctrl_info *ctrl, ...@@ -390,9 +390,9 @@ int be_mcc_compl_process_isr(struct be_ctrl_info *ctrl,
tag_mem->va, tag_mem->dma); tag_mem->va, tag_mem->dma);
/* Change tag state */ /* 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; 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 */
free_mcc_tag(ctrl, tag); free_mcc_tag(ctrl, tag);
...@@ -831,7 +831,7 @@ int beiscsi_cmd_eq_create(struct be_ctrl_info *ctrl, ...@@ -831,7 +831,7 @@ int beiscsi_cmd_eq_create(struct be_ctrl_info *ctrl,
struct be_dma_mem *q_mem = &eq->dma_mem; struct be_dma_mem *q_mem = &eq->dma_mem;
int status; int status;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
memset(wrb, 0, sizeof(*wrb)); memset(wrb, 0, sizeof(*wrb));
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
...@@ -858,7 +858,7 @@ int beiscsi_cmd_eq_create(struct be_ctrl_info *ctrl, ...@@ -858,7 +858,7 @@ int beiscsi_cmd_eq_create(struct be_ctrl_info *ctrl,
eq->id = le16_to_cpu(resp->eq_id); eq->id = le16_to_cpu(resp->eq_id);
eq->created = true; eq->created = true;
} }
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return status; return status;
} }
...@@ -879,7 +879,7 @@ int be_cmd_fw_initialize(struct be_ctrl_info *ctrl) ...@@ -879,7 +879,7 @@ int be_cmd_fw_initialize(struct be_ctrl_info *ctrl)
int status; int status;
u8 *endian_check; u8 *endian_check;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
memset(wrb, 0, sizeof(*wrb)); memset(wrb, 0, sizeof(*wrb));
endian_check = (u8 *) wrb; endian_check = (u8 *) wrb;
...@@ -898,7 +898,7 @@ int be_cmd_fw_initialize(struct be_ctrl_info *ctrl) ...@@ -898,7 +898,7 @@ int be_cmd_fw_initialize(struct be_ctrl_info *ctrl)
beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
"BC_%d : be_cmd_fw_initialize Failed\n"); "BC_%d : be_cmd_fw_initialize Failed\n");
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return status; return status;
} }
...@@ -919,7 +919,7 @@ int be_cmd_fw_uninit(struct be_ctrl_info *ctrl) ...@@ -919,7 +919,7 @@ int be_cmd_fw_uninit(struct be_ctrl_info *ctrl)
int status; int status;
u8 *endian_check; u8 *endian_check;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
memset(wrb, 0, sizeof(*wrb)); memset(wrb, 0, sizeof(*wrb));
endian_check = (u8 *) wrb; endian_check = (u8 *) wrb;
...@@ -939,7 +939,7 @@ int be_cmd_fw_uninit(struct be_ctrl_info *ctrl) ...@@ -939,7 +939,7 @@ int be_cmd_fw_uninit(struct be_ctrl_info *ctrl)
beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
"BC_%d : be_cmd_fw_uninit Failed\n"); "BC_%d : be_cmd_fw_uninit Failed\n");
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return status; return status;
} }
...@@ -955,7 +955,7 @@ int beiscsi_cmd_cq_create(struct be_ctrl_info *ctrl, ...@@ -955,7 +955,7 @@ int beiscsi_cmd_cq_create(struct be_ctrl_info *ctrl,
void *ctxt = &req->context; void *ctxt = &req->context;
int status; int status;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
memset(wrb, 0, sizeof(*wrb)); memset(wrb, 0, sizeof(*wrb));
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
...@@ -1005,7 +1005,7 @@ int beiscsi_cmd_cq_create(struct be_ctrl_info *ctrl, ...@@ -1005,7 +1005,7 @@ int beiscsi_cmd_cq_create(struct be_ctrl_info *ctrl,
"BC_%d : In be_cmd_cq_create, status=ox%08x\n", "BC_%d : In be_cmd_cq_create, status=ox%08x\n",
status); status);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return status; return status;
} }
...@@ -1029,7 +1029,7 @@ int beiscsi_cmd_mccq_create(struct beiscsi_hba *phba, ...@@ -1029,7 +1029,7 @@ int beiscsi_cmd_mccq_create(struct beiscsi_hba *phba,
void *ctxt; void *ctxt;
int status; int status;
spin_lock(&phba->ctrl.mbox_lock); mutex_lock(&phba->ctrl.mbox_lock);
ctrl = &phba->ctrl; ctrl = &phba->ctrl;
wrb = wrb_from_mbox(&ctrl->mbox_mem); wrb = wrb_from_mbox(&ctrl->mbox_mem);
memset(wrb, 0, sizeof(*wrb)); memset(wrb, 0, sizeof(*wrb));
...@@ -1060,7 +1060,7 @@ int beiscsi_cmd_mccq_create(struct beiscsi_hba *phba, ...@@ -1060,7 +1060,7 @@ int beiscsi_cmd_mccq_create(struct beiscsi_hba *phba,
mccq->id = le16_to_cpu(resp->id); mccq->id = le16_to_cpu(resp->id);
mccq->created = true; mccq->created = true;
} }
spin_unlock(&phba->ctrl.mbox_lock); mutex_unlock(&phba->ctrl.mbox_lock);
return status; return status;
} }
...@@ -1078,7 +1078,7 @@ int beiscsi_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q, ...@@ -1078,7 +1078,7 @@ int beiscsi_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q,
"BC_%d : In beiscsi_cmd_q_destroy " "BC_%d : In beiscsi_cmd_q_destroy "
"queue_type : %d\n", queue_type); "queue_type : %d\n", queue_type);
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
memset(wrb, 0, sizeof(*wrb)); memset(wrb, 0, sizeof(*wrb));
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
...@@ -1108,7 +1108,7 @@ int beiscsi_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q, ...@@ -1108,7 +1108,7 @@ int beiscsi_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q,
opcode = OPCODE_COMMON_ISCSI_CFG_REMOVE_SGL_PAGES; opcode = OPCODE_COMMON_ISCSI_CFG_REMOVE_SGL_PAGES;
break; break;
default: default:
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
BUG(); BUG();
return -ENXIO; return -ENXIO;
} }
...@@ -1118,7 +1118,7 @@ int beiscsi_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q, ...@@ -1118,7 +1118,7 @@ int beiscsi_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q,
status = be_mbox_notify(ctrl); status = be_mbox_notify(ctrl);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return status; return status;
} }
...@@ -1153,7 +1153,7 @@ int be_cmd_create_default_pdu_queue(struct be_ctrl_info *ctrl, ...@@ -1153,7 +1153,7 @@ int be_cmd_create_default_pdu_queue(struct be_ctrl_info *ctrl,
void *ctxt = &req->context; void *ctxt = &req->context;
int status; int status;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
memset(wrb, 0, sizeof(*wrb)); memset(wrb, 0, sizeof(*wrb));
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
...@@ -1225,7 +1225,7 @@ int be_cmd_create_default_pdu_queue(struct be_ctrl_info *ctrl, ...@@ -1225,7 +1225,7 @@ int be_cmd_create_default_pdu_queue(struct be_ctrl_info *ctrl,
defq_ring->doorbell_offset = resp->doorbell_offset; defq_ring->doorbell_offset = resp->doorbell_offset;
} }
} }
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return status; return status;
} }
...@@ -1253,7 +1253,7 @@ int be_cmd_wrbq_create(struct be_ctrl_info *ctrl, ...@@ -1253,7 +1253,7 @@ int be_cmd_wrbq_create(struct be_ctrl_info *ctrl,
struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev); struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
int status; int status;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
memset(wrb, 0, sizeof(*wrb)); memset(wrb, 0, sizeof(*wrb));
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
...@@ -1284,7 +1284,7 @@ int be_cmd_wrbq_create(struct be_ctrl_info *ctrl, ...@@ -1284,7 +1284,7 @@ int be_cmd_wrbq_create(struct be_ctrl_info *ctrl,
pwrb_context->doorbell_offset = resp->doorbell_offset; pwrb_context->doorbell_offset = resp->doorbell_offset;
} }
} }
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return status; return status;
} }
...@@ -1295,7 +1295,7 @@ int be_cmd_iscsi_post_template_hdr(struct be_ctrl_info *ctrl, ...@@ -1295,7 +1295,7 @@ int be_cmd_iscsi_post_template_hdr(struct be_ctrl_info *ctrl,
struct be_post_template_pages_req *req = embedded_payload(wrb); struct be_post_template_pages_req *req = embedded_payload(wrb);
int status; int status;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
memset(wrb, 0, sizeof(*wrb)); memset(wrb, 0, sizeof(*wrb));
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
...@@ -1308,7 +1308,7 @@ int be_cmd_iscsi_post_template_hdr(struct be_ctrl_info *ctrl, ...@@ -1308,7 +1308,7 @@ int be_cmd_iscsi_post_template_hdr(struct be_ctrl_info *ctrl,
be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
status = be_mbox_notify(ctrl); status = be_mbox_notify(ctrl);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return status; return status;
} }
...@@ -1318,7 +1318,7 @@ int be_cmd_iscsi_remove_template_hdr(struct be_ctrl_info *ctrl) ...@@ -1318,7 +1318,7 @@ int be_cmd_iscsi_remove_template_hdr(struct be_ctrl_info *ctrl)
struct be_remove_template_pages_req *req = embedded_payload(wrb); struct be_remove_template_pages_req *req = embedded_payload(wrb);
int status; int status;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
memset(wrb, 0, sizeof(*wrb)); memset(wrb, 0, sizeof(*wrb));
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
...@@ -1329,7 +1329,7 @@ int be_cmd_iscsi_remove_template_hdr(struct be_ctrl_info *ctrl) ...@@ -1329,7 +1329,7 @@ int be_cmd_iscsi_remove_template_hdr(struct be_ctrl_info *ctrl)
req->type = BEISCSI_TEMPLATE_HDR_TYPE_ISCSI; req->type = BEISCSI_TEMPLATE_HDR_TYPE_ISCSI;
status = be_mbox_notify(ctrl); status = be_mbox_notify(ctrl);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return status; return status;
} }
...@@ -1348,7 +1348,7 @@ int be_cmd_iscsi_post_sgl_pages(struct be_ctrl_info *ctrl, ...@@ -1348,7 +1348,7 @@ int be_cmd_iscsi_post_sgl_pages(struct be_ctrl_info *ctrl,
if (num_pages == 0xff) if (num_pages == 0xff)
num_pages = 1; num_pages = 1;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
do { do {
memset(wrb, 0, sizeof(*wrb)); memset(wrb, 0, sizeof(*wrb));
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
...@@ -1377,7 +1377,7 @@ int be_cmd_iscsi_post_sgl_pages(struct be_ctrl_info *ctrl, ...@@ -1377,7 +1377,7 @@ int be_cmd_iscsi_post_sgl_pages(struct be_ctrl_info *ctrl,
} }
} while (num_pages > 0); } while (num_pages > 0);
error: error:
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
if (status != 0) if (status != 0)
beiscsi_cmd_q_destroy(ctrl, NULL, QTYPE_SGL); beiscsi_cmd_q_destroy(ctrl, NULL, QTYPE_SGL);
return status; return status;
...@@ -1390,7 +1390,7 @@ int beiscsi_cmd_reset_function(struct beiscsi_hba *phba) ...@@ -1390,7 +1390,7 @@ int beiscsi_cmd_reset_function(struct beiscsi_hba *phba)
struct be_post_sgl_pages_req *req = embedded_payload(wrb); struct be_post_sgl_pages_req *req = embedded_payload(wrb);
int status; int status;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
req = embedded_payload(wrb); req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
...@@ -1398,7 +1398,7 @@ int beiscsi_cmd_reset_function(struct beiscsi_hba *phba) ...@@ -1398,7 +1398,7 @@ int beiscsi_cmd_reset_function(struct beiscsi_hba *phba)
OPCODE_COMMON_FUNCTION_RESET, sizeof(*req)); OPCODE_COMMON_FUNCTION_RESET, sizeof(*req));
status = be_mbox_notify_wait(phba); status = be_mbox_notify_wait(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return status; return status;
} }
...@@ -1420,10 +1420,11 @@ int be_cmd_set_vlan(struct beiscsi_hba *phba, ...@@ -1420,10 +1420,11 @@ int be_cmd_set_vlan(struct beiscsi_hba *phba,
struct be_cmd_set_vlan_req *req; struct be_cmd_set_vlan_req *req;
struct be_ctrl_info *ctrl = &phba->ctrl; 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); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -1439,7 +1440,7 @@ int be_cmd_set_vlan(struct beiscsi_hba *phba, ...@@ -1439,7 +1440,7 @@ int be_cmd_set_vlan(struct beiscsi_hba *phba,
req->vlan_priority = vlan_tag; req->vlan_priority = vlan_tag;
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -727,7 +727,7 @@ static int be_ctrl_init(struct beiscsi_hba *phba, struct pci_dev *pdev) ...@@ -727,7 +727,7 @@ static int be_ctrl_init(struct beiscsi_hba *phba, struct pci_dev *pdev)
mbox_mem_align->va = PTR_ALIGN(mbox_mem_alloc->va, 16); mbox_mem_align->va = PTR_ALIGN(mbox_mem_alloc->va, 16);
mbox_mem_align->dma = PTR_ALIGN(mbox_mem_alloc->dma, 16); mbox_mem_align->dma = PTR_ALIGN(mbox_mem_alloc->dma, 16);
memset(mbox_mem_align->va, 0, sizeof(struct be_mcc_mailbox)); memset(mbox_mem_align->va, 0, sizeof(struct be_mcc_mailbox));
spin_lock_init(&ctrl->mbox_lock); mutex_init(&ctrl->mbox_lock);
spin_lock_init(&phba->ctrl.mcc_lock); spin_lock_init(&phba->ctrl.mcc_lock);
spin_lock_init(&phba->ctrl.mcc_cq_lock); spin_lock_init(&phba->ctrl.mcc_cq_lock);
......
...@@ -164,10 +164,10 @@ int be_cmd_modify_eq_delay(struct beiscsi_hba *phba, ...@@ -164,10 +164,10 @@ int be_cmd_modify_eq_delay(struct beiscsi_hba *phba,
unsigned int tag = 0; unsigned int tag = 0;
int i; int i;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
tag = alloc_mcc_tag(phba); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -188,7 +188,7 @@ int be_cmd_modify_eq_delay(struct beiscsi_hba *phba, ...@@ -188,7 +188,7 @@ int be_cmd_modify_eq_delay(struct beiscsi_hba *phba,
} }
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -215,10 +215,10 @@ unsigned int mgmt_reopen_session(struct beiscsi_hba *phba, ...@@ -215,10 +215,10 @@ unsigned int mgmt_reopen_session(struct beiscsi_hba *phba,
BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX, BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
"BG_%d : In bescsi_get_boot_target\n"); "BG_%d : In bescsi_get_boot_target\n");
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
tag = alloc_mcc_tag(phba); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -235,7 +235,7 @@ unsigned int mgmt_reopen_session(struct beiscsi_hba *phba, ...@@ -235,7 +235,7 @@ unsigned int mgmt_reopen_session(struct beiscsi_hba *phba,
req->session_handle = sess_handle; req->session_handle = sess_handle;
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -250,10 +250,10 @@ unsigned int mgmt_get_boot_target(struct beiscsi_hba *phba) ...@@ -250,10 +250,10 @@ unsigned int mgmt_get_boot_target(struct beiscsi_hba *phba)
BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX, BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
"BG_%d : In bescsi_get_boot_target\n"); "BG_%d : In bescsi_get_boot_target\n");
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
tag = alloc_mcc_tag(phba); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -266,7 +266,7 @@ unsigned int mgmt_get_boot_target(struct beiscsi_hba *phba) ...@@ -266,7 +266,7 @@ unsigned int mgmt_get_boot_target(struct beiscsi_hba *phba)
sizeof(struct be_cmd_get_boot_target_resp)); sizeof(struct be_cmd_get_boot_target_resp));
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -285,10 +285,10 @@ unsigned int mgmt_get_session_info(struct beiscsi_hba *phba, ...@@ -285,10 +285,10 @@ unsigned int mgmt_get_session_info(struct beiscsi_hba *phba,
BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX, BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
"BG_%d : In beiscsi_get_session_info\n"); "BG_%d : In beiscsi_get_session_info\n");
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
tag = alloc_mcc_tag(phba); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -311,7 +311,7 @@ unsigned int mgmt_get_session_info(struct beiscsi_hba *phba, ...@@ -311,7 +311,7 @@ unsigned int mgmt_get_session_info(struct beiscsi_hba *phba,
sge->len = cpu_to_le32(nonemb_cmd->size); sge->len = cpu_to_le32(nonemb_cmd->size);
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -334,7 +334,7 @@ int mgmt_get_fw_config(struct be_ctrl_info *ctrl, ...@@ -334,7 +334,7 @@ int mgmt_get_fw_config(struct be_ctrl_info *ctrl,
struct be_fw_cfg *req = embedded_payload(wrb); struct be_fw_cfg *req = embedded_payload(wrb);
int status = 0; int status = 0;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
memset(wrb, 0, sizeof(*wrb)); memset(wrb, 0, sizeof(*wrb));
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
...@@ -415,7 +415,7 @@ int mgmt_get_fw_config(struct be_ctrl_info *ctrl, ...@@ -415,7 +415,7 @@ int mgmt_get_fw_config(struct be_ctrl_info *ctrl,
status = -EINVAL; status = -EINVAL;
} }
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return status; return status;
} }
...@@ -440,7 +440,7 @@ int mgmt_check_supported_fw(struct be_ctrl_info *ctrl, ...@@ -440,7 +440,7 @@ int mgmt_check_supported_fw(struct be_ctrl_info *ctrl,
nonemb_cmd.size = sizeof(struct be_mgmt_controller_attributes); nonemb_cmd.size = sizeof(struct be_mgmt_controller_attributes);
req = nonemb_cmd.va; req = nonemb_cmd.va;
memset(req, 0, sizeof(*req)); memset(req, 0, sizeof(*req));
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
memset(wrb, 0, sizeof(*wrb)); memset(wrb, 0, sizeof(*wrb));
be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1); be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
...@@ -470,7 +470,7 @@ int mgmt_check_supported_fw(struct be_ctrl_info *ctrl, ...@@ -470,7 +470,7 @@ int mgmt_check_supported_fw(struct be_ctrl_info *ctrl,
} else } else
beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
"BG_%d : Failed in mgmt_check_supported_fw\n"); "BG_%d : Failed in mgmt_check_supported_fw\n");
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
if (nonemb_cmd.va) if (nonemb_cmd.va)
pci_free_consistent(ctrl->pdev, nonemb_cmd.size, pci_free_consistent(ctrl->pdev, nonemb_cmd.size,
nonemb_cmd.va, nonemb_cmd.dma); nonemb_cmd.va, nonemb_cmd.dma);
...@@ -501,8 +501,9 @@ unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl, ...@@ -501,8 +501,9 @@ unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl,
req->region = region; req->region = region;
req->sector = sector; req->sector = sector;
req->offset = offset; 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]) { switch (bsg_req->rqst_data.h_vendor.vendor_cmd[0]) {
case BEISCSI_WRITE_FLASH: case BEISCSI_WRITE_FLASH:
offset = sector * sector_size + offset; offset = sector * sector_size + offset;
...@@ -521,13 +522,13 @@ unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl, ...@@ -521,13 +522,13 @@ unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl,
"BG_%d : Unsupported cmd = 0x%x\n\n", "BG_%d : Unsupported cmd = 0x%x\n\n",
bsg_req->rqst_data.h_vendor.vendor_cmd[0]); bsg_req->rqst_data.h_vendor.vendor_cmd[0]);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return -ENOSYS; return -ENOSYS;
} }
tag = alloc_mcc_tag(phba); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -542,7 +543,7 @@ unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl, ...@@ -542,7 +543,7 @@ unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl,
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -562,7 +563,7 @@ int mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short ulp_num) ...@@ -562,7 +563,7 @@ int mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short ulp_num)
struct iscsi_cleanup_req *req = embedded_payload(wrb); struct iscsi_cleanup_req *req = embedded_payload(wrb);
int status = 0; int status = 0;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI, be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
...@@ -576,7 +577,7 @@ int mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short ulp_num) ...@@ -576,7 +577,7 @@ int mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short ulp_num)
if (status) if (status)
beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT, beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT,
"BG_%d : mgmt_epfw_cleanup , FAILED\n"); "BG_%d : mgmt_epfw_cleanup , FAILED\n");
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return status; return status;
} }
...@@ -592,10 +593,10 @@ unsigned int mgmt_invalidate_icds(struct beiscsi_hba *phba, ...@@ -592,10 +593,10 @@ unsigned int mgmt_invalidate_icds(struct beiscsi_hba *phba,
struct invalidate_commands_params_in *req; struct invalidate_commands_params_in *req;
unsigned int i, tag = 0; unsigned int i, tag = 0;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
tag = alloc_mcc_tag(phba); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -622,7 +623,7 @@ unsigned int mgmt_invalidate_icds(struct beiscsi_hba *phba, ...@@ -622,7 +623,7 @@ unsigned int mgmt_invalidate_icds(struct beiscsi_hba *phba,
sge->len = cpu_to_le32(nonemb_cmd->size); sge->len = cpu_to_le32(nonemb_cmd->size);
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -637,10 +638,10 @@ unsigned int mgmt_invalidate_connection(struct beiscsi_hba *phba, ...@@ -637,10 +638,10 @@ unsigned int mgmt_invalidate_connection(struct beiscsi_hba *phba,
struct iscsi_invalidate_connection_params_in *req; struct iscsi_invalidate_connection_params_in *req;
unsigned int tag = 0; unsigned int tag = 0;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
tag = alloc_mcc_tag(phba); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
wrb = wrb_from_mccq(phba); wrb = wrb_from_mccq(phba);
...@@ -659,7 +660,7 @@ unsigned int mgmt_invalidate_connection(struct beiscsi_hba *phba, ...@@ -659,7 +660,7 @@ unsigned int mgmt_invalidate_connection(struct beiscsi_hba *phba,
req->cleanup_type = CMD_ISCSI_CONNECTION_INVALIDATE; req->cleanup_type = CMD_ISCSI_CONNECTION_INVALIDATE;
req->save_cfg = savecfg_flag; req->save_cfg = savecfg_flag;
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -671,10 +672,10 @@ unsigned int mgmt_upload_connection(struct beiscsi_hba *phba, ...@@ -671,10 +672,10 @@ unsigned int mgmt_upload_connection(struct beiscsi_hba *phba,
struct tcp_upload_params_in *req; struct tcp_upload_params_in *req;
unsigned int tag = 0; unsigned int tag = 0;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
tag = alloc_mcc_tag(phba); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
wrb = wrb_from_mccq(phba); wrb = wrb_from_mccq(phba);
...@@ -687,7 +688,7 @@ unsigned int mgmt_upload_connection(struct beiscsi_hba *phba, ...@@ -687,7 +688,7 @@ unsigned int mgmt_upload_connection(struct beiscsi_hba *phba,
req->id = (unsigned short)cid; req->id = (unsigned short)cid;
req->upload_type = (unsigned char)upload_flag; req->upload_type = (unsigned char)upload_flag;
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -732,10 +733,11 @@ int mgmt_open_connection(struct beiscsi_hba *phba, ...@@ -732,10 +733,11 @@ int mgmt_open_connection(struct beiscsi_hba *phba,
ptemplate_address = &template_address; ptemplate_address = &template_address;
ISCSI_GET_PDU_TEMPLATE_ADDRESS(phba, ptemplate_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); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
wrb = wrb_from_mccq(phba); wrb = wrb_from_mccq(phba);
...@@ -773,7 +775,7 @@ int mgmt_open_connection(struct beiscsi_hba *phba, ...@@ -773,7 +775,7 @@ int mgmt_open_connection(struct beiscsi_hba *phba,
beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
"BG_%d : unknown addr family %d\n", "BG_%d : unknown addr family %d\n",
dst_addr->sa_family); dst_addr->sa_family);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
free_mcc_tag(&phba->ctrl, tag); free_mcc_tag(&phba->ctrl, tag);
return -EINVAL; return -EINVAL;
...@@ -802,7 +804,7 @@ int mgmt_open_connection(struct beiscsi_hba *phba, ...@@ -802,7 +804,7 @@ int mgmt_open_connection(struct beiscsi_hba *phba,
} }
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -815,10 +817,11 @@ unsigned int mgmt_get_all_if_id(struct beiscsi_hba *phba) ...@@ -815,10 +817,11 @@ unsigned int mgmt_get_all_if_id(struct beiscsi_hba *phba)
unsigned int tag; unsigned int tag;
int status = 0; int status = 0;
spin_lock(&ctrl->mbox_lock); if (mutex_lock_interruptible(&ctrl->mbox_lock))
return -EINTR;
tag = alloc_mcc_tag(phba); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return -ENOMEM; return -ENOMEM;
} }
...@@ -831,7 +834,7 @@ unsigned int mgmt_get_all_if_id(struct beiscsi_hba *phba) ...@@ -831,7 +834,7 @@ unsigned int mgmt_get_all_if_id(struct beiscsi_hba *phba)
OPCODE_COMMON_ISCSI_NTWK_GET_ALL_IF_ID, OPCODE_COMMON_ISCSI_NTWK_GET_ALL_IF_ID,
sizeof(*req)); sizeof(*req));
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
status = beiscsi_mccq_compl(phba, tag, &wrb, NULL); status = beiscsi_mccq_compl(phba, tag, &wrb, NULL);
if (status) { if (status) {
...@@ -864,10 +867,10 @@ static int mgmt_exec_nonemb_cmd(struct beiscsi_hba *phba, ...@@ -864,10 +867,10 @@ static int mgmt_exec_nonemb_cmd(struct beiscsi_hba *phba,
unsigned int tag; unsigned int tag;
int rc = 0; int rc = 0;
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
tag = alloc_mcc_tag(phba); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
rc = -ENOMEM; rc = -ENOMEM;
goto free_cmd; goto free_cmd;
} }
...@@ -882,7 +885,7 @@ static int mgmt_exec_nonemb_cmd(struct beiscsi_hba *phba, ...@@ -882,7 +885,7 @@ static int mgmt_exec_nonemb_cmd(struct beiscsi_hba *phba,
sge->len = cpu_to_le32(nonemb_cmd->size); sge->len = cpu_to_le32(nonemb_cmd->size);
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
rc = beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd); rc = beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd);
...@@ -1262,10 +1265,11 @@ unsigned int be_cmd_get_initname(struct beiscsi_hba *phba) ...@@ -1262,10 +1265,11 @@ unsigned int be_cmd_get_initname(struct beiscsi_hba *phba)
struct be_cmd_hba_name *req; struct be_cmd_hba_name *req;
struct be_ctrl_info *ctrl = &phba->ctrl; 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); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -1278,7 +1282,7 @@ unsigned int be_cmd_get_initname(struct beiscsi_hba *phba) ...@@ -1278,7 +1282,7 @@ unsigned int be_cmd_get_initname(struct beiscsi_hba *phba)
sizeof(*req)); sizeof(*req));
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -1289,10 +1293,11 @@ unsigned int be_cmd_get_port_speed(struct beiscsi_hba *phba) ...@@ -1289,10 +1293,11 @@ unsigned int be_cmd_get_port_speed(struct beiscsi_hba *phba)
struct be_cmd_ntwk_link_status_req *req; struct be_cmd_ntwk_link_status_req *req;
struct be_ctrl_info *ctrl = &phba->ctrl; 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); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -1305,7 +1310,7 @@ unsigned int be_cmd_get_port_speed(struct beiscsi_hba *phba) ...@@ -1305,7 +1310,7 @@ unsigned int be_cmd_get_port_speed(struct beiscsi_hba *phba)
sizeof(*req)); sizeof(*req));
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
return tag; return tag;
} }
...@@ -1761,10 +1766,10 @@ int beiscsi_logout_fw_sess(struct beiscsi_hba *phba, ...@@ -1761,10 +1766,10 @@ int beiscsi_logout_fw_sess(struct beiscsi_hba *phba,
BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX, BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
"BG_%d : In bescsi_logout_fwboot_sess\n"); "BG_%d : In bescsi_logout_fwboot_sess\n");
spin_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
tag = alloc_mcc_tag(phba); tag = alloc_mcc_tag(phba);
if (!tag) { if (!tag) {
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
beiscsi_log(phba, KERN_INFO, beiscsi_log(phba, KERN_INFO,
BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX, BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
"BG_%d : MBX Tag Failure\n"); "BG_%d : MBX Tag Failure\n");
...@@ -1782,7 +1787,7 @@ int beiscsi_logout_fw_sess(struct beiscsi_hba *phba, ...@@ -1782,7 +1787,7 @@ int beiscsi_logout_fw_sess(struct beiscsi_hba *phba,
/* Set the session handle */ /* Set the session handle */
req->session_handle = fw_sess_handle; req->session_handle = fw_sess_handle;
be_mcc_notify(phba); be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock); mutex_unlock(&ctrl->mbox_lock);
rc = beiscsi_mccq_compl(phba, tag, &wrb, NULL); rc = beiscsi_mccq_compl(phba, tag, &wrb, NULL);
if (rc) { if (rc) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册