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; 927ebb336eSQuinn Tran port_id_t remote_pid; 937a7b0b48SQuinn Tran uint8_t version; 947a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 957ebb336eSQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 967ebb336eSQuinn Tran } __packed; 977ebb336eSQuinn Tran 987ebb336eSQuinn Tran struct app_pinfo { 997ebb336eSQuinn Tran port_id_t remote_pid; 1007ebb336eSQuinn Tran uint8_t remote_wwpn[WWN_SIZE]; 1017ebb336eSQuinn Tran uint8_t remote_type; 1027ebb336eSQuinn Tran #define VND_CMD_RTYPE_UNKNOWN 0 1037ebb336eSQuinn Tran #define VND_CMD_RTYPE_TARGET 1 1047ebb336eSQuinn Tran #define VND_CMD_RTYPE_INITIATOR 2 1057ebb336eSQuinn Tran uint8_t remote_state; 1067ebb336eSQuinn Tran uint8_t auth_state; 1077a7b0b48SQuinn Tran uint8_t version; 1087a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 1097ebb336eSQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 1107ebb336eSQuinn Tran } __packed; 1117ebb336eSQuinn Tran 1127ebb336eSQuinn Tran /* AUTH States */ 1137ebb336eSQuinn Tran #define VND_CMD_AUTH_STATE_UNDEF 0 1147ebb336eSQuinn Tran #define VND_CMD_AUTH_STATE_SESSION_SHUTDOWN 1 1157ebb336eSQuinn Tran #define VND_CMD_AUTH_STATE_NEEDED 2 1167ebb336eSQuinn Tran #define VND_CMD_AUTH_STATE_ELS_RCVD 3 1177ebb336eSQuinn Tran #define VND_CMD_AUTH_STATE_SAUPDATE_COMPL 4 1187ebb336eSQuinn Tran 1197ebb336eSQuinn Tran struct app_pinfo_reply { 1207ebb336eSQuinn Tran uint8_t port_count; 1217a7b0b48SQuinn Tran uint8_t version; 1227a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 1237ebb336eSQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 1245224f790SGustavo A. R. Silva struct app_pinfo ports[]; 1257ebb336eSQuinn Tran } __packed; 1267ebb336eSQuinn Tran 1277ebb336eSQuinn Tran struct app_sinfo_req { 1287ebb336eSQuinn Tran struct app_id app_info; 1297ebb336eSQuinn Tran uint8_t num_ports; 1307a7b0b48SQuinn Tran uint8_t version; 1317a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 1327ebb336eSQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 1337ebb336eSQuinn Tran } __packed; 1347ebb336eSQuinn Tran 1357ebb336eSQuinn Tran struct app_sinfo { 1367ebb336eSQuinn Tran uint8_t remote_wwpn[WWN_SIZE]; 1377ebb336eSQuinn Tran int64_t rekey_count; 1387ebb336eSQuinn Tran uint8_t rekey_mode; 1397ebb336eSQuinn Tran int64_t tx_bytes; 1407ebb336eSQuinn Tran int64_t rx_bytes; 1417ebb336eSQuinn Tran } __packed; 1427ebb336eSQuinn Tran 1437ebb336eSQuinn Tran struct app_stats_reply { 1447ebb336eSQuinn Tran uint8_t elem_count; 1457a7b0b48SQuinn Tran uint8_t version; 1467a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 1477a7b0b48SQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 1485224f790SGustavo A. R. Silva struct app_sinfo elem[]; 1497ebb336eSQuinn Tran } __packed; 1507ebb336eSQuinn Tran 1517ebb336eSQuinn Tran struct qla_sa_update_frame { 1527ebb336eSQuinn Tran struct app_id app_info; 1537ebb336eSQuinn Tran uint16_t flags; 1547ebb336eSQuinn Tran #define SAU_FLG_INV 0x01 /* delete key */ 1557ebb336eSQuinn Tran #define SAU_FLG_TX 0x02 /* 1=tx, 0 = rx */ 1567ebb336eSQuinn Tran #define SAU_FLG_FORCE_DELETE 0x08 1577ebb336eSQuinn Tran #define SAU_FLG_GMAC_MODE 0x20 /* 1587ebb336eSQuinn Tran * GMAC mode is cleartext for the IO 1597ebb336eSQuinn Tran * (i.e. NULL encryption) 1607ebb336eSQuinn Tran */ 1617ebb336eSQuinn Tran #define SAU_FLG_KEY128 0x40 1627ebb336eSQuinn Tran #define SAU_FLG_KEY256 0x80 1637ebb336eSQuinn Tran uint16_t fast_sa_index:10, 1647ebb336eSQuinn Tran reserved:6; 1657ebb336eSQuinn Tran uint32_t salt; 1667ebb336eSQuinn Tran uint32_t spi; 1677ebb336eSQuinn Tran uint8_t sa_key[32]; 1687ebb336eSQuinn Tran uint8_t node_name[WWN_SIZE]; 1697ebb336eSQuinn Tran uint8_t port_name[WWN_SIZE]; 1707ebb336eSQuinn Tran port_id_t port_id; 1717a7b0b48SQuinn Tran uint8_t version; 1727a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 1737a7b0b48SQuinn Tran uint8_t reserved2[VND_CMD_APP_RESERVED_SIZE]; 1747ebb336eSQuinn Tran } __packed; 1757ebb336eSQuinn Tran 1767ebb336eSQuinn Tran #define QL_VND_SC_UNDEF 0 1777ebb336eSQuinn Tran #define QL_VND_SC_SA_UPDATE 1 1787ebb336eSQuinn Tran #define QL_VND_SC_APP_START 2 1797ebb336eSQuinn Tran #define QL_VND_SC_APP_STOP 3 1807ebb336eSQuinn Tran #define QL_VND_SC_AUTH_OK 4 1817ebb336eSQuinn Tran #define QL_VND_SC_AUTH_FAIL 5 1827ebb336eSQuinn Tran #define QL_VND_SC_REKEY_CONFIG 6 1837ebb336eSQuinn Tran #define QL_VND_SC_GET_FCINFO 7 1847ebb336eSQuinn Tran #define QL_VND_SC_GET_STATS 8 1857a7b0b48SQuinn Tran #define QL_VND_SC_AEN_COMPLETE 9 186*5ecd241bSQuinn Tran #define QL_VND_SC_READ_DBELL 10 187*5ecd241bSQuinn Tran 188*5ecd241bSQuinn Tran /* 189*5ecd241bSQuinn Tran * bsg caller to provide empty buffer for doorbell events. 190*5ecd241bSQuinn Tran * 191*5ecd241bSQuinn Tran * sg_io_v4.din_xferp = empty buffer for door bell events 192*5ecd241bSQuinn Tran * sg_io_v4.dout_xferp = struct edif_read_dbell *buf 193*5ecd241bSQuinn Tran */ 194*5ecd241bSQuinn Tran struct edif_read_dbell { 195*5ecd241bSQuinn Tran struct app_id app_info; 196*5ecd241bSQuinn Tran uint8_t version; 197*5ecd241bSQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 198*5ecd241bSQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 199*5ecd241bSQuinn Tran }; 2007a7b0b48SQuinn Tran 2017ebb336eSQuinn Tran 2027ebb336eSQuinn Tran /* Application interface data structure for rtn data */ 2037ebb336eSQuinn Tran #define EXT_DEF_EVENT_DATA_SIZE 64 2047ebb336eSQuinn Tran struct edif_app_dbell { 2057ebb336eSQuinn Tran uint32_t event_code; 2067ebb336eSQuinn Tran uint32_t event_data_size; 2077ebb336eSQuinn Tran union { 2087ebb336eSQuinn Tran port_id_t port_id; 2097ebb336eSQuinn Tran uint8_t event_data[EXT_DEF_EVENT_DATA_SIZE]; 2107ebb336eSQuinn Tran }; 2117ebb336eSQuinn Tran } __packed; 2127ebb336eSQuinn Tran 2137ebb336eSQuinn Tran struct edif_sa_update_aen { 2147ebb336eSQuinn Tran port_id_t port_id; 2157ebb336eSQuinn Tran uint32_t key_type; /* Tx (1) or RX (2) */ 2167ebb336eSQuinn Tran uint32_t status; /* 0 succes, 1 failed, 2 timeout , 3 error */ 2177a7b0b48SQuinn Tran uint8_t version; 2187a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 2197a7b0b48SQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 2207ebb336eSQuinn Tran } __packed; 2217ebb336eSQuinn Tran 2227ebb336eSQuinn Tran #define QL_VND_SA_STAT_SUCCESS 0 2237ebb336eSQuinn Tran #define QL_VND_SA_STAT_FAILED 1 2247ebb336eSQuinn Tran #define QL_VND_SA_STAT_TIMEOUT 2 2257ebb336eSQuinn Tran #define QL_VND_SA_STAT_ERROR 3 2267ebb336eSQuinn Tran 2277ebb336eSQuinn Tran #define QL_VND_RX_SA_KEY 1 2287ebb336eSQuinn Tran #define QL_VND_TX_SA_KEY 2 2297ebb336eSQuinn Tran 2307ebb336eSQuinn Tran /* App defines for plogi auth'd ok and plogi auth bad requests */ 2317ebb336eSQuinn Tran struct auth_complete_cmd { 2327ebb336eSQuinn Tran struct app_id app_info; 2337ebb336eSQuinn Tran #define PL_TYPE_WWPN 1 2347ebb336eSQuinn Tran #define PL_TYPE_DID 2 2357ebb336eSQuinn Tran uint32_t type; 2367ebb336eSQuinn Tran union { 2377ebb336eSQuinn Tran uint8_t wwpn[WWN_SIZE]; 2387ebb336eSQuinn Tran port_id_t d_id; 2397ebb336eSQuinn Tran } u; 2407a7b0b48SQuinn Tran uint8_t version; 2417a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 2427a7b0b48SQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 2437a7b0b48SQuinn Tran } __packed; 2447a7b0b48SQuinn Tran 2457a7b0b48SQuinn Tran struct aen_complete_cmd { 2467a7b0b48SQuinn Tran struct app_id app_info; 2477a7b0b48SQuinn Tran port_id_t port_id; 2487a7b0b48SQuinn Tran uint32_t event_code; 2497a7b0b48SQuinn Tran uint8_t version; 2507a7b0b48SQuinn Tran uint8_t pad[VND_CMD_PAD_SIZE]; 2517a7b0b48SQuinn Tran uint8_t reserved[VND_CMD_APP_RESERVED_SIZE]; 2527ebb336eSQuinn Tran } __packed; 2537ebb336eSQuinn Tran 2547ebb336eSQuinn Tran #define RX_DELAY_DELETE_TIMEOUT 20 2557ebb336eSQuinn Tran 2567ebb336eSQuinn Tran #endif /* QLA_EDIF_BSG_H */ 257