162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Marvell Fibre Channel HBA Driver 462306a36Sopenharmony_ci * Copyright (c) 2021 Marvell 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#ifndef __QLA_EDIF_H 762306a36Sopenharmony_ci#define __QLA_EDIF_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_cistruct qla_scsi_host; 1062306a36Sopenharmony_ci#define EDIF_APP_ID 0x73730001 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define EDIF_MAX_INDEX 2048 1362306a36Sopenharmony_cistruct edif_sa_ctl { 1462306a36Sopenharmony_ci struct list_head next; 1562306a36Sopenharmony_ci uint16_t del_index; 1662306a36Sopenharmony_ci uint16_t index; 1762306a36Sopenharmony_ci uint16_t slot; 1862306a36Sopenharmony_ci uint16_t flags; 1962306a36Sopenharmony_ci#define EDIF_SA_CTL_FLG_REPL BIT_0 2062306a36Sopenharmony_ci#define EDIF_SA_CTL_FLG_DEL BIT_1 2162306a36Sopenharmony_ci#define EDIF_SA_CTL_FLG_CLEANUP_DEL BIT_4 2262306a36Sopenharmony_ci // Invalidate Index bit and mirrors QLA_SA_UPDATE_FLAGS_DELETE 2362306a36Sopenharmony_ci unsigned long state; 2462306a36Sopenharmony_ci#define EDIF_SA_CTL_USED 1 /* Active Sa update */ 2562306a36Sopenharmony_ci#define EDIF_SA_CTL_PEND 2 /* Waiting for slot */ 2662306a36Sopenharmony_ci#define EDIF_SA_CTL_REPL 3 /* Active Replace and Delete */ 2762306a36Sopenharmony_ci#define EDIF_SA_CTL_DEL 4 /* Delete Pending */ 2862306a36Sopenharmony_ci struct fc_port *fcport; 2962306a36Sopenharmony_ci struct bsg_job *bsg_job; 3062306a36Sopenharmony_ci struct qla_sa_update_frame sa_frame; 3162306a36Sopenharmony_ci}; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cienum enode_flags_t { 3462306a36Sopenharmony_ci ENODE_ACTIVE = 0x1, 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistruct pur_core { 3862306a36Sopenharmony_ci enum enode_flags_t enode_flags; 3962306a36Sopenharmony_ci spinlock_t pur_lock; 4062306a36Sopenharmony_ci struct list_head head; 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cienum db_flags_t { 4462306a36Sopenharmony_ci EDB_ACTIVE = BIT_0, 4562306a36Sopenharmony_ci}; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci#define DBELL_ACTIVE(_v) (_v->e_dbell.db_flags & EDB_ACTIVE) 4862306a36Sopenharmony_ci#define DBELL_INACTIVE(_v) (!(_v->e_dbell.db_flags & EDB_ACTIVE)) 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cistruct edif_dbell { 5162306a36Sopenharmony_ci enum db_flags_t db_flags; 5262306a36Sopenharmony_ci spinlock_t db_lock; 5362306a36Sopenharmony_ci struct list_head head; 5462306a36Sopenharmony_ci struct bsg_job *dbell_bsg_job; 5562306a36Sopenharmony_ci unsigned long bsg_expire; 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#define SA_UPDATE_IOCB_TYPE 0x71 /* Security Association Update IOCB entry */ 5962306a36Sopenharmony_cistruct sa_update_28xx { 6062306a36Sopenharmony_ci uint8_t entry_type; /* Entry type. */ 6162306a36Sopenharmony_ci uint8_t entry_count; /* Entry count. */ 6262306a36Sopenharmony_ci uint8_t sys_define; /* System Defined. */ 6362306a36Sopenharmony_ci uint8_t entry_status; /* Entry Status. */ 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci uint32_t handle; /* IOCB System handle. */ 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci union { 6862306a36Sopenharmony_ci __le16 nport_handle; /* in: N_PORT handle. */ 6962306a36Sopenharmony_ci __le16 comp_sts; /* out: completion status */ 7062306a36Sopenharmony_ci#define CS_PORT_EDIF_UNAVAIL 0x28 7162306a36Sopenharmony_ci#define CS_PORT_EDIF_LOGOUT 0x29 7262306a36Sopenharmony_ci#define CS_PORT_EDIF_SUPP_NOT_RDY 0x64 7362306a36Sopenharmony_ci#define CS_PORT_EDIF_INV_REQ 0x66 7462306a36Sopenharmony_ci } u; 7562306a36Sopenharmony_ci uint8_t vp_index; 7662306a36Sopenharmony_ci uint8_t reserved_1; 7762306a36Sopenharmony_ci uint8_t port_id[3]; 7862306a36Sopenharmony_ci uint8_t flags; 7962306a36Sopenharmony_ci#define SA_FLAG_INVALIDATE BIT_0 8062306a36Sopenharmony_ci#define SA_FLAG_TX BIT_1 // 1=tx, 0=rx 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci uint8_t sa_key[32]; /* 256 bit key */ 8362306a36Sopenharmony_ci __le32 salt; 8462306a36Sopenharmony_ci __le32 spi; 8562306a36Sopenharmony_ci uint8_t sa_control; 8662306a36Sopenharmony_ci#define SA_CNTL_ENC_FCSP (1 << 3) 8762306a36Sopenharmony_ci#define SA_CNTL_ENC_OPD (2 << 3) 8862306a36Sopenharmony_ci#define SA_CNTL_ENC_MSK (3 << 3) // mask bits 4,3 8962306a36Sopenharmony_ci#define SA_CNTL_AES_GMAC (1 << 2) 9062306a36Sopenharmony_ci#define SA_CNTL_KEY256 (2 << 0) 9162306a36Sopenharmony_ci#define SA_CNTL_KEY128 0 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci uint8_t reserved_2; 9462306a36Sopenharmony_ci __le16 sa_index; // reserve: bit 11-15 9562306a36Sopenharmony_ci __le16 old_sa_info; 9662306a36Sopenharmony_ci __le16 new_sa_info; 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci#define NUM_ENTRIES 256 10062306a36Sopenharmony_ci#define PUR_GET 1 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cistruct dinfo { 10362306a36Sopenharmony_ci int nodecnt; 10462306a36Sopenharmony_ci int lstate; 10562306a36Sopenharmony_ci}; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistruct pur_ninfo { 10862306a36Sopenharmony_ci port_id_t pur_sid; 10962306a36Sopenharmony_ci port_id_t pur_did; 11062306a36Sopenharmony_ci uint8_t vp_idx; 11162306a36Sopenharmony_ci short pur_bytes_rcvd; 11262306a36Sopenharmony_ci unsigned short pur_nphdl; 11362306a36Sopenharmony_ci unsigned int pur_rx_xchg_address; 11462306a36Sopenharmony_ci}; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_cistruct purexevent { 11762306a36Sopenharmony_ci struct pur_ninfo pur_info; 11862306a36Sopenharmony_ci unsigned char *msgp; 11962306a36Sopenharmony_ci u32 msgp_len; 12062306a36Sopenharmony_ci}; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci#define N_UNDEF 0 12362306a36Sopenharmony_ci#define N_PUREX 1 12462306a36Sopenharmony_cistruct enode { 12562306a36Sopenharmony_ci struct list_head list; 12662306a36Sopenharmony_ci struct dinfo dinfo; 12762306a36Sopenharmony_ci uint32_t ntype; 12862306a36Sopenharmony_ci union { 12962306a36Sopenharmony_ci struct purexevent purexinfo; 13062306a36Sopenharmony_ci } u; 13162306a36Sopenharmony_ci}; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci#define RX_ELS_SIZE (roundup(sizeof(struct enode) + ELS_MAX_PAYLOAD, SMP_CACHE_BYTES)) 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci#define EDIF_SESSION_DOWN(_s) \ 13662306a36Sopenharmony_ci (qla_ini_mode_enabled(_s->vha) && (_s->disc_state == DSC_DELETE_PEND || \ 13762306a36Sopenharmony_ci _s->disc_state == DSC_DELETED || \ 13862306a36Sopenharmony_ci !_s->edif.app_sess_online)) 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci#define EDIF_NEGOTIATION_PENDING(_fcport) \ 14162306a36Sopenharmony_ci (DBELL_ACTIVE(_fcport->vha) && \ 14262306a36Sopenharmony_ci (_fcport->disc_state == DSC_LOGIN_AUTH_PEND)) 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci#define EDIF_SESS_DELETE(_s) \ 14562306a36Sopenharmony_ci (qla_ini_mode_enabled(_s->vha) && (_s->disc_state == DSC_DELETE_PEND || \ 14662306a36Sopenharmony_ci _s->disc_state == DSC_DELETED)) 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci#define EDIF_CAP(_ha) (ql2xsecenable && IS_QLA28XX(_ha)) 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci#endif /* __QLA_EDIF_H */ 151