xref: /spdk/lib/nvmf/nvmf_fc.h (revision 83e8405e4c25408c010ba2b9e02ce45e2347370c)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse  *   Copyright (C) 2018 Intel Corporation.
3ed56a3d4SAnil Veerabhadrappa  *   Copyright (c) 2018-2019 Broadcom.  All Rights Reserved.
40e9f9beaSJohn Barnard  *   The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
50e9f9beaSJohn Barnard  */
60e9f9beaSJohn Barnard 
70e9f9beaSJohn Barnard #ifndef __NVMF_FC_H__
80e9f9beaSJohn Barnard #define __NVMF_FC_H__
90e9f9beaSJohn Barnard 
10ed56a3d4SAnil Veerabhadrappa #include "spdk/nvme.h"
110e9f9beaSJohn Barnard #include "spdk/nvmf.h"
120e9f9beaSJohn Barnard #include "spdk/assert.h"
130e9f9beaSJohn Barnard #include "spdk/nvme_spec.h"
140e9f9beaSJohn Barnard #include "spdk/nvmf_fc_spec.h"
158e05b15cSDarek Stojaczyk #include "spdk/thread.h"
160e9f9beaSJohn Barnard #include "nvmf_internal.h"
17b50c6bc2SNaresh Gottumukkala #include <rte_hash.h>
180e9f9beaSJohn Barnard 
190e9f9beaSJohn Barnard #define SPDK_NVMF_FC_TR_ADDR_LEN 64
20ed56a3d4SAnil Veerabhadrappa #define NVMF_FC_INVALID_CONN_ID UINT64_MAX
21ed56a3d4SAnil Veerabhadrappa 
22ed56a3d4SAnil Veerabhadrappa #define SPDK_FC_HW_DUMP_REASON_STR_MAX_SIZE 256
23ed56a3d4SAnil Veerabhadrappa #define SPDK_MAX_NUM_OF_FC_PORTS 32
24ed56a3d4SAnil Veerabhadrappa #define SPDK_NVMF_PORT_ID_MAX_LEN 32
25ed56a3d4SAnil Veerabhadrappa 
26ed56a3d4SAnil Veerabhadrappa /*
27ed56a3d4SAnil Veerabhadrappa  * FC HWQP pointer
28ed56a3d4SAnil Veerabhadrappa  */
29ed56a3d4SAnil Veerabhadrappa typedef void *spdk_nvmf_fc_lld_hwqp_t;
300e9f9beaSJohn Barnard 
310e9f9beaSJohn Barnard /*
321b011d5dSNaresh Gottumukkala  * FC LLD port.
331b011d5dSNaresh Gottumukkala  */
341b011d5dSNaresh Gottumukkala typedef void *spdk_nvmf_fc_lld_fc_port_t;
351b011d5dSNaresh Gottumukkala 
361b011d5dSNaresh Gottumukkala /*
370e9f9beaSJohn Barnard  * FC HW port states.
380e9f9beaSJohn Barnard  */
390e9f9beaSJohn Barnard enum spdk_fc_port_state {
400e9f9beaSJohn Barnard 	SPDK_FC_PORT_OFFLINE = 0,
410e9f9beaSJohn Barnard 	SPDK_FC_PORT_ONLINE = 1,
420e9f9beaSJohn Barnard 	SPDK_FC_PORT_QUIESCED = 2,
430e9f9beaSJohn Barnard };
440e9f9beaSJohn Barnard 
450e9f9beaSJohn Barnard enum spdk_fc_hwqp_state {
460e9f9beaSJohn Barnard 	SPDK_FC_HWQP_OFFLINE = 0,
470e9f9beaSJohn Barnard 	SPDK_FC_HWQP_ONLINE = 1,
480e9f9beaSJohn Barnard };
490e9f9beaSJohn Barnard 
500e9f9beaSJohn Barnard /*
51ed56a3d4SAnil Veerabhadrappa  * NVMF FC Object state
520e9f9beaSJohn Barnard  * Add all the generic states of the object here.
530e9f9beaSJohn Barnard  * Specific object states can be added separately
540e9f9beaSJohn Barnard  */
550e9f9beaSJohn Barnard enum spdk_nvmf_fc_object_state {
560e9f9beaSJohn Barnard 	SPDK_NVMF_FC_OBJECT_CREATED = 0,
570e9f9beaSJohn Barnard 	SPDK_NVMF_FC_OBJECT_TO_BE_DELETED = 1,
580e9f9beaSJohn Barnard 	SPDK_NVMF_FC_OBJECT_ZOMBIE = 2,      /* Partial Create or Delete  */
590e9f9beaSJohn Barnard };
600e9f9beaSJohn Barnard 
610e9f9beaSJohn Barnard /*
620e9f9beaSJohn Barnard  * FC request state
630e9f9beaSJohn Barnard  */
640e9f9beaSJohn Barnard enum spdk_nvmf_fc_request_state {
650e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_INIT = 0,
660e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_READ_BDEV,
670e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_READ_XFER,
680e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_READ_RSP,
690e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_WRITE_BUFFS,
700e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_WRITE_XFER,
710e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_WRITE_BDEV,
720e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_WRITE_RSP,
730e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_NONE_BDEV,
740e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_NONE_RSP,
750e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_SUCCESS,
760e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_FAILED,
770e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_ABORTED,
78ed56a3d4SAnil Veerabhadrappa 	SPDK_NVMF_FC_REQ_BDEV_ABORTED,
790e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_PENDING,
80cfc716feSNaresh Gottumukkala 	SPDK_NVMF_FC_REQ_FUSED_WAITING,
810e9f9beaSJohn Barnard 	SPDK_NVMF_FC_REQ_MAX_STATE,
820e9f9beaSJohn Barnard };
830e9f9beaSJohn Barnard 
840e9f9beaSJohn Barnard /*
850e9f9beaSJohn Barnard  * Generic DMA buffer descriptor
860e9f9beaSJohn Barnard  */
870e9f9beaSJohn Barnard struct spdk_nvmf_fc_buffer_desc {
880e9f9beaSJohn Barnard 	void *virt;
890e9f9beaSJohn Barnard 	uint64_t phys;
900e9f9beaSJohn Barnard 	size_t len;
910e9f9beaSJohn Barnard 
920e9f9beaSJohn Barnard 	/* Internal */
930e9f9beaSJohn Barnard 	uint32_t buf_index;
940e9f9beaSJohn Barnard };
950e9f9beaSJohn Barnard 
960e9f9beaSJohn Barnard /*
97cc6920a4SJosh Soref  * ABTS handling context
980e9f9beaSJohn Barnard  */
990e9f9beaSJohn Barnard struct spdk_nvmf_fc_abts_ctx {
1000e9f9beaSJohn Barnard 	bool handled;
1010e9f9beaSJohn Barnard 	uint16_t hwqps_responded;
1020e9f9beaSJohn Barnard 	uint16_t rpi;
1030e9f9beaSJohn Barnard 	uint16_t oxid;
1040e9f9beaSJohn Barnard 	uint16_t rxid;
1050e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_nport *nport;
1060e9f9beaSJohn Barnard 	uint16_t nport_hdl;
1070e9f9beaSJohn Barnard 	uint8_t port_hdl;
1080e9f9beaSJohn Barnard 	void *abts_poller_args;
1090e9f9beaSJohn Barnard 	void *sync_poller_args;
1100e9f9beaSJohn Barnard 	int num_hwqps;
1110e9f9beaSJohn Barnard 	bool queue_synced;
1120e9f9beaSJohn Barnard 	uint64_t u_id;
1130e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_hwqp *ls_hwqp;
1140e9f9beaSJohn Barnard 	uint16_t fcp_rq_id;
1150e9f9beaSJohn Barnard };
1160e9f9beaSJohn Barnard 
1170e9f9beaSJohn Barnard /*
1180e9f9beaSJohn Barnard  * NVME FC transport errors
1190e9f9beaSJohn Barnard  */
1200e9f9beaSJohn Barnard struct spdk_nvmf_fc_errors {
121ed56a3d4SAnil Veerabhadrappa 	uint32_t no_xchg;
1220e9f9beaSJohn Barnard 	uint32_t nport_invalid;
1230e9f9beaSJohn Barnard 	uint32_t unknown_frame;
1240e9f9beaSJohn Barnard 	uint32_t wqe_cmplt_err;
1250e9f9beaSJohn Barnard 	uint32_t wqe_write_err;
1260e9f9beaSJohn Barnard 	uint32_t rq_status_err;
1270e9f9beaSJohn Barnard 	uint32_t rq_buf_len_err;
1280e9f9beaSJohn Barnard 	uint32_t rq_id_err;
1290e9f9beaSJohn Barnard 	uint32_t rq_index_err;
1300e9f9beaSJohn Barnard 	uint32_t invalid_cq_type;
1310e9f9beaSJohn Barnard 	uint32_t invalid_cq_id;
1320e9f9beaSJohn Barnard 	uint32_t fc_req_buf_err;
133ed56a3d4SAnil Veerabhadrappa 	uint32_t buf_alloc_err;
1340e9f9beaSJohn Barnard 	uint32_t unexpected_err;
1350e9f9beaSJohn Barnard 	uint32_t nvme_cmd_iu_err;
1360e9f9beaSJohn Barnard 	uint32_t nvme_cmd_xfer_err;
1370e9f9beaSJohn Barnard 	uint32_t queue_entry_invalid;
1380e9f9beaSJohn Barnard 	uint32_t invalid_conn_err;
1390e9f9beaSJohn Barnard 	uint32_t fcp_rsp_failure;
1400e9f9beaSJohn Barnard 	uint32_t write_failed;
1410e9f9beaSJohn Barnard 	uint32_t read_failed;
1420e9f9beaSJohn Barnard 	uint32_t rport_invalid;
1430e9f9beaSJohn Barnard 	uint32_t num_aborted;
1440e9f9beaSJohn Barnard 	uint32_t num_abts_sent;
1450e9f9beaSJohn Barnard };
1460e9f9beaSJohn Barnard 
1470e9f9beaSJohn Barnard /*
1480e9f9beaSJohn Barnard  *  Send Single Request/Response Sequence.
1490e9f9beaSJohn Barnard  */
150ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_srsr_bufs {
151ed56a3d4SAnil Veerabhadrappa 	void *rqst;
152ed56a3d4SAnil Veerabhadrappa 	size_t rqst_len;
153ed56a3d4SAnil Veerabhadrappa 	void *rsp;
154ed56a3d4SAnil Veerabhadrappa 	size_t rsp_len;
1550e9f9beaSJohn Barnard 	uint16_t rpi;
1560e9f9beaSJohn Barnard };
1570e9f9beaSJohn Barnard 
158e89d9af0SNaresh Gottumukkala struct spdk_nvmf_fc_qpair_remove_ctx {
159e89d9af0SNaresh Gottumukkala 	struct spdk_nvmf_qpair *qpair;
160e89d9af0SNaresh Gottumukkala 	spdk_nvmf_transport_qpair_fini_cb cb_fn;
161e89d9af0SNaresh Gottumukkala 	void *cb_ctx;
162e89d9af0SNaresh Gottumukkala 	struct spdk_thread *qpair_thread;
163e89d9af0SNaresh Gottumukkala };
164e89d9af0SNaresh Gottumukkala 
1650e9f9beaSJohn Barnard /*
1660e9f9beaSJohn Barnard  * Struct representing a nport
1670e9f9beaSJohn Barnard  */
1680e9f9beaSJohn Barnard struct spdk_nvmf_fc_nport {
1690e9f9beaSJohn Barnard 
1700e9f9beaSJohn Barnard 	uint16_t nport_hdl;
1710e9f9beaSJohn Barnard 	uint8_t port_hdl;
1720e9f9beaSJohn Barnard 	uint32_t d_id;
1730e9f9beaSJohn Barnard 	enum spdk_nvmf_fc_object_state nport_state;
1740e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_wwn fc_nodename;
1750e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_wwn fc_portname;
1760e9f9beaSJohn Barnard 
1770e9f9beaSJohn Barnard 	/* list of remote ports (i.e. initiators) connected to nport */
1780e9f9beaSJohn Barnard 	TAILQ_HEAD(, spdk_nvmf_fc_remote_port_info) rem_port_list;
1790e9f9beaSJohn Barnard 	uint32_t rport_count;
1800e9f9beaSJohn Barnard 
1810e9f9beaSJohn Barnard 	void *vendor_data;	/* available for vendor use */
1820e9f9beaSJohn Barnard 
1830e9f9beaSJohn Barnard 	/* list of associations to nport */
1840e9f9beaSJohn Barnard 	TAILQ_HEAD(, spdk_nvmf_fc_association) fc_associations;
1850e9f9beaSJohn Barnard 	uint32_t assoc_count;
1860e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_port *fc_port;
1870e9f9beaSJohn Barnard 	TAILQ_ENTRY(spdk_nvmf_fc_nport) link; /* list of nports on a hw port. */
1880e9f9beaSJohn Barnard };
1890e9f9beaSJohn Barnard 
190*83e8405eSKalyan Kadiyala typedef void (*spdk_nvmf_fc_caller_cb)(void *hwqp, int32_t status, void *args);
1910e9f9beaSJohn Barnard /*
1920e9f9beaSJohn Barnard  * NVMF FC Connection
1930e9f9beaSJohn Barnard  */
1940e9f9beaSJohn Barnard struct spdk_nvmf_fc_conn {
1950e9f9beaSJohn Barnard 	struct spdk_nvmf_qpair qpair;
196ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvme_transport_id trid;
1970e9f9beaSJohn Barnard 
19867429f28SNaresh Gottumukkala 	uint32_t s_id;
19967429f28SNaresh Gottumukkala 	uint32_t d_id;
2000e9f9beaSJohn Barnard 	uint64_t conn_id;
2010e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_hwqp *hwqp;
2020e9f9beaSJohn Barnard 	uint16_t esrp_ratio;
2030e9f9beaSJohn Barnard 	uint16_t rsp_count;
2040e9f9beaSJohn Barnard 	uint32_t rsn;
2050e9f9beaSJohn Barnard 
2060e9f9beaSJohn Barnard 	/* The maximum number of I/O outstanding on this connection at one time */
2070e9f9beaSJohn Barnard 	uint16_t max_queue_depth;
2080e9f9beaSJohn Barnard 	uint16_t max_rw_depth;
2090e9f9beaSJohn Barnard 	/* The current number of I/O outstanding on this connection. This number
2100e9f9beaSJohn Barnard 	 * includes all I/O from the time the capsule is first received until it is
2110e9f9beaSJohn Barnard 	 * completed.
2120e9f9beaSJohn Barnard 	 */
2130e9f9beaSJohn Barnard 	uint16_t cur_queue_depth;
2140e9f9beaSJohn Barnard 
2150e9f9beaSJohn Barnard 	/* number of read/write requests that are outstanding */
2160e9f9beaSJohn Barnard 	uint16_t cur_fc_rw_depth;
2170e9f9beaSJohn Barnard 
218cfc716feSNaresh Gottumukkala 	TAILQ_HEAD(, spdk_nvmf_fc_request) fused_waiting_queue;
219cfc716feSNaresh Gottumukkala 
2200e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_association *fc_assoc;
2210e9f9beaSJohn Barnard 
2220e9f9beaSJohn Barnard 	uint16_t rpi;
2230e9f9beaSJohn Barnard 
2240e9f9beaSJohn Barnard 	/* for association's connection list */
2250e9f9beaSJohn Barnard 	TAILQ_ENTRY(spdk_nvmf_fc_conn) assoc_link;
2260e9f9beaSJohn Barnard 
227cc6920a4SJosh Soref 	/* for associations's available connection list */
2280e9f9beaSJohn Barnard 	TAILQ_ENTRY(spdk_nvmf_fc_conn) assoc_avail_link;
2290e9f9beaSJohn Barnard 
230561a9f26SNaresh Gottumukkala 	/* for hwqp's rport connection list link  */
231561a9f26SNaresh Gottumukkala 	TAILQ_ENTRY(spdk_nvmf_fc_conn) rport_link;
232561a9f26SNaresh Gottumukkala 
233561a9f26SNaresh Gottumukkala 	/* Per connection fc_req pool */
234561a9f26SNaresh Gottumukkala 	STAILQ_HEAD(, spdk_nvmf_fc_pooled_request) pool_queue;
235561a9f26SNaresh Gottumukkala 
236561a9f26SNaresh Gottumukkala 	/* Memory for the fc_req pool objects */
237561a9f26SNaresh Gottumukkala 	struct spdk_nvmf_fc_pooled_request *pool_memory;
238561a9f26SNaresh Gottumukkala 
239561a9f26SNaresh Gottumukkala 	/* Pool size */
240561a9f26SNaresh Gottumukkala 	uint32_t pool_size;
241561a9f26SNaresh Gottumukkala 
242561a9f26SNaresh Gottumukkala 	/* Current free elem in pool */
243561a9f26SNaresh Gottumukkala 	uint32_t pool_free_elems;
244561a9f26SNaresh Gottumukkala 
245561a9f26SNaresh Gottumukkala 	TAILQ_HEAD(, spdk_nvmf_fc_request) in_use_reqs;
246561a9f26SNaresh Gottumukkala 
2479ae43465SNaresh Gottumukkala 	enum spdk_nvmf_fc_object_state conn_state;
2489ae43465SNaresh Gottumukkala 
249ed56a3d4SAnil Veerabhadrappa 	/* New QP create context. */
250ed56a3d4SAnil Veerabhadrappa 	struct nvmf_fc_ls_op_ctx *create_opd;
2519ae43465SNaresh Gottumukkala 
2529ae43465SNaresh Gottumukkala 	/* Delete conn callback list */
2539ae43465SNaresh Gottumukkala 	void *ls_del_op_ctx;
254*83e8405eSKalyan Kadiyala 
255*83e8405eSKalyan Kadiyala 	bool qpair_fini_done;
256*83e8405eSKalyan Kadiyala 	spdk_nvmf_fc_caller_cb qpair_fini_done_cb;
257*83e8405eSKalyan Kadiyala 	void *qpair_fini_done_cb_args;
2580e9f9beaSJohn Barnard };
2590e9f9beaSJohn Barnard 
2600e9f9beaSJohn Barnard /*
261ed56a3d4SAnil Veerabhadrappa  * Structure for maintaining the FC exchanges
2620e9f9beaSJohn Barnard  */
263ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_xchg {
264ed56a3d4SAnil Veerabhadrappa 	uint32_t xchg_id;   /* The actual xchg identifier */
265ed56a3d4SAnil Veerabhadrappa 
2660e9f9beaSJohn Barnard 	/* Internal */
267ed56a3d4SAnil Veerabhadrappa 	TAILQ_ENTRY(spdk_nvmf_fc_xchg) link;
268ed56a3d4SAnil Veerabhadrappa 	bool active;
269ed56a3d4SAnil Veerabhadrappa 	bool aborted;
270ed56a3d4SAnil Veerabhadrappa 	bool send_abts; /* Valid if is_aborted is set. */
2710e9f9beaSJohn Barnard };
2720e9f9beaSJohn Barnard 
273ed56a3d4SAnil Veerabhadrappa /*
274ed56a3d4SAnil Veerabhadrappa  *  FC poll group structure
275ed56a3d4SAnil Veerabhadrappa  */
276ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_poll_group {
277b9dc11f9SShuhei Matsumoto 	struct spdk_nvmf_transport_poll_group group;
278ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_tgt *nvmf_tgt;
279ed56a3d4SAnil Veerabhadrappa 	uint32_t hwqp_count; /* number of hwqp's assigned to this pg */
280ed56a3d4SAnil Veerabhadrappa 	TAILQ_HEAD(, spdk_nvmf_fc_hwqp) hwqp_list;
281ed56a3d4SAnil Veerabhadrappa 
282ed56a3d4SAnil Veerabhadrappa 	TAILQ_ENTRY(spdk_nvmf_fc_poll_group) link;
283ed56a3d4SAnil Veerabhadrappa };
2840e9f9beaSJohn Barnard 
2850e9f9beaSJohn Barnard /*
2860e8925dbSJim Harris  *  HWQP poller structure passed from main thread
2870e9f9beaSJohn Barnard  */
2880e9f9beaSJohn Barnard struct spdk_nvmf_fc_hwqp {
289ed56a3d4SAnil Veerabhadrappa 	enum spdk_fc_hwqp_state state;  /* queue state (for poller) */
290f892089fSNaresh Gottumukkala 	bool is_ls_queue;
2910e9f9beaSJohn Barnard 	uint32_t lcore_id;   /* core hwqp is running on (for tracing purposes only) */
2920e9f9beaSJohn Barnard 	struct spdk_thread *thread;  /* thread hwqp is running on */
2930e9f9beaSJohn Barnard 	uint32_t hwqp_id;    /* A unique id (per physical port) for a hwqp */
2940e9f9beaSJohn Barnard 	spdk_nvmf_fc_lld_hwqp_t queues;    /* vendor HW queue set */
2950e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_port *fc_port; /* HW port structure for these queues */
29699ea1d36SShuhei Matsumoto 	struct spdk_nvmf_fc_poll_group *fgroup;
2970e9f9beaSJohn Barnard 
298ed56a3d4SAnil Veerabhadrappa 	/* qpair (fc_connection) list */
2990e9f9beaSJohn Barnard 	uint32_t num_conns; /* number of connections to queue */
300b50c6bc2SNaresh Gottumukkala 	struct rte_hash *connection_list_hash;
301b50c6bc2SNaresh Gottumukkala 	struct rte_hash *rport_list_hash;
3020e9f9beaSJohn Barnard 
3030e9f9beaSJohn Barnard 	TAILQ_HEAD(, spdk_nvmf_fc_request) in_use_reqs;
3040e9f9beaSJohn Barnard 
3050e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_errors counters;
3060e9f9beaSJohn Barnard 
307ed56a3d4SAnil Veerabhadrappa 	/* Pending LS request waiting for FC resource */
3080e9f9beaSJohn Barnard 	TAILQ_HEAD(, spdk_nvmf_fc_ls_rqst) ls_pending_queue;
3090e9f9beaSJohn Barnard 
3100e9f9beaSJohn Barnard 	/* Sync req list */
3110e9f9beaSJohn Barnard 	TAILQ_HEAD(, spdk_nvmf_fc_poller_api_queue_sync_args) sync_cbs;
3120e9f9beaSJohn Barnard 
3130e9f9beaSJohn Barnard 	TAILQ_ENTRY(spdk_nvmf_fc_hwqp) link;
3140e9f9beaSJohn Barnard 
315ed56a3d4SAnil Veerabhadrappa 	void *context;			/* Vendor specific context data */
3160e9f9beaSJohn Barnard };
3170e9f9beaSJohn Barnard 
3180e9f9beaSJohn Barnard /*
3190e9f9beaSJohn Barnard  * FC HW port.
3200e9f9beaSJohn Barnard  */
3210e9f9beaSJohn Barnard struct spdk_nvmf_fc_port {
3220e9f9beaSJohn Barnard 	uint8_t port_hdl;
3231b011d5dSNaresh Gottumukkala 	spdk_nvmf_fc_lld_fc_port_t lld_fc_port;
3240e9f9beaSJohn Barnard 	enum spdk_fc_port_state hw_port_status;
3250e9f9beaSJohn Barnard 	uint16_t fcp_rq_id;
3260e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_hwqp ls_queue;
327ed56a3d4SAnil Veerabhadrappa 
3280e9f9beaSJohn Barnard 	uint32_t num_io_queues;
3290e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_hwqp *io_queues;
3300e9f9beaSJohn Barnard 	/*
3310e9f9beaSJohn Barnard 	 * List of nports on this HW port.
3320e9f9beaSJohn Barnard 	 */
3330e9f9beaSJohn Barnard 	TAILQ_HEAD(, spdk_nvmf_fc_nport)nport_list;
3340e9f9beaSJohn Barnard 	int	num_nports;
3350e9f9beaSJohn Barnard 	TAILQ_ENTRY(spdk_nvmf_fc_port) link;
3360e9f9beaSJohn Barnard 
337ed56a3d4SAnil Veerabhadrappa 	struct spdk_mempool *io_resource_pool; /* Pools to store bdev_io's for this port */
3380e9f9beaSJohn Barnard 	void *port_ctx;
3390e9f9beaSJohn Barnard };
3400e9f9beaSJohn Barnard 
3410e9f9beaSJohn Barnard /*
3420e9f9beaSJohn Barnard  * NVMF FC Request
3430e9f9beaSJohn Barnard  */
3440e9f9beaSJohn Barnard struct spdk_nvmf_fc_request {
3450e9f9beaSJohn Barnard 	struct spdk_nvmf_request req;
346892d8bc4SNaresh Gottumukkala 	union nvmf_h2c_msg cmd;
3470e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_ersp_iu ersp;
3480e9f9beaSJohn Barnard 	uint32_t poller_lcore; /* for tracing purposes only */
3490e9f9beaSJohn Barnard 	struct spdk_thread *poller_thread;
350ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_xchg *xchg;
3510e9f9beaSJohn Barnard 	uint16_t oxid;
3520e9f9beaSJohn Barnard 	uint16_t rpi;
3530e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_conn *fc_conn;
3540e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_hwqp *hwqp;
3550e9f9beaSJohn Barnard 	int state;
356cc6920a4SJosh Soref 	uint32_t transferred_len;
3570e9f9beaSJohn Barnard 	bool is_aborted;
3580e9f9beaSJohn Barnard 	uint32_t magic;
3590e9f9beaSJohn Barnard 	uint32_t s_id;
3600e9f9beaSJohn Barnard 	uint32_t d_id;
361cfc716feSNaresh Gottumukkala 	uint32_t csn;
36261dfdd2aSNaresh Gottumukkala 	uint32_t app_id;
36361dfdd2aSNaresh Gottumukkala 	uint8_t csctl;
3640e9f9beaSJohn Barnard 	TAILQ_ENTRY(spdk_nvmf_fc_request) link;
365561a9f26SNaresh Gottumukkala 	TAILQ_ENTRY(spdk_nvmf_fc_request) conn_link;
366cfc716feSNaresh Gottumukkala 	TAILQ_ENTRY(spdk_nvmf_fc_request) fused_link;
3670e9f9beaSJohn Barnard 	TAILQ_HEAD(, spdk_nvmf_fc_caller_ctx) abort_cbs;
3680e9f9beaSJohn Barnard };
3690e9f9beaSJohn Barnard 
3700e9f9beaSJohn Barnard SPDK_STATIC_ASSERT(!offsetof(struct spdk_nvmf_fc_request, req),
371b7201f8eSyidong0635 		   "FC request and NVMF request address don't match.");
3720e9f9beaSJohn Barnard 
373561a9f26SNaresh Gottumukkala struct spdk_nvmf_fc_pooled_request {
374561a9f26SNaresh Gottumukkala 	STAILQ_ENTRY(spdk_nvmf_fc_pooled_request) pool_link;
375561a9f26SNaresh Gottumukkala };
376ed56a3d4SAnil Veerabhadrappa 
3770e9f9beaSJohn Barnard /*
3780e9f9beaSJohn Barnard  * NVMF FC Association
3790e9f9beaSJohn Barnard  */
3800e9f9beaSJohn Barnard struct spdk_nvmf_fc_association {
3810e9f9beaSJohn Barnard 	uint64_t assoc_id;
3820e9f9beaSJohn Barnard 	uint32_t s_id;
3830e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_nport *tgtport;
3840e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_remote_port_info *rport;
3850e9f9beaSJohn Barnard 	struct spdk_nvmf_subsystem *subsystem;
386561a9f26SNaresh Gottumukkala 	struct spdk_nvmf_transport *nvmf_transport;
3870e9f9beaSJohn Barnard 	enum spdk_nvmf_fc_object_state assoc_state;
3880e9f9beaSJohn Barnard 
3890e9f9beaSJohn Barnard 	char host_id[FCNVME_ASSOC_HOSTID_LEN];
390d4877640SAnil Veerabhadrappa 	char host_nqn[SPDK_NVME_NQN_FIELD_SIZE];
391d4877640SAnil Veerabhadrappa 	char sub_nqn[SPDK_NVME_NQN_FIELD_SIZE];
3920e9f9beaSJohn Barnard 
3930e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_conn *aq_conn; /* connection for admin queue */
3940e9f9beaSJohn Barnard 
3950e9f9beaSJohn Barnard 	uint16_t conn_count;
3960e9f9beaSJohn Barnard 	TAILQ_HEAD(, spdk_nvmf_fc_conn) fc_conns;
3970e9f9beaSJohn Barnard 
3980e9f9beaSJohn Barnard 	void *conns_buf;
3990e9f9beaSJohn Barnard 	TAILQ_HEAD(, spdk_nvmf_fc_conn) avail_fc_conns;
4000e9f9beaSJohn Barnard 
4010e9f9beaSJohn Barnard 	TAILQ_ENTRY(spdk_nvmf_fc_association) link;
4020e9f9beaSJohn Barnard 
4030e9f9beaSJohn Barnard 	/* for port's association free list */
4040e9f9beaSJohn Barnard 	TAILQ_ENTRY(spdk_nvmf_fc_association) port_free_assoc_list_link;
4050e9f9beaSJohn Barnard 
4060e9f9beaSJohn Barnard 	void *ls_del_op_ctx; /* delete assoc. callback list */
4070e9f9beaSJohn Barnard 
408ed56a3d4SAnil Veerabhadrappa 	/* disconnect cmd buffers (sent to initiator) */
409ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_srsr_bufs *snd_disconn_bufs;
4100e9f9beaSJohn Barnard };
4110e9f9beaSJohn Barnard 
4120e9f9beaSJohn Barnard /*
4130e9f9beaSJohn Barnard  * FC Remote Port
4140e9f9beaSJohn Barnard  */
4150e9f9beaSJohn Barnard struct spdk_nvmf_fc_remote_port_info {
4160e9f9beaSJohn Barnard 	uint32_t s_id;
4170e9f9beaSJohn Barnard 	uint32_t rpi;
4180e9f9beaSJohn Barnard 	uint32_t assoc_count;
4190e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_wwn fc_nodename;
4200e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_wwn fc_portname;
4210e9f9beaSJohn Barnard 	enum spdk_nvmf_fc_object_state rport_state;
4220e9f9beaSJohn Barnard 	TAILQ_ENTRY(spdk_nvmf_fc_remote_port_info) link;
4230e9f9beaSJohn Barnard };
4240e9f9beaSJohn Barnard 
4250e9f9beaSJohn Barnard /*
4260e9f9beaSJohn Barnard  * Poller API error codes
4270e9f9beaSJohn Barnard  */
4280e9f9beaSJohn Barnard enum spdk_nvmf_fc_poller_api_ret {
4290e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_SUCCESS = 0,
4300e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_ERROR,
4310e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_INVALID_ARG,
4320e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_NO_CONN_ID,
4330e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_DUP_CONN_ID,
4340e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_OXID_NOT_FOUND,
4350e9f9beaSJohn Barnard };
4360e9f9beaSJohn Barnard 
4370e9f9beaSJohn Barnard /*
4380e9f9beaSJohn Barnard  * Poller API definitions
4390e9f9beaSJohn Barnard  */
4400e9f9beaSJohn Barnard enum spdk_nvmf_fc_poller_api {
4410e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_ADD_CONNECTION,
4420e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_DEL_CONNECTION,
4430e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_QUIESCE_QUEUE,
4440e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_ACTIVATE_QUEUE,
4450e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_ABTS_RECEIVED,
446ed56a3d4SAnil Veerabhadrappa 	SPDK_NVMF_FC_POLLER_API_REQ_ABORT_COMPLETE,
4470e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_ADAPTER_EVENT,
4480e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_AEN,
4490e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_QUEUE_SYNC,
4500e9f9beaSJohn Barnard 	SPDK_NVMF_FC_POLLER_API_QUEUE_SYNC_DONE,
451ed56a3d4SAnil Veerabhadrappa 	SPDK_NVMF_FC_POLLER_API_ADD_HWQP,
452ed56a3d4SAnil Veerabhadrappa 	SPDK_NVMF_FC_POLLER_API_REMOVE_HWQP,
4530e9f9beaSJohn Barnard };
4540e9f9beaSJohn Barnard 
4550e9f9beaSJohn Barnard /*
4560e9f9beaSJohn Barnard  * Poller API callback function proto
4570e9f9beaSJohn Barnard  */
4580e9f9beaSJohn Barnard typedef void (*spdk_nvmf_fc_poller_api_cb)(void *cb_data, enum spdk_nvmf_fc_poller_api_ret ret);
4590e9f9beaSJohn Barnard 
4600e9f9beaSJohn Barnard /*
4610e9f9beaSJohn Barnard  * Poller API callback data
4620e9f9beaSJohn Barnard  */
4630e9f9beaSJohn Barnard struct spdk_nvmf_fc_poller_api_cb_info {
464ed56a3d4SAnil Veerabhadrappa 	struct spdk_thread *cb_thread;
4650e9f9beaSJohn Barnard 	spdk_nvmf_fc_poller_api_cb cb_func;
4660e9f9beaSJohn Barnard 	void *cb_data;
4670e9f9beaSJohn Barnard 	enum spdk_nvmf_fc_poller_api_ret ret;
4680e9f9beaSJohn Barnard };
4690e9f9beaSJohn Barnard 
4700e9f9beaSJohn Barnard /*
4710e9f9beaSJohn Barnard  * Poller API structures
4720e9f9beaSJohn Barnard  */
4730e9f9beaSJohn Barnard struct spdk_nvmf_fc_poller_api_add_connection_args {
4740e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_conn *fc_conn;
4750e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_poller_api_cb_info cb_info;
4760e9f9beaSJohn Barnard };
4770e9f9beaSJohn Barnard 
4780e9f9beaSJohn Barnard struct spdk_nvmf_fc_poller_api_del_connection_args {
4790e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_conn *fc_conn;
4800e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_hwqp *hwqp;
4810e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_poller_api_cb_info cb_info;
4820e9f9beaSJohn Barnard 	bool send_abts;
4830e9f9beaSJohn Barnard 	/* internal */
4840e9f9beaSJohn Barnard 	int fc_request_cnt;
485ed56a3d4SAnil Veerabhadrappa 	bool backend_initiated;
4860e9f9beaSJohn Barnard };
4870e9f9beaSJohn Barnard 
4880e9f9beaSJohn Barnard struct spdk_nvmf_fc_poller_api_quiesce_queue_args {
4890e9f9beaSJohn Barnard 	void   *ctx;
4900e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_hwqp *hwqp;
4910e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_poller_api_cb_info cb_info;
4920e9f9beaSJohn Barnard };
4930e9f9beaSJohn Barnard 
4940e9f9beaSJohn Barnard struct spdk_nvmf_fc_poller_api_activate_queue_args {
4950e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_hwqp *hwqp;
4960e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_poller_api_cb_info cb_info;
4970e9f9beaSJohn Barnard };
4980e9f9beaSJohn Barnard 
4990e9f9beaSJohn Barnard struct spdk_nvmf_fc_poller_api_abts_recvd_args {
5000e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_abts_ctx *ctx;
5010e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_hwqp *hwqp;
5020e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_poller_api_cb_info cb_info;
5030e9f9beaSJohn Barnard };
5040e9f9beaSJohn Barnard 
5050e9f9beaSJohn Barnard struct spdk_nvmf_fc_poller_api_queue_sync_done_args {
5060e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_hwqp *hwqp;
507ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_poller_api_cb_info cb_info;
5080e9f9beaSJohn Barnard 	uint64_t tag;
5090e9f9beaSJohn Barnard };
5100e9f9beaSJohn Barnard 
511dc0d8962SNaresh Gottumukkala typedef void (*spdk_nvmf_fc_remove_hwqp_cb)(void *ctx, int err);
512dc0d8962SNaresh Gottumukkala 
513dc0d8962SNaresh Gottumukkala struct spdk_nvmf_fc_poller_api_remove_hwqp_args {
514dc0d8962SNaresh Gottumukkala 	struct spdk_nvmf_fc_hwqp *hwqp;
515dc0d8962SNaresh Gottumukkala 	spdk_nvmf_fc_remove_hwqp_cb cb_fn;
516dc0d8962SNaresh Gottumukkala 	void *cb_ctx;
517dc0d8962SNaresh Gottumukkala 	struct spdk_nvmf_fc_poller_api_cb_info cb_info;
518dc0d8962SNaresh Gottumukkala };
519dc0d8962SNaresh Gottumukkala 
520b50c6bc2SNaresh Gottumukkala struct spdk_nvmf_fc_hwqp_rport {
521b50c6bc2SNaresh Gottumukkala 	uint16_t rpi;
522b50c6bc2SNaresh Gottumukkala 	TAILQ_HEAD(, spdk_nvmf_fc_conn) conn_list;
523b50c6bc2SNaresh Gottumukkala };
524b50c6bc2SNaresh Gottumukkala 
5250e9f9beaSJohn Barnard /*
5260e9f9beaSJohn Barnard  * NVMF LS request structure
5270e9f9beaSJohn Barnard  */
5280e9f9beaSJohn Barnard struct spdk_nvmf_fc_ls_rqst {
5290e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_buffer_desc rqstbuf;
5300e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_buffer_desc rspbuf;
5310e9f9beaSJohn Barnard 	uint32_t rqst_len;
5320e9f9beaSJohn Barnard 	uint32_t rsp_len;
5330e9f9beaSJohn Barnard 	uint32_t rpi;
534ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_xchg *xchg;
5350e9f9beaSJohn Barnard 	uint16_t oxid;
5360e9f9beaSJohn Barnard 	void *private_data; /* for LLD only (LS does not touch) */
5370e9f9beaSJohn Barnard 	TAILQ_ENTRY(spdk_nvmf_fc_ls_rqst) ls_pending_link;
5380e9f9beaSJohn Barnard 	uint32_t s_id;
5390e9f9beaSJohn Barnard 	uint32_t d_id;
5400e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_nport *nport;
5410e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_remote_port_info *rport;
5420e9f9beaSJohn Barnard 	struct spdk_nvmf_tgt *nvmf_tgt;
5430e9f9beaSJohn Barnard };
5440e9f9beaSJohn Barnard 
5450e9f9beaSJohn Barnard /*
5460e9f9beaSJohn Barnard  * RQ Buffer LS Overlay Structure
5470e9f9beaSJohn Barnard  */
5488a5a15b8SPawel Wodkowski #define FCNVME_LS_RSVD_SIZE (FCNVME_MAX_LS_BUFFER_SIZE - \
5498a5a15b8SPawel Wodkowski 	(sizeof(struct spdk_nvmf_fc_ls_rqst) + FCNVME_MAX_LS_REQ_SIZE + FCNVME_MAX_LS_RSP_SIZE))
5508a5a15b8SPawel Wodkowski 
551e7ceb0b9SBen Walker struct spdk_nvmf_fc_rq_buf_ls_request {
5520e9f9beaSJohn Barnard 	uint8_t rqst[FCNVME_MAX_LS_REQ_SIZE];
5530e9f9beaSJohn Barnard 	uint8_t resp[FCNVME_MAX_LS_RSP_SIZE];
5540e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_ls_rqst ls_rqst;
5558a5a15b8SPawel Wodkowski 	uint8_t rsvd[FCNVME_LS_RSVD_SIZE];
5560e9f9beaSJohn Barnard };
5570e9f9beaSJohn Barnard 
5580e9f9beaSJohn Barnard SPDK_STATIC_ASSERT(sizeof(struct spdk_nvmf_fc_rq_buf_ls_request) ==
5590e9f9beaSJohn Barnard 		   FCNVME_MAX_LS_BUFFER_SIZE, "LS RQ Buffer overflow");
5600e9f9beaSJohn Barnard 
561ed56a3d4SAnil Veerabhadrappa /* Poller API structures (arguments and callback data */
562ed56a3d4SAnil Veerabhadrappa typedef void (*spdk_nvmf_fc_del_assoc_cb)(void *arg, uint32_t err);
563e89d9af0SNaresh Gottumukkala typedef void (*spdk_nvmf_fc_del_conn_cb)(void *arg);
564ed56a3d4SAnil Veerabhadrappa 
565ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_add_conn_api_data {
566ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_poller_api_add_connection_args args;
567ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_ls_rqst *ls_rqst;
568ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_association *assoc;
569ed56a3d4SAnil Veerabhadrappa 	bool aq_conn; /* true if adding connection for new association */
570ed56a3d4SAnil Veerabhadrappa };
571ed56a3d4SAnil Veerabhadrappa 
572ed56a3d4SAnil Veerabhadrappa /* Disconnect (connection) request functions */
573ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_del_conn_api_data {
574ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_poller_api_del_connection_args args;
575ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_ls_rqst *ls_rqst;
576ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_association *assoc;
577ed56a3d4SAnil Veerabhadrappa 	bool aq_conn; /* true if deleting AQ connection */
578e89d9af0SNaresh Gottumukkala 	spdk_nvmf_fc_del_conn_cb del_conn_cb;
579e89d9af0SNaresh Gottumukkala 	void *del_conn_cb_data;
580ed56a3d4SAnil Veerabhadrappa };
581ed56a3d4SAnil Veerabhadrappa 
582ed56a3d4SAnil Veerabhadrappa /* used by LS disconnect association cmd handling */
583ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_ls_disconn_assoc_api_data {
584ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_nport *tgtport;
585ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_ls_rqst *ls_rqst;
586ed56a3d4SAnil Veerabhadrappa };
587ed56a3d4SAnil Veerabhadrappa 
588ed56a3d4SAnil Veerabhadrappa /* used by delete association call */
589ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_delete_assoc_api_data {
590ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_poller_api_del_connection_args args;
591ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_association *assoc;
592ed56a3d4SAnil Veerabhadrappa 	bool from_ls_rqst;   /* true = request came for LS */
593ed56a3d4SAnil Veerabhadrappa 	spdk_nvmf_fc_del_assoc_cb del_assoc_cb;
594ed56a3d4SAnil Veerabhadrappa 	void *del_assoc_cb_data;
595ed56a3d4SAnil Veerabhadrappa };
596ed56a3d4SAnil Veerabhadrappa 
597ed56a3d4SAnil Veerabhadrappa struct nvmf_fc_ls_op_ctx {
598ed56a3d4SAnil Veerabhadrappa 	union {
599ed56a3d4SAnil Veerabhadrappa 		struct spdk_nvmf_fc_ls_add_conn_api_data add_conn;
600ed56a3d4SAnil Veerabhadrappa 		struct spdk_nvmf_fc_ls_del_conn_api_data del_conn;
601ed56a3d4SAnil Veerabhadrappa 		struct spdk_nvmf_fc_ls_disconn_assoc_api_data disconn_assoc;
602ed56a3d4SAnil Veerabhadrappa 		struct spdk_nvmf_fc_delete_assoc_api_data del_assoc;
603ed56a3d4SAnil Veerabhadrappa 	} u;
604ed56a3d4SAnil Veerabhadrappa 	struct  nvmf_fc_ls_op_ctx *next_op_ctx;
605ed56a3d4SAnil Veerabhadrappa };
6060e9f9beaSJohn Barnard 
6070e9f9beaSJohn Barnard struct spdk_nvmf_fc_poller_api_queue_sync_args {
6080e9f9beaSJohn Barnard 	uint64_t u_id;
6090e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_hwqp *hwqp;
6100e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_poller_api_cb_info cb_info;
6110e9f9beaSJohn Barnard 
6120e9f9beaSJohn Barnard 	/* Used internally by poller */
6130e9f9beaSJohn Barnard 	TAILQ_ENTRY(spdk_nvmf_fc_poller_api_queue_sync_args) link;
6140e9f9beaSJohn Barnard };
6150e9f9beaSJohn Barnard 
616ed56a3d4SAnil Veerabhadrappa /**
6170e8925dbSJim Harris  * Following defines and structures are used to pass messages between main thread
618ed56a3d4SAnil Veerabhadrappa  * and FCT driver.
619ed56a3d4SAnil Veerabhadrappa  */
620ed56a3d4SAnil Veerabhadrappa enum spdk_fc_event {
621ed56a3d4SAnil Veerabhadrappa 	SPDK_FC_HW_PORT_INIT,
622e3c78a64SNaresh Gottumukkala 	SPDK_FC_HW_PORT_FREE,
623ed56a3d4SAnil Veerabhadrappa 	SPDK_FC_HW_PORT_ONLINE,
624ed56a3d4SAnil Veerabhadrappa 	SPDK_FC_HW_PORT_OFFLINE,
625ed56a3d4SAnil Veerabhadrappa 	SPDK_FC_HW_PORT_RESET,
626ed56a3d4SAnil Veerabhadrappa 	SPDK_FC_NPORT_CREATE,
627ed56a3d4SAnil Veerabhadrappa 	SPDK_FC_NPORT_DELETE,
628ed56a3d4SAnil Veerabhadrappa 	SPDK_FC_IT_ADD,    /* PRLI */
629ed56a3d4SAnil Veerabhadrappa 	SPDK_FC_IT_DELETE, /* PRLI */
630ed56a3d4SAnil Veerabhadrappa 	SPDK_FC_ABTS_RECV,
631ed56a3d4SAnil Veerabhadrappa 	SPDK_FC_HW_PORT_DUMP,
632ed56a3d4SAnil Veerabhadrappa 	SPDK_FC_UNRECOVERABLE_ERR,
633ed56a3d4SAnil Veerabhadrappa 	SPDK_FC_EVENT_MAX,
634ed56a3d4SAnil Veerabhadrappa };
635ed56a3d4SAnil Veerabhadrappa 
636ed56a3d4SAnil Veerabhadrappa /**
637ed56a3d4SAnil Veerabhadrappa  * Arguments for to dump assoc id
638ed56a3d4SAnil Veerabhadrappa  */
639ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_dump_assoc_id_args {
640ed56a3d4SAnil Veerabhadrappa 	uint8_t                           pport_handle;
641ed56a3d4SAnil Veerabhadrappa 	uint16_t                          nport_handle;
642ed56a3d4SAnil Veerabhadrappa 	uint32_t                          assoc_id;
643ed56a3d4SAnil Veerabhadrappa };
644ed56a3d4SAnil Veerabhadrappa 
645ed56a3d4SAnil Veerabhadrappa /**
646ed56a3d4SAnil Veerabhadrappa  * Arguments for HW port init event.
647ed56a3d4SAnil Veerabhadrappa  */
648ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_hw_port_init_args {
6491b011d5dSNaresh Gottumukkala 	spdk_nvmf_fc_lld_fc_port_t     lld_fc_port;
650ed56a3d4SAnil Veerabhadrappa 	uint32_t                       ls_queue_size;
651ed56a3d4SAnil Veerabhadrappa 	spdk_nvmf_fc_lld_hwqp_t        ls_queue;
652ed56a3d4SAnil Veerabhadrappa 	uint32_t                       io_queue_size;
653ed56a3d4SAnil Veerabhadrappa 	uint32_t                       io_queue_cnt;
654ed56a3d4SAnil Veerabhadrappa 	spdk_nvmf_fc_lld_hwqp_t       *io_queues;
655ed56a3d4SAnil Veerabhadrappa 	void                          *cb_ctx;
656ed56a3d4SAnil Veerabhadrappa 	void                          *port_ctx;
657ed56a3d4SAnil Veerabhadrappa 	uint8_t                        port_handle;
658ed56a3d4SAnil Veerabhadrappa 	uint8_t                        nvme_aq_index;  /* io_queue used for nvme admin queue */
659ed56a3d4SAnil Veerabhadrappa 	uint16_t                       fcp_rq_id; /* Base rq ID of SCSI queue */
660ed56a3d4SAnil Veerabhadrappa };
661ed56a3d4SAnil Veerabhadrappa 
662ed56a3d4SAnil Veerabhadrappa /**
663ed56a3d4SAnil Veerabhadrappa  * Arguments for HW port online event.
664ed56a3d4SAnil Veerabhadrappa  */
665ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_hw_port_online_args {
666ed56a3d4SAnil Veerabhadrappa 	uint8_t port_handle;
667ed56a3d4SAnil Veerabhadrappa 	void   *cb_ctx;
668ed56a3d4SAnil Veerabhadrappa };
669ed56a3d4SAnil Veerabhadrappa 
670ed56a3d4SAnil Veerabhadrappa /**
671ed56a3d4SAnil Veerabhadrappa  * Arguments for HW port offline event.
672ed56a3d4SAnil Veerabhadrappa  */
673ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_hw_port_offline_args {
674ed56a3d4SAnil Veerabhadrappa 	uint8_t port_handle;
675ed56a3d4SAnil Veerabhadrappa 	void   *cb_ctx;
676ed56a3d4SAnil Veerabhadrappa };
677ed56a3d4SAnil Veerabhadrappa 
678ed56a3d4SAnil Veerabhadrappa /**
679ed56a3d4SAnil Veerabhadrappa  * Arguments for n-port add event.
680ed56a3d4SAnil Veerabhadrappa  */
681ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_nport_create_args {
682ed56a3d4SAnil Veerabhadrappa 	uint8_t                     port_handle;
683ed56a3d4SAnil Veerabhadrappa 	uint16_t                    nport_handle;
684ed56a3d4SAnil Veerabhadrappa 	struct spdk_uuid            container_uuid; /* UUID of the nports container */
685ed56a3d4SAnil Veerabhadrappa 	struct spdk_uuid            nport_uuid;     /* Unique UUID for the nport */
686ed56a3d4SAnil Veerabhadrappa 	uint32_t                    d_id;
687ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_wwn fc_nodename;
688ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_wwn fc_portname;
689ed56a3d4SAnil Veerabhadrappa 	uint32_t                    subsys_id; /* Subsystemid */
690ed56a3d4SAnil Veerabhadrappa 	char                        port_id[SPDK_NVMF_PORT_ID_MAX_LEN];
691ed56a3d4SAnil Veerabhadrappa 	void                       *cb_ctx;
692ed56a3d4SAnil Veerabhadrappa };
693ed56a3d4SAnil Veerabhadrappa 
694ed56a3d4SAnil Veerabhadrappa /**
695ed56a3d4SAnil Veerabhadrappa  * Arguments for n-port delete event.
696ed56a3d4SAnil Veerabhadrappa  */
697ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_nport_delete_args {
698ed56a3d4SAnil Veerabhadrappa 	uint8_t  port_handle;
699ed56a3d4SAnil Veerabhadrappa 	uint32_t nport_handle;
700ed56a3d4SAnil Veerabhadrappa 	uint32_t subsys_id; /* Subsystem id */
701ed56a3d4SAnil Veerabhadrappa 	void    *cb_ctx;
702ed56a3d4SAnil Veerabhadrappa };
703ed56a3d4SAnil Veerabhadrappa 
704ed56a3d4SAnil Veerabhadrappa /**
705ed56a3d4SAnil Veerabhadrappa  * Arguments for I_T add event.
706ed56a3d4SAnil Veerabhadrappa  */
707ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_hw_i_t_add_args {
708ed56a3d4SAnil Veerabhadrappa 	uint8_t                      port_handle;
709ed56a3d4SAnil Veerabhadrappa 	uint32_t                     nport_handle;
710ed56a3d4SAnil Veerabhadrappa 	uint16_t                     itn_handle;
711ed56a3d4SAnil Veerabhadrappa 	uint32_t                     rpi;
712ed56a3d4SAnil Veerabhadrappa 	uint32_t                     s_id;
713ed56a3d4SAnil Veerabhadrappa 	uint32_t                     initiator_prli_info;
7140e8925dbSJim Harris 	uint32_t                     target_prli_info; /* populated by the SPDK main */
715ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_wwn  fc_nodename;
716ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_wwn  fc_portname;
717ed56a3d4SAnil Veerabhadrappa 	void                        *cb_ctx;
718ed56a3d4SAnil Veerabhadrappa };
719ed56a3d4SAnil Veerabhadrappa 
720ed56a3d4SAnil Veerabhadrappa /**
721ed56a3d4SAnil Veerabhadrappa  * Arguments for I_T delete event.
722ed56a3d4SAnil Veerabhadrappa  */
723ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_hw_i_t_delete_args {
724ed56a3d4SAnil Veerabhadrappa 	uint8_t  port_handle;
725ed56a3d4SAnil Veerabhadrappa 	uint32_t nport_handle;
726ed56a3d4SAnil Veerabhadrappa 	uint16_t itn_handle;    /* Only used by FC LLD driver; unused in SPDK */
727ed56a3d4SAnil Veerabhadrappa 	uint32_t rpi;
728ed56a3d4SAnil Veerabhadrappa 	uint32_t s_id;
729ed56a3d4SAnil Veerabhadrappa 	void    *cb_ctx;
730ed56a3d4SAnil Veerabhadrappa };
731ed56a3d4SAnil Veerabhadrappa 
732ed56a3d4SAnil Veerabhadrappa /**
733ed56a3d4SAnil Veerabhadrappa  * Arguments for ABTS  event.
734ed56a3d4SAnil Veerabhadrappa  */
735ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_abts_args {
736ed56a3d4SAnil Veerabhadrappa 	uint8_t  port_handle;
737ed56a3d4SAnil Veerabhadrappa 	uint32_t nport_handle;
738ed56a3d4SAnil Veerabhadrappa 	uint32_t rpi;
739ed56a3d4SAnil Veerabhadrappa 	uint16_t oxid, rxid;
740ed56a3d4SAnil Veerabhadrappa 	void    *cb_ctx;
741ed56a3d4SAnil Veerabhadrappa };
742ed56a3d4SAnil Veerabhadrappa 
743ed56a3d4SAnil Veerabhadrappa /**
744ed56a3d4SAnil Veerabhadrappa  * Arguments for port reset event.
745ed56a3d4SAnil Veerabhadrappa  */
746ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_hw_port_reset_args {
747ed56a3d4SAnil Veerabhadrappa 	uint8_t    port_handle;
748ed56a3d4SAnil Veerabhadrappa 	bool       dump_queues;
749ed56a3d4SAnil Veerabhadrappa 	char       reason[SPDK_FC_HW_DUMP_REASON_STR_MAX_SIZE];
750ed56a3d4SAnil Veerabhadrappa 	uint32_t **dump_buf;
751ed56a3d4SAnil Veerabhadrappa 	void      *cb_ctx;
752ed56a3d4SAnil Veerabhadrappa };
753ed56a3d4SAnil Veerabhadrappa 
754ed56a3d4SAnil Veerabhadrappa /**
755ed56a3d4SAnil Veerabhadrappa  * Arguments for unrecoverable error event
756ed56a3d4SAnil Veerabhadrappa  */
757ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_unrecoverable_error_event_args {
758ed56a3d4SAnil Veerabhadrappa };
759ed56a3d4SAnil Veerabhadrappa 
760e3c78a64SNaresh Gottumukkala struct spdk_nvmf_fc_hw_port_free_args {
761e3c78a64SNaresh Gottumukkala 	uint8_t port_handle;
762e3c78a64SNaresh Gottumukkala 	void    *cb_ctx;
763e3c78a64SNaresh Gottumukkala };
764e3c78a64SNaresh Gottumukkala 
765ed56a3d4SAnil Veerabhadrappa /**
766ed56a3d4SAnil Veerabhadrappa  * Callback function to the FCT driver.
767ed56a3d4SAnil Veerabhadrappa  */
768ed56a3d4SAnil Veerabhadrappa typedef void (*spdk_nvmf_fc_callback)(uint8_t port_handle,
769ed56a3d4SAnil Veerabhadrappa 				      enum spdk_fc_event event_type,
770ed56a3d4SAnil Veerabhadrappa 				      void *arg, int err);
771ed56a3d4SAnil Veerabhadrappa 
772dc0d8962SNaresh Gottumukkala struct spdk_nvmf_fc_remove_hwqp_cb_args {
773dc0d8962SNaresh Gottumukkala 	uint16_t pending_remove_hwqp;
774dc0d8962SNaresh Gottumukkala 	spdk_nvmf_fc_callback cb_fn;
775dc0d8962SNaresh Gottumukkala 	void *cb_args;
776dc0d8962SNaresh Gottumukkala };
777dc0d8962SNaresh Gottumukkala 
778ed56a3d4SAnil Veerabhadrappa /**
7790e8925dbSJim Harris  * Enqueue an FCT event to main thread
780ed56a3d4SAnil Veerabhadrappa  *
781ed56a3d4SAnil Veerabhadrappa  * \param event_type Type of the event.
782ed56a3d4SAnil Veerabhadrappa  * \param args Pointer to the argument structure.
783ed56a3d4SAnil Veerabhadrappa  * \param cb_func Callback function into fc driver.
784ed56a3d4SAnil Veerabhadrappa  *
785ed56a3d4SAnil Veerabhadrappa  * \return 0 on success, non-zero on failure.
786ed56a3d4SAnil Veerabhadrappa  */
7878dd1cd21SBen Walker int nvmf_fc_main_enqueue_event(enum spdk_fc_event event_type,
788ed56a3d4SAnil Veerabhadrappa 			       void *args,
789ed56a3d4SAnil Veerabhadrappa 			       spdk_nvmf_fc_callback cb_func);
790ed56a3d4SAnil Veerabhadrappa 
7910e9f9beaSJohn Barnard /*
7920e9f9beaSJohn Barnard  * dump info
7930e9f9beaSJohn Barnard  */
7940e9f9beaSJohn Barnard struct spdk_nvmf_fc_queue_dump_info {
7950e9f9beaSJohn Barnard 	char *buffer;
7960e9f9beaSJohn Barnard 	int   offset;
7970e9f9beaSJohn Barnard };
7980e9f9beaSJohn Barnard #define SPDK_FC_HW_DUMP_BUF_SIZE (10 * 4096)
7990e9f9beaSJohn Barnard 
8000e9f9beaSJohn Barnard static inline void
80161d85773SSeth Howell nvmf_fc_dump_buf_print(struct spdk_nvmf_fc_queue_dump_info *dump_info, char *fmt, ...)
8020e9f9beaSJohn Barnard {
8030e9f9beaSJohn Barnard 	uint64_t buffer_size = SPDK_FC_HW_DUMP_BUF_SIZE;
8040e9f9beaSJohn Barnard 	int32_t avail = (int32_t)(buffer_size - dump_info->offset);
8050e9f9beaSJohn Barnard 
8060e9f9beaSJohn Barnard 	if (avail > 0) {
8070e9f9beaSJohn Barnard 		va_list ap;
8080e9f9beaSJohn Barnard 		int32_t written;
8090e9f9beaSJohn Barnard 
8100e9f9beaSJohn Barnard 		va_start(ap, fmt);
8110e9f9beaSJohn Barnard 		written = vsnprintf(dump_info->buffer + dump_info->offset, avail, fmt, ap);
8120e9f9beaSJohn Barnard 		if (written >= avail) {
8130e9f9beaSJohn Barnard 			dump_info->offset += avail;
8140e9f9beaSJohn Barnard 		} else {
8150e9f9beaSJohn Barnard 			dump_info->offset += written;
8160e9f9beaSJohn Barnard 		}
8170e9f9beaSJohn Barnard 		va_end(ap);
8180e9f9beaSJohn Barnard 	}
8190e9f9beaSJohn Barnard }
8200e9f9beaSJohn Barnard 
8210e9f9beaSJohn Barnard /*
8220e9f9beaSJohn Barnard  * NVMF FC caller callback definitions
8230e9f9beaSJohn Barnard  */
8240e9f9beaSJohn Barnard 
8250e9f9beaSJohn Barnard struct spdk_nvmf_fc_caller_ctx {
8260e9f9beaSJohn Barnard 	void *ctx;
8270e9f9beaSJohn Barnard 	spdk_nvmf_fc_caller_cb cb;
8280e9f9beaSJohn Barnard 	void *cb_args;
8290e9f9beaSJohn Barnard 	TAILQ_ENTRY(spdk_nvmf_fc_caller_ctx) link;
8300e9f9beaSJohn Barnard };
8310e9f9beaSJohn Barnard 
8320e9f9beaSJohn Barnard /*
833ed56a3d4SAnil Veerabhadrappa  * NVMF FC Exchange Info (for debug)
8340e9f9beaSJohn Barnard  */
835ed56a3d4SAnil Veerabhadrappa struct spdk_nvmf_fc_xchg_info {
836ed56a3d4SAnil Veerabhadrappa 	uint32_t xchg_base;
837ed56a3d4SAnil Veerabhadrappa 	uint32_t xchg_total_count;
838ed56a3d4SAnil Veerabhadrappa 	uint32_t xchg_avail_count;
839ed56a3d4SAnil Veerabhadrappa 	uint32_t send_frame_xchg_id;
840ed56a3d4SAnil Veerabhadrappa 	uint8_t send_frame_seqid;
8410e9f9beaSJohn Barnard };
8420e9f9beaSJohn Barnard 
8430e9f9beaSJohn Barnard /*
8440e9f9beaSJohn Barnard  * NVMF FC inline and function prototypes
8450e9f9beaSJohn Barnard  */
8460e9f9beaSJohn Barnard 
8470e9f9beaSJohn Barnard static inline struct spdk_nvmf_fc_request *
84861d85773SSeth Howell nvmf_fc_get_fc_req(struct spdk_nvmf_request *req)
8490e9f9beaSJohn Barnard {
8500e9f9beaSJohn Barnard 	return (struct spdk_nvmf_fc_request *)
8510e9f9beaSJohn Barnard 	       ((uintptr_t)req - offsetof(struct spdk_nvmf_fc_request, req));
8520e9f9beaSJohn Barnard }
8530e9f9beaSJohn Barnard 
8540e9f9beaSJohn Barnard static inline bool
85561d85773SSeth Howell nvmf_fc_is_port_dead(struct spdk_nvmf_fc_hwqp *hwqp)
8560e9f9beaSJohn Barnard {
8570e9f9beaSJohn Barnard 	switch (hwqp->fc_port->hw_port_status) {
8580e9f9beaSJohn Barnard 	case SPDK_FC_PORT_QUIESCED:
8590e9f9beaSJohn Barnard 		return true;
8600e9f9beaSJohn Barnard 	default:
8610e9f9beaSJohn Barnard 		return false;
8620e9f9beaSJohn Barnard 	}
8630e9f9beaSJohn Barnard }
8640e9f9beaSJohn Barnard 
8650e9f9beaSJohn Barnard static inline bool
86661d85773SSeth Howell nvmf_fc_req_in_xfer(struct spdk_nvmf_fc_request *fc_req)
8670e9f9beaSJohn Barnard {
8680e9f9beaSJohn Barnard 	switch (fc_req->state) {
8690e9f9beaSJohn Barnard 	case SPDK_NVMF_FC_REQ_READ_XFER:
8700e9f9beaSJohn Barnard 	case SPDK_NVMF_FC_REQ_READ_RSP:
8710e9f9beaSJohn Barnard 	case SPDK_NVMF_FC_REQ_WRITE_XFER:
8720e9f9beaSJohn Barnard 	case SPDK_NVMF_FC_REQ_WRITE_RSP:
8730e9f9beaSJohn Barnard 	case SPDK_NVMF_FC_REQ_NONE_RSP:
8740e9f9beaSJohn Barnard 		return true;
8750e9f9beaSJohn Barnard 	default:
8760e9f9beaSJohn Barnard 		return false;
8770e9f9beaSJohn Barnard 	}
8780e9f9beaSJohn Barnard }
8790e9f9beaSJohn Barnard 
880ed56a3d4SAnil Veerabhadrappa static inline void
88161d85773SSeth Howell nvmf_fc_create_trid(struct spdk_nvme_transport_id *trid, uint64_t n_wwn, uint64_t p_wwn)
882ed56a3d4SAnil Veerabhadrappa {
8837ed0904bSSeth Howell 	spdk_nvme_trid_populate_transport(trid, SPDK_NVME_TRANSPORT_FC);
884ed56a3d4SAnil Veerabhadrappa 	trid->adrfam = SPDK_NVMF_ADRFAM_FC;
885ed56a3d4SAnil Veerabhadrappa 	snprintf(trid->trsvcid, sizeof(trid->trsvcid), "none");
886ed56a3d4SAnil Veerabhadrappa 	snprintf(trid->traddr, sizeof(trid->traddr), "nn-0x%lx:pn-0x%lx", n_wwn, p_wwn);
887ed56a3d4SAnil Veerabhadrappa }
8880e9f9beaSJohn Barnard 
88961d85773SSeth Howell void nvmf_fc_ls_init(struct spdk_nvmf_fc_port *fc_port);
8900e9f9beaSJohn Barnard 
89161d85773SSeth Howell void nvmf_fc_ls_fini(struct spdk_nvmf_fc_port *fc_port);
8920e9f9beaSJohn Barnard 
89361d85773SSeth Howell void nvmf_fc_handle_ls_rqst(struct spdk_nvmf_fc_ls_rqst *ls_rqst);
894ed56a3d4SAnil Veerabhadrappa void nvmf_fc_ls_add_conn_failure(
895ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_association *assoc,
896ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_ls_rqst *ls_rqst,
897ed56a3d4SAnil Veerabhadrappa 	struct spdk_nvmf_fc_conn *fc_conn,
898ed56a3d4SAnil Veerabhadrappa 	bool aq_conn);
8990e9f9beaSJohn Barnard 
900b50c6bc2SNaresh Gottumukkala int nvmf_fc_init_hwqp(struct spdk_nvmf_fc_port *fc_port, struct spdk_nvmf_fc_hwqp *hwqp);
9010e9f9beaSJohn Barnard 
90261d85773SSeth Howell struct spdk_nvmf_fc_conn *nvmf_fc_hwqp_find_fc_conn(struct spdk_nvmf_fc_hwqp *hwqp,
903ed56a3d4SAnil Veerabhadrappa 		uint64_t conn_id);
9040e9f9beaSJohn Barnard 
90561d85773SSeth Howell struct spdk_nvmf_fc_port *nvmf_fc_port_lookup(uint8_t port_hdl);
9060e9f9beaSJohn Barnard 
90761d85773SSeth Howell bool nvmf_fc_port_is_offline(struct spdk_nvmf_fc_port *fc_port);
9080e9f9beaSJohn Barnard 
90961d85773SSeth Howell int nvmf_fc_port_set_offline(struct spdk_nvmf_fc_port *fc_port);
9100e9f9beaSJohn Barnard 
91161d85773SSeth Howell bool nvmf_fc_port_is_online(struct spdk_nvmf_fc_port *fc_port);
9120e9f9beaSJohn Barnard 
91361d85773SSeth Howell int nvmf_fc_port_set_online(struct spdk_nvmf_fc_port *fc_port);
9140e9f9beaSJohn Barnard 
91561d85773SSeth Howell int nvmf_fc_rport_set_state(struct spdk_nvmf_fc_remote_port_info *rport,
9160e9f9beaSJohn Barnard 			    enum spdk_nvmf_fc_object_state state);
9170e9f9beaSJohn Barnard 
91861d85773SSeth Howell void nvmf_fc_port_add(struct spdk_nvmf_fc_port *fc_port);
9190e9f9beaSJohn Barnard 
92061d85773SSeth Howell int nvmf_fc_port_add_nport(struct spdk_nvmf_fc_port *fc_port,
9210e9f9beaSJohn Barnard 			   struct spdk_nvmf_fc_nport *nport);
9220e9f9beaSJohn Barnard 
92361d85773SSeth Howell int nvmf_fc_port_remove_nport(struct spdk_nvmf_fc_port *fc_port,
9240e9f9beaSJohn Barnard 			      struct spdk_nvmf_fc_nport *nport);
9250e9f9beaSJohn Barnard 
92661d85773SSeth Howell struct spdk_nvmf_fc_nport *nvmf_fc_nport_find(uint8_t port_hdl, uint16_t nport_hdl);
927ed56a3d4SAnil Veerabhadrappa 
92861d85773SSeth Howell int nvmf_fc_nport_set_state(struct spdk_nvmf_fc_nport *nport,
929ed56a3d4SAnil Veerabhadrappa 			    enum spdk_nvmf_fc_object_state state);
930ed56a3d4SAnil Veerabhadrappa 
93161d85773SSeth Howell bool nvmf_fc_nport_add_rem_port(struct spdk_nvmf_fc_nport *nport,
932ed56a3d4SAnil Veerabhadrappa 				struct spdk_nvmf_fc_remote_port_info *rem_port);
933ed56a3d4SAnil Veerabhadrappa 
93461d85773SSeth Howell bool nvmf_fc_nport_remove_rem_port(struct spdk_nvmf_fc_nport *nport,
935ed56a3d4SAnil Veerabhadrappa 				   struct spdk_nvmf_fc_remote_port_info *rem_port);
936ed56a3d4SAnil Veerabhadrappa 
93761d85773SSeth Howell bool nvmf_fc_nport_has_no_rport(struct spdk_nvmf_fc_nport *nport);
938ed56a3d4SAnil Veerabhadrappa 
93961d85773SSeth Howell int nvmf_fc_assoc_set_state(struct spdk_nvmf_fc_association *assoc,
940ed56a3d4SAnil Veerabhadrappa 			    enum spdk_nvmf_fc_object_state state);
941ed56a3d4SAnil Veerabhadrappa 
94261d85773SSeth Howell int nvmf_fc_delete_association(struct spdk_nvmf_fc_nport *tgtport,
943ed56a3d4SAnil Veerabhadrappa 			       uint64_t assoc_id, bool send_abts, bool backend_initiated,
944ed56a3d4SAnil Veerabhadrappa 			       spdk_nvmf_fc_del_assoc_cb del_assoc_cb,
945ed56a3d4SAnil Veerabhadrappa 			       void *cb_data);
946ed56a3d4SAnil Veerabhadrappa 
947e89d9af0SNaresh Gottumukkala int nvmf_fc_delete_connection(struct spdk_nvmf_fc_conn *fc_conn, bool send_abts,
948e89d9af0SNaresh Gottumukkala 			      bool backend_initiated, spdk_nvmf_fc_del_conn_cb cb_fn,
949e89d9af0SNaresh Gottumukkala 			      void *cb_data);
950e89d9af0SNaresh Gottumukkala 
95161d85773SSeth Howell bool nvmf_ctrlr_is_on_nport(uint8_t port_hdl, uint16_t nport_hdl,
952ed56a3d4SAnil Veerabhadrappa 			    struct spdk_nvmf_ctrlr *ctrlr);
953ed56a3d4SAnil Veerabhadrappa 
9540e8925dbSJim Harris void nvmf_fc_assign_queue_to_main_thread(struct spdk_nvmf_fc_hwqp *hwqp);
955ed56a3d4SAnil Veerabhadrappa 
956dc0d8962SNaresh Gottumukkala bool nvmf_fc_poll_group_valid(struct spdk_nvmf_fc_poll_group *fgroup);
957dc0d8962SNaresh Gottumukkala 
95861d85773SSeth Howell void nvmf_fc_poll_group_add_hwqp(struct spdk_nvmf_fc_hwqp *hwqp);
959ed56a3d4SAnil Veerabhadrappa 
960dc0d8962SNaresh Gottumukkala void nvmf_fc_poll_group_remove_hwqp(struct spdk_nvmf_fc_hwqp *hwqp,
961dc0d8962SNaresh Gottumukkala 				    spdk_nvmf_fc_remove_hwqp_cb cb_fn, void *cb_ctx);
962ed56a3d4SAnil Veerabhadrappa 
96361d85773SSeth Howell int nvmf_fc_hwqp_set_online(struct spdk_nvmf_fc_hwqp *hwqp);
964ed56a3d4SAnil Veerabhadrappa 
96561d85773SSeth Howell int nvmf_fc_hwqp_set_offline(struct spdk_nvmf_fc_hwqp *hwqp);
966ed56a3d4SAnil Veerabhadrappa 
96761d85773SSeth Howell uint32_t nvmf_fc_get_prli_service_params(void);
9680e9f9beaSJohn Barnard 
96961d85773SSeth Howell void nvmf_fc_handle_abts_frame(struct spdk_nvmf_fc_nport *nport, uint16_t rpi, uint16_t oxid,
9700e9f9beaSJohn Barnard 			       uint16_t rxid);
9710e9f9beaSJohn Barnard 
97261d85773SSeth Howell void nvmf_fc_request_abort(struct spdk_nvmf_fc_request *fc_req, bool send_abts,
973ed56a3d4SAnil Veerabhadrappa 			   spdk_nvmf_fc_caller_cb cb, void *cb_args);
974ed56a3d4SAnil Veerabhadrappa 
97561d85773SSeth Howell struct spdk_nvmf_tgt *nvmf_fc_get_tgt(void);
976ed56a3d4SAnil Veerabhadrappa 
9770e8925dbSJim Harris struct spdk_thread *nvmf_fc_get_main_thread(void);
9780e9f9beaSJohn Barnard 
9790e9f9beaSJohn Barnard /*
980ed56a3d4SAnil Veerabhadrappa  * These functions are called by low level FC driver
9810e9f9beaSJohn Barnard  */
9820e9f9beaSJohn Barnard 
9830e9f9beaSJohn Barnard static inline struct spdk_nvmf_fc_conn *
98461d85773SSeth Howell nvmf_fc_get_conn(struct spdk_nvmf_qpair *qpair)
9850e9f9beaSJohn Barnard {
9860e9f9beaSJohn Barnard 	return (struct spdk_nvmf_fc_conn *)
9870e9f9beaSJohn Barnard 	       ((uintptr_t)qpair - offsetof(struct spdk_nvmf_fc_conn, qpair));
9880e9f9beaSJohn Barnard }
9890e9f9beaSJohn Barnard 
9900e9f9beaSJohn Barnard static inline uint16_t
99161d85773SSeth Howell nvmf_fc_advance_conn_sqhead(struct spdk_nvmf_qpair *qpair)
9920e9f9beaSJohn Barnard {
9930e9f9beaSJohn Barnard 	/* advance sq_head pointer - wrap if needed */
9940e9f9beaSJohn Barnard 	qpair->sq_head = (qpair->sq_head == qpair->sq_head_max) ?
9950e9f9beaSJohn Barnard 			 0 : (qpair->sq_head + 1);
9960e9f9beaSJohn Barnard 	return qpair->sq_head;
9970e9f9beaSJohn Barnard }
9980e9f9beaSJohn Barnard 
9990e9f9beaSJohn Barnard static inline bool
100061dfdd2aSNaresh Gottumukkala nvmf_fc_use_send_frame(struct spdk_nvmf_fc_request *fc_req)
10010e9f9beaSJohn Barnard {
100261dfdd2aSNaresh Gottumukkala 	struct spdk_nvmf_request *req = &fc_req->req;
100361dfdd2aSNaresh Gottumukkala 
100461dfdd2aSNaresh Gottumukkala 	if (fc_req->app_id) {
100561dfdd2aSNaresh Gottumukkala 		return false;
100661dfdd2aSNaresh Gottumukkala 	}
100761dfdd2aSNaresh Gottumukkala 
10080e9f9beaSJohn Barnard 	/* For now use for only keepalives. */
10090e9f9beaSJohn Barnard 	if (req->qpair->qid == 0 &&
10100e9f9beaSJohn Barnard 	    (req->cmd->nvme_cmd.opc == SPDK_NVME_OPC_KEEP_ALIVE)) {
10110e9f9beaSJohn Barnard 		return true;
10120e9f9beaSJohn Barnard 	}
10130e9f9beaSJohn Barnard 	return false;
10140e9f9beaSJohn Barnard }
10150e9f9beaSJohn Barnard 
101661d85773SSeth Howell enum spdk_nvmf_fc_poller_api_ret nvmf_fc_poller_api_func(
10170e9f9beaSJohn Barnard 	struct spdk_nvmf_fc_hwqp *hwqp,
10180e9f9beaSJohn Barnard 	enum spdk_nvmf_fc_poller_api api,
10190e9f9beaSJohn Barnard 	void *api_args);
10200e9f9beaSJohn Barnard 
102161d85773SSeth Howell int nvmf_fc_hwqp_process_frame(struct spdk_nvmf_fc_hwqp *hwqp, uint32_t buff_idx,
10220e9f9beaSJohn Barnard 			       struct spdk_nvmf_fc_frame_hdr *frame,
10230e9f9beaSJohn Barnard 			       struct spdk_nvmf_fc_buffer_desc *buffer, uint32_t plen);
10240e9f9beaSJohn Barnard 
102561d85773SSeth Howell void nvmf_fc_hwqp_process_pending_reqs(struct spdk_nvmf_fc_hwqp *hwqp);
10260e9f9beaSJohn Barnard 
102761d85773SSeth Howell void nvmf_fc_hwqp_process_pending_ls_rqsts(struct spdk_nvmf_fc_hwqp *hwqp);
10280e9f9beaSJohn Barnard 
102961d85773SSeth Howell void nvmf_fc_request_set_state(struct spdk_nvmf_fc_request *fc_req,
10300e9f9beaSJohn Barnard 			       enum spdk_nvmf_fc_request_state state);
10310e9f9beaSJohn Barnard 
103261d85773SSeth Howell char *nvmf_fc_request_get_state_str(int state);
10330e9f9beaSJohn Barnard 
103461d85773SSeth Howell void _nvmf_fc_request_free(struct spdk_nvmf_fc_request *fc_req);
1035ed56a3d4SAnil Veerabhadrappa 
103661d85773SSeth Howell void nvmf_fc_request_abort_complete(void *arg1);
10370e9f9beaSJohn Barnard 
103861d85773SSeth Howell bool nvmf_fc_send_ersp_required(struct spdk_nvmf_fc_request *fc_req,
10390e9f9beaSJohn Barnard 				uint32_t rsp_cnt, uint32_t xfer_len);
10400e9f9beaSJohn Barnard 
104161d85773SSeth Howell int nvmf_fc_handle_rsp(struct spdk_nvmf_fc_request *req);
1042ed56a3d4SAnil Veerabhadrappa 
1043561a9f26SNaresh Gottumukkala int nvmf_fc_create_conn_reqpool(struct spdk_nvmf_fc_conn *fc_conn);
1044561a9f26SNaresh Gottumukkala 
1045561a9f26SNaresh Gottumukkala void nvmf_fc_free_conn_reqpool(struct spdk_nvmf_fc_conn *fc_conn);
1046561a9f26SNaresh Gottumukkala 
10470e9f9beaSJohn Barnard #endif
1048