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