16e9ef509SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2942b7654SJitendra Bhivare /* 30172dc65SJitendra Bhivare * Copyright 2017 Broadcom. All Rights Reserved. 4942b7654SJitendra Bhivare * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries. 56733b39aSJayamohan Kallickal * 66733b39aSJayamohan Kallickal * Contact Information: 760f36e04SJitendra Bhivare * linux-drivers@broadcom.com 86733b39aSJayamohan Kallickal */ 96733b39aSJayamohan Kallickal 106733b39aSJayamohan Kallickal #ifndef _BEISCSI_MGMT_ 116733b39aSJayamohan Kallickal #define _BEISCSI_MGMT_ 126733b39aSJayamohan Kallickal 13ffce3e2eSJayamohan Kallickal #include <scsi/scsi_bsg_iscsi.h> 146733b39aSJayamohan Kallickal #include "be_iscsi.h" 156733b39aSJayamohan Kallickal #include "be_main.h" 166733b39aSJayamohan Kallickal 170e43895eSMike Christie #define IP_ACTION_ADD 0x01 180e43895eSMike Christie #define IP_ACTION_DEL 0x02 190e43895eSMike Christie 200e43895eSMike Christie #define IP_V6_LEN 16 210e43895eSMike Christie #define IP_V4_LEN 4 220e43895eSMike Christie 237a158003SJohn Soni Jose /* UE Status and Mask register */ 247a158003SJohn Soni Jose #define PCICFG_UE_STATUS_LOW 0xA0 257a158003SJohn Soni Jose #define PCICFG_UE_STATUS_HIGH 0xA4 267a158003SJohn Soni Jose #define PCICFG_UE_STATUS_MASK_LOW 0xA8 277a158003SJohn Soni Jose #define PCICFG_UE_STATUS_MASK_HI 0xAC 287a158003SJohn Soni Jose 293cbb7a74SJayamohan Kallickal int mgmt_open_connection(struct beiscsi_hba *phba, 303cbb7a74SJayamohan Kallickal struct sockaddr *dst_addr, 313cbb7a74SJayamohan Kallickal struct beiscsi_endpoint *beiscsi_ep, 323cbb7a74SJayamohan Kallickal struct be_dma_mem *nonemb_cmd); 336733b39aSJayamohan Kallickal 34ffce3e2eSJayamohan Kallickal unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl, 35ffce3e2eSJayamohan Kallickal struct beiscsi_hba *phba, 36ffce3e2eSJayamohan Kallickal struct bsg_job *job, 37ffce3e2eSJayamohan Kallickal struct be_dma_mem *nonemb_cmd); 386733b39aSJayamohan Kallickal 39f3505013SJitendra Bhivare #define BE_INVLDT_CMD_TBL_SZ 128 40f3505013SJitendra Bhivare struct invldt_cmd_tbl { 41f3505013SJitendra Bhivare unsigned short icd; 42f3505013SJitendra Bhivare unsigned short cid; 43f3505013SJitendra Bhivare } __packed; 44f3505013SJitendra Bhivare 45f3505013SJitendra Bhivare struct invldt_cmds_params_in { 466733b39aSJayamohan Kallickal struct be_cmd_req_hdr hdr; 476733b39aSJayamohan Kallickal unsigned int ref_handle; 486733b39aSJayamohan Kallickal unsigned int icd_count; 49f3505013SJitendra Bhivare struct invldt_cmd_tbl table[BE_INVLDT_CMD_TBL_SZ]; 506733b39aSJayamohan Kallickal unsigned short cleanup_type; 516733b39aSJayamohan Kallickal unsigned short unused; 526733b39aSJayamohan Kallickal } __packed; 536733b39aSJayamohan Kallickal 54f3505013SJitendra Bhivare struct invldt_cmds_params_out { 55f3505013SJitendra Bhivare struct be_cmd_resp_hdr hdr; 566733b39aSJayamohan Kallickal unsigned int ref_handle; 576733b39aSJayamohan Kallickal unsigned int icd_count; 58f3505013SJitendra Bhivare unsigned int icd_status[BE_INVLDT_CMD_TBL_SZ]; 596733b39aSJayamohan Kallickal } __packed; 606733b39aSJayamohan Kallickal 61f3505013SJitendra Bhivare union be_invldt_cmds_params { 62f3505013SJitendra Bhivare struct invldt_cmds_params_in request; 63f3505013SJitendra Bhivare struct invldt_cmds_params_out response; 646733b39aSJayamohan Kallickal } __packed; 656733b39aSJayamohan Kallickal 666733b39aSJayamohan Kallickal struct mgmt_hba_attributes { 6722661e25SJayamohan Kallickal u8 flashrom_version_string[BEISCSI_VER_STRLEN]; 6822661e25SJayamohan Kallickal u8 manufacturer_name[BEISCSI_VER_STRLEN]; 696733b39aSJayamohan Kallickal u32 supported_modes; 706733b39aSJayamohan Kallickal u8 seeprom_version_lo; 716733b39aSJayamohan Kallickal u8 seeprom_version_hi; 726733b39aSJayamohan Kallickal u8 rsvd0[2]; 736733b39aSJayamohan Kallickal u32 fw_cmd_data_struct_version; 746733b39aSJayamohan Kallickal u32 ep_fw_data_struct_version; 7522661e25SJayamohan Kallickal u8 ncsi_version_string[12]; 766733b39aSJayamohan Kallickal u32 default_extended_timeout; 7722661e25SJayamohan Kallickal u8 controller_model_number[BEISCSI_VER_STRLEN]; 786733b39aSJayamohan Kallickal u8 controller_description[64]; 7922661e25SJayamohan Kallickal u8 controller_serial_number[BEISCSI_VER_STRLEN]; 8022661e25SJayamohan Kallickal u8 ip_version_string[BEISCSI_VER_STRLEN]; 8122661e25SJayamohan Kallickal u8 firmware_version_string[BEISCSI_VER_STRLEN]; 8222661e25SJayamohan Kallickal u8 bios_version_string[BEISCSI_VER_STRLEN]; 8322661e25SJayamohan Kallickal u8 redboot_version_string[BEISCSI_VER_STRLEN]; 8422661e25SJayamohan Kallickal u8 driver_version_string[BEISCSI_VER_STRLEN]; 8522661e25SJayamohan Kallickal u8 fw_on_flash_version_string[BEISCSI_VER_STRLEN]; 866733b39aSJayamohan Kallickal u32 functionalities_supported; 876733b39aSJayamohan Kallickal u16 max_cdblength; 886733b39aSJayamohan Kallickal u8 asic_revision; 896733b39aSJayamohan Kallickal u8 generational_guid[16]; 906733b39aSJayamohan Kallickal u8 hba_port_count; 916733b39aSJayamohan Kallickal u16 default_link_down_timeout; 926733b39aSJayamohan Kallickal u8 iscsi_ver_min_max; 936733b39aSJayamohan Kallickal u8 multifunction_device; 946733b39aSJayamohan Kallickal u8 cache_valid; 956733b39aSJayamohan Kallickal u8 hba_status; 966733b39aSJayamohan Kallickal u8 max_domains_supported; 976733b39aSJayamohan Kallickal u8 phy_port; 986733b39aSJayamohan Kallickal u32 firmware_post_status; 996733b39aSJayamohan Kallickal u32 hba_mtu[8]; 100bfead3b2SJayamohan Kallickal u8 iscsi_features; 10122661e25SJayamohan Kallickal u8 asic_generation; 10222661e25SJayamohan Kallickal u8 future_u8[2]; 103bfead3b2SJayamohan Kallickal u32 future_u32[3]; 1046733b39aSJayamohan Kallickal } __packed; 1056733b39aSJayamohan Kallickal 1066733b39aSJayamohan Kallickal struct mgmt_controller_attributes { 1076733b39aSJayamohan Kallickal struct mgmt_hba_attributes hba_attribs; 1086733b39aSJayamohan Kallickal u16 pci_vendor_id; 1096733b39aSJayamohan Kallickal u16 pci_device_id; 1106733b39aSJayamohan Kallickal u16 pci_sub_vendor_id; 1116733b39aSJayamohan Kallickal u16 pci_sub_system_id; 1126733b39aSJayamohan Kallickal u8 pci_bus_number; 1136733b39aSJayamohan Kallickal u8 pci_device_number; 1146733b39aSJayamohan Kallickal u8 pci_function_number; 1156733b39aSJayamohan Kallickal u8 interface_type; 1166733b39aSJayamohan Kallickal u64 unique_identifier; 1176733b39aSJayamohan Kallickal u8 netfilters; 1186733b39aSJayamohan Kallickal u8 rsvd0[3]; 11922661e25SJayamohan Kallickal u32 future_u32[4]; 1206733b39aSJayamohan Kallickal } __packed; 1216733b39aSJayamohan Kallickal 1226733b39aSJayamohan Kallickal struct be_mgmt_controller_attributes { 1236733b39aSJayamohan Kallickal struct be_cmd_req_hdr hdr; 1246733b39aSJayamohan Kallickal struct mgmt_controller_attributes params; 1256733b39aSJayamohan Kallickal } __packed; 1266733b39aSJayamohan Kallickal 1276733b39aSJayamohan Kallickal struct be_mgmt_controller_attributes_resp { 1286733b39aSJayamohan Kallickal struct be_cmd_resp_hdr hdr; 1296733b39aSJayamohan Kallickal struct mgmt_controller_attributes params; 1306733b39aSJayamohan Kallickal } __packed; 1316733b39aSJayamohan Kallickal 132ffce3e2eSJayamohan Kallickal struct be_bsg_vendor_cmd { 133ffce3e2eSJayamohan Kallickal struct be_cmd_req_hdr hdr; 134ffce3e2eSJayamohan Kallickal unsigned short region; 135ffce3e2eSJayamohan Kallickal unsigned short offset; 136ffce3e2eSJayamohan Kallickal unsigned short sector; 137ffce3e2eSJayamohan Kallickal } __packed; 138ffce3e2eSJayamohan Kallickal 1396733b39aSJayamohan Kallickal /* configuration management */ 1406733b39aSJayamohan Kallickal 1416733b39aSJayamohan Kallickal #define GET_MGMT_CONTROLLER_WS(phba) (phba->pmgmt_ws) 1426733b39aSJayamohan Kallickal 1436733b39aSJayamohan Kallickal #define ISCSI_GET_PDU_TEMPLATE_ADDRESS(pc, pa) {\ 1446733b39aSJayamohan Kallickal pa->lo = phba->init_mem[ISCSI_MEM_GLOBAL_HEADER].mem_array[0].\ 1456733b39aSJayamohan Kallickal bus_address.u.a32.address_lo; \ 1466733b39aSJayamohan Kallickal pa->hi = phba->init_mem[ISCSI_MEM_GLOBAL_HEADER].mem_array[0].\ 1476733b39aSJayamohan Kallickal bus_address.u.a32.address_hi; \ 1486733b39aSJayamohan Kallickal } 1496733b39aSJayamohan Kallickal 150ffce3e2eSJayamohan Kallickal #define BEISCSI_WRITE_FLASH 0 151ffce3e2eSJayamohan Kallickal #define BEISCSI_READ_FLASH 1 152ffce3e2eSJayamohan Kallickal 1536733b39aSJayamohan Kallickal struct beiscsi_endpoint { 1546733b39aSJayamohan Kallickal struct beiscsi_hba *phba; 1556733b39aSJayamohan Kallickal struct beiscsi_conn *conn; 156c2462288SJayamohan Kallickal struct iscsi_endpoint *openiscsi_ep; 1576733b39aSJayamohan Kallickal unsigned short ip_type; 1586733b39aSJayamohan Kallickal char dst6_addr[ISCSI_ADDRESS_BUF_LEN]; 1596733b39aSJayamohan Kallickal unsigned long dst_addr; 1606733b39aSJayamohan Kallickal unsigned short ep_cid; 1616733b39aSJayamohan Kallickal unsigned int fw_handle; 1626733b39aSJayamohan Kallickal u16 dst_tcpport; 1636733b39aSJayamohan Kallickal u16 cid_vld; 1646733b39aSJayamohan Kallickal }; 1656733b39aSJayamohan Kallickal 16698713216SJitendra Bhivare int beiscsi_mgmt_invalidate_icds(struct beiscsi_hba *phba, 16798713216SJitendra Bhivare struct invldt_cmd_tbl *inv_tbl, 16898713216SJitendra Bhivare unsigned int nents); 169bfead3b2SJayamohan Kallickal 1704788e732SJitendra Bhivare int beiscsi_get_initiator_name(struct beiscsi_hba *phba, char *name, bool cfg); 171c5905bf8SJitendra Bhivare 1720152a7e9SJitendra Bhivare int beiscsi_if_en_dhcp(struct beiscsi_hba *phba, u32 ip_type); 1730152a7e9SJitendra Bhivare 1740152a7e9SJitendra Bhivare int beiscsi_if_en_static(struct beiscsi_hba *phba, u32 ip_type, 1750152a7e9SJitendra Bhivare u8 *ip, u8 *subnet); 1760e43895eSMike Christie 177480195c2SJitendra Bhivare int beiscsi_if_set_gw(struct beiscsi_hba *phba, u32 ip_type, u8 *gw); 178480195c2SJitendra Bhivare 179480195c2SJitendra Bhivare int beiscsi_if_get_gw(struct beiscsi_hba *phba, u32 ip_type, 180480195c2SJitendra Bhivare struct be_cmd_get_def_gateway_resp *resp); 181480195c2SJitendra Bhivare 1820e43895eSMike Christie int mgmt_get_nic_conf(struct beiscsi_hba *phba, 1830e43895eSMike Christie struct be_cmd_get_nic_conf_resp *mac); 1840e43895eSMike Christie 18596b48b92SJitendra Bhivare int beiscsi_if_get_info(struct beiscsi_hba *phba, int ip_type, 1861f536d49SJayamohan Kallickal struct be_cmd_get_if_info_resp **if_info); 1870e43895eSMike Christie 188c5bf8889SJitendra Bhivare unsigned int beiscsi_if_get_handle(struct beiscsi_hba *phba); 1896f72238eSJohn Soni Jose 190db02aea9SJitendra Bhivare int beiscsi_if_set_vlan(struct beiscsi_hba *phba, uint16_t vlan_tag); 1915cac7596SJohn Soni Jose 19250a4b824SJitendra Bhivare unsigned int beiscsi_boot_logout_sess(struct beiscsi_hba *phba); 19350a4b824SJitendra Bhivare 19450a4b824SJitendra Bhivare unsigned int beiscsi_boot_reopen_sess(struct beiscsi_hba *phba); 19550a4b824SJitendra Bhivare 19650a4b824SJitendra Bhivare unsigned int beiscsi_boot_get_sinfo(struct beiscsi_hba *phba); 19750a4b824SJitendra Bhivare 19850a4b824SJitendra Bhivare unsigned int __beiscsi_boot_get_shandle(struct beiscsi_hba *phba, int async); 19950a4b824SJitendra Bhivare 20050a4b824SJitendra Bhivare int beiscsi_boot_get_shandle(struct beiscsi_hba *phba, unsigned int *s_handle); 20150a4b824SJitendra Bhivare 2025cac7596SJohn Soni Jose ssize_t beiscsi_drvr_ver_disp(struct device *dev, 2035cac7596SJohn Soni Jose struct device_attribute *attr, char *buf); 204acb9693cSJohn Soni Jose 20522661e25SJayamohan Kallickal ssize_t beiscsi_fw_ver_disp(struct device *dev, 20622661e25SJayamohan Kallickal struct device_attribute *attr, char *buf); 20722661e25SJayamohan Kallickal 2086103c1f7SJayamohan Kallickal ssize_t beiscsi_active_session_disp(struct device *dev, 2097ad4dfe1SJayamohan Kallickal struct device_attribute *attr, char *buf); 2107ad4dfe1SJayamohan Kallickal 21126000db7SJohn Soni Jose ssize_t beiscsi_adap_family_disp(struct device *dev, 21226000db7SJohn Soni Jose struct device_attribute *attr, char *buf); 21326000db7SJohn Soni Jose 2146103c1f7SJayamohan Kallickal 2156103c1f7SJayamohan Kallickal ssize_t beiscsi_free_session_disp(struct device *dev, 2166103c1f7SJayamohan Kallickal struct device_attribute *attr, char *buf); 2176103c1f7SJayamohan Kallickal 218d3fea9afSJayamohan Kallickal ssize_t beiscsi_phys_port_disp(struct device *dev, 219d3fea9afSJayamohan Kallickal struct device_attribute *attr, char *buf); 220d3fea9afSJayamohan Kallickal 221acb9693cSJohn Soni Jose void beiscsi_offload_cxn_v0(struct beiscsi_offload_params *params, 222acb9693cSJohn Soni Jose struct wrb_handle *pwrb_handle, 223340c99e9SJohn Soni Jose struct be_mem_descriptor *mem_descr, 224340c99e9SJohn Soni Jose struct hwi_wrb_context *pwrb_context); 225acb9693cSJohn Soni Jose 226acb9693cSJohn Soni Jose void beiscsi_offload_cxn_v2(struct beiscsi_offload_params *params, 227340c99e9SJohn Soni Jose struct wrb_handle *pwrb_handle, 228340c99e9SJohn Soni Jose struct hwi_wrb_context *pwrb_context); 229340c99e9SJohn Soni Jose 23049fc5152SJitendra Bhivare unsigned int beiscsi_invalidate_cxn(struct beiscsi_hba *phba, 23149fc5152SJitendra Bhivare struct beiscsi_endpoint *beiscsi_ep); 23249fc5152SJitendra Bhivare 23349fc5152SJitendra Bhivare unsigned int beiscsi_upload_cxn(struct beiscsi_hba *phba, 23449fc5152SJitendra Bhivare struct beiscsi_endpoint *beiscsi_ep); 23549fc5152SJitendra Bhivare 23673af08e1SJayamohan Kallickal int be_cmd_modify_eq_delay(struct beiscsi_hba *phba, 23773af08e1SJayamohan Kallickal struct be_set_eqd *, int num); 238acb9693cSJohn Soni Jose 2393f4134c1SJohn Soni Jose int beiscsi_logout_fw_sess(struct beiscsi_hba *phba, 2403f4134c1SJohn Soni Jose uint32_t fw_sess_handle); 2413f4134c1SJohn Soni Jose 2426733b39aSJayamohan Kallickal #endif 243