be_mgmt.c revision d3ad2bb31c26d7314fad98da8abb04f4fa24ed16
16733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal/**
2d2eeb1ac35a7146cbd4b1f6bf09bb6384ccdfb0dJayamohan Kallickal * Copyright (C) 2005 - 2010 ServerEngines
36733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal * All rights reserved.
46733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal *
56733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal * This program is free software; you can redistribute it and/or
66733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal * modify it under the terms of the GNU General Public License version 2
76733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal * as published by the Free Software Foundation.  The full GNU General
86733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal * Public License is included in this distribution in the file called COPYING.
96733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal *
106733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal * Written by: Jayamohan Kallickal (jayamohank@serverengines.com)
116733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal *
126733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal * Contact Information:
136733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal * linux-drivers@serverengines.com
146733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal *
156733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal * ServerEngines
166733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal * 209 N. Fair Oaks Ave
176733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal * Sunnyvale, CA 94085
186733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal *
196733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal */
206733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
216733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal#include "be_mgmt.h"
226733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal#include "be_iscsi.h"
236733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
246733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickalunsigned char mgmt_get_fw_config(struct be_ctrl_info *ctrl,
256733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal				struct beiscsi_hba *phba)
266733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal{
276733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
286733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_fw_cfg *req = embedded_payload(wrb);
296733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	int status = 0;
306733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
316733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
326733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	memset(wrb, 0, sizeof(*wrb));
336733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
346733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
356733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
366733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
376733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   OPCODE_COMMON_QUERY_FIRMWARE_CONFIG, sizeof(*req));
386733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	status = be_mbox_notify(ctrl);
396733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (!status) {
406733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		struct be_fw_cfg *pfw_cfg;
416733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		pfw_cfg = req;
426733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		phba->fw_config.phys_port = pfw_cfg->phys_port;
436733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		phba->fw_config.iscsi_icd_start =
446733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					pfw_cfg->ulp[0].icd_base;
456733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		phba->fw_config.iscsi_icd_count =
466733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					pfw_cfg->ulp[0].icd_count;
476733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		phba->fw_config.iscsi_cid_start =
486733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					pfw_cfg->ulp[0].sq_base;
496733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		phba->fw_config.iscsi_cid_count =
506733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					pfw_cfg->ulp[0].sq_count;
517da5087971b1a187f92be4efb74a991ac9ccb0a3Jayamohan Kallickal		if (phba->fw_config.iscsi_cid_count > (BE2_MAX_SESSIONS / 2)) {
52a3babda5b3b60b5d28dbab127b1ecc8ba707b6e7Jayamohan Kallickal			SE_DEBUG(DBG_LVL_8,
53a3babda5b3b60b5d28dbab127b1ecc8ba707b6e7Jayamohan Kallickal				"FW reported MAX CXNS as %d \t"
54a3babda5b3b60b5d28dbab127b1ecc8ba707b6e7Jayamohan Kallickal				"Max Supported = %d.\n",
55a3babda5b3b60b5d28dbab127b1ecc8ba707b6e7Jayamohan Kallickal				phba->fw_config.iscsi_cid_count,
56a3babda5b3b60b5d28dbab127b1ecc8ba707b6e7Jayamohan Kallickal				BE2_MAX_SESSIONS);
57a3babda5b3b60b5d28dbab127b1ecc8ba707b6e7Jayamohan Kallickal			phba->fw_config.iscsi_cid_count = BE2_MAX_SESSIONS / 2;
587da5087971b1a187f92be4efb74a991ac9ccb0a3Jayamohan Kallickal		}
596733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	} else {
606733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		shost_printk(KERN_WARNING, phba->shost,
61457ff3b7dc3796d8778286217ad304ff122e948fJayamohan Kallickal			     "Failed in mgmt_get_fw_config\n");
626733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	}
636733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
646733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
656733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	return status;
666733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal}
676733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
68bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickalunsigned char mgmt_check_supported_fw(struct be_ctrl_info *ctrl,
69bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal				      struct beiscsi_hba *phba)
706733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal{
716733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_dma_mem nonemb_cmd;
726733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
736733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_mgmt_controller_attributes *req;
746733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_sge *sge = nonembedded_sgl(wrb);
756733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	int status = 0;
766733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
776733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	nonemb_cmd.va = pci_alloc_consistent(ctrl->pdev,
786733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal				sizeof(struct be_mgmt_controller_attributes),
796733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal				&nonemb_cmd.dma);
806733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (nonemb_cmd.va == NULL) {
816733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		SE_DEBUG(DBG_LVL_1,
826733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			 "Failed to allocate memory for mgmt_check_supported_fw"
836733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			 "\n");
84d3ad2bb31c26d7314fad98da8abb04f4fa24ed16Jayamohan Kallickal		return -ENOMEM;
856733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	}
866733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	nonemb_cmd.size = sizeof(struct be_mgmt_controller_attributes);
876733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req = nonemb_cmd.va;
88f98c96b0b6572b5491e954148509b20f08f31491Jayamohan Kallickal	memset(req, 0, sizeof(*req));
896733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
906733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	memset(wrb, 0, sizeof(*wrb));
916733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
926733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
936733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   OPCODE_COMMON_GET_CNTL_ATTRIBUTES, sizeof(*req));
946733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd.dma));
956733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	sge->pa_lo = cpu_to_le32(nonemb_cmd.dma & 0xFFFFFFFF);
966733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	sge->len = cpu_to_le32(nonemb_cmd.size);
976733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	status = be_mbox_notify(ctrl);
986733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (!status) {
996733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		struct be_mgmt_controller_attributes_resp *resp = nonemb_cmd.va;
1006733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		SE_DEBUG(DBG_LVL_8, "Firmware version of CMD: %s\n",
1016733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			resp->params.hba_attribs.flashrom_version_string);
1026733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		SE_DEBUG(DBG_LVL_8, "Firmware version is : %s\n",
1036733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			resp->params.hba_attribs.firmware_version_string);
1046733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		SE_DEBUG(DBG_LVL_8,
1056733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			"Developer Build, not performing version check...\n");
106bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal		phba->fw_config.iscsi_features =
107bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal				resp->params.hba_attribs.iscsi_features;
108bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal		SE_DEBUG(DBG_LVL_8, " phba->fw_config.iscsi_features = %d\n",
109bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal				      phba->fw_config.iscsi_features);
1106733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	} else
1116733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		SE_DEBUG(DBG_LVL_1, " Failed in mgmt_check_supported_fw\n");
112bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
1136733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (nonemb_cmd.va)
1146733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		pci_free_consistent(ctrl->pdev, nonemb_cmd.size,
1156733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal				    nonemb_cmd.va, nonemb_cmd.dma);
1166733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
1176733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	return status;
1186733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal}
1196733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
120bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal
1216733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickalunsigned char mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short chute)
1226733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal{
1236733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_ctrl_info *ctrl = &phba->ctrl;
124bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	struct be_mcc_wrb *wrb = wrb_from_mccq(phba);
1256733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct iscsi_cleanup_req *req = embedded_payload(wrb);
1266733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	int status = 0;
1276733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
1286733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
1296733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	memset(wrb, 0, sizeof(*wrb));
1306733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
1316733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
1326733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
1336733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   OPCODE_COMMON_ISCSI_CLEANUP, sizeof(*req));
1346733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
1356733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->chute = chute;
1366733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->hdr_ring_id = 0;
1376733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->data_ring_id = 0;
1386733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
139bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	status =  be_mcc_notify_wait(phba);
1406733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (status)
1416733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		shost_printk(KERN_WARNING, phba->shost,
1426733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			     " mgmt_epfw_cleanup , FAILED\n");
1436733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
1446733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	return status;
1456733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal}
1466733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
1476733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickalunsigned char mgmt_invalidate_icds(struct beiscsi_hba *phba,
1484183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal				struct invalidate_command_table *inv_tbl,
1494183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal				unsigned int num_invalidate, unsigned int cid)
1506733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal{
1516733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_dma_mem nonemb_cmd;
1526733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_ctrl_info *ctrl = &phba->ctrl;
153756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct be_mcc_wrb *wrb;
154756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct be_sge *sge;
1556733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct invalidate_commands_params_in *req;
1564183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal	unsigned int i, tag = 0;
157756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal
158756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
159756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	tag = alloc_mcc_tag(phba);
160756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	if (!tag) {
161756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		spin_unlock(&ctrl->mbox_lock);
162756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		return tag;
163756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	}
1646733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
1656733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	nonemb_cmd.va = pci_alloc_consistent(ctrl->pdev,
1666733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal				sizeof(struct invalidate_commands_params_in),
1676733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal				&nonemb_cmd.dma);
1686733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (nonemb_cmd.va == NULL) {
1696733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		SE_DEBUG(DBG_LVL_1,
170457ff3b7dc3796d8778286217ad304ff122e948fJayamohan Kallickal			 "Failed to alloc memory for mgmt_invalidate_icds\n");
1714ec3fdbef17d0266826b56b33735dc9dada58c27Jiri Slaby		spin_unlock(&ctrl->mbox_lock);
172e6b50c30fa8d46c9401c2d48eee2351bdbb4c51cDan Carpenter		return 0;
1736733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	}
1746733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	nonemb_cmd.size = sizeof(struct invalidate_commands_params_in);
1756733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req = nonemb_cmd.va;
176f98c96b0b6572b5491e954148509b20f08f31491Jayamohan Kallickal	memset(req, 0, sizeof(*req));
177756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb = wrb_from_mccq(phba);
178756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	sge = nonembedded_sgl(wrb);
179756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb->tag0 |= tag;
1806733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
1816733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
1826733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
1836733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			OPCODE_COMMON_ISCSI_ERROR_RECOVERY_INVALIDATE_COMMANDS,
1846733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			sizeof(*req));
1856733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->ref_handle = 0;
1866733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->cleanup_type = CMD_ISCSI_COMMAND_INVALIDATE;
1874183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal	for (i = 0; i < num_invalidate; i++) {
1884183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal		req->table[i].icd = inv_tbl->icd;
1894183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal		req->table[i].cid = inv_tbl->cid;
1904183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal		req->icd_count++;
1914183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal		inv_tbl++;
1924183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal	}
1936733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd.dma));
1946733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	sge->pa_lo = cpu_to_le32(nonemb_cmd.dma & 0xFFFFFFFF);
1956733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	sge->len = cpu_to_le32(nonemb_cmd.size);
1966733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
197756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	be_mcc_notify(phba);
1986733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
1996733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (nonemb_cmd.va)
2006733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		pci_free_consistent(ctrl->pdev, nonemb_cmd.size,
2016733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal				    nonemb_cmd.va, nonemb_cmd.dma);
202756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	return tag;
2036733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal}
2046733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2056733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickalunsigned char mgmt_invalidate_connection(struct beiscsi_hba *phba,
2066733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					 struct beiscsi_endpoint *beiscsi_ep,
2076733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					 unsigned short cid,
2086733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					 unsigned short issue_reset,
2096733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					 unsigned short savecfg_flag)
2106733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal{
2116733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_ctrl_info *ctrl = &phba->ctrl;
212756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct be_mcc_wrb *wrb;
213756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct iscsi_invalidate_connection_params_in *req;
214756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	unsigned int tag = 0;
2156733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2166733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
217756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	tag = alloc_mcc_tag(phba);
218756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	if (!tag) {
219756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		spin_unlock(&ctrl->mbox_lock);
220756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		return tag;
221756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	}
222756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb = wrb_from_mccq(phba);
223756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb->tag0 |= tag;
224756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	req = embedded_payload(wrb);
2256733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2266733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
2276733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
2286733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   OPCODE_ISCSI_INI_DRIVER_INVALIDATE_CONNECTION,
2296733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   sizeof(*req));
2306733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->session_handle = beiscsi_ep->fw_handle;
2316733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->cid = cid;
2326733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (issue_reset)
2336733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->cleanup_type = CMD_ISCSI_CONNECTION_ISSUE_TCP_RST;
2346733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	else
2356733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->cleanup_type = CMD_ISCSI_CONNECTION_INVALIDATE;
2366733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->save_cfg = savecfg_flag;
237756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	be_mcc_notify(phba);
2386733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
239756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	return tag;
2406733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal}
2416733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2426733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickalunsigned char mgmt_upload_connection(struct beiscsi_hba *phba,
2436733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal				unsigned short cid, unsigned int upload_flag)
2446733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal{
2456733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_ctrl_info *ctrl = &phba->ctrl;
246756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct be_mcc_wrb *wrb;
247756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct tcp_upload_params_in *req;
248756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	unsigned int tag = 0;
2496733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2506733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
251756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	tag = alloc_mcc_tag(phba);
252756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	if (!tag) {
253756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		spin_unlock(&ctrl->mbox_lock);
254756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		return tag;
255756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	}
256756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb = wrb_from_mccq(phba);
257756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	req = embedded_payload(wrb);
258756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb->tag0 |= tag;
2596733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2606733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
2616733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_COMMON_TCP_UPLOAD,
2626733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   OPCODE_COMMON_TCP_UPLOAD, sizeof(*req));
2636733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->id = (unsigned short)cid;
2646733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->upload_type = (unsigned char)upload_flag;
265756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	be_mcc_notify(phba);
2666733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
267756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	return tag;
2686733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal}
2696733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2706733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickalint mgmt_open_connection(struct beiscsi_hba *phba,
2716733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			 struct sockaddr *dst_addr,
2726733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			 struct beiscsi_endpoint *beiscsi_ep)
2736733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal{
2746733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct hwi_controller *phwi_ctrlr;
2756733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct hwi_context_memory *phwi_context;
2766733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct sockaddr_in *daddr_in = (struct sockaddr_in *)dst_addr;
2776733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct sockaddr_in6 *daddr_in6 = (struct sockaddr_in6 *)dst_addr;
2786733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_ctrl_info *ctrl = &phba->ctrl;
279756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct be_mcc_wrb *wrb;
280756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct tcp_connect_and_offload_in *req;
2816733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	unsigned short def_hdr_id;
2826733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	unsigned short def_data_id;
2836733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct phys_addr template_address = { 0, 0 };
2846733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct phys_addr *ptemplate_address;
285756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	unsigned int tag = 0;
286bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	unsigned int i;
2876733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	unsigned short cid = beiscsi_ep->ep_cid;
2886733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2896733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	phwi_ctrlr = phba->phwi_ctrlr;
2906733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	phwi_context = phwi_ctrlr->phwi_ctxt;
2916733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	def_hdr_id = (unsigned short)HWI_GET_DEF_HDRQ_ID(phba);
2926733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	def_data_id = (unsigned short)HWI_GET_DEF_BUFQ_ID(phba);
2936733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2946733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	ptemplate_address = &template_address;
2956733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	ISCSI_GET_PDU_TEMPLATE_ADDRESS(phba, ptemplate_address);
2966733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
297756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	tag = alloc_mcc_tag(phba);
298756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	if (!tag) {
299756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		spin_unlock(&ctrl->mbox_lock);
300756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		return tag;
301756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	}
302756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb = wrb_from_mccq(phba);
303756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	req = embedded_payload(wrb);
304756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb->tag0 |= tag;
3056733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
3066733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
3076733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
3086733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   OPCODE_COMMON_ISCSI_TCP_CONNECT_AND_OFFLOAD,
3096733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   sizeof(*req));
3106733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (dst_addr->sa_family == PF_INET) {
3116733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		__be32 s_addr = daddr_in->sin_addr.s_addr;
3126733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->ip_address.ip_type = BE2_IPV4;
3136733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->ip_address.ip_address[0] = s_addr & 0x000000ff;
3146733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->ip_address.ip_address[1] = (s_addr & 0x0000ff00) >> 8;
3156733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->ip_address.ip_address[2] = (s_addr & 0x00ff0000) >> 16;
3166733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->ip_address.ip_address[3] = (s_addr & 0xff000000) >> 24;
3176733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->tcp_port = ntohs(daddr_in->sin_port);
3186733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		beiscsi_ep->dst_addr = daddr_in->sin_addr.s_addr;
3196733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		beiscsi_ep->dst_tcpport = ntohs(daddr_in->sin_port);
3206733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		beiscsi_ep->ip_type = BE2_IPV4;
3216733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	} else if (dst_addr->sa_family == PF_INET6) {
3226733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->ip_address.ip_type = BE2_IPV6;
3236733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		memcpy(&req->ip_address.ip_address,
3246733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		       &daddr_in6->sin6_addr.in6_u.u6_addr8, 16);
3256733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->tcp_port = ntohs(daddr_in6->sin6_port);
3266733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		beiscsi_ep->dst_tcpport = ntohs(daddr_in6->sin6_port);
3276733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		memcpy(&beiscsi_ep->dst6_addr,
3286733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		       &daddr_in6->sin6_addr.in6_u.u6_addr8, 16);
3296733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		beiscsi_ep->ip_type = BE2_IPV6;
3306733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	} else{
3316733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		shost_printk(KERN_ERR, phba->shost, "unknown addr family %d\n",
3326733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			     dst_addr->sa_family);
3336733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		spin_unlock(&ctrl->mbox_lock);
3346733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		return -EINVAL;
3356733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
3366733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	}
3376733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->cid = cid;
338bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	i = phba->nxt_cqid++;
339bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	if (phba->nxt_cqid == phba->num_cpus)
340bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal		phba->nxt_cqid = 0;
341bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	req->cq_id = phwi_context->be_cq[i].id;
342457ff3b7dc3796d8778286217ad304ff122e948fJayamohan Kallickal	SE_DEBUG(DBG_LVL_8, "i=%d cq_id=%d\n", i, req->cq_id);
3436733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->defq_id = def_hdr_id;
3446733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->hdr_ring_id = def_hdr_id;
3456733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->data_ring_id = def_data_id;
3466733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->do_offload = 1;
3476733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->dataout_template_pa.lo = ptemplate_address->lo;
3486733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->dataout_template_pa.hi = ptemplate_address->hi;
349756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	be_mcc_notify(phba);
3506733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
351756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	return tag;
3526733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal}
353bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal
354756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickalunsigned int be_cmd_get_mac_addr(struct beiscsi_hba *phba)
355bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal{
356bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	struct be_ctrl_info *ctrl = &phba->ctrl;
357756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct be_mcc_wrb *wrb;
358756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct be_cmd_req_get_mac_addr *req;
359756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	unsigned int tag = 0;
360bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal
361bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	SE_DEBUG(DBG_LVL_8, "In be_cmd_get_mac_addr\n");
362bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
363756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	tag = alloc_mcc_tag(phba);
364756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	if (!tag) {
365756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		spin_unlock(&ctrl->mbox_lock);
366756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		return tag;
367756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	}
368756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal
369756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb = wrb_from_mccq(phba);
370756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	req = embedded_payload(wrb);
371756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb->tag0 |= tag;
372bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
373bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
374bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal			   OPCODE_COMMON_ISCSI_NTWK_GET_NIC_CONFIG,
375bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal			   sizeof(*req));
376bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal
377756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	be_mcc_notify(phba);
378bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
379756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	return tag;
380bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal}
381bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal
382