[SCSI] be2iscsi: Fix returning Failure when MBX fails with Insufficient buffer error
When MBX command fails with insufficent buffer, check for the response lenght returned. Return success if response length is non-zero value which indicates valid data. Signed-off-by: Minh Tran <minhduc.tran@emulex.com> Signed-off-by: John Soni Jose <sony.john-n@emulex.com> Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> Reviewed-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
Родитель
0283fbb18c
Коммит
a8081e346a
|
@ -155,6 +155,7 @@ int beiscsi_mccq_compl(struct beiscsi_hba *phba,
|
||||||
uint16_t status = 0, addl_status = 0, wrb_num = 0;
|
uint16_t status = 0, addl_status = 0, wrb_num = 0;
|
||||||
struct be_mcc_wrb *temp_wrb;
|
struct be_mcc_wrb *temp_wrb;
|
||||||
struct be_cmd_req_hdr *ioctl_hdr;
|
struct be_cmd_req_hdr *ioctl_hdr;
|
||||||
|
struct be_cmd_resp_hdr *ioctl_resp_hdr;
|
||||||
struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q;
|
struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q;
|
||||||
|
|
||||||
if (beiscsi_error(phba))
|
if (beiscsi_error(phba))
|
||||||
|
@ -204,6 +205,12 @@ int beiscsi_mccq_compl(struct beiscsi_hba *phba,
|
||||||
ioctl_hdr->subsystem,
|
ioctl_hdr->subsystem,
|
||||||
ioctl_hdr->opcode,
|
ioctl_hdr->opcode,
|
||||||
status, addl_status);
|
status, addl_status);
|
||||||
|
|
||||||
|
if (status == MCC_STATUS_INSUFFICIENT_BUFFER) {
|
||||||
|
ioctl_resp_hdr = (struct be_cmd_resp_hdr *) ioctl_hdr;
|
||||||
|
if (ioctl_resp_hdr->response_length)
|
||||||
|
goto release_mcc_tag;
|
||||||
|
}
|
||||||
rc = -EAGAIN;
|
rc = -EAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,6 +274,7 @@ static int be_mcc_compl_process(struct be_ctrl_info *ctrl,
|
||||||
struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
|
||||||
struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
|
struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
|
||||||
struct be_cmd_req_hdr *hdr = embedded_payload(wrb);
|
struct be_cmd_req_hdr *hdr = embedded_payload(wrb);
|
||||||
|
struct be_cmd_resp_hdr *resp_hdr;
|
||||||
|
|
||||||
be_dws_le_to_cpu(compl, 4);
|
be_dws_le_to_cpu(compl, 4);
|
||||||
|
|
||||||
|
@ -284,6 +292,11 @@ static int be_mcc_compl_process(struct be_ctrl_info *ctrl,
|
||||||
hdr->subsystem, hdr->opcode,
|
hdr->subsystem, hdr->opcode,
|
||||||
compl_status, extd_status);
|
compl_status, extd_status);
|
||||||
|
|
||||||
|
if (compl_status == MCC_STATUS_INSUFFICIENT_BUFFER) {
|
||||||
|
resp_hdr = (struct be_cmd_resp_hdr *) hdr;
|
||||||
|
if (resp_hdr->response_length)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -52,6 +52,10 @@ struct be_mcc_wrb {
|
||||||
|
|
||||||
/* Completion Status */
|
/* Completion Status */
|
||||||
#define MCC_STATUS_SUCCESS 0x0
|
#define MCC_STATUS_SUCCESS 0x0
|
||||||
|
#define MCC_STATUS_FAILED 0x1
|
||||||
|
#define MCC_STATUS_ILLEGAL_REQUEST 0x2
|
||||||
|
#define MCC_STATUS_ILLEGAL_FIELD 0x3
|
||||||
|
#define MCC_STATUS_INSUFFICIENT_BUFFER 0x4
|
||||||
|
|
||||||
#define CQE_STATUS_COMPL_MASK 0xFFFF
|
#define CQE_STATUS_COMPL_MASK 0xFFFF
|
||||||
#define CQE_STATUS_COMPL_SHIFT 0 /* bits 0 - 15 */
|
#define CQE_STATUS_COMPL_SHIFT 0 /* bits 0 - 15 */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче