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