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