1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Marvell Fibre Channel HBA Driver 4 * Copyright (C) 2018- Marvell 5 * 6 */ 7 #ifndef __QLA_EDIF_BSG_H 8 #define __QLA_EDIF_BSG_H 9 10 #define EDIF_VERSION1 1 11 12 /* BSG Vendor specific commands */ 13 #define ELS_MAX_PAYLOAD 2112 14 #ifndef WWN_SIZE 15 #define WWN_SIZE 8 16 #endif 17 #define VND_CMD_APP_RESERVED_SIZE 28 18 #define VND_CMD_PAD_SIZE 3 19 enum auth_els_sub_cmd { 20 SEND_ELS = 0, 21 SEND_ELS_REPLY, 22 PULL_ELS, 23 }; 24 25 struct extra_auth_els { 26 enum auth_els_sub_cmd sub_cmd; 27 uint32_t extra_rx_xchg_address; 28 uint8_t extra_control_flags; 29 #define BSG_CTL_FLAG_INIT 0 30 #define BSG_CTL_FLAG_LS_ACC 1 31 #define BSG_CTL_FLAG_LS_RJT 2 32 #define BSG_CTL_FLAG_TRM 3 33 uint8_t version; 34 uint8_t pad[2]; 35 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 36 } __packed; 37 38 struct qla_bsg_auth_els_request { 39 struct fc_bsg_request r; 40 struct extra_auth_els e; 41 }; 42 43 struct qla_bsg_auth_els_reply { 44 struct fc_bsg_reply r; 45 uint32_t rx_xchg_address; 46 uint8_t version; 47 uint8_t pad[VND_CMD_PAD_SIZE]; 48 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 49 }; 50 51 struct app_id { 52 int app_vid; 53 uint8_t version; 54 uint8_t pad[VND_CMD_PAD_SIZE]; 55 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 56 } __packed; 57 58 struct app_start_reply { 59 uint32_t host_support_edif; 60 uint32_t edif_enode_active; 61 uint32_t edif_edb_active; 62 uint8_t version; 63 uint8_t pad[VND_CMD_PAD_SIZE]; 64 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 65 } __packed; 66 67 struct app_start { 68 struct app_id app_info; 69 uint8_t app_start_flags; 70 uint8_t version; 71 uint8_t pad[2]; 72 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 73 } __packed; 74 75 struct app_stop { 76 struct app_id app_info; 77 uint8_t version; 78 uint8_t pad[VND_CMD_PAD_SIZE]; 79 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 80 } __packed; 81 82 struct app_plogi_reply { 83 uint32_t prli_status; 84 uint8_t version; 85 uint8_t pad[VND_CMD_PAD_SIZE]; 86 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 87 } __packed; 88 89 struct app_pinfo_req { 90 struct app_id app_info; 91 uint8_t num_ports; 92 struct { 93 #ifdef __BIG_ENDIAN 94 uint8_t domain; 95 uint8_t area; 96 uint8_t al_pa; 97 #elif defined(__LITTLE_ENDIAN) 98 uint8_t al_pa; 99 uint8_t area; 100 uint8_t domain; 101 #else 102 #error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined!" 103 #endif 104 uint8_t rsvd_1; 105 } remote_pid; 106 uint8_t version; 107 uint8_t pad[VND_CMD_PAD_SIZE]; 108 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 109 } __packed; 110 111 struct app_pinfo { 112 port_id_t remote_pid; 113 uint8_t remote_wwpn[WWN_SIZE]; 114 uint8_t remote_type; 115 #define VND_CMD_RTYPE_UNKNOWN 0 116 #define VND_CMD_RTYPE_TARGET 1 117 #define VND_CMD_RTYPE_INITIATOR 2 118 uint8_t remote_state; 119 uint8_t auth_state; 120 uint8_t version; 121 uint8_t pad[VND_CMD_PAD_SIZE]; 122 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 123 } __packed; 124 125 /* AUTH States */ 126 #define VND_CMD_AUTH_STATE_UNDEF 0 127 #define VND_CMD_AUTH_STATE_SESSION_SHUTDOWN 1 128 #define VND_CMD_AUTH_STATE_NEEDED 2 129 #define VND_CMD_AUTH_STATE_ELS_RCVD 3 130 #define VND_CMD_AUTH_STATE_SAUPDATE_COMPL 4 131 132 struct app_pinfo_reply { 133 uint8_t port_count; 134 uint8_t version; 135 uint8_t pad[VND_CMD_PAD_SIZE]; 136 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 137 struct app_pinfo ports[]; 138 } __packed; 139 140 struct app_sinfo_req { 141 struct app_id app_info; 142 uint8_t num_ports; 143 uint8_t version; 144 uint8_t pad[VND_CMD_PAD_SIZE]; 145 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 146 } __packed; 147 148 struct app_sinfo { 149 uint8_t remote_wwpn[WWN_SIZE]; 150 int64_t rekey_count; 151 uint8_t rekey_mode; 152 int64_t tx_bytes; 153 int64_t rx_bytes; 154 } __packed; 155 156 struct app_stats_reply { 157 uint8_t elem_count; 158 uint8_t version; 159 uint8_t pad[VND_CMD_PAD_SIZE]; 160 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 161 struct app_sinfo elem[]; 162 } __packed; 163 164 struct qla_sa_update_frame { 165 struct app_id app_info; 166 uint16_t flags; 167 #define SAU_FLG_INV 0x01 /* delete key */ 168 #define SAU_FLG_TX 0x02 /* 1=tx, 0 = rx */ 169 #define SAU_FLG_FORCE_DELETE 0x08 170 #define SAU_FLG_GMAC_MODE 0x20 /* 171 * GMAC mode is cleartext for the IO 172 * (i.e. NULL encryption) 173 */ 174 #define SAU_FLG_KEY128 0x40 175 #define SAU_FLG_KEY256 0x80 176 uint16_t fast_sa_index:10, 177 reserved:6; 178 uint32_t salt; 179 uint32_t spi; 180 uint8_t sa_key[32]; 181 uint8_t node_name[WWN_SIZE]; 182 uint8_t port_name[WWN_SIZE]; 183 port_id_t port_id; 184 uint8_t version; 185 uint8_t pad[VND_CMD_PAD_SIZE]; 186 uint8_t reserved2[VND_CMD_APP_RESERVED_SIZE]; 187 } __packed; 188 189 #define QL_VND_SC_UNDEF 0 190 #define QL_VND_SC_SA_UPDATE 1 191 #define QL_VND_SC_APP_START 2 192 #define QL_VND_SC_APP_STOP 3 193 #define QL_VND_SC_AUTH_OK 4 194 #define QL_VND_SC_AUTH_FAIL 5 195 #define QL_VND_SC_REKEY_CONFIG 6 196 #define QL_VND_SC_GET_FCINFO 7 197 #define QL_VND_SC_GET_STATS 8 198 #define QL_VND_SC_AEN_COMPLETE 9 199 #define QL_VND_SC_READ_DBELL 10 200 201 /* 202 * bsg caller to provide empty buffer for doorbell events. 203 * 204 * sg_io_v4.din_xferp = empty buffer for door bell events 205 * sg_io_v4.dout_xferp = struct edif_read_dbell *buf 206 */ 207 struct edif_read_dbell { 208 struct app_id app_info; 209 uint8_t version; 210 uint8_t pad[VND_CMD_PAD_SIZE]; 211 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 212 }; 213 214 215 /* Application interface data structure for rtn data */ 216 #define EXT_DEF_EVENT_DATA_SIZE 64 217 struct edif_app_dbell { 218 uint32_t event_code; 219 uint32_t event_data_size; 220 union { 221 port_id_t port_id; 222 uint8_t event_data[EXT_DEF_EVENT_DATA_SIZE]; 223 }; 224 } __packed; 225 226 struct edif_sa_update_aen { 227 port_id_t port_id; 228 uint32_t key_type; /* Tx (1) or RX (2) */ 229 uint32_t status; /* 0 succes, 1 failed, 2 timeout , 3 error */ 230 uint8_t version; 231 uint8_t pad[VND_CMD_PAD_SIZE]; 232 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 233 } __packed; 234 235 #define QL_VND_SA_STAT_SUCCESS 0 236 #define QL_VND_SA_STAT_FAILED 1 237 #define QL_VND_SA_STAT_TIMEOUT 2 238 #define QL_VND_SA_STAT_ERROR 3 239 240 #define QL_VND_RX_SA_KEY 1 241 #define QL_VND_TX_SA_KEY 2 242 243 /* App defines for plogi auth'd ok and plogi auth bad requests */ 244 struct auth_complete_cmd { 245 struct app_id app_info; 246 #define PL_TYPE_WWPN 1 247 #define PL_TYPE_DID 2 248 uint32_t type; 249 union { 250 uint8_t wwpn[WWN_SIZE]; 251 port_id_t d_id; 252 } u; 253 uint8_t version; 254 uint8_t pad[VND_CMD_PAD_SIZE]; 255 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 256 } __packed; 257 258 struct aen_complete_cmd { 259 struct app_id app_info; 260 port_id_t port_id; 261 uint32_t event_code; 262 uint8_t version; 263 uint8_t pad[VND_CMD_PAD_SIZE]; 264 uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 265 } __packed; 266 267 #define RX_DELAY_DELETE_TIMEOUT 20 268 269 #define FCH_EVT_VENDOR_UNIQUE_VPORT_DOWN 1 270 271 #endif /* QLA_EDIF_BSG_H */ 272