Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit daa8dc08 authored by Jayamohan Kallickal's avatar Jayamohan Kallickal Committed by Christoph Hellwig
Browse files

be2iscsi: Fix retrieving MCCQ_WRB in non-embedded Mbox path



 Getting WRB for MCCQ posting was done before looking if tag is
 available or not. This lead to increase phba->ctrl.mcc_obj.q.used
 variable and the WARN_ON message was coming from wrb_from_mccq().
 Moved getting wrb from mccq after checking for the tag.

 In wrb_from_mccq(), memset is done before returning wrb ptr.
 Removed memset of mccq wrb from all other functions.

Signed-off-by: default avatarJohn Soni Jose <sony.john-n@emulex.com>
Signed-off-by: default avatarJayamohan Kallickal <jayamohan.kallickal@emulex.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent e8e7f271
Loading
Loading
Loading
Loading
+7 −7
Original line number Original line Diff line number Diff line
@@ -447,8 +447,8 @@ unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl,
					 struct be_dma_mem *nonemb_cmd)
					 struct be_dma_mem *nonemb_cmd)
{
{
	struct be_cmd_resp_hdr *resp;
	struct be_cmd_resp_hdr *resp;
	struct be_mcc_wrb *wrb = wrb_from_mccq(phba);
	struct be_mcc_wrb *wrb;
	struct be_sge *mcc_sge = nonembedded_sgl(wrb);
	struct be_sge *mcc_sge;
	unsigned int tag = 0;
	unsigned int tag = 0;
	struct iscsi_bsg_request *bsg_req = job->request;
	struct iscsi_bsg_request *bsg_req = job->request;
	struct be_bsg_vendor_cmd *req = nonemb_cmd->va;
	struct be_bsg_vendor_cmd *req = nonemb_cmd->va;
@@ -465,7 +465,6 @@ unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl,
	req->sector = sector;
	req->sector = sector;
	req->offset = offset;
	req->offset = offset;
	spin_lock(&ctrl->mbox_lock);
	spin_lock(&ctrl->mbox_lock);
	memset(wrb, 0, sizeof(*wrb));


	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:
@@ -495,6 +494,8 @@ unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl,
		return tag;
		return tag;
	}
	}


	wrb = wrb_from_mccq(phba);
	mcc_sge = nonembedded_sgl(wrb);
	be_wrb_hdr_prepare(wrb, nonemb_cmd->size, false,
	be_wrb_hdr_prepare(wrb, nonemb_cmd->size, false,
			   job->request_payload.sg_cnt);
			   job->request_payload.sg_cnt);
	mcc_sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
	mcc_sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
@@ -525,7 +526,6 @@ int mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short ulp_num)
	int status = 0;
	int status = 0;


	spin_lock(&ctrl->mbox_lock);
	spin_lock(&ctrl->mbox_lock);
	memset(wrb, 0, sizeof(*wrb));


	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,
@@ -702,7 +702,6 @@ int mgmt_open_connection(struct beiscsi_hba *phba,
		return tag;
		return tag;
	}
	}
	wrb = wrb_from_mccq(phba);
	wrb = wrb_from_mccq(phba);
	memset(wrb, 0, sizeof(*wrb));
	sge = nonembedded_sgl(wrb);
	sge = nonembedded_sgl(wrb);


	req = nonemb_cmd->va;
	req = nonemb_cmd->va;
@@ -804,7 +803,7 @@ static int mgmt_exec_nonemb_cmd(struct beiscsi_hba *phba,
				int resp_buf_len)
				int resp_buf_len)
{
{
	struct be_ctrl_info *ctrl = &phba->ctrl;
	struct be_ctrl_info *ctrl = &phba->ctrl;
	struct be_mcc_wrb *wrb = wrb_from_mccq(phba);
	struct be_mcc_wrb *wrb;
	struct be_sge *sge;
	struct be_sge *sge;
	unsigned int tag;
	unsigned int tag;
	int rc = 0;
	int rc = 0;
@@ -816,7 +815,8 @@ static int mgmt_exec_nonemb_cmd(struct beiscsi_hba *phba,
		rc = -ENOMEM;
		rc = -ENOMEM;
		goto free_cmd;
		goto free_cmd;
	}
	}
	memset(wrb, 0, sizeof(*wrb));

	wrb = wrb_from_mccq(phba);
	wrb->tag0 |= tag;
	wrb->tag0 |= tag;
	sge = nonembedded_sgl(wrb);
	sge = nonembedded_sgl(wrb);