16733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal/**
2255fa9a3cce3e344ff245cf3b4fbb738bd7e3f48Jayamohan Kallickal * Copyright (C) 2005 - 2011 Emulex
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 *
10255fa9a3cce3e344ff245cf3b4fbb738bd7e3f48Jayamohan Kallickal * Written by: Jayamohan Kallickal (jayamohan.kallickal@emulex.com)
116733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal *
126733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal * Contact Information:
13255fa9a3cce3e344ff245cf3b4fbb738bd7e3f48Jayamohan Kallickal * linux-drivers@emulex.com
146733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal *
15255fa9a3cce3e344ff245cf3b4fbb738bd7e3f48Jayamohan Kallickal * Emulex
16255fa9a3cce3e344ff245cf3b4fbb738bd7e3f48Jayamohan Kallickal * 3333 Susan Street
17255fa9a3cce3e344ff245cf3b4fbb738bd7e3f48Jayamohan Kallickal * Costa Mesa, CA 92626
186733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal */
196733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
206733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal#include "be_mgmt.h"
216733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal#include "be_iscsi.h"
22c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal#include <scsi/scsi_transport_iscsi.h>
23c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal
24c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickalunsigned int beiscsi_get_boot_target(struct beiscsi_hba *phba)
25c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal{
26c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	struct be_ctrl_info *ctrl = &phba->ctrl;
27c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	struct be_mcc_wrb *wrb;
28c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	struct be_cmd_req_get_mac_addr *req;
29c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	unsigned int tag = 0;
30c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal
31c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	SE_DEBUG(DBG_LVL_8, "In bescsi_get_boot_target\n");
32c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
33c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	tag = alloc_mcc_tag(phba);
34c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	if (!tag) {
35c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal		spin_unlock(&ctrl->mbox_lock);
36c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal		return tag;
37c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	}
38c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal
39c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	wrb = wrb_from_mccq(phba);
40c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	req = embedded_payload(wrb);
41c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	wrb->tag0 |= tag;
42c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
43c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
44c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal			   OPCODE_ISCSI_INI_BOOT_GET_BOOT_TARGET,
45c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal			   sizeof(*req));
46c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal
47c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	be_mcc_notify(phba);
48c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
49c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	return tag;
50c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal}
51c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal
52c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickalunsigned int beiscsi_get_session_info(struct beiscsi_hba *phba,
53c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal				  u32 boot_session_handle,
54c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal				  struct be_dma_mem *nonemb_cmd)
55c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal{
56c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	struct be_ctrl_info *ctrl = &phba->ctrl;
57c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	struct be_mcc_wrb *wrb;
58c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	unsigned int tag = 0;
59c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	struct  be_cmd_req_get_session *req;
60c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	struct be_cmd_resp_get_session *resp;
61c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	struct be_sge *sge;
62c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal
63c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	SE_DEBUG(DBG_LVL_8, "In beiscsi_get_session_info\n");
64c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
65c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	tag = alloc_mcc_tag(phba);
66c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	if (!tag) {
67c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal		spin_unlock(&ctrl->mbox_lock);
68c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal		return tag;
69c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	}
70c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal
71c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	nonemb_cmd->size = sizeof(*resp);
72c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	req = nonemb_cmd->va;
73c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	memset(req, 0, sizeof(*req));
74c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	wrb = wrb_from_mccq(phba);
75c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	sge = nonembedded_sgl(wrb);
76c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	wrb->tag0 |= tag;
77c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal
78c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal
79c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	wrb->tag0 |= tag;
80c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
81c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
82c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal			   OPCODE_ISCSI_INI_SESSION_GET_A_SESSION,
83c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal			   sizeof(*resp));
84c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	req->session_handle = boot_session_handle;
85c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
86c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
87c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	sge->len = cpu_to_le32(nonemb_cmd->size);
88c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal
89c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	be_mcc_notify(phba);
90c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
91c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal	return tag;
92c7acc5b8f9a0e6cb17d313ebfbc5d392aa837ac7Jayamohan Kallickal}
936733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
9403a1231009927b7168d6d86a7a7f6c7f9b4be85aJayamohan Kallickalint mgmt_get_fw_config(struct be_ctrl_info *ctrl,
956733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal				struct beiscsi_hba *phba)
966733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal{
976733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
986733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_fw_cfg *req = embedded_payload(wrb);
996733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	int status = 0;
1006733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
1016733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
1026733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	memset(wrb, 0, sizeof(*wrb));
1036733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
1046733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
1056733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
1066733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1076733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   OPCODE_COMMON_QUERY_FIRMWARE_CONFIG, sizeof(*req));
1086733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	status = be_mbox_notify(ctrl);
1096733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (!status) {
1106733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		struct be_fw_cfg *pfw_cfg;
1116733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		pfw_cfg = req;
1126733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		phba->fw_config.phys_port = pfw_cfg->phys_port;
1136733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		phba->fw_config.iscsi_icd_start =
1146733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					pfw_cfg->ulp[0].icd_base;
1156733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		phba->fw_config.iscsi_icd_count =
1166733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					pfw_cfg->ulp[0].icd_count;
1176733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		phba->fw_config.iscsi_cid_start =
1186733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					pfw_cfg->ulp[0].sq_base;
1196733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		phba->fw_config.iscsi_cid_count =
1206733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					pfw_cfg->ulp[0].sq_count;
1217da5087971b1a187f92be4efb74a991ac9ccb0a3Jayamohan Kallickal		if (phba->fw_config.iscsi_cid_count > (BE2_MAX_SESSIONS / 2)) {
122a3babda5b3b60b5d28dbab127b1ecc8ba707b6e7Jayamohan Kallickal			SE_DEBUG(DBG_LVL_8,
1233cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal				"FW reported MAX CXNS as %d\t"
124a3babda5b3b60b5d28dbab127b1ecc8ba707b6e7Jayamohan Kallickal				"Max Supported = %d.\n",
125a3babda5b3b60b5d28dbab127b1ecc8ba707b6e7Jayamohan Kallickal				phba->fw_config.iscsi_cid_count,
126a3babda5b3b60b5d28dbab127b1ecc8ba707b6e7Jayamohan Kallickal				BE2_MAX_SESSIONS);
127a3babda5b3b60b5d28dbab127b1ecc8ba707b6e7Jayamohan Kallickal			phba->fw_config.iscsi_cid_count = BE2_MAX_SESSIONS / 2;
1287da5087971b1a187f92be4efb74a991ac9ccb0a3Jayamohan Kallickal		}
1296733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	} else {
1306733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		shost_printk(KERN_WARNING, phba->shost,
131457ff3b7dc3796d8778286217ad304ff122e948fJayamohan Kallickal			     "Failed in mgmt_get_fw_config\n");
1326733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	}
1336733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
1346733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
1356733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	return status;
1366733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal}
1376733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
13803a1231009927b7168d6d86a7a7f6c7f9b4be85aJayamohan Kallickalint mgmt_check_supported_fw(struct be_ctrl_info *ctrl,
139bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal				      struct beiscsi_hba *phba)
1406733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal{
1416733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_dma_mem nonemb_cmd;
1426733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
1436733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_mgmt_controller_attributes *req;
1446733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_sge *sge = nonembedded_sgl(wrb);
1456733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	int status = 0;
1466733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
1476733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	nonemb_cmd.va = pci_alloc_consistent(ctrl->pdev,
1486733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal				sizeof(struct be_mgmt_controller_attributes),
1496733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal				&nonemb_cmd.dma);
1506733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (nonemb_cmd.va == NULL) {
1516733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		SE_DEBUG(DBG_LVL_1,
1526733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			 "Failed to allocate memory for mgmt_check_supported_fw"
1536733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			 "\n");
154d3ad2bb31c26d7314fad98da8abb04f4fa24ed16Jayamohan Kallickal		return -ENOMEM;
1556733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	}
1566733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	nonemb_cmd.size = sizeof(struct be_mgmt_controller_attributes);
1576733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req = nonemb_cmd.va;
158f98c96b0b6572b5491e954148509b20f08f31491Jayamohan Kallickal	memset(req, 0, sizeof(*req));
1596733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
1606733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	memset(wrb, 0, sizeof(*wrb));
1616733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
1626733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1636733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   OPCODE_COMMON_GET_CNTL_ATTRIBUTES, sizeof(*req));
1646733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd.dma));
1656733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	sge->pa_lo = cpu_to_le32(nonemb_cmd.dma & 0xFFFFFFFF);
1666733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	sge->len = cpu_to_le32(nonemb_cmd.size);
1676733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	status = be_mbox_notify(ctrl);
1686733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (!status) {
1696733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		struct be_mgmt_controller_attributes_resp *resp = nonemb_cmd.va;
1706733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		SE_DEBUG(DBG_LVL_8, "Firmware version of CMD: %s\n",
1716733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			resp->params.hba_attribs.flashrom_version_string);
1726733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		SE_DEBUG(DBG_LVL_8, "Firmware version is : %s\n",
1736733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			resp->params.hba_attribs.firmware_version_string);
1746733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		SE_DEBUG(DBG_LVL_8,
1756733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			"Developer Build, not performing version check...\n");
176bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal		phba->fw_config.iscsi_features =
177bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal				resp->params.hba_attribs.iscsi_features;
178bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal		SE_DEBUG(DBG_LVL_8, " phba->fw_config.iscsi_features = %d\n",
179bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal				      phba->fw_config.iscsi_features);
1806733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	} else
1816733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		SE_DEBUG(DBG_LVL_1, " Failed in mgmt_check_supported_fw\n");
182bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
1836733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (nonemb_cmd.va)
1846733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		pci_free_consistent(ctrl->pdev, nonemb_cmd.size,
1856733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal				    nonemb_cmd.va, nonemb_cmd.dma);
1866733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
1876733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	return status;
1886733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal}
1896733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
19003a1231009927b7168d6d86a7a7f6c7f9b4be85aJayamohan Kallickalint mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short chute)
1916733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal{
1926733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_ctrl_info *ctrl = &phba->ctrl;
193bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	struct be_mcc_wrb *wrb = wrb_from_mccq(phba);
1946733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct iscsi_cleanup_req *req = embedded_payload(wrb);
1956733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	int status = 0;
1966733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
1976733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
1986733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	memset(wrb, 0, sizeof(*wrb));
1996733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2006733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
2016733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
2026733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   OPCODE_COMMON_ISCSI_CLEANUP, sizeof(*req));
2036733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2046733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->chute = chute;
205069adc7b0617348dd4c5cace1b35a90d6ddf1013Jayamohan Kallickal	req->hdr_ring_id = cpu_to_le16(HWI_GET_DEF_HDRQ_ID(phba));
206069adc7b0617348dd4c5cace1b35a90d6ddf1013Jayamohan Kallickal	req->data_ring_id = cpu_to_le16(HWI_GET_DEF_BUFQ_ID(phba));
2076733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
208bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	status =  be_mcc_notify_wait(phba);
2096733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (status)
2106733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		shost_printk(KERN_WARNING, phba->shost,
2116733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			     " mgmt_epfw_cleanup , FAILED\n");
2126733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
2136733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	return status;
2146733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal}
2156733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
21603a1231009927b7168d6d86a7a7f6c7f9b4be85aJayamohan Kallickalunsigned int  mgmt_invalidate_icds(struct beiscsi_hba *phba,
2174183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal				struct invalidate_command_table *inv_tbl,
2183cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal				unsigned int num_invalidate, unsigned int cid,
2193cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal				struct be_dma_mem *nonemb_cmd)
2203cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal
2216733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal{
2226733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_ctrl_info *ctrl = &phba->ctrl;
223756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct be_mcc_wrb *wrb;
224756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct be_sge *sge;
2256733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct invalidate_commands_params_in *req;
2264183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal	unsigned int i, tag = 0;
227756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal
228756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
229756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	tag = alloc_mcc_tag(phba);
230756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	if (!tag) {
231756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		spin_unlock(&ctrl->mbox_lock);
232756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		return tag;
233756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	}
2346733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2353cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal	req = nonemb_cmd->va;
236f98c96b0b6572b5491e954148509b20f08f31491Jayamohan Kallickal	memset(req, 0, sizeof(*req));
237756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb = wrb_from_mccq(phba);
238756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	sge = nonembedded_sgl(wrb);
239756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb->tag0 |= tag;
2406733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2416733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
2426733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
2436733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			OPCODE_COMMON_ISCSI_ERROR_RECOVERY_INVALIDATE_COMMANDS,
2446733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			sizeof(*req));
2456733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->ref_handle = 0;
2466733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->cleanup_type = CMD_ISCSI_COMMAND_INVALIDATE;
2474183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal	for (i = 0; i < num_invalidate; i++) {
2484183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal		req->table[i].icd = inv_tbl->icd;
2494183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal		req->table[i].cid = inv_tbl->cid;
2504183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal		req->icd_count++;
2514183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal		inv_tbl++;
2524183122dbc7c489f11971c5afa8e42011bca7fa2Jayamohan Kallickal	}
2533cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal	sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
2543cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal	sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
2553cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal	sge->len = cpu_to_le32(nonemb_cmd->size);
2566733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
257756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	be_mcc_notify(phba);
2586733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
259756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	return tag;
2606733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal}
2616733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
26203a1231009927b7168d6d86a7a7f6c7f9b4be85aJayamohan Kallickalunsigned int mgmt_invalidate_connection(struct beiscsi_hba *phba,
2636733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					 struct beiscsi_endpoint *beiscsi_ep,
2646733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					 unsigned short cid,
2656733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					 unsigned short issue_reset,
2666733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal					 unsigned short savecfg_flag)
2676733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal{
2686733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_ctrl_info *ctrl = &phba->ctrl;
269756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct be_mcc_wrb *wrb;
270756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct iscsi_invalidate_connection_params_in *req;
271756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	unsigned int tag = 0;
2726733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2736733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
274756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	tag = alloc_mcc_tag(phba);
275756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	if (!tag) {
276756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		spin_unlock(&ctrl->mbox_lock);
277756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		return tag;
278756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	}
279756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb = wrb_from_mccq(phba);
280756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb->tag0 |= tag;
281756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	req = embedded_payload(wrb);
2826733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
2836733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
2846733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
2856733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   OPCODE_ISCSI_INI_DRIVER_INVALIDATE_CONNECTION,
2866733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   sizeof(*req));
2876733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->session_handle = beiscsi_ep->fw_handle;
2886733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->cid = cid;
2896733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (issue_reset)
2906733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->cleanup_type = CMD_ISCSI_CONNECTION_ISSUE_TCP_RST;
2916733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	else
2926733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->cleanup_type = CMD_ISCSI_CONNECTION_INVALIDATE;
2936733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->save_cfg = savecfg_flag;
294756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	be_mcc_notify(phba);
2956733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
296756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	return tag;
2976733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal}
2986733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
29903a1231009927b7168d6d86a7a7f6c7f9b4be85aJayamohan Kallickalunsigned int mgmt_upload_connection(struct beiscsi_hba *phba,
3006733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal				unsigned short cid, unsigned int upload_flag)
3016733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal{
3026733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_ctrl_info *ctrl = &phba->ctrl;
303756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct be_mcc_wrb *wrb;
304756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct tcp_upload_params_in *req;
305756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	unsigned int tag = 0;
3066733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
3076733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
308756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	tag = alloc_mcc_tag(phba);
309756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	if (!tag) {
310756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		spin_unlock(&ctrl->mbox_lock);
311756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		return tag;
312756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	}
313756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb = wrb_from_mccq(phba);
314756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	req = embedded_payload(wrb);
315756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb->tag0 |= tag;
3166733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
3176733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
3186733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_COMMON_TCP_UPLOAD,
3196733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   OPCODE_COMMON_TCP_UPLOAD, sizeof(*req));
3206733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->id = (unsigned short)cid;
3216733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->upload_type = (unsigned char)upload_flag;
322756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	be_mcc_notify(phba);
3236733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
324756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	return tag;
3256733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal}
3266733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
3276733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickalint mgmt_open_connection(struct beiscsi_hba *phba,
3286733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			 struct sockaddr *dst_addr,
3293cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal			 struct beiscsi_endpoint *beiscsi_ep,
3303cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal			 struct be_dma_mem *nonemb_cmd)
3313cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal
3326733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal{
3336733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct hwi_controller *phwi_ctrlr;
3346733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct hwi_context_memory *phwi_context;
3356733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct sockaddr_in *daddr_in = (struct sockaddr_in *)dst_addr;
3366733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct sockaddr_in6 *daddr_in6 = (struct sockaddr_in6 *)dst_addr;
3376733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct be_ctrl_info *ctrl = &phba->ctrl;
338756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct be_mcc_wrb *wrb;
339756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct tcp_connect_and_offload_in *req;
3406733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	unsigned short def_hdr_id;
3416733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	unsigned short def_data_id;
3426733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct phys_addr template_address = { 0, 0 };
3436733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	struct phys_addr *ptemplate_address;
344756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	unsigned int tag = 0;
345bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	unsigned int i;
3466733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	unsigned short cid = beiscsi_ep->ep_cid;
3473cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal	struct be_sge *sge;
3486733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
3496733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	phwi_ctrlr = phba->phwi_ctrlr;
3506733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	phwi_context = phwi_ctrlr->phwi_ctxt;
3516733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	def_hdr_id = (unsigned short)HWI_GET_DEF_HDRQ_ID(phba);
3526733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	def_data_id = (unsigned short)HWI_GET_DEF_BUFQ_ID(phba);
3536733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
3546733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	ptemplate_address = &template_address;
3556733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	ISCSI_GET_PDU_TEMPLATE_ADDRESS(phba, ptemplate_address);
3566733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
357756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	tag = alloc_mcc_tag(phba);
358756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	if (!tag) {
359756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		spin_unlock(&ctrl->mbox_lock);
360756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		return tag;
361756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	}
362756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb = wrb_from_mccq(phba);
3633cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal	memset(wrb, 0, sizeof(*wrb));
3643cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal	sge = nonembedded_sgl(wrb);
3653cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal
3663cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal	req = nonemb_cmd->va;
3673cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal	memset(req, 0, sizeof(*req));
368756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb->tag0 |= tag;
3696733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
370b15d05b0d358cedf9c4d420a60d2ee2d0f530788Jayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
3716733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
3726733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   OPCODE_COMMON_ISCSI_TCP_CONNECT_AND_OFFLOAD,
3736733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			   sizeof(*req));
3746733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	if (dst_addr->sa_family == PF_INET) {
3756733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		__be32 s_addr = daddr_in->sin_addr.s_addr;
3766733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->ip_address.ip_type = BE2_IPV4;
3776733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->ip_address.ip_address[0] = s_addr & 0x000000ff;
3786733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->ip_address.ip_address[1] = (s_addr & 0x0000ff00) >> 8;
3796733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->ip_address.ip_address[2] = (s_addr & 0x00ff0000) >> 16;
3806733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->ip_address.ip_address[3] = (s_addr & 0xff000000) >> 24;
3816733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->tcp_port = ntohs(daddr_in->sin_port);
3826733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		beiscsi_ep->dst_addr = daddr_in->sin_addr.s_addr;
3836733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		beiscsi_ep->dst_tcpport = ntohs(daddr_in->sin_port);
3846733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		beiscsi_ep->ip_type = BE2_IPV4;
3856733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	} else if (dst_addr->sa_family == PF_INET6) {
3866733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->ip_address.ip_type = BE2_IPV6;
3876733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		memcpy(&req->ip_address.ip_address,
3886733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		       &daddr_in6->sin6_addr.in6_u.u6_addr8, 16);
3896733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		req->tcp_port = ntohs(daddr_in6->sin6_port);
3906733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		beiscsi_ep->dst_tcpport = ntohs(daddr_in6->sin6_port);
3916733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		memcpy(&beiscsi_ep->dst6_addr,
3926733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		       &daddr_in6->sin6_addr.in6_u.u6_addr8, 16);
3936733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		beiscsi_ep->ip_type = BE2_IPV6;
3946733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	} else{
3956733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		shost_printk(KERN_ERR, phba->shost, "unknown addr family %d\n",
3966733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal			     dst_addr->sa_family);
3976733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		spin_unlock(&ctrl->mbox_lock);
3985db3f33d687c5a4ba589bf3af98c786399c6e213Jayamohan Kallickal		free_mcc_tag(&phba->ctrl, tag);
3996733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal		return -EINVAL;
4006733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal
4016733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	}
4026733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->cid = cid;
403bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	i = phba->nxt_cqid++;
404bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	if (phba->nxt_cqid == phba->num_cpus)
405bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal		phba->nxt_cqid = 0;
406bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	req->cq_id = phwi_context->be_cq[i].id;
407457ff3b7dc3796d8778286217ad304ff122e948fJayamohan Kallickal	SE_DEBUG(DBG_LVL_8, "i=%d cq_id=%d\n", i, req->cq_id);
4086733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->defq_id = def_hdr_id;
4096733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->hdr_ring_id = def_hdr_id;
4106733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->data_ring_id = def_data_id;
4116733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->do_offload = 1;
4126733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->dataout_template_pa.lo = ptemplate_address->lo;
4136733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	req->dataout_template_pa.hi = ptemplate_address->hi;
4143cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal	sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
4153cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal	sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
4163cbb7a74a76e45f5e410367259844e8266fba6ecJayamohan Kallickal	sge->len = cpu_to_le32(nonemb_cmd->size);
417756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	be_mcc_notify(phba);
4186733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
419756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	return tag;
4206733b39a1301b0b020bbcbf3295852e93e624cb1Jayamohan Kallickal}
421bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal
422756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickalunsigned int be_cmd_get_mac_addr(struct beiscsi_hba *phba)
423bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal{
424bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	struct be_ctrl_info *ctrl = &phba->ctrl;
425756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct be_mcc_wrb *wrb;
426756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	struct be_cmd_req_get_mac_addr *req;
427756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	unsigned int tag = 0;
428bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal
429bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	SE_DEBUG(DBG_LVL_8, "In be_cmd_get_mac_addr\n");
430bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	spin_lock(&ctrl->mbox_lock);
431756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	tag = alloc_mcc_tag(phba);
432756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	if (!tag) {
433756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		spin_unlock(&ctrl->mbox_lock);
434756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal		return tag;
435756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	}
436756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal
437756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb = wrb_from_mccq(phba);
438756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	req = embedded_payload(wrb);
439756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	wrb->tag0 |= tag;
440bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
441bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
442bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal			   OPCODE_COMMON_ISCSI_NTWK_GET_NIC_CONFIG,
443bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal			   sizeof(*req));
444bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal
445756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	be_mcc_notify(phba);
446bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal	spin_unlock(&ctrl->mbox_lock);
447756d29c8c7ed8887ed7d752371ce2f6d12399267Jayamohan Kallickal	return tag;
448bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal}
449bfead3b2cb4607c71831423c3ee97d22cd0c9dcbJayamohan Kallickal
450