17ebb336eSQuinn Tran /* SPDX-License-Identifier: GPL-2.0-only */ 27ebb336eSQuinn Tran /* 37ebb336eSQuinn Tran * Marvell Fibre Channel HBA Driver 47ebb336eSQuinn Tran * Copyright (C) 2018- Marvell 57ebb336eSQuinn Tran * 67ebb336eSQuinn Tran */ 77ebb336eSQuinn Tran #ifndef __QLA_EDIF_BSG_H 87ebb336eSQuinn Tran #define __QLA_EDIF_BSG_H 97ebb336eSQuinn Tran 107a7b0b48SQuinn Tran #define EDIF_VERSION1 1 117a7b0b48SQuinn Tran 127ebb336eSQuinn Tran /* BSG Vendor specific commands */ 130f6d600aSQuinn Tran #define ELS_MAX_PAYLOAD 2112 147ebb336eSQuinn Tran #ifndef WWN_SIZE 157ebb336eSQuinn Tran #define WWN_SIZE 8 167ebb336eSQuinn Tran #endif 177a7b0b48SQuinn Tran #define VND_CMD_APP_RESERVED_SIZE 28 187a7b0b48SQuinn Tran #define VND_CMD_PAD_SIZE 3 197ebb336eSQuinn Tran enum auth_els_sub_cmd { 207ebb336eSQuinn Tran SEND_ELS = 0, 217ebb336eSQuinn Tran SEND_ELS_REPLY, 227ebb336eSQuinn Tran PULL_ELS, 237ebb336eSQuinn Tran }; 247ebb336eSQuinn Tran 257ebb336eSQuinn Tran struct extra_auth_els { 267ebb336eSQuinn Tran enum auth_els_sub_cmd sub_cmd; 277ebb336eSQuinn Tran uint32_t extra_rx_xchg_address; 287ebb336eSQuinn Tran uint8_t extra_control_flags; 297ebb336eSQuinn Tran #define BSG_CTL_FLAG_INIT 0 307ebb336eSQuinn Tran #define BSG_CTL_FLAG_LS_ACC 1 317ebb336eSQuinn Tran #define BSG_CTL_FLAG_LS_RJT 2 327ebb336eSQuinn Tran #define BSG_CTL_FLAG_TRM 3 337a7b0b48SQuinn Tran uint8_t version; 347a7b0b48SQuinn Tran uint8_t pad[2]; 357a7b0b48SQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 367ebb336eSQuinn Tran } __packed; 377ebb336eSQuinn Tran 387ebb336eSQuinn Tran struct qla_bsg_auth_els_request { 397ebb336eSQuinn Tran struct fc_bsg_request r; 407ebb336eSQuinn Tran struct extra_auth_els e; 417ebb336eSQuinn Tran }; 427ebb336eSQuinn Tran 437ebb336eSQuinn Tran struct qla_bsg_auth_els_reply { 447ebb336eSQuinn Tran struct fc_bsg_reply r; 457ebb336eSQuinn Tran uint32_t rx_xchg_address; 467a7b0b48SQuinn Tran uint8_t version; 477a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 487a7b0b48SQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 497ebb336eSQuinn Tran }; 507ebb336eSQuinn Tran 517ebb336eSQuinn Tran struct app_id { 527ebb336eSQuinn Tran int app_vid; 537a7b0b48SQuinn Tran uint8_t version; 547a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 557a7b0b48SQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 567ebb336eSQuinn Tran } __packed; 577ebb336eSQuinn Tran 587ebb336eSQuinn Tran struct app_start_reply { 597ebb336eSQuinn Tran uint32_t host_support_edif; 607ebb336eSQuinn Tran uint32_t edif_enode_active; 617ebb336eSQuinn Tran uint32_t edif_edb_active; 627a7b0b48SQuinn Tran uint8_t version; 637a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 647a7b0b48SQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 657ebb336eSQuinn Tran } __packed; 667ebb336eSQuinn Tran 677ebb336eSQuinn Tran struct app_start { 687ebb336eSQuinn Tran struct app_id app_info; 697ebb336eSQuinn Tran uint8_t app_start_flags; 707a7b0b48SQuinn Tran uint8_t version; 717a7b0b48SQuinn Tran uint8_t pad[2]; 727a7b0b48SQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 737ebb336eSQuinn Tran } __packed; 747ebb336eSQuinn Tran 757ebb336eSQuinn Tran struct app_stop { 767ebb336eSQuinn Tran struct app_id app_info; 777a7b0b48SQuinn Tran uint8_t version; 787a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 797a7b0b48SQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 807ebb336eSQuinn Tran } __packed; 817ebb336eSQuinn Tran 827ebb336eSQuinn Tran struct app_plogi_reply { 837ebb336eSQuinn Tran uint32_t prli_status; 847a7b0b48SQuinn Tran uint8_t version; 857a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 867ebb336eSQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 877ebb336eSQuinn Tran } __packed; 887ebb336eSQuinn Tran 897ebb336eSQuinn Tran struct app_pinfo_req { 907ebb336eSQuinn Tran struct app_id app_info; 917ebb336eSQuinn Tran uint8_t num_ports; 92*2f5fab1bSQuinn Tran struct { 93*2f5fab1bSQuinn Tran #ifdef __BIG_ENDIAN 94*2f5fab1bSQuinn Tran uint8_t domain; 95*2f5fab1bSQuinn Tran uint8_t area; 96*2f5fab1bSQuinn Tran uint8_t al_pa; 97*2f5fab1bSQuinn Tran #elif defined(__LITTLE_ENDIAN) 98*2f5fab1bSQuinn Tran uint8_t al_pa; 99*2f5fab1bSQuinn Tran uint8_t area; 100*2f5fab1bSQuinn Tran uint8_t domain; 101*2f5fab1bSQuinn Tran #else 102*2f5fab1bSQuinn Tran #error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined!" 103*2f5fab1bSQuinn Tran #endif 104*2f5fab1bSQuinn Tran uint8_t rsvd_1; 105*2f5fab1bSQuinn Tran } remote_pid; 1067a7b0b48SQuinn Tran uint8_t version; 1077a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 1087ebb336eSQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 1097ebb336eSQuinn Tran } __packed; 1107ebb336eSQuinn Tran 1117ebb336eSQuinn Tran struct app_pinfo { 1127ebb336eSQuinn Tran port_id_t remote_pid; 1137ebb336eSQuinn Tran uint8_t remote_wwpn[WWN_SIZE]; 1147ebb336eSQuinn Tran uint8_t remote_type; 1157ebb336eSQuinn Tran #define VND_CMD_RTYPE_UNKNOWN 0 1167ebb336eSQuinn Tran #define VND_CMD_RTYPE_TARGET 1 1177ebb336eSQuinn Tran #define VND_CMD_RTYPE_INITIATOR 2 1187ebb336eSQuinn Tran uint8_t remote_state; 1197ebb336eSQuinn Tran uint8_t auth_state; 1207a7b0b48SQuinn Tran uint8_t version; 1217a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 1227ebb336eSQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 1237ebb336eSQuinn Tran } __packed; 1247ebb336eSQuinn Tran 1257ebb336eSQuinn Tran /* AUTH States */ 1267ebb336eSQuinn Tran #define VND_CMD_AUTH_STATE_UNDEF 0 1277ebb336eSQuinn Tran #define VND_CMD_AUTH_STATE_SESSION_SHUTDOWN 1 1287ebb336eSQuinn Tran #define VND_CMD_AUTH_STATE_NEEDED 2 1297ebb336eSQuinn Tran #define VND_CMD_AUTH_STATE_ELS_RCVD 3 1307ebb336eSQuinn Tran #define VND_CMD_AUTH_STATE_SAUPDATE_COMPL 4 1317ebb336eSQuinn Tran 1327ebb336eSQuinn Tran struct app_pinfo_reply { 1337ebb336eSQuinn Tran uint8_t port_count; 1347a7b0b48SQuinn Tran uint8_t version; 1357a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 1367ebb336eSQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 1375224f790SGustavo A. R. Silva struct app_pinfo ports[]; 1387ebb336eSQuinn Tran } __packed; 1397ebb336eSQuinn Tran 1407ebb336eSQuinn Tran struct app_sinfo_req { 1417ebb336eSQuinn Tran struct app_id app_info; 1427ebb336eSQuinn Tran uint8_t num_ports; 1437a7b0b48SQuinn Tran uint8_t version; 1447a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 1457ebb336eSQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 1467ebb336eSQuinn Tran } __packed; 1477ebb336eSQuinn Tran 1487ebb336eSQuinn Tran struct app_sinfo { 1497ebb336eSQuinn Tran uint8_t remote_wwpn[WWN_SIZE]; 1507ebb336eSQuinn Tran int64_t rekey_count; 1517ebb336eSQuinn Tran uint8_t rekey_mode; 1527ebb336eSQuinn Tran int64_t tx_bytes; 1537ebb336eSQuinn Tran int64_t rx_bytes; 1547ebb336eSQuinn Tran } __packed; 1557ebb336eSQuinn Tran 1567ebb336eSQuinn Tran struct app_stats_reply { 1577ebb336eSQuinn Tran uint8_t elem_count; 1587a7b0b48SQuinn Tran uint8_t version; 1597a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 1607a7b0b48SQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 1615224f790SGustavo A. R. Silva struct app_sinfo elem[]; 1627ebb336eSQuinn Tran } __packed; 1637ebb336eSQuinn Tran 1647ebb336eSQuinn Tran struct qla_sa_update_frame { 1657ebb336eSQuinn Tran struct app_id app_info; 1667ebb336eSQuinn Tran uint16_t flags; 1677ebb336eSQuinn Tran #define SAU_FLG_INV 0x01 /* delete key */ 1687ebb336eSQuinn Tran #define SAU_FLG_TX 0x02 /* 1=tx, 0 = rx */ 1697ebb336eSQuinn Tran #define SAU_FLG_FORCE_DELETE 0x08 1707ebb336eSQuinn Tran #define SAU_FLG_GMAC_MODE 0x20 /* 1717ebb336eSQuinn Tran * GMAC mode is cleartext for the IO 1727ebb336eSQuinn Tran * (i.e. NULL encryption) 1737ebb336eSQuinn Tran */ 1747ebb336eSQuinn Tran #define SAU_FLG_KEY128 0x40 1757ebb336eSQuinn Tran #define SAU_FLG_KEY256 0x80 1767ebb336eSQuinn Tran uint16_t fast_sa_index:10, 1777ebb336eSQuinn Tran reserved:6; 1787ebb336eSQuinn Tran uint32_t salt; 1797ebb336eSQuinn Tran uint32_t spi; 1807ebb336eSQuinn Tran uint8_t sa_key[32]; 1817ebb336eSQuinn Tran uint8_t node_name[WWN_SIZE]; 1827ebb336eSQuinn Tran uint8_t port_name[WWN_SIZE]; 1837ebb336eSQuinn Tran port_id_t port_id; 1847a7b0b48SQuinn Tran uint8_t version; 1857a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 1867a7b0b48SQuinn Tran uint8_t reserved2[VND_CMD_APP_RESERVED_SIZE]; 1877ebb336eSQuinn Tran } __packed; 1887ebb336eSQuinn Tran 1897ebb336eSQuinn Tran #define QL_VND_SC_UNDEF 0 1907ebb336eSQuinn Tran #define QL_VND_SC_SA_UPDATE 1 1917ebb336eSQuinn Tran #define QL_VND_SC_APP_START 2 1927ebb336eSQuinn Tran #define QL_VND_SC_APP_STOP 3 1937ebb336eSQuinn Tran #define QL_VND_SC_AUTH_OK 4 1947ebb336eSQuinn Tran #define QL_VND_SC_AUTH_FAIL 5 1957ebb336eSQuinn Tran #define QL_VND_SC_REKEY_CONFIG 6 1967ebb336eSQuinn Tran #define QL_VND_SC_GET_FCINFO 7 1977ebb336eSQuinn Tran #define QL_VND_SC_GET_STATS 8 1987a7b0b48SQuinn Tran #define QL_VND_SC_AEN_COMPLETE 9 1995ecd241bSQuinn Tran #define QL_VND_SC_READ_DBELL 10 2005ecd241bSQuinn Tran 2015ecd241bSQuinn Tran /* 2025ecd241bSQuinn Tran * bsg caller to provide empty buffer for doorbell events. 2035ecd241bSQuinn Tran * 2045ecd241bSQuinn Tran * sg_io_v4.din_xferp = empty buffer for door bell events 2055ecd241bSQuinn Tran * sg_io_v4.dout_xferp = struct edif_read_dbell *buf 2065ecd241bSQuinn Tran */ 2075ecd241bSQuinn Tran struct edif_read_dbell { 2085ecd241bSQuinn Tran struct app_id app_info; 2095ecd241bSQuinn Tran uint8_t version; 2105ecd241bSQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 2115ecd241bSQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 2125ecd241bSQuinn Tran }; 2137a7b0b48SQuinn Tran 2147ebb336eSQuinn Tran 2157ebb336eSQuinn Tran /* Application interface data structure for rtn data */ 2167ebb336eSQuinn Tran #define EXT_DEF_EVENT_DATA_SIZE 64 2177ebb336eSQuinn Tran struct edif_app_dbell { 2187ebb336eSQuinn Tran uint32_t event_code; 2197ebb336eSQuinn Tran uint32_t event_data_size; 2207ebb336eSQuinn Tran union { 2217ebb336eSQuinn Tran port_id_t port_id; 2227ebb336eSQuinn Tran uint8_t event_data[EXT_DEF_EVENT_DATA_SIZE]; 2237ebb336eSQuinn Tran }; 2247ebb336eSQuinn Tran } __packed; 2257ebb336eSQuinn Tran 2267ebb336eSQuinn Tran struct edif_sa_update_aen { 2277ebb336eSQuinn Tran port_id_t port_id; 2287ebb336eSQuinn Tran uint32_t key_type; /* Tx (1) or RX (2) */ 2297ebb336eSQuinn Tran uint32_t status; /* 0 succes, 1 failed, 2 timeout , 3 error */ 2307a7b0b48SQuinn Tran uint8_t version; 2317a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 2327a7b0b48SQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 2337ebb336eSQuinn Tran } __packed; 2347ebb336eSQuinn Tran 2357ebb336eSQuinn Tran #define QL_VND_SA_STAT_SUCCESS 0 2367ebb336eSQuinn Tran #define QL_VND_SA_STAT_FAILED 1 2377ebb336eSQuinn Tran #define QL_VND_SA_STAT_TIMEOUT 2 2387ebb336eSQuinn Tran #define QL_VND_SA_STAT_ERROR 3 2397ebb336eSQuinn Tran 2407ebb336eSQuinn Tran #define QL_VND_RX_SA_KEY 1 2417ebb336eSQuinn Tran #define QL_VND_TX_SA_KEY 2 2427ebb336eSQuinn Tran 2437ebb336eSQuinn Tran /* App defines for plogi auth'd ok and plogi auth bad requests */ 2447ebb336eSQuinn Tran struct auth_complete_cmd { 2457ebb336eSQuinn Tran struct app_id app_info; 2467ebb336eSQuinn Tran #define PL_TYPE_WWPN 1 2477ebb336eSQuinn Tran #define PL_TYPE_DID 2 2487ebb336eSQuinn Tran uint32_t type; 2497ebb336eSQuinn Tran union { 2507ebb336eSQuinn Tran uint8_t wwpn[WWN_SIZE]; 2517ebb336eSQuinn Tran port_id_t d_id; 2527ebb336eSQuinn Tran } u; 2537a7b0b48SQuinn Tran uint8_t version; 2547a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 2557a7b0b48SQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 2567a7b0b48SQuinn Tran } __packed; 2577a7b0b48SQuinn Tran 2587a7b0b48SQuinn Tran struct aen_complete_cmd { 2597a7b0b48SQuinn Tran struct app_id app_info; 2607a7b0b48SQuinn Tran port_id_t port_id; 2617a7b0b48SQuinn Tran uint32_t event_code; 2627a7b0b48SQuinn Tran uint8_t version; 2637a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 2647a7b0b48SQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 2657ebb336eSQuinn Tran } __packed; 2667ebb336eSQuinn Tran 2677ebb336eSQuinn Tran #define RX_DELAY_DELETE_TIMEOUT 20 2687ebb336eSQuinn Tran 269cf79716eSQuinn Tran #define FCH_EVT_VENDOR_UNIQUE_VPORT_DOWN 1 270cf79716eSQuinn Tran 2717ebb336eSQuinn Tran #endif /* QLA_EDIF_BSG_H */ 272