|
@@ -155,6 +155,7 @@ int beiscsi_mccq_compl(struct beiscsi_hba *phba,
|
|
|
uint16_t status = 0, addl_status = 0, wrb_num = 0;
|
|
|
struct be_mcc_wrb *temp_wrb;
|
|
|
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;
|
|
|
|
|
|
if (beiscsi_error(phba))
|
|
@@ -204,6 +205,12 @@ int beiscsi_mccq_compl(struct beiscsi_hba *phba,
|
|
|
ioctl_hdr->subsystem,
|
|
|
ioctl_hdr->opcode,
|
|
|
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;
|
|
|
}
|
|
|
|
|
@@ -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 beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
|
|
|
struct be_cmd_req_hdr *hdr = embedded_payload(wrb);
|
|
|
+ struct be_cmd_resp_hdr *resp_hdr;
|
|
|
|
|
|
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,
|
|
|
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 0;
|