| /* SPDX-License-Identifier: GPL-2.0-only */ | 
 | /* | 
 |  * Marvell Fibre Channel HBA Driver | 
 |  * Copyright (c)  2021    Marvell | 
 |  */ | 
 | #ifndef __QLA_EDIF_H | 
 | #define __QLA_EDIF_H | 
 |  | 
 | struct qla_scsi_host; | 
 | #define EDIF_APP_ID 0x73730001 | 
 |  | 
 | #define EDIF_MAX_INDEX	2048 | 
 | struct edif_sa_ctl { | 
 | 	struct list_head next; | 
 | 	uint16_t	del_index; | 
 | 	uint16_t	index; | 
 | 	uint16_t	slot; | 
 | 	uint16_t	flags; | 
 | #define	EDIF_SA_CTL_FLG_REPL		BIT_0 | 
 | #define	EDIF_SA_CTL_FLG_DEL		BIT_1 | 
 | #define EDIF_SA_CTL_FLG_CLEANUP_DEL BIT_4 | 
 | 	// Invalidate Index bit and mirrors QLA_SA_UPDATE_FLAGS_DELETE | 
 | 	unsigned long   state; | 
 | #define EDIF_SA_CTL_USED	1	/* Active Sa update  */ | 
 | #define EDIF_SA_CTL_PEND	2	/* Waiting for slot */ | 
 | #define EDIF_SA_CTL_REPL	3	/* Active Replace and Delete */ | 
 | #define EDIF_SA_CTL_DEL		4	/* Delete Pending */ | 
 | 	struct fc_port	*fcport; | 
 | 	struct bsg_job *bsg_job; | 
 | 	struct qla_sa_update_frame sa_frame; | 
 | }; | 
 |  | 
 | enum enode_flags_t { | 
 | 	ENODE_ACTIVE = 0x1, | 
 | }; | 
 |  | 
 | struct pur_core { | 
 | 	enum enode_flags_t	enode_flags; | 
 | 	spinlock_t		pur_lock; | 
 | 	struct  list_head	head; | 
 | }; | 
 |  | 
 | enum db_flags_t { | 
 | 	EDB_ACTIVE = BIT_0, | 
 | }; | 
 |  | 
 | #define DBELL_ACTIVE(_v) (_v->e_dbell.db_flags & EDB_ACTIVE) | 
 | #define DBELL_INACTIVE(_v) (!(_v->e_dbell.db_flags & EDB_ACTIVE)) | 
 |  | 
 | struct edif_dbell { | 
 | 	enum db_flags_t		db_flags; | 
 | 	spinlock_t		db_lock; | 
 | 	struct  list_head	head; | 
 | 	struct bsg_job *dbell_bsg_job; | 
 | 	unsigned long bsg_expire; | 
 | }; | 
 |  | 
 | #define SA_UPDATE_IOCB_TYPE            0x71    /* Security Association Update IOCB entry */ | 
 | struct sa_update_28xx { | 
 | 	uint8_t entry_type;             /* Entry type. */ | 
 | 	uint8_t entry_count;            /* Entry count. */ | 
 | 	uint8_t sys_define;             /* System Defined. */ | 
 | 	uint8_t entry_status;           /* Entry Status. */ | 
 |  | 
 | 	uint32_t handle;                /* IOCB System handle. */ | 
 |  | 
 | 	union { | 
 | 		__le16 nport_handle;  /* in: N_PORT handle. */ | 
 | 		__le16 comp_sts;              /* out: completion status */ | 
 | #define CS_PORT_EDIF_UNAVAIL	0x28 | 
 | #define CS_PORT_EDIF_LOGOUT	0x29 | 
 | #define CS_PORT_EDIF_SUPP_NOT_RDY 0x64 | 
 | #define CS_PORT_EDIF_INV_REQ      0x66 | 
 | 	} u; | 
 | 	uint8_t vp_index; | 
 | 	uint8_t reserved_1; | 
 | 	uint8_t port_id[3]; | 
 | 	uint8_t flags; | 
 | #define SA_FLAG_INVALIDATE BIT_0 | 
 | #define SA_FLAG_TX	   BIT_1 // 1=tx, 0=rx | 
 |  | 
 | 	uint8_t sa_key[32];     /* 256 bit key */ | 
 | 	__le32 salt; | 
 | 	__le32 spi; | 
 | 	uint8_t sa_control; | 
 | #define SA_CNTL_ENC_FCSP        (1 << 3) | 
 | #define SA_CNTL_ENC_OPD         (2 << 3) | 
 | #define SA_CNTL_ENC_MSK         (3 << 3)  // mask bits 4,3 | 
 | #define SA_CNTL_AES_GMAC	(1 << 2) | 
 | #define SA_CNTL_KEY256          (2 << 0) | 
 | #define SA_CNTL_KEY128          0 | 
 |  | 
 | 	uint8_t reserved_2; | 
 | 	__le16 sa_index;   // reserve: bit 11-15 | 
 | 	__le16 old_sa_info; | 
 | 	__le16 new_sa_info; | 
 | }; | 
 |  | 
 | #define        NUM_ENTRIES     256 | 
 | #define        PUR_GET         1 | 
 |  | 
 | struct dinfo { | 
 | 	int		nodecnt; | 
 | 	int		lstate; | 
 | }; | 
 |  | 
 | struct pur_ninfo { | 
 | 	port_id_t       pur_sid; | 
 | 	port_id_t	pur_did; | 
 | 	uint8_t		vp_idx; | 
 | 	short           pur_bytes_rcvd; | 
 | 	unsigned short  pur_nphdl; | 
 | 	unsigned int    pur_rx_xchg_address; | 
 | }; | 
 |  | 
 | struct purexevent { | 
 | 	struct  pur_ninfo	pur_info; | 
 | 	unsigned char		*msgp; | 
 | 	u32			msgp_len; | 
 | }; | 
 |  | 
 | #define	N_UNDEF		0 | 
 | #define	N_PUREX		1 | 
 | struct enode { | 
 | 	struct list_head	list; | 
 | 	struct dinfo		dinfo; | 
 | 	uint32_t		ntype; | 
 | 	union { | 
 | 		struct purexevent	purexinfo; | 
 | 	} u; | 
 | }; | 
 |  | 
 | #define RX_ELS_SIZE (roundup(sizeof(struct enode) + ELS_MAX_PAYLOAD, SMP_CACHE_BYTES)) | 
 |  | 
 | #define EDIF_SESSION_DOWN(_s) \ | 
 | 	(qla_ini_mode_enabled(_s->vha) && (_s->disc_state == DSC_DELETE_PEND || \ | 
 | 	 _s->disc_state == DSC_DELETED || \ | 
 | 	 !_s->edif.app_sess_online)) | 
 |  | 
 | #define EDIF_NEGOTIATION_PENDING(_fcport) \ | 
 | 	(DBELL_ACTIVE(_fcport->vha) && \ | 
 | 	 (_fcport->disc_state == DSC_LOGIN_AUTH_PEND)) | 
 |  | 
 | #define EDIF_SESS_DELETE(_s) \ | 
 | 	(qla_ini_mode_enabled(_s->vha) && (_s->disc_state == DSC_DELETE_PEND || \ | 
 | 	 _s->disc_state == DSC_DELETED)) | 
 |  | 
 | #define EDIF_CAP(_ha) (ql2xsecenable && IS_QLA28XX(_ha)) | 
 |  | 
 | #endif	/* __QLA_EDIF_H */ |