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 19enum auth_els_sub_cmd { 20 SEND_ELS = 0, 21 SEND_ELS_REPLY, 22 PULL_ELS, 23}; 24 25struct 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 38struct qla_bsg_auth_els_request { 39 struct fc_bsg_request r; 40 struct extra_auth_els e; 41}; 42 43struct 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 51struct 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 58struct 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 67struct 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 75struct 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 82struct 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 89struct 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 111struct 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 132struct 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 140struct 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 148struct 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 156struct 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 164struct 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 */ 207struct 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 217struct 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 226struct 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 */ 244struct 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 258struct 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