1 /** 2 * Copyright (C) 2005 - 2010 ServerEngines 3 * All rights reserved. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License version 2 7 * as published by the Free Software Foundation. The full GNU General 8 * Public License is included in this distribution in the file called COPYING. 9 * 10 * Written by: Jayamohan Kallickal (jayamohank@serverengines.com) 11 * 12 * Contact Information: 13 * linux-drivers@serverengines.com 14 * 15 * ServerEngines 16 * 209 N. Fair Oaks Ave 17 * Sunnyvale, CA 94085 18 * 19 */ 20 21 #ifndef _BEISCSI_MGMT_ 22 #define _BEISCSI_MGMT_ 23 24 #include <linux/types.h> 25 #include <linux/list.h> 26 #include "be_iscsi.h" 27 #include "be_main.h" 28 29 /** 30 * Pseudo amap definition in which each bit of the actual structure is defined 31 * as a byte: used to calculate offset/shift/mask of each field 32 */ 33 struct amap_mcc_sge { 34 u8 pa_lo[32]; /* dword 0 */ 35 u8 pa_hi[32]; /* dword 1 */ 36 u8 length[32]; /* DWORD 2 */ 37 } __packed; 38 39 /** 40 * Pseudo amap definition in which each bit of the actual structure is defined 41 * as a byte: used to calculate offset/shift/mask of each field 42 */ 43 struct amap_mcc_wrb_payload { 44 union { 45 struct amap_mcc_sge sgl[19]; 46 u8 embedded[59 * 32]; /* DWORDS 57 to 115 */ 47 } u; 48 } __packed; 49 50 /** 51 * Pseudo amap definition in which each bit of the actual structure is defined 52 * as a byte: used to calculate offset/shift/mask of each field 53 */ 54 struct amap_mcc_wrb { 55 u8 embedded; /* DWORD 0 */ 56 u8 rsvd0[2]; /* DWORD 0 */ 57 u8 sge_count[5]; /* DWORD 0 */ 58 u8 rsvd1[16]; /* DWORD 0 */ 59 u8 special[8]; /* DWORD 0 */ 60 u8 payload_length[32]; 61 u8 tag[64]; /* DWORD 2 */ 62 u8 rsvd2[32]; /* DWORD 4 */ 63 struct amap_mcc_wrb_payload payload; 64 }; 65 66 struct mcc_sge { 67 u32 pa_lo; /* dword 0 */ 68 u32 pa_hi; /* dword 1 */ 69 u32 length; /* DWORD 2 */ 70 } __packed; 71 72 struct mcc_wrb_payload { 73 union { 74 struct mcc_sge sgl[19]; 75 u32 embedded[59]; /* DWORDS 57 to 115 */ 76 } u; 77 } __packed; 78 79 #define MCC_WRB_EMBEDDED_MASK 0x00000001 80 81 struct mcc_wrb { 82 u32 dw[0]; /* DWORD 0 */ 83 u32 payload_length; 84 u32 tag[2]; /* DWORD 2 */ 85 u32 rsvd2[1]; /* DWORD 4 */ 86 struct mcc_wrb_payload payload; 87 }; 88 89 int mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short chute); 90 int mgmt_open_connection(struct beiscsi_hba *phba, 91 struct sockaddr *dst_addr, 92 struct beiscsi_endpoint *beiscsi_ep, 93 struct be_dma_mem *nonemb_cmd); 94 95 unsigned int mgmt_upload_connection(struct beiscsi_hba *phba, 96 unsigned short cid, 97 unsigned int upload_flag); 98 unsigned int mgmt_invalidate_icds(struct beiscsi_hba *phba, 99 struct invalidate_command_table *inv_tbl, 100 unsigned int num_invalidate, unsigned int cid, 101 struct be_dma_mem *nonemb_cmd); 102 103 struct iscsi_invalidate_connection_params_in { 104 struct be_cmd_req_hdr hdr; 105 unsigned int session_handle; 106 unsigned short cid; 107 unsigned short unused; 108 unsigned short cleanup_type; 109 unsigned short save_cfg; 110 } __packed; 111 112 struct iscsi_invalidate_connection_params_out { 113 unsigned int session_handle; 114 unsigned short cid; 115 unsigned short unused; 116 } __packed; 117 118 union iscsi_invalidate_connection_params { 119 struct iscsi_invalidate_connection_params_in request; 120 struct iscsi_invalidate_connection_params_out response; 121 } __packed; 122 123 struct invalidate_commands_params_in { 124 struct be_cmd_req_hdr hdr; 125 unsigned int ref_handle; 126 unsigned int icd_count; 127 struct invalidate_command_table table[128]; 128 unsigned short cleanup_type; 129 unsigned short unused; 130 } __packed; 131 132 struct invalidate_commands_params_out { 133 unsigned int ref_handle; 134 unsigned int icd_count; 135 unsigned int icd_status[128]; 136 } __packed; 137 138 union invalidate_commands_params { 139 struct invalidate_commands_params_in request; 140 struct invalidate_commands_params_out response; 141 } __packed; 142 143 struct mgmt_hba_attributes { 144 u8 flashrom_version_string[32]; 145 u8 manufacturer_name[32]; 146 u32 supported_modes; 147 u8 seeprom_version_lo; 148 u8 seeprom_version_hi; 149 u8 rsvd0[2]; 150 u32 fw_cmd_data_struct_version; 151 u32 ep_fw_data_struct_version; 152 u32 future_reserved[12]; 153 u32 default_extended_timeout; 154 u8 controller_model_number[32]; 155 u8 controller_description[64]; 156 u8 controller_serial_number[32]; 157 u8 ip_version_string[32]; 158 u8 firmware_version_string[32]; 159 u8 bios_version_string[32]; 160 u8 redboot_version_string[32]; 161 u8 driver_version_string[32]; 162 u8 fw_on_flash_version_string[32]; 163 u32 functionalities_supported; 164 u16 max_cdblength; 165 u8 asic_revision; 166 u8 generational_guid[16]; 167 u8 hba_port_count; 168 u16 default_link_down_timeout; 169 u8 iscsi_ver_min_max; 170 u8 multifunction_device; 171 u8 cache_valid; 172 u8 hba_status; 173 u8 max_domains_supported; 174 u8 phy_port; 175 u32 firmware_post_status; 176 u32 hba_mtu[8]; 177 u8 iscsi_features; 178 u8 future_u8[3]; 179 u32 future_u32[3]; 180 } __packed; 181 182 struct mgmt_controller_attributes { 183 struct mgmt_hba_attributes hba_attribs; 184 u16 pci_vendor_id; 185 u16 pci_device_id; 186 u16 pci_sub_vendor_id; 187 u16 pci_sub_system_id; 188 u8 pci_bus_number; 189 u8 pci_device_number; 190 u8 pci_function_number; 191 u8 interface_type; 192 u64 unique_identifier; 193 u8 netfilters; 194 u8 rsvd0[3]; 195 u8 future_u32[4]; 196 } __packed; 197 198 struct be_mgmt_controller_attributes { 199 struct be_cmd_req_hdr hdr; 200 struct mgmt_controller_attributes params; 201 } __packed; 202 203 struct be_mgmt_controller_attributes_resp { 204 struct be_cmd_resp_hdr hdr; 205 struct mgmt_controller_attributes params; 206 } __packed; 207 208 /* configuration management */ 209 210 #define GET_MGMT_CONTROLLER_WS(phba) (phba->pmgmt_ws) 211 212 /* MGMT CMD flags */ 213 214 #define MGMT_CMDH_FREE (1<<0) 215 216 /* --- MGMT_ERROR_CODES --- */ 217 /* Error Codes returned in the status field of the CMD response header */ 218 #define MGMT_STATUS_SUCCESS 0 /* The CMD completed without errors */ 219 #define MGMT_STATUS_FAILED 1 /* Error status in the Status field of */ 220 /* the CMD_RESPONSE_HEADER */ 221 222 #define ISCSI_GET_PDU_TEMPLATE_ADDRESS(pc, pa) {\ 223 pa->lo = phba->init_mem[ISCSI_MEM_GLOBAL_HEADER].mem_array[0].\ 224 bus_address.u.a32.address_lo; \ 225 pa->hi = phba->init_mem[ISCSI_MEM_GLOBAL_HEADER].mem_array[0].\ 226 bus_address.u.a32.address_hi; \ 227 } 228 229 struct beiscsi_endpoint { 230 struct beiscsi_hba *phba; 231 struct beiscsi_sess *sess; 232 struct beiscsi_conn *conn; 233 struct iscsi_endpoint *openiscsi_ep; 234 unsigned short ip_type; 235 char dst6_addr[ISCSI_ADDRESS_BUF_LEN]; 236 unsigned long dst_addr; 237 unsigned short ep_cid; 238 unsigned int fw_handle; 239 u16 dst_tcpport; 240 u16 cid_vld; 241 }; 242 243 int mgmt_get_fw_config(struct be_ctrl_info *ctrl, 244 struct beiscsi_hba *phba); 245 246 unsigned int mgmt_invalidate_connection(struct beiscsi_hba *phba, 247 struct beiscsi_endpoint *beiscsi_ep, 248 unsigned short cid, 249 unsigned short issue_reset, 250 unsigned short savecfg_flag); 251 252 #endif 253