162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Marvell Fibre Channel HBA Driver 462306a36Sopenharmony_ci * Copyright (C) 2018- Marvell 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#ifndef __QLA_EDIF_BSG_H 862306a36Sopenharmony_ci#define __QLA_EDIF_BSG_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#define EDIF_VERSION1 1 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* BSG Vendor specific commands */ 1362306a36Sopenharmony_ci#define ELS_MAX_PAYLOAD 2112 1462306a36Sopenharmony_ci#ifndef WWN_SIZE 1562306a36Sopenharmony_ci#define WWN_SIZE 8 1662306a36Sopenharmony_ci#endif 1762306a36Sopenharmony_ci#define VND_CMD_APP_RESERVED_SIZE 28 1862306a36Sopenharmony_ci#define VND_CMD_PAD_SIZE 3 1962306a36Sopenharmony_cienum auth_els_sub_cmd { 2062306a36Sopenharmony_ci SEND_ELS = 0, 2162306a36Sopenharmony_ci SEND_ELS_REPLY, 2262306a36Sopenharmony_ci PULL_ELS, 2362306a36Sopenharmony_ci}; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistruct extra_auth_els { 2662306a36Sopenharmony_ci enum auth_els_sub_cmd sub_cmd; 2762306a36Sopenharmony_ci uint32_t extra_rx_xchg_address; 2862306a36Sopenharmony_ci uint8_t extra_control_flags; 2962306a36Sopenharmony_ci#define BSG_CTL_FLAG_INIT 0 3062306a36Sopenharmony_ci#define BSG_CTL_FLAG_LS_ACC 1 3162306a36Sopenharmony_ci#define BSG_CTL_FLAG_LS_RJT 2 3262306a36Sopenharmony_ci#define BSG_CTL_FLAG_TRM 3 3362306a36Sopenharmony_ci uint8_t version; 3462306a36Sopenharmony_ci uint8_t pad[2]; 3562306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 3662306a36Sopenharmony_ci} __packed; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistruct qla_bsg_auth_els_request { 3962306a36Sopenharmony_ci struct fc_bsg_request r; 4062306a36Sopenharmony_ci struct extra_auth_els e; 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct qla_bsg_auth_els_reply { 4462306a36Sopenharmony_ci struct fc_bsg_reply r; 4562306a36Sopenharmony_ci uint32_t rx_xchg_address; 4662306a36Sopenharmony_ci uint8_t version; 4762306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 4862306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistruct app_id { 5262306a36Sopenharmony_ci int app_vid; 5362306a36Sopenharmony_ci uint8_t version; 5462306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 5562306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 5662306a36Sopenharmony_ci} __packed; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct app_start_reply { 5962306a36Sopenharmony_ci uint32_t host_support_edif; 6062306a36Sopenharmony_ci uint32_t edif_enode_active; 6162306a36Sopenharmony_ci uint32_t edif_edb_active; 6262306a36Sopenharmony_ci uint8_t version; 6362306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 6462306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 6562306a36Sopenharmony_ci} __packed; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cistruct app_start { 6862306a36Sopenharmony_ci struct app_id app_info; 6962306a36Sopenharmony_ci uint8_t app_start_flags; 7062306a36Sopenharmony_ci uint8_t version; 7162306a36Sopenharmony_ci uint8_t pad[2]; 7262306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 7362306a36Sopenharmony_ci} __packed; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistruct app_stop { 7662306a36Sopenharmony_ci struct app_id app_info; 7762306a36Sopenharmony_ci uint8_t version; 7862306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 7962306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 8062306a36Sopenharmony_ci} __packed; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistruct app_plogi_reply { 8362306a36Sopenharmony_ci uint32_t prli_status; 8462306a36Sopenharmony_ci uint8_t version; 8562306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 8662306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 8762306a36Sopenharmony_ci} __packed; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_cistruct app_pinfo_req { 9062306a36Sopenharmony_ci struct app_id app_info; 9162306a36Sopenharmony_ci uint8_t num_ports; 9262306a36Sopenharmony_ci struct { 9362306a36Sopenharmony_ci#ifdef __BIG_ENDIAN 9462306a36Sopenharmony_ci uint8_t domain; 9562306a36Sopenharmony_ci uint8_t area; 9662306a36Sopenharmony_ci uint8_t al_pa; 9762306a36Sopenharmony_ci#elif defined(__LITTLE_ENDIAN) 9862306a36Sopenharmony_ci uint8_t al_pa; 9962306a36Sopenharmony_ci uint8_t area; 10062306a36Sopenharmony_ci uint8_t domain; 10162306a36Sopenharmony_ci#else 10262306a36Sopenharmony_ci#error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined!" 10362306a36Sopenharmony_ci#endif 10462306a36Sopenharmony_ci uint8_t rsvd_1; 10562306a36Sopenharmony_ci } remote_pid; 10662306a36Sopenharmony_ci uint8_t version; 10762306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 10862306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 10962306a36Sopenharmony_ci} __packed; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistruct app_pinfo { 11262306a36Sopenharmony_ci port_id_t remote_pid; 11362306a36Sopenharmony_ci uint8_t remote_wwpn[WWN_SIZE]; 11462306a36Sopenharmony_ci uint8_t remote_type; 11562306a36Sopenharmony_ci#define VND_CMD_RTYPE_UNKNOWN 0 11662306a36Sopenharmony_ci#define VND_CMD_RTYPE_TARGET 1 11762306a36Sopenharmony_ci#define VND_CMD_RTYPE_INITIATOR 2 11862306a36Sopenharmony_ci uint8_t remote_state; 11962306a36Sopenharmony_ci uint8_t auth_state; 12062306a36Sopenharmony_ci uint8_t version; 12162306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 12262306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 12362306a36Sopenharmony_ci} __packed; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci/* AUTH States */ 12662306a36Sopenharmony_ci#define VND_CMD_AUTH_STATE_UNDEF 0 12762306a36Sopenharmony_ci#define VND_CMD_AUTH_STATE_SESSION_SHUTDOWN 1 12862306a36Sopenharmony_ci#define VND_CMD_AUTH_STATE_NEEDED 2 12962306a36Sopenharmony_ci#define VND_CMD_AUTH_STATE_ELS_RCVD 3 13062306a36Sopenharmony_ci#define VND_CMD_AUTH_STATE_SAUPDATE_COMPL 4 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cistruct app_pinfo_reply { 13362306a36Sopenharmony_ci uint8_t port_count; 13462306a36Sopenharmony_ci uint8_t version; 13562306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 13662306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 13762306a36Sopenharmony_ci struct app_pinfo ports[]; 13862306a36Sopenharmony_ci} __packed; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_cistruct app_sinfo_req { 14162306a36Sopenharmony_ci struct app_id app_info; 14262306a36Sopenharmony_ci uint8_t num_ports; 14362306a36Sopenharmony_ci uint8_t version; 14462306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 14562306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 14662306a36Sopenharmony_ci} __packed; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cistruct app_sinfo { 14962306a36Sopenharmony_ci uint8_t remote_wwpn[WWN_SIZE]; 15062306a36Sopenharmony_ci int64_t rekey_count; 15162306a36Sopenharmony_ci uint8_t rekey_mode; 15262306a36Sopenharmony_ci int64_t tx_bytes; 15362306a36Sopenharmony_ci int64_t rx_bytes; 15462306a36Sopenharmony_ci} __packed; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cistruct app_stats_reply { 15762306a36Sopenharmony_ci uint8_t elem_count; 15862306a36Sopenharmony_ci uint8_t version; 15962306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 16062306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 16162306a36Sopenharmony_ci struct app_sinfo elem[]; 16262306a36Sopenharmony_ci} __packed; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistruct qla_sa_update_frame { 16562306a36Sopenharmony_ci struct app_id app_info; 16662306a36Sopenharmony_ci uint16_t flags; 16762306a36Sopenharmony_ci#define SAU_FLG_INV 0x01 /* delete key */ 16862306a36Sopenharmony_ci#define SAU_FLG_TX 0x02 /* 1=tx, 0 = rx */ 16962306a36Sopenharmony_ci#define SAU_FLG_FORCE_DELETE 0x08 17062306a36Sopenharmony_ci#define SAU_FLG_GMAC_MODE 0x20 /* 17162306a36Sopenharmony_ci * GMAC mode is cleartext for the IO 17262306a36Sopenharmony_ci * (i.e. NULL encryption) 17362306a36Sopenharmony_ci */ 17462306a36Sopenharmony_ci#define SAU_FLG_KEY128 0x40 17562306a36Sopenharmony_ci#define SAU_FLG_KEY256 0x80 17662306a36Sopenharmony_ci uint16_t fast_sa_index:10, 17762306a36Sopenharmony_ci reserved:6; 17862306a36Sopenharmony_ci uint32_t salt; 17962306a36Sopenharmony_ci uint32_t spi; 18062306a36Sopenharmony_ci uint8_t sa_key[32]; 18162306a36Sopenharmony_ci uint8_t node_name[WWN_SIZE]; 18262306a36Sopenharmony_ci uint8_t port_name[WWN_SIZE]; 18362306a36Sopenharmony_ci port_id_t port_id; 18462306a36Sopenharmony_ci uint8_t version; 18562306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 18662306a36Sopenharmony_ci uint8_t reserved2[VND_CMD_APP_RESERVED_SIZE]; 18762306a36Sopenharmony_ci} __packed; 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci#define QL_VND_SC_UNDEF 0 19062306a36Sopenharmony_ci#define QL_VND_SC_SA_UPDATE 1 19162306a36Sopenharmony_ci#define QL_VND_SC_APP_START 2 19262306a36Sopenharmony_ci#define QL_VND_SC_APP_STOP 3 19362306a36Sopenharmony_ci#define QL_VND_SC_AUTH_OK 4 19462306a36Sopenharmony_ci#define QL_VND_SC_AUTH_FAIL 5 19562306a36Sopenharmony_ci#define QL_VND_SC_REKEY_CONFIG 6 19662306a36Sopenharmony_ci#define QL_VND_SC_GET_FCINFO 7 19762306a36Sopenharmony_ci#define QL_VND_SC_GET_STATS 8 19862306a36Sopenharmony_ci#define QL_VND_SC_AEN_COMPLETE 9 19962306a36Sopenharmony_ci#define QL_VND_SC_READ_DBELL 10 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci/* 20262306a36Sopenharmony_ci * bsg caller to provide empty buffer for doorbell events. 20362306a36Sopenharmony_ci * 20462306a36Sopenharmony_ci * sg_io_v4.din_xferp = empty buffer for door bell events 20562306a36Sopenharmony_ci * sg_io_v4.dout_xferp = struct edif_read_dbell *buf 20662306a36Sopenharmony_ci */ 20762306a36Sopenharmony_cistruct edif_read_dbell { 20862306a36Sopenharmony_ci struct app_id app_info; 20962306a36Sopenharmony_ci uint8_t version; 21062306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 21162306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 21262306a36Sopenharmony_ci}; 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci/* Application interface data structure for rtn data */ 21662306a36Sopenharmony_ci#define EXT_DEF_EVENT_DATA_SIZE 64 21762306a36Sopenharmony_cistruct edif_app_dbell { 21862306a36Sopenharmony_ci uint32_t event_code; 21962306a36Sopenharmony_ci uint32_t event_data_size; 22062306a36Sopenharmony_ci union { 22162306a36Sopenharmony_ci port_id_t port_id; 22262306a36Sopenharmony_ci uint8_t event_data[EXT_DEF_EVENT_DATA_SIZE]; 22362306a36Sopenharmony_ci }; 22462306a36Sopenharmony_ci} __packed; 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_cistruct edif_sa_update_aen { 22762306a36Sopenharmony_ci port_id_t port_id; 22862306a36Sopenharmony_ci uint32_t key_type; /* Tx (1) or RX (2) */ 22962306a36Sopenharmony_ci uint32_t status; /* 0 succes, 1 failed, 2 timeout , 3 error */ 23062306a36Sopenharmony_ci uint8_t version; 23162306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 23262306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 23362306a36Sopenharmony_ci} __packed; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci#define QL_VND_SA_STAT_SUCCESS 0 23662306a36Sopenharmony_ci#define QL_VND_SA_STAT_FAILED 1 23762306a36Sopenharmony_ci#define QL_VND_SA_STAT_TIMEOUT 2 23862306a36Sopenharmony_ci#define QL_VND_SA_STAT_ERROR 3 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci#define QL_VND_RX_SA_KEY 1 24162306a36Sopenharmony_ci#define QL_VND_TX_SA_KEY 2 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci/* App defines for plogi auth'd ok and plogi auth bad requests */ 24462306a36Sopenharmony_cistruct auth_complete_cmd { 24562306a36Sopenharmony_ci struct app_id app_info; 24662306a36Sopenharmony_ci#define PL_TYPE_WWPN 1 24762306a36Sopenharmony_ci#define PL_TYPE_DID 2 24862306a36Sopenharmony_ci uint32_t type; 24962306a36Sopenharmony_ci union { 25062306a36Sopenharmony_ci uint8_t wwpn[WWN_SIZE]; 25162306a36Sopenharmony_ci port_id_t d_id; 25262306a36Sopenharmony_ci } u; 25362306a36Sopenharmony_ci uint8_t version; 25462306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 25562306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 25662306a36Sopenharmony_ci} __packed; 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_cistruct aen_complete_cmd { 25962306a36Sopenharmony_ci struct app_id app_info; 26062306a36Sopenharmony_ci port_id_t port_id; 26162306a36Sopenharmony_ci uint32_t event_code; 26262306a36Sopenharmony_ci uint8_t version; 26362306a36Sopenharmony_ci uint8_t pad[VND_CMD_PAD_SIZE]; 26462306a36Sopenharmony_ci uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 26562306a36Sopenharmony_ci} __packed; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci#define RX_DELAY_DELETE_TIMEOUT 20 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci#define FCH_EVT_VENDOR_UNIQUE_VPORT_DOWN 1 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci#endif /* QLA_EDIF_BSG_H */ 272