17ebb336eSQuinn Tran /* SPDX-License-Identifier: GPL-2.0-only */ 27ebb336eSQuinn Tran /* 37ebb336eSQuinn Tran * Marvell Fibre Channel HBA Driver 47ebb336eSQuinn Tran * Copyright (c) 2021 Marvell 57ebb336eSQuinn Tran */ 67ebb336eSQuinn Tran #ifndef __QLA_EDIF_H 77ebb336eSQuinn Tran #define __QLA_EDIF_H 87ebb336eSQuinn Tran 97ebb336eSQuinn Tran struct qla_scsi_host; 107ebb336eSQuinn Tran #define EDIF_APP_ID 0x73730001 117ebb336eSQuinn Tran 12dd30706eSQuinn Tran #define EDIF_MAX_INDEX 2048 13dd30706eSQuinn Tran struct edif_sa_ctl { 14dd30706eSQuinn Tran struct list_head next; 15dd30706eSQuinn Tran uint16_t del_index; 16dd30706eSQuinn Tran uint16_t index; 17dd30706eSQuinn Tran uint16_t slot; 18dd30706eSQuinn Tran uint16_t flags; 19dd30706eSQuinn Tran #define EDIF_SA_CTL_FLG_REPL BIT_0 20dd30706eSQuinn Tran #define EDIF_SA_CTL_FLG_DEL BIT_1 21dd30706eSQuinn Tran #define EDIF_SA_CTL_FLG_CLEANUP_DEL BIT_4 22dd30706eSQuinn Tran // Invalidate Index bit and mirrors QLA_SA_UPDATE_FLAGS_DELETE 23dd30706eSQuinn Tran unsigned long state; 24dd30706eSQuinn Tran #define EDIF_SA_CTL_USED 1 /* Active Sa update */ 25dd30706eSQuinn Tran #define EDIF_SA_CTL_PEND 2 /* Waiting for slot */ 26dd30706eSQuinn Tran #define EDIF_SA_CTL_REPL 3 /* Active Replace and Delete */ 27dd30706eSQuinn Tran #define EDIF_SA_CTL_DEL 4 /* Delete Pending */ 28dd30706eSQuinn Tran struct fc_port *fcport; 29dd30706eSQuinn Tran struct bsg_job *bsg_job; 30dd30706eSQuinn Tran struct qla_sa_update_frame sa_frame; 31dd30706eSQuinn Tran }; 32dd30706eSQuinn Tran 337ebb336eSQuinn Tran enum enode_flags_t { 347ebb336eSQuinn Tran ENODE_ACTIVE = 0x1, 357ebb336eSQuinn Tran }; 367ebb336eSQuinn Tran 377ebb336eSQuinn Tran struct pur_core { 387ebb336eSQuinn Tran enum enode_flags_t enode_flags; 397ebb336eSQuinn Tran spinlock_t pur_lock; 407ebb336eSQuinn Tran struct list_head head; 417ebb336eSQuinn Tran }; 427ebb336eSQuinn Tran 437ebb336eSQuinn Tran enum db_flags_t { 4436f468bfSQuinn Tran EDB_ACTIVE = BIT_0, 457ebb336eSQuinn Tran }; 467ebb336eSQuinn Tran 4736f468bfSQuinn Tran #define DBELL_ACTIVE(_v) (_v->e_dbell.db_flags & EDB_ACTIVE) 4836f468bfSQuinn Tran #define DBELL_INACTIVE(_v) (!(_v->e_dbell.db_flags & EDB_ACTIVE)) 4936f468bfSQuinn Tran 507ebb336eSQuinn Tran struct edif_dbell { 517ebb336eSQuinn Tran enum db_flags_t db_flags; 527ebb336eSQuinn Tran spinlock_t db_lock; 537ebb336eSQuinn Tran struct list_head head; 545ecd241bSQuinn Tran struct bsg_job *dbell_bsg_job; 555ecd241bSQuinn Tran unsigned long bsg_expire; 567ebb336eSQuinn Tran }; 577ebb336eSQuinn Tran 58dd30706eSQuinn Tran #define SA_UPDATE_IOCB_TYPE 0x71 /* Security Association Update IOCB entry */ 59dd30706eSQuinn Tran struct sa_update_28xx { 60dd30706eSQuinn Tran uint8_t entry_type; /* Entry type. */ 61dd30706eSQuinn Tran uint8_t entry_count; /* Entry count. */ 62dd30706eSQuinn Tran uint8_t sys_define; /* System Defined. */ 63dd30706eSQuinn Tran uint8_t entry_status; /* Entry Status. */ 64dd30706eSQuinn Tran 65dd30706eSQuinn Tran uint32_t handle; /* IOCB System handle. */ 66dd30706eSQuinn Tran 67dd30706eSQuinn Tran union { 68dd30706eSQuinn Tran __le16 nport_handle; /* in: N_PORT handle. */ 69dd30706eSQuinn Tran __le16 comp_sts; /* out: completion status */ 70b15ce2f3SQuinn Tran #define CS_PORT_EDIF_UNAVAIL 0x28 71b15ce2f3SQuinn Tran #define CS_PORT_EDIF_LOGOUT 0x29 72dd30706eSQuinn Tran #define CS_PORT_EDIF_SUPP_NOT_RDY 0x64 73dd30706eSQuinn Tran #define CS_PORT_EDIF_INV_REQ 0x66 74dd30706eSQuinn Tran } u; 75dd30706eSQuinn Tran uint8_t vp_index; 76dd30706eSQuinn Tran uint8_t reserved_1; 77dd30706eSQuinn Tran uint8_t port_id[3]; 78dd30706eSQuinn Tran uint8_t flags; 79dd30706eSQuinn Tran #define SA_FLAG_INVALIDATE BIT_0 80dd30706eSQuinn Tran #define SA_FLAG_TX BIT_1 // 1=tx, 0=rx 81dd30706eSQuinn Tran 82dd30706eSQuinn Tran uint8_t sa_key[32]; /* 256 bit key */ 83dd30706eSQuinn Tran __le32 salt; 84dd30706eSQuinn Tran __le32 spi; 85dd30706eSQuinn Tran uint8_t sa_control; 86dd30706eSQuinn Tran #define SA_CNTL_ENC_FCSP (1 << 3) 87dd30706eSQuinn Tran #define SA_CNTL_ENC_OPD (2 << 3) 88dd30706eSQuinn Tran #define SA_CNTL_ENC_MSK (3 << 3) // mask bits 4,3 89dd30706eSQuinn Tran #define SA_CNTL_AES_GMAC (1 << 2) 90dd30706eSQuinn Tran #define SA_CNTL_KEY256 (2 << 0) 91dd30706eSQuinn Tran #define SA_CNTL_KEY128 0 92dd30706eSQuinn Tran 93dd30706eSQuinn Tran uint8_t reserved_2; 94dd30706eSQuinn Tran __le16 sa_index; // reserve: bit 11-15 95dd30706eSQuinn Tran __le16 old_sa_info; 96dd30706eSQuinn Tran __le16 new_sa_info; 97dd30706eSQuinn Tran }; 98dd30706eSQuinn Tran 99dd30706eSQuinn Tran #define NUM_ENTRIES 256 10084318a9fSQuinn Tran #define PUR_GET 1 10184318a9fSQuinn Tran 10284318a9fSQuinn Tran struct dinfo { 10384318a9fSQuinn Tran int nodecnt; 10484318a9fSQuinn Tran int lstate; 10584318a9fSQuinn Tran }; 10684318a9fSQuinn Tran 10784318a9fSQuinn Tran struct pur_ninfo { 10884318a9fSQuinn Tran port_id_t pur_sid; 10984318a9fSQuinn Tran port_id_t pur_did; 11084318a9fSQuinn Tran uint8_t vp_idx; 11184318a9fSQuinn Tran short pur_bytes_rcvd; 11284318a9fSQuinn Tran unsigned short pur_nphdl; 11384318a9fSQuinn Tran unsigned int pur_rx_xchg_address; 11484318a9fSQuinn Tran }; 11584318a9fSQuinn Tran 11684318a9fSQuinn Tran struct purexevent { 11784318a9fSQuinn Tran struct pur_ninfo pur_info; 11884318a9fSQuinn Tran unsigned char *msgp; 11984318a9fSQuinn Tran u32 msgp_len; 12084318a9fSQuinn Tran }; 12184318a9fSQuinn Tran 12284318a9fSQuinn Tran #define N_UNDEF 0 12384318a9fSQuinn Tran #define N_PUREX 1 12484318a9fSQuinn Tran struct enode { 12584318a9fSQuinn Tran struct list_head list; 12684318a9fSQuinn Tran struct dinfo dinfo; 12784318a9fSQuinn Tran uint32_t ntype; 12884318a9fSQuinn Tran union { 12984318a9fSQuinn Tran struct purexevent purexinfo; 13084318a9fSQuinn Tran } u; 13184318a9fSQuinn Tran }; 13222547929SQuinn Tran 1330f6d600aSQuinn Tran #define RX_ELS_SIZE (roundup(sizeof(struct enode) + ELS_MAX_PAYLOAD, SMP_CACHE_BYTES)) 1340f6d600aSQuinn Tran 13522547929SQuinn Tran #define EDIF_SESSION_DOWN(_s) \ 1364de067e5SQuinn Tran (qla_ini_mode_enabled(_s->vha) && (_s->disc_state == DSC_DELETE_PEND || \ 13722547929SQuinn Tran _s->disc_state == DSC_DELETED || \ 1384de067e5SQuinn Tran !_s->edif.app_sess_online)) 13922547929SQuinn Tran 14091f6f5fbSQuinn Tran #define EDIF_NEGOTIATION_PENDING(_fcport) \ 14136f468bfSQuinn Tran (DBELL_ACTIVE(_fcport->vha) && \ 14291f6f5fbSQuinn Tran (_fcport->disc_state == DSC_LOGIN_AUTH_PEND)) 14391f6f5fbSQuinn Tran 144a8fdfb0bSQuinn Tran #define EDIF_SESS_DELETE(_s) \ 145a8fdfb0bSQuinn Tran (qla_ini_mode_enabled(_s->vha) && (_s->disc_state == DSC_DELETE_PEND || \ 146a8fdfb0bSQuinn Tran _s->disc_state == DSC_DELETED)) 147a8fdfb0bSQuinn Tran 148*430eef03SQuinn Tran #define EDIF_CAP(_ha) (ql2xsecenable && IS_QLA28XX(_ha)) 149*430eef03SQuinn Tran 1507ebb336eSQuinn Tran #endif /* __QLA_EDIF_H */ 151