/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Marvell Fibre Channel HBA Driver
* Copyright (C) 2018- Marvell
*
*/
#ifndef __QLA_EDIF_BSG_H
#define __QLA_EDIF_BSG_H
#define EDIF_VERSION1 1
/* BSG Vendor specific commands */
#define ELS_MAX_PAYLOAD 2112
#ifndef WWN_SIZE
#define WWN_SIZE 8
#endif
#define VND_CMD_APP_RESERVED_SIZE 28
#define VND_CMD_PAD_SIZE 3
enum auth_els_sub_cmd {
SEND_ELS = 0,
SEND_ELS_REPLY,
PULL_ELS,
};
struct extra_auth_els {
enum auth_els_sub_cmd sub_cmd;
uint32_t extra_rx_xchg_address;
uint8_t extra_control_flags;
#define BSG_CTL_FLAG_INIT 0
#define BSG_CTL_FLAG_LS_ACC 1
#define BSG_CTL_FLAG_LS_RJT 2
#define BSG_CTL_FLAG_TRM 3
uint8_t version;
uint8_t pad[2];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
struct qla_bsg_auth_els_request {
struct fc_bsg_request r;
struct extra_auth_els e;
};
struct qla_bsg_auth_els_reply {
struct fc_bsg_reply r;
uint32_t rx_xchg_address;
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
};
struct app_id {
int app_vid;
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
struct app_start_reply {
uint32_t host_support_edif;
uint32_t edif_enode_active;
uint32_t edif_edb_active;
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
struct app_start {
struct app_id app_info;
uint8_t app_start_flags;
uint8_t version;
uint8_t pad[2];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
struct app_stop {
struct app_id app_info;
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
struct app_plogi_reply {
uint32_t prli_status;
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
struct app_pinfo_req {
struct app_id app_info;
uint8_t num_ports;
struct {
#ifdef __BIG_ENDIAN
uint8_t domain;
uint8_t area;
uint8_t al_pa;
#elif defined(__LITTLE_ENDIAN)
uint8_t al_pa;
uint8_t area;
uint8_t domain;
#else
#error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined!"
#endif
uint8_t rsvd_1;
} remote_pid;
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
struct app_pinfo {
port_id_t remote_pid;
uint8_t remote_wwpn[WWN_SIZE];
uint8_t remote_type;
#define VND_CMD_RTYPE_UNKNOWN 0
#define VND_CMD_RTYPE_TARGET 1
#define VND_CMD_RTYPE_INITIATOR 2
uint8_t remote_state;
uint8_t auth_state;
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
/* AUTH States */
#define VND_CMD_AUTH_STATE_UNDEF 0
#define VND_CMD_AUTH_STATE_SESSION_SHUTDOWN 1
#define VND_CMD_AUTH_STATE_NEEDED 2
#define VND_CMD_AUTH_STATE_ELS_RCVD 3
#define VND_CMD_AUTH_STATE_SAUPDATE_COMPL 4
struct app_pinfo_reply {
uint8_t port_count;
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
struct app_pinfo ports[];
} __packed;
struct app_sinfo_req {
struct app_id app_info;
uint8_t num_ports;
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
struct app_sinfo {
uint8_t remote_wwpn[WWN_SIZE];
int64_t rekey_count;
uint8_t rekey_mode;
int64_t tx_bytes;
int64_t rx_bytes;
} __packed;
struct app_stats_reply {
uint8_t elem_count;
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
struct app_sinfo elem[];
} __packed;
struct qla_sa_update_frame {
struct app_id app_info;
uint16_t flags;
#define SAU_FLG_INV 0x01 /* delete key */
#define SAU_FLG_TX 0x02 /* 1=tx, 0 = rx */
#define SAU_FLG_FORCE_DELETE 0x08
#define SAU_FLG_GMAC_MODE 0x20 /*
* GMAC mode is cleartext for the IO
* (i.e. NULL encryption)
*/
#define SAU_FLG_KEY128 0x40
#define SAU_FLG_KEY256 0x80
uint16_t fast_sa_index:10,
reserved:6;
uint32_t salt;
uint32_t spi;
uint8_t sa_key[32];
uint8_t node_name[WWN_SIZE];
uint8_t port_name[WWN_SIZE];
port_id_t port_id;
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved2[VND_CMD_APP_RESERVED_SIZE];
} __packed;
#define QL_VND_SC_UNDEF 0
#define QL_VND_SC_SA_UPDATE 1
#define QL_VND_SC_APP_START 2
#define QL_VND_SC_APP_STOP 3
#define QL_VND_SC_AUTH_OK 4
#define QL_VND_SC_AUTH_FAIL 5
#define QL_VND_SC_REKEY_CONFIG 6
#define QL_VND_SC_GET_FCINFO 7
#define QL_VND_SC_GET_STATS 8
#define QL_VND_SC_AEN_COMPLETE 9
#define QL_VND_SC_READ_DBELL 10
/*
* bsg caller to provide empty buffer for doorbell events.
*
* sg_io_v4.din_xferp = empty buffer for door bell events
* sg_io_v4.dout_xferp = struct edif_read_dbell *buf
*/
struct edif_read_dbell {
struct app_id app_info;
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
};
/* Application interface data structure for rtn data */
#define EXT_DEF_EVENT_DATA_SIZE 64
struct edif_app_dbell {
uint32_t event_code;
uint32_t event_data_size;
union {
port_id_t port_id;
uint8_t event_data[EXT_DEF_EVENT_DATA_SIZE];
};
} __packed;
struct edif_sa_update_aen {
port_id_t port_id;
uint32_t key_type; /* Tx (1) or RX (2) */
uint32_t status; /* 0 succes, 1 failed, 2 timeout , 3 error */
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
#define QL_VND_SA_STAT_SUCCESS 0
#define QL_VND_SA_STAT_FAILED 1
#define QL_VND_SA_STAT_TIMEOUT 2
#define QL_VND_SA_STAT_ERROR 3
#define QL_VND_RX_SA_KEY 1
#define QL_VND_TX_SA_KEY 2
/* App defines for plogi auth'd ok and plogi auth bad requests */
struct auth_complete_cmd {
struct app_id app_info;
#define PL_TYPE_WWPN 1
#define PL_TYPE_DID 2
uint32_t type;
union {
uint8_t wwpn[WWN_SIZE];
port_id_t d_id;
} u;
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
struct aen_complete_cmd {
struct app_id app_info;
port_id_t port_id;
uint32_t event_code;
uint8_t version;
uint8_t pad[VND_CMD_PAD_SIZE];
uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
} __packed;
#define RX_DELAY_DELETE_TIMEOUT 20
#define FCH_EVT_VENDOR_UNIQUE_VPORT_DOWN 1
#endif /* QLA_EDIF_BSG_H */