1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright 2017 Broadcom. All Rights Reserved. 4*4882a593Smuzhiyun * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Contact Information: 7*4882a593Smuzhiyun * linux-drivers@broadcom.com 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef _BEISCSI_MGMT_ 11*4882a593Smuzhiyun #define _BEISCSI_MGMT_ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <scsi/scsi_bsg_iscsi.h> 14*4882a593Smuzhiyun #include "be_iscsi.h" 15*4882a593Smuzhiyun #include "be_main.h" 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #define IP_ACTION_ADD 0x01 18*4882a593Smuzhiyun #define IP_ACTION_DEL 0x02 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define IP_V6_LEN 16 21*4882a593Smuzhiyun #define IP_V4_LEN 4 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /* UE Status and Mask register */ 24*4882a593Smuzhiyun #define PCICFG_UE_STATUS_LOW 0xA0 25*4882a593Smuzhiyun #define PCICFG_UE_STATUS_HIGH 0xA4 26*4882a593Smuzhiyun #define PCICFG_UE_STATUS_MASK_LOW 0xA8 27*4882a593Smuzhiyun #define PCICFG_UE_STATUS_MASK_HI 0xAC 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun int mgmt_open_connection(struct beiscsi_hba *phba, 30*4882a593Smuzhiyun struct sockaddr *dst_addr, 31*4882a593Smuzhiyun struct beiscsi_endpoint *beiscsi_ep, 32*4882a593Smuzhiyun struct be_dma_mem *nonemb_cmd); 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl, 35*4882a593Smuzhiyun struct beiscsi_hba *phba, 36*4882a593Smuzhiyun struct bsg_job *job, 37*4882a593Smuzhiyun struct be_dma_mem *nonemb_cmd); 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define BE_INVLDT_CMD_TBL_SZ 128 40*4882a593Smuzhiyun struct invldt_cmd_tbl { 41*4882a593Smuzhiyun unsigned short icd; 42*4882a593Smuzhiyun unsigned short cid; 43*4882a593Smuzhiyun } __packed; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun struct invldt_cmds_params_in { 46*4882a593Smuzhiyun struct be_cmd_req_hdr hdr; 47*4882a593Smuzhiyun unsigned int ref_handle; 48*4882a593Smuzhiyun unsigned int icd_count; 49*4882a593Smuzhiyun struct invldt_cmd_tbl table[BE_INVLDT_CMD_TBL_SZ]; 50*4882a593Smuzhiyun unsigned short cleanup_type; 51*4882a593Smuzhiyun unsigned short unused; 52*4882a593Smuzhiyun } __packed; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun struct invldt_cmds_params_out { 55*4882a593Smuzhiyun struct be_cmd_resp_hdr hdr; 56*4882a593Smuzhiyun unsigned int ref_handle; 57*4882a593Smuzhiyun unsigned int icd_count; 58*4882a593Smuzhiyun unsigned int icd_status[BE_INVLDT_CMD_TBL_SZ]; 59*4882a593Smuzhiyun } __packed; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun union be_invldt_cmds_params { 62*4882a593Smuzhiyun struct invldt_cmds_params_in request; 63*4882a593Smuzhiyun struct invldt_cmds_params_out response; 64*4882a593Smuzhiyun } __packed; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun struct mgmt_hba_attributes { 67*4882a593Smuzhiyun u8 flashrom_version_string[BEISCSI_VER_STRLEN]; 68*4882a593Smuzhiyun u8 manufacturer_name[BEISCSI_VER_STRLEN]; 69*4882a593Smuzhiyun u32 supported_modes; 70*4882a593Smuzhiyun u8 seeprom_version_lo; 71*4882a593Smuzhiyun u8 seeprom_version_hi; 72*4882a593Smuzhiyun u8 rsvd0[2]; 73*4882a593Smuzhiyun u32 fw_cmd_data_struct_version; 74*4882a593Smuzhiyun u32 ep_fw_data_struct_version; 75*4882a593Smuzhiyun u8 ncsi_version_string[12]; 76*4882a593Smuzhiyun u32 default_extended_timeout; 77*4882a593Smuzhiyun u8 controller_model_number[BEISCSI_VER_STRLEN]; 78*4882a593Smuzhiyun u8 controller_description[64]; 79*4882a593Smuzhiyun u8 controller_serial_number[BEISCSI_VER_STRLEN]; 80*4882a593Smuzhiyun u8 ip_version_string[BEISCSI_VER_STRLEN]; 81*4882a593Smuzhiyun u8 firmware_version_string[BEISCSI_VER_STRLEN]; 82*4882a593Smuzhiyun u8 bios_version_string[BEISCSI_VER_STRLEN]; 83*4882a593Smuzhiyun u8 redboot_version_string[BEISCSI_VER_STRLEN]; 84*4882a593Smuzhiyun u8 driver_version_string[BEISCSI_VER_STRLEN]; 85*4882a593Smuzhiyun u8 fw_on_flash_version_string[BEISCSI_VER_STRLEN]; 86*4882a593Smuzhiyun u32 functionalities_supported; 87*4882a593Smuzhiyun u16 max_cdblength; 88*4882a593Smuzhiyun u8 asic_revision; 89*4882a593Smuzhiyun u8 generational_guid[16]; 90*4882a593Smuzhiyun u8 hba_port_count; 91*4882a593Smuzhiyun u16 default_link_down_timeout; 92*4882a593Smuzhiyun u8 iscsi_ver_min_max; 93*4882a593Smuzhiyun u8 multifunction_device; 94*4882a593Smuzhiyun u8 cache_valid; 95*4882a593Smuzhiyun u8 hba_status; 96*4882a593Smuzhiyun u8 max_domains_supported; 97*4882a593Smuzhiyun u8 phy_port; 98*4882a593Smuzhiyun u32 firmware_post_status; 99*4882a593Smuzhiyun u32 hba_mtu[8]; 100*4882a593Smuzhiyun u8 iscsi_features; 101*4882a593Smuzhiyun u8 asic_generation; 102*4882a593Smuzhiyun u8 future_u8[2]; 103*4882a593Smuzhiyun u32 future_u32[3]; 104*4882a593Smuzhiyun } __packed; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun struct mgmt_controller_attributes { 107*4882a593Smuzhiyun struct mgmt_hba_attributes hba_attribs; 108*4882a593Smuzhiyun u16 pci_vendor_id; 109*4882a593Smuzhiyun u16 pci_device_id; 110*4882a593Smuzhiyun u16 pci_sub_vendor_id; 111*4882a593Smuzhiyun u16 pci_sub_system_id; 112*4882a593Smuzhiyun u8 pci_bus_number; 113*4882a593Smuzhiyun u8 pci_device_number; 114*4882a593Smuzhiyun u8 pci_function_number; 115*4882a593Smuzhiyun u8 interface_type; 116*4882a593Smuzhiyun u64 unique_identifier; 117*4882a593Smuzhiyun u8 netfilters; 118*4882a593Smuzhiyun u8 rsvd0[3]; 119*4882a593Smuzhiyun u32 future_u32[4]; 120*4882a593Smuzhiyun } __packed; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun struct be_mgmt_controller_attributes { 123*4882a593Smuzhiyun struct be_cmd_req_hdr hdr; 124*4882a593Smuzhiyun struct mgmt_controller_attributes params; 125*4882a593Smuzhiyun } __packed; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun struct be_mgmt_controller_attributes_resp { 128*4882a593Smuzhiyun struct be_cmd_resp_hdr hdr; 129*4882a593Smuzhiyun struct mgmt_controller_attributes params; 130*4882a593Smuzhiyun } __packed; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun struct be_bsg_vendor_cmd { 133*4882a593Smuzhiyun struct be_cmd_req_hdr hdr; 134*4882a593Smuzhiyun unsigned short region; 135*4882a593Smuzhiyun unsigned short offset; 136*4882a593Smuzhiyun unsigned short sector; 137*4882a593Smuzhiyun } __packed; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /* configuration management */ 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun #define GET_MGMT_CONTROLLER_WS(phba) (phba->pmgmt_ws) 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #define ISCSI_GET_PDU_TEMPLATE_ADDRESS(pc, pa) {\ 144*4882a593Smuzhiyun pa->lo = phba->init_mem[ISCSI_MEM_GLOBAL_HEADER].mem_array[0].\ 145*4882a593Smuzhiyun bus_address.u.a32.address_lo; \ 146*4882a593Smuzhiyun pa->hi = phba->init_mem[ISCSI_MEM_GLOBAL_HEADER].mem_array[0].\ 147*4882a593Smuzhiyun bus_address.u.a32.address_hi; \ 148*4882a593Smuzhiyun } 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define BEISCSI_WRITE_FLASH 0 151*4882a593Smuzhiyun #define BEISCSI_READ_FLASH 1 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun struct beiscsi_endpoint { 154*4882a593Smuzhiyun struct beiscsi_hba *phba; 155*4882a593Smuzhiyun struct beiscsi_conn *conn; 156*4882a593Smuzhiyun struct iscsi_endpoint *openiscsi_ep; 157*4882a593Smuzhiyun unsigned short ip_type; 158*4882a593Smuzhiyun char dst6_addr[ISCSI_ADDRESS_BUF_LEN]; 159*4882a593Smuzhiyun unsigned long dst_addr; 160*4882a593Smuzhiyun unsigned short ep_cid; 161*4882a593Smuzhiyun unsigned int fw_handle; 162*4882a593Smuzhiyun u16 dst_tcpport; 163*4882a593Smuzhiyun u16 cid_vld; 164*4882a593Smuzhiyun }; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun int beiscsi_mgmt_invalidate_icds(struct beiscsi_hba *phba, 167*4882a593Smuzhiyun struct invldt_cmd_tbl *inv_tbl, 168*4882a593Smuzhiyun unsigned int nents); 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun int beiscsi_get_initiator_name(struct beiscsi_hba *phba, char *name, bool cfg); 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun int beiscsi_if_en_dhcp(struct beiscsi_hba *phba, u32 ip_type); 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun int beiscsi_if_en_static(struct beiscsi_hba *phba, u32 ip_type, 175*4882a593Smuzhiyun u8 *ip, u8 *subnet); 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun int beiscsi_if_set_gw(struct beiscsi_hba *phba, u32 ip_type, u8 *gw); 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun int beiscsi_if_get_gw(struct beiscsi_hba *phba, u32 ip_type, 180*4882a593Smuzhiyun struct be_cmd_get_def_gateway_resp *resp); 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun int mgmt_get_nic_conf(struct beiscsi_hba *phba, 183*4882a593Smuzhiyun struct be_cmd_get_nic_conf_resp *mac); 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun int beiscsi_if_get_info(struct beiscsi_hba *phba, int ip_type, 186*4882a593Smuzhiyun struct be_cmd_get_if_info_resp **if_info); 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun unsigned int beiscsi_if_get_handle(struct beiscsi_hba *phba); 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun int beiscsi_if_set_vlan(struct beiscsi_hba *phba, uint16_t vlan_tag); 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun unsigned int beiscsi_boot_logout_sess(struct beiscsi_hba *phba); 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun unsigned int beiscsi_boot_reopen_sess(struct beiscsi_hba *phba); 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun unsigned int beiscsi_boot_get_sinfo(struct beiscsi_hba *phba); 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun unsigned int __beiscsi_boot_get_shandle(struct beiscsi_hba *phba, int async); 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun int beiscsi_boot_get_shandle(struct beiscsi_hba *phba, unsigned int *s_handle); 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun ssize_t beiscsi_drvr_ver_disp(struct device *dev, 203*4882a593Smuzhiyun struct device_attribute *attr, char *buf); 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun ssize_t beiscsi_fw_ver_disp(struct device *dev, 206*4882a593Smuzhiyun struct device_attribute *attr, char *buf); 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun ssize_t beiscsi_active_session_disp(struct device *dev, 209*4882a593Smuzhiyun struct device_attribute *attr, char *buf); 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun ssize_t beiscsi_adap_family_disp(struct device *dev, 212*4882a593Smuzhiyun struct device_attribute *attr, char *buf); 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun ssize_t beiscsi_free_session_disp(struct device *dev, 216*4882a593Smuzhiyun struct device_attribute *attr, char *buf); 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun ssize_t beiscsi_phys_port_disp(struct device *dev, 219*4882a593Smuzhiyun struct device_attribute *attr, char *buf); 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun void beiscsi_offload_cxn_v0(struct beiscsi_offload_params *params, 222*4882a593Smuzhiyun struct wrb_handle *pwrb_handle, 223*4882a593Smuzhiyun struct be_mem_descriptor *mem_descr, 224*4882a593Smuzhiyun struct hwi_wrb_context *pwrb_context); 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun void beiscsi_offload_cxn_v2(struct beiscsi_offload_params *params, 227*4882a593Smuzhiyun struct wrb_handle *pwrb_handle, 228*4882a593Smuzhiyun struct hwi_wrb_context *pwrb_context); 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun unsigned int beiscsi_invalidate_cxn(struct beiscsi_hba *phba, 231*4882a593Smuzhiyun struct beiscsi_endpoint *beiscsi_ep); 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun unsigned int beiscsi_upload_cxn(struct beiscsi_hba *phba, 234*4882a593Smuzhiyun struct beiscsi_endpoint *beiscsi_ep); 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun int be_cmd_modify_eq_delay(struct beiscsi_hba *phba, 237*4882a593Smuzhiyun struct be_set_eqd *, int num); 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun int beiscsi_logout_fw_sess(struct beiscsi_hba *phba, 240*4882a593Smuzhiyun uint32_t fw_sess_handle); 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun #endif 243