16733b39aSJayamohan Kallickal /** 26733b39aSJayamohan Kallickal * Copyright (C) 2005 - 2009 ServerEngines 36733b39aSJayamohan Kallickal * All rights reserved. 46733b39aSJayamohan Kallickal * 56733b39aSJayamohan Kallickal * This program is free software; you can redistribute it and/or 66733b39aSJayamohan Kallickal * modify it under the terms of the GNU General Public License version 2 76733b39aSJayamohan Kallickal * as published by the Free Software Foundation. The full GNU General 86733b39aSJayamohan Kallickal * Public License is included in this distribution in the file called COPYING. 96733b39aSJayamohan Kallickal * 106733b39aSJayamohan Kallickal * Written by: Jayamohan Kallickal (jayamohank@serverengines.com) 116733b39aSJayamohan Kallickal * 126733b39aSJayamohan Kallickal * Contact Information: 136733b39aSJayamohan Kallickal * linux-drivers@serverengines.com 146733b39aSJayamohan Kallickal * 156733b39aSJayamohan Kallickal * ServerEngines 166733b39aSJayamohan Kallickal * 209 N. Fair Oaks Ave 176733b39aSJayamohan Kallickal * Sunnyvale, CA 94085 186733b39aSJayamohan Kallickal * 196733b39aSJayamohan Kallickal */ 206733b39aSJayamohan Kallickal 216733b39aSJayamohan Kallickal #ifndef _BEISCSI_MGMT_ 226733b39aSJayamohan Kallickal #define _BEISCSI_MGMT_ 236733b39aSJayamohan Kallickal 246733b39aSJayamohan Kallickal #include <linux/types.h> 256733b39aSJayamohan Kallickal #include <linux/list.h> 266733b39aSJayamohan Kallickal #include "be_iscsi.h" 276733b39aSJayamohan Kallickal #include "be_main.h" 286733b39aSJayamohan Kallickal 296733b39aSJayamohan Kallickal /** 306733b39aSJayamohan Kallickal * Pseudo amap definition in which each bit of the actual structure is defined 316733b39aSJayamohan Kallickal * as a byte: used to calculate offset/shift/mask of each field 326733b39aSJayamohan Kallickal */ 336733b39aSJayamohan Kallickal struct amap_mcc_sge { 346733b39aSJayamohan Kallickal u8 pa_lo[32]; /* dword 0 */ 356733b39aSJayamohan Kallickal u8 pa_hi[32]; /* dword 1 */ 366733b39aSJayamohan Kallickal u8 length[32]; /* DWORD 2 */ 376733b39aSJayamohan Kallickal } __packed; 386733b39aSJayamohan Kallickal 396733b39aSJayamohan Kallickal /** 406733b39aSJayamohan Kallickal * Pseudo amap definition in which each bit of the actual structure is defined 416733b39aSJayamohan Kallickal * as a byte: used to calculate offset/shift/mask of each field 426733b39aSJayamohan Kallickal */ 436733b39aSJayamohan Kallickal struct amap_mcc_wrb_payload { 446733b39aSJayamohan Kallickal union { 456733b39aSJayamohan Kallickal struct amap_mcc_sge sgl[19]; 466733b39aSJayamohan Kallickal u8 embedded[59 * 32]; /* DWORDS 57 to 115 */ 476733b39aSJayamohan Kallickal } u; 486733b39aSJayamohan Kallickal } __packed; 496733b39aSJayamohan Kallickal 506733b39aSJayamohan Kallickal /** 516733b39aSJayamohan Kallickal * Pseudo amap definition in which each bit of the actual structure is defined 526733b39aSJayamohan Kallickal * as a byte: used to calculate offset/shift/mask of each field 536733b39aSJayamohan Kallickal */ 546733b39aSJayamohan Kallickal struct amap_mcc_wrb { 556733b39aSJayamohan Kallickal u8 embedded; /* DWORD 0 */ 566733b39aSJayamohan Kallickal u8 rsvd0[2]; /* DWORD 0 */ 576733b39aSJayamohan Kallickal u8 sge_count[5]; /* DWORD 0 */ 586733b39aSJayamohan Kallickal u8 rsvd1[16]; /* DWORD 0 */ 596733b39aSJayamohan Kallickal u8 special[8]; /* DWORD 0 */ 606733b39aSJayamohan Kallickal u8 payload_length[32]; 616733b39aSJayamohan Kallickal u8 tag[64]; /* DWORD 2 */ 626733b39aSJayamohan Kallickal u8 rsvd2[32]; /* DWORD 4 */ 636733b39aSJayamohan Kallickal struct amap_mcc_wrb_payload payload; 646733b39aSJayamohan Kallickal }; 656733b39aSJayamohan Kallickal 666733b39aSJayamohan Kallickal struct mcc_sge { 676733b39aSJayamohan Kallickal u32 pa_lo; /* dword 0 */ 686733b39aSJayamohan Kallickal u32 pa_hi; /* dword 1 */ 696733b39aSJayamohan Kallickal u32 length; /* DWORD 2 */ 706733b39aSJayamohan Kallickal } __packed; 716733b39aSJayamohan Kallickal 726733b39aSJayamohan Kallickal struct mcc_wrb_payload { 736733b39aSJayamohan Kallickal union { 746733b39aSJayamohan Kallickal struct mcc_sge sgl[19]; 756733b39aSJayamohan Kallickal u32 embedded[59]; /* DWORDS 57 to 115 */ 766733b39aSJayamohan Kallickal } u; 776733b39aSJayamohan Kallickal } __packed; 786733b39aSJayamohan Kallickal 796733b39aSJayamohan Kallickal #define MCC_WRB_EMBEDDED_MASK 0x00000001 806733b39aSJayamohan Kallickal 816733b39aSJayamohan Kallickal struct mcc_wrb { 826733b39aSJayamohan Kallickal u32 dw[0]; /* DWORD 0 */ 836733b39aSJayamohan Kallickal u32 payload_length; 846733b39aSJayamohan Kallickal u32 tag[2]; /* DWORD 2 */ 856733b39aSJayamohan Kallickal u32 rsvd2[1]; /* DWORD 4 */ 866733b39aSJayamohan Kallickal struct mcc_wrb_payload payload; 876733b39aSJayamohan Kallickal }; 886733b39aSJayamohan Kallickal 896733b39aSJayamohan Kallickal unsigned char mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short chute); 906733b39aSJayamohan Kallickal int mgmt_open_connection(struct beiscsi_hba *phba, struct sockaddr *dst_addr, 916733b39aSJayamohan Kallickal struct beiscsi_endpoint *beiscsi_ep); 926733b39aSJayamohan Kallickal 936733b39aSJayamohan Kallickal unsigned char mgmt_upload_connection(struct beiscsi_hba *phba, 946733b39aSJayamohan Kallickal unsigned short cid, 956733b39aSJayamohan Kallickal unsigned int upload_flag); 966733b39aSJayamohan Kallickal unsigned char mgmt_invalidate_icds(struct beiscsi_hba *phba, 976733b39aSJayamohan Kallickal unsigned int icd, unsigned int cid); 986733b39aSJayamohan Kallickal 996733b39aSJayamohan Kallickal struct iscsi_invalidate_connection_params_in { 1006733b39aSJayamohan Kallickal struct be_cmd_req_hdr hdr; 1016733b39aSJayamohan Kallickal unsigned int session_handle; 1026733b39aSJayamohan Kallickal unsigned short cid; 1036733b39aSJayamohan Kallickal unsigned short unused; 1046733b39aSJayamohan Kallickal unsigned short cleanup_type; 1056733b39aSJayamohan Kallickal unsigned short save_cfg; 1066733b39aSJayamohan Kallickal } __packed; 1076733b39aSJayamohan Kallickal 1086733b39aSJayamohan Kallickal struct iscsi_invalidate_connection_params_out { 1096733b39aSJayamohan Kallickal unsigned int session_handle; 1106733b39aSJayamohan Kallickal unsigned short cid; 1116733b39aSJayamohan Kallickal unsigned short unused; 1126733b39aSJayamohan Kallickal } __packed; 1136733b39aSJayamohan Kallickal 1146733b39aSJayamohan Kallickal union iscsi_invalidate_connection_params { 1156733b39aSJayamohan Kallickal struct iscsi_invalidate_connection_params_in request; 1166733b39aSJayamohan Kallickal struct iscsi_invalidate_connection_params_out response; 1176733b39aSJayamohan Kallickal } __packed; 1186733b39aSJayamohan Kallickal 1196733b39aSJayamohan Kallickal struct invalidate_command_table { 1206733b39aSJayamohan Kallickal unsigned short icd; 1216733b39aSJayamohan Kallickal unsigned short cid; 1226733b39aSJayamohan Kallickal } __packed; 1236733b39aSJayamohan Kallickal 1246733b39aSJayamohan Kallickal struct invalidate_commands_params_in { 1256733b39aSJayamohan Kallickal struct be_cmd_req_hdr hdr; 1266733b39aSJayamohan Kallickal unsigned int ref_handle; 1276733b39aSJayamohan Kallickal unsigned int icd_count; 1286733b39aSJayamohan Kallickal struct invalidate_command_table table[128]; 1296733b39aSJayamohan Kallickal unsigned short cleanup_type; 1306733b39aSJayamohan Kallickal unsigned short unused; 1316733b39aSJayamohan Kallickal } __packed; 1326733b39aSJayamohan Kallickal 1336733b39aSJayamohan Kallickal struct invalidate_commands_params_out { 1346733b39aSJayamohan Kallickal unsigned int ref_handle; 1356733b39aSJayamohan Kallickal unsigned int icd_count; 1366733b39aSJayamohan Kallickal unsigned int icd_status[128]; 1376733b39aSJayamohan Kallickal } __packed; 1386733b39aSJayamohan Kallickal 1396733b39aSJayamohan Kallickal union invalidate_commands_params { 1406733b39aSJayamohan Kallickal struct invalidate_commands_params_in request; 1416733b39aSJayamohan Kallickal struct invalidate_commands_params_out response; 1426733b39aSJayamohan Kallickal } __packed; 1436733b39aSJayamohan Kallickal 1446733b39aSJayamohan Kallickal struct mgmt_hba_attributes { 1456733b39aSJayamohan Kallickal u8 flashrom_version_string[32]; 1466733b39aSJayamohan Kallickal u8 manufacturer_name[32]; 1476733b39aSJayamohan Kallickal u32 supported_modes; 1486733b39aSJayamohan Kallickal u8 seeprom_version_lo; 1496733b39aSJayamohan Kallickal u8 seeprom_version_hi; 1506733b39aSJayamohan Kallickal u8 rsvd0[2]; 1516733b39aSJayamohan Kallickal u32 fw_cmd_data_struct_version; 1526733b39aSJayamohan Kallickal u32 ep_fw_data_struct_version; 1536733b39aSJayamohan Kallickal u32 future_reserved[12]; 1546733b39aSJayamohan Kallickal u32 default_extended_timeout; 1556733b39aSJayamohan Kallickal u8 controller_model_number[32]; 1566733b39aSJayamohan Kallickal u8 controller_description[64]; 1576733b39aSJayamohan Kallickal u8 controller_serial_number[32]; 1586733b39aSJayamohan Kallickal u8 ip_version_string[32]; 1596733b39aSJayamohan Kallickal u8 firmware_version_string[32]; 1606733b39aSJayamohan Kallickal u8 bios_version_string[32]; 1616733b39aSJayamohan Kallickal u8 redboot_version_string[32]; 1626733b39aSJayamohan Kallickal u8 driver_version_string[32]; 1636733b39aSJayamohan Kallickal u8 fw_on_flash_version_string[32]; 1646733b39aSJayamohan Kallickal u32 functionalities_supported; 1656733b39aSJayamohan Kallickal u16 max_cdblength; 1666733b39aSJayamohan Kallickal u8 asic_revision; 1676733b39aSJayamohan Kallickal u8 generational_guid[16]; 1686733b39aSJayamohan Kallickal u8 hba_port_count; 1696733b39aSJayamohan Kallickal u16 default_link_down_timeout; 1706733b39aSJayamohan Kallickal u8 iscsi_ver_min_max; 1716733b39aSJayamohan Kallickal u8 multifunction_device; 1726733b39aSJayamohan Kallickal u8 cache_valid; 1736733b39aSJayamohan Kallickal u8 hba_status; 1746733b39aSJayamohan Kallickal u8 max_domains_supported; 1756733b39aSJayamohan Kallickal u8 phy_port; 1766733b39aSJayamohan Kallickal u32 firmware_post_status; 1776733b39aSJayamohan Kallickal u32 hba_mtu[8]; 178bfead3b2SJayamohan Kallickal u8 iscsi_features; 179bfead3b2SJayamohan Kallickal u8 future_u8[3]; 180bfead3b2SJayamohan Kallickal u32 future_u32[3]; 1816733b39aSJayamohan Kallickal } __packed; 1826733b39aSJayamohan Kallickal 1836733b39aSJayamohan Kallickal struct mgmt_controller_attributes { 1846733b39aSJayamohan Kallickal struct mgmt_hba_attributes hba_attribs; 1856733b39aSJayamohan Kallickal u16 pci_vendor_id; 1866733b39aSJayamohan Kallickal u16 pci_device_id; 1876733b39aSJayamohan Kallickal u16 pci_sub_vendor_id; 1886733b39aSJayamohan Kallickal u16 pci_sub_system_id; 1896733b39aSJayamohan Kallickal u8 pci_bus_number; 1906733b39aSJayamohan Kallickal u8 pci_device_number; 1916733b39aSJayamohan Kallickal u8 pci_function_number; 1926733b39aSJayamohan Kallickal u8 interface_type; 1936733b39aSJayamohan Kallickal u64 unique_identifier; 1946733b39aSJayamohan Kallickal u8 netfilters; 1956733b39aSJayamohan Kallickal u8 rsvd0[3]; 1966733b39aSJayamohan Kallickal u8 future_u32[4]; 1976733b39aSJayamohan Kallickal } __packed; 1986733b39aSJayamohan Kallickal 1996733b39aSJayamohan Kallickal struct be_mgmt_controller_attributes { 2006733b39aSJayamohan Kallickal struct be_cmd_req_hdr hdr; 2016733b39aSJayamohan Kallickal struct mgmt_controller_attributes params; 2026733b39aSJayamohan Kallickal } __packed; 2036733b39aSJayamohan Kallickal 2046733b39aSJayamohan Kallickal struct be_mgmt_controller_attributes_resp { 2056733b39aSJayamohan Kallickal struct be_cmd_resp_hdr hdr; 2066733b39aSJayamohan Kallickal struct mgmt_controller_attributes params; 2076733b39aSJayamohan Kallickal } __packed; 2086733b39aSJayamohan Kallickal 2096733b39aSJayamohan Kallickal /* configuration management */ 2106733b39aSJayamohan Kallickal 2116733b39aSJayamohan Kallickal #define GET_MGMT_CONTROLLER_WS(phba) (phba->pmgmt_ws) 2126733b39aSJayamohan Kallickal 2136733b39aSJayamohan Kallickal /* MGMT CMD flags */ 2146733b39aSJayamohan Kallickal 2156733b39aSJayamohan Kallickal #define MGMT_CMDH_FREE (1<<0) 2166733b39aSJayamohan Kallickal 2176733b39aSJayamohan Kallickal /* --- MGMT_ERROR_CODES --- */ 2186733b39aSJayamohan Kallickal /* Error Codes returned in the status field of the CMD response header */ 2196733b39aSJayamohan Kallickal #define MGMT_STATUS_SUCCESS 0 /* The CMD completed without errors */ 2206733b39aSJayamohan Kallickal #define MGMT_STATUS_FAILED 1 /* Error status in the Status field of */ 2216733b39aSJayamohan Kallickal /* the CMD_RESPONSE_HEADER */ 2226733b39aSJayamohan Kallickal 2236733b39aSJayamohan Kallickal #define ISCSI_GET_PDU_TEMPLATE_ADDRESS(pc, pa) {\ 2246733b39aSJayamohan Kallickal pa->lo = phba->init_mem[ISCSI_MEM_GLOBAL_HEADER].mem_array[0].\ 2256733b39aSJayamohan Kallickal bus_address.u.a32.address_lo; \ 2266733b39aSJayamohan Kallickal pa->hi = phba->init_mem[ISCSI_MEM_GLOBAL_HEADER].mem_array[0].\ 2276733b39aSJayamohan Kallickal bus_address.u.a32.address_hi; \ 2286733b39aSJayamohan Kallickal } 2296733b39aSJayamohan Kallickal 2306733b39aSJayamohan Kallickal struct beiscsi_endpoint { 2316733b39aSJayamohan Kallickal struct beiscsi_hba *phba; 2326733b39aSJayamohan Kallickal struct beiscsi_sess *sess; 2336733b39aSJayamohan Kallickal struct beiscsi_conn *conn; 2346733b39aSJayamohan Kallickal unsigned short ip_type; 2356733b39aSJayamohan Kallickal char dst6_addr[ISCSI_ADDRESS_BUF_LEN]; 2366733b39aSJayamohan Kallickal unsigned long dst_addr; 2376733b39aSJayamohan Kallickal unsigned short ep_cid; 2386733b39aSJayamohan Kallickal unsigned int fw_handle; 2396733b39aSJayamohan Kallickal u16 dst_tcpport; 2406733b39aSJayamohan Kallickal u16 cid_vld; 2416733b39aSJayamohan Kallickal }; 2426733b39aSJayamohan Kallickal 2436733b39aSJayamohan Kallickal unsigned char mgmt_get_fw_config(struct be_ctrl_info *ctrl, 2446733b39aSJayamohan Kallickal struct beiscsi_hba *phba); 2456733b39aSJayamohan Kallickal 2466733b39aSJayamohan Kallickal unsigned char mgmt_invalidate_connection(struct beiscsi_hba *phba, 2476733b39aSJayamohan Kallickal struct beiscsi_endpoint *beiscsi_ep, 2486733b39aSJayamohan Kallickal unsigned short cid, 2496733b39aSJayamohan Kallickal unsigned short issue_reset, 2506733b39aSJayamohan Kallickal unsigned short savecfg_flag); 251bfead3b2SJayamohan Kallickal 252bfead3b2SJayamohan Kallickal unsigned char mgmt_fw_cmd(struct be_ctrl_info *ctrl, 253bfead3b2SJayamohan Kallickal struct beiscsi_hba *phba, 254bfead3b2SJayamohan Kallickal char *buf, unsigned int len); 2556733b39aSJayamohan Kallickal #endif 256