15efdd5cfSKaran Tilak Kumar /* SPDX-License-Identifier: GPL-2.0-only */ 25efdd5cfSKaran Tilak Kumar /* 35efdd5cfSKaran Tilak Kumar * Copyright 2008 Cisco Systems, Inc. All rights reserved. 45efdd5cfSKaran Tilak Kumar * Copyright 2007 Nuova Systems, Inc. All rights reserved. 55efdd5cfSKaran Tilak Kumar */ 65efdd5cfSKaran Tilak Kumar #ifndef _FNIC_NVME_H 75efdd5cfSKaran Tilak Kumar #define _FNIC_NVME_H 85efdd5cfSKaran Tilak Kumar 95efdd5cfSKaran Tilak Kumar #include "fdls_fc.h" 105efdd5cfSKaran Tilak Kumar #include "fnic_fdls.h" 115efdd5cfSKaran Tilak Kumar 125efdd5cfSKaran Tilak Kumar #define FNIC_NVME_TPORT_REMOVE_WAIT (5 * 1000) 135efdd5cfSKaran Tilak Kumar #define FNIC_NVME_TPORT_LIST_EMPTY_WAIT (FNIC_NVME_TPORT_REMOVE_WAIT * 2) 145efdd5cfSKaran Tilak Kumar #define FNIC_TPORT_CLEANUP_WAIT_COUNT 8 155efdd5cfSKaran Tilak Kumar #define FNIC_NVME_LPORT_REMOVE_WAIT (2 * 60 * 1000) 165efdd5cfSKaran Tilak Kumar 175efdd5cfSKaran Tilak Kumar #define FNIC_LS_REQ_FLAGS_NONE 0x0 185efdd5cfSKaran Tilak Kumar #define FNIC_LS_REQ_FLAGS_ABORTED 0x1 195efdd5cfSKaran Tilak Kumar #define FNIC_LS_REQ_FLAGS_DONE 0x2 205efdd5cfSKaran Tilak Kumar #define FNIC_LS_REQ_ABORT_COMPLETED 0x4 215efdd5cfSKaran Tilak Kumar #define FNIC_STATUS_LS_REQ_ABORTED 0x1 225efdd5cfSKaran Tilak Kumar 235efdd5cfSKaran Tilak Kumar #define FNIC_LS_REQ_MIN_TMO_SECS (2) 245efdd5cfSKaran Tilak Kumar #define FNIC_LS_REQ_MAX_TMO_SECS (5) 255efdd5cfSKaran Tilak Kumar #define FNIC_NVME_ADMIN_IO_TIMEOUT 30000 /* mSec */ 265efdd5cfSKaran Tilak Kumar #define FNIC_NVME_NO_FREE_TAG (0xFFFF) 275efdd5cfSKaran Tilak Kumar 285efdd5cfSKaran Tilak Kumar #define FNIC_LS_REQ_TMO_MSECS(tmo) (((tmo >= FNIC_LS_REQ_MIN_TMO_SECS) && \ 295efdd5cfSKaran Tilak Kumar (tmo <= FNIC_LS_REQ_MAX_TMO_SECS)) ? \ 305efdd5cfSKaran Tilak Kumar (tmo * 1000) : (FNIC_LS_REQ_MIN_TMO_SECS * 1000)) 315efdd5cfSKaran Tilak Kumar 325efdd5cfSKaran Tilak Kumar #define IS_ADMIN_IO(_io_req) \ 335efdd5cfSKaran Tilak Kumar (NVME_CMD_FLAGS(_io_req) & FNIC_NVME_ADMIN_IO_TIMER_PENDING) 345efdd5cfSKaran Tilak Kumar 355efdd5cfSKaran Tilak Kumar extern unsigned int nvme_max_ios_to_process; 365efdd5cfSKaran Tilak Kumar extern unsigned int nvme_dev_loss_tmo; 375efdd5cfSKaran Tilak Kumar extern spinlock_t fnic_list_lock; 385efdd5cfSKaran Tilak Kumar 395efdd5cfSKaran Tilak Kumar enum nvfnic_lsreq_state_e { 405efdd5cfSKaran Tilak Kumar FNIC_LS_REQ_CMD_INIT = 0, 415efdd5cfSKaran Tilak Kumar FNIC_LS_REQ_CMD_PENDING, 425efdd5cfSKaran Tilak Kumar FNIC_LS_REQ_CMD_ABTS_PENDING, 435efdd5cfSKaran Tilak Kumar FNIC_LS_REQ_CMD_COMPLETE, 445efdd5cfSKaran Tilak Kumar FNIC_LS_REQ_ABTS_COMPLETE, 455efdd5cfSKaran Tilak Kumar FNIC_LS_REQ_CMD_ABTS_STARTED, 465efdd5cfSKaran Tilak Kumar }; 475efdd5cfSKaran Tilak Kumar 485efdd5cfSKaran Tilak Kumar struct fnic_nvme_tag { 495efdd5cfSKaran Tilak Kumar struct list_head free_list; 505efdd5cfSKaran Tilak Kumar int tag_id; 515efdd5cfSKaran Tilak Kumar }; 525efdd5cfSKaran Tilak Kumar 535efdd5cfSKaran Tilak Kumar struct nvfnic_ls_req { 545efdd5cfSKaran Tilak Kumar struct list_head list; 555efdd5cfSKaran Tilak Kumar struct nvmefc_ls_req *ls_req; 565efdd5cfSKaran Tilak Kumar uint16_t oxid; 575efdd5cfSKaran Tilak Kumar struct timer_list ls_req_timer; 585efdd5cfSKaran Tilak Kumar struct fnic *fnic; 595efdd5cfSKaran Tilak Kumar struct fnic_tport_s *tport; 605efdd5cfSKaran Tilak Kumar int state; 615efdd5cfSKaran Tilak Kumar unsigned int flags; 625efdd5cfSKaran Tilak Kumar }; 635efdd5cfSKaran Tilak Kumar 64*376a3960SKaran Tilak Kumar #if IS_REACHABLE(CONFIG_NVME_FC) 655efdd5cfSKaran Tilak Kumar int nvfnic_nvme_io_done_handler(void *arg); 665efdd5cfSKaran Tilak Kumar struct fnic_io_req *nvfnic_find_io_req_by_tag(struct fnic *fnic, uint16_t tag); 675efdd5cfSKaran Tilak Kumar void nvfnic_reset_fcpio_tag_pool(struct fnic_iport_s *iport); 685efdd5cfSKaran Tilak Kumar int nvfnic_add_lport(struct fnic *fnic); 695efdd5cfSKaran Tilak Kumar void nvfnic_fcpio_abort(struct nvme_fc_local_port *lport, 705efdd5cfSKaran Tilak Kumar struct nvme_fc_remote_port *rport, 715efdd5cfSKaran Tilak Kumar void *hw_queue_handle, struct nvmefc_fcp_req *fcp_req); 725efdd5cfSKaran Tilak Kumar void nvfnic_remote_port_delete(struct nvme_fc_remote_port *rport); 735efdd5cfSKaran Tilak Kumar void nvfnic_local_port_delete(struct nvme_fc_local_port *lport); 745efdd5cfSKaran Tilak Kumar int nvfnic_dma_map_sgl(struct fnic *fnic, struct fnic_io_req *io_req, 755efdd5cfSKaran Tilak Kumar int sg_count); 765efdd5cfSKaran Tilak Kumar void nvfnic_dma_unmap_sgl(struct fnic *fnic, struct fnic_io_req *io_req); 775efdd5cfSKaran Tilak Kumar int nvfnic_get_sg_count(struct fnic_io_req *io_req); 785efdd5cfSKaran Tilak Kumar void nvfnic_release_nvme_ioreq_buf(struct fnic_iport_s *iport, 795efdd5cfSKaran Tilak Kumar struct fnic_io_req *io_req); 805efdd5cfSKaran Tilak Kumar void nvfnic_dump_nvcmd(struct fnic_io_req *io_req, uint8_t flags); 815efdd5cfSKaran Tilak Kumar bool _cleanup_tport_io(struct sbitmap *map, unsigned int tag, void *data); 825efdd5cfSKaran Tilak Kumar void nvfnic_flush_nvme_io_list(struct fnic *fnic); 835efdd5cfSKaran Tilak Kumar void nvfnic_fcpio_cmpl(struct fnic_io_req *io_req); 845efdd5cfSKaran Tilak Kumar bool nvfnic_transport_ready(struct fnic_iport_s *iport, 855efdd5cfSKaran Tilak Kumar struct fnic_tport_s *tport); 865efdd5cfSKaran Tilak Kumar int nvfnic_alloc_fcpio_tag(struct fnic_iport_s *iport, 875efdd5cfSKaran Tilak Kumar struct fnic_io_req *io_req); 885efdd5cfSKaran Tilak Kumar int nvfnic_queuecommand(struct fnic_io_req *io_req); 895efdd5cfSKaran Tilak Kumar void nvfnic_free_fcpio_tag(struct fnic_iport_s *iport, 905efdd5cfSKaran Tilak Kumar struct fnic_io_req *io_req); 915efdd5cfSKaran Tilak Kumar void nvfnic_delete_lport(struct fnic_iport_s *iport); 925efdd5cfSKaran Tilak Kumar int nvfnic_add_tport(struct fnic *fnic, struct fnic_tport_s *tport, 935efdd5cfSKaran Tilak Kumar unsigned long flags); 945efdd5cfSKaran Tilak Kumar void nvfnic_cleanup_all_nvme_ios(struct fnic *fnic); 955efdd5cfSKaran Tilak Kumar void nvfnic_delete_tport_work(struct work_struct *work); 965efdd5cfSKaran Tilak Kumar void nvfnic_delete_tport(struct fnic_iport_s *iport, 975efdd5cfSKaran Tilak Kumar struct fnic_tport_s *tport, unsigned long flags); 985efdd5cfSKaran Tilak Kumar void nvfnic_fcpio_nvme_fast_cmpl_handler(struct fnic *fnic, 995efdd5cfSKaran Tilak Kumar struct fcpio_fw_req *desc); 1005efdd5cfSKaran Tilak Kumar void nvfnic_ls_rsp_recv(struct fnic_iport_s *iport, 1015efdd5cfSKaran Tilak Kumar struct fc_frame_header *fchdr, int len); 1025efdd5cfSKaran Tilak Kumar void nvfnic_process_ls_abts_rsp(struct fnic_iport_s *iport, 1035efdd5cfSKaran Tilak Kumar struct fc_frame_header *fchdr); 1045efdd5cfSKaran Tilak Kumar void nvfnic_admin_io_timeout(struct timer_list *t); 1055efdd5cfSKaran Tilak Kumar void nvfnic_fcpio_nvme_itmf_cmpl_handler(struct fnic *fnic, 1065efdd5cfSKaran Tilak Kumar struct fcpio_fw_req *desc); 1075efdd5cfSKaran Tilak Kumar void nvfnic_nvme_zero_devloss_tports(struct fnic *fnic); 1085efdd5cfSKaran Tilak Kumar bool nvfnic_queue_abort_io_req(struct fnic *fnic, int tag, u32 task_req, 1095efdd5cfSKaran Tilak Kumar struct fnic_io_req *io_req); 1105efdd5cfSKaran Tilak Kumar void nvfnic_ls_req_abort(struct nvme_fc_local_port *lport, 1115efdd5cfSKaran Tilak Kumar struct nvme_fc_remote_port *rport, 1125efdd5cfSKaran Tilak Kumar struct nvmefc_ls_req *lsreq); 1135efdd5cfSKaran Tilak Kumar int nvfnic_create_queue(struct nvme_fc_local_port *lport, unsigned int idx, 1145efdd5cfSKaran Tilak Kumar u16 size, void **handle); 11539bf0755SKaran Tilak Kumar int nvfnic_ls_req_send(struct nvme_fc_local_port *lport, 11639bf0755SKaran Tilak Kumar struct nvme_fc_remote_port *rport, 11739bf0755SKaran Tilak Kumar struct nvmefc_ls_req *ls_req); 1185efdd5cfSKaran Tilak Kumar void nvfnic_ls_req_timeout(struct timer_list *t); 1195efdd5cfSKaran Tilak Kumar uint16_t nvfnic_alloc_ls_req_oxid(struct fnic_iport_s *iport); 1205efdd5cfSKaran Tilak Kumar struct nvfnic_ls_req *nvfnic_find_ls_req(struct fnic_tport_s *tport, 1215efdd5cfSKaran Tilak Kumar uint16_t oxid); 1225efdd5cfSKaran Tilak Kumar void nvfnic_terminate_tport_ios(struct fnic *fnic, struct fnic_tport_s *tport); 1235efdd5cfSKaran Tilak Kumar bool _terminate_tport_ios(struct sbitmap *map, unsigned int tag, void *data); 1245efdd5cfSKaran Tilak Kumar bool _cleanup_all_nvme_io(struct sbitmap *map, unsigned int tag, void *data); 1255efdd5cfSKaran Tilak Kumar void nvfnic_cleanup_all_nvme_ios(struct fnic *fnic); 1265efdd5cfSKaran Tilak Kumar int nvfnic_fcpio_send(struct nvme_fc_local_port *lport, 1275efdd5cfSKaran Tilak Kumar struct nvme_fc_remote_port *rport, void *hw_queue_handle, 1285efdd5cfSKaran Tilak Kumar struct nvmefc_fcp_req *fcp_req); 1295efdd5cfSKaran Tilak Kumar void nvfnic_fcpio_ersp_cmpl_handler(struct fnic *fnic, 1305efdd5cfSKaran Tilak Kumar struct fcpio_fw_req *desc, int sw_flag); 1315efdd5cfSKaran Tilak Kumar void nvfnic_terminate_tport_ls_reqs(struct fnic *fnic, 1325efdd5cfSKaran Tilak Kumar struct fnic_tport_s *tport); 1335efdd5cfSKaran Tilak Kumar void nvfnic_terminate_tport_admin_ios(struct fnic *fnic, 1345efdd5cfSKaran Tilak Kumar struct fnic_tport_s *tport); 1355efdd5cfSKaran Tilak Kumar void nvfnic_cleanup_tport_io(struct fnic *fnic, struct fnic_tport_s *tport); 1365efdd5cfSKaran Tilak Kumar void nvfnic_nvme_unload(struct fnic *fnic); 1378ef412ceSKaran Tilak Kumar int nvfnic_get_nvmef_info(struct fnic *fnic, struct fnic_nvmef_info *info); 1385efdd5cfSKaran Tilak Kumar void nvfnic_exch_reset(struct fnic_iport_s *iport, struct fnic_tport_s *tport); 1395efdd5cfSKaran Tilak Kumar void nvfnic_nvme_iodone_work(struct work_struct *work); 1405efdd5cfSKaran Tilak Kumar #else 1415efdd5cfSKaran Tilak Kumar static inline int nvfnic_add_lport(struct fnic *fnic) 1425efdd5cfSKaran Tilak Kumar { 1435efdd5cfSKaran Tilak Kumar return -EOPNOTSUPP; 1445efdd5cfSKaran Tilak Kumar } 1455efdd5cfSKaran Tilak Kumar 1465efdd5cfSKaran Tilak Kumar static inline void nvfnic_nvme_unload(struct fnic *fnic) 1475efdd5cfSKaran Tilak Kumar { 1485efdd5cfSKaran Tilak Kumar } 1495efdd5cfSKaran Tilak Kumar 1505efdd5cfSKaran Tilak Kumar static inline void nvfnic_flush_nvme_io_list(struct fnic *fnic) 1515efdd5cfSKaran Tilak Kumar { 1525efdd5cfSKaran Tilak Kumar } 1535efdd5cfSKaran Tilak Kumar 1545efdd5cfSKaran Tilak Kumar static inline void nvfnic_nvme_iodone_work(struct work_struct *work) 1555efdd5cfSKaran Tilak Kumar { 1565efdd5cfSKaran Tilak Kumar } 1575efdd5cfSKaran Tilak Kumar 1585efdd5cfSKaran Tilak Kumar static inline void nvfnic_exch_reset(struct fnic_iport_s *iport, 1595efdd5cfSKaran Tilak Kumar struct fnic_tport_s *tport) 1605efdd5cfSKaran Tilak Kumar { 1615efdd5cfSKaran Tilak Kumar } 1625efdd5cfSKaran Tilak Kumar 1635efdd5cfSKaran Tilak Kumar static inline void nvfnic_process_ls_abts_rsp(struct fnic_iport_s *iport, 1645efdd5cfSKaran Tilak Kumar struct fc_frame_header *fchdr) 1655efdd5cfSKaran Tilak Kumar { 1665efdd5cfSKaran Tilak Kumar } 1675efdd5cfSKaran Tilak Kumar 1685efdd5cfSKaran Tilak Kumar static inline void nvfnic_ls_rsp_recv(struct fnic_iport_s *iport, 1695efdd5cfSKaran Tilak Kumar struct fc_frame_header *fchdr, int len) 1705efdd5cfSKaran Tilak Kumar { 1715efdd5cfSKaran Tilak Kumar } 1725efdd5cfSKaran Tilak Kumar 1735efdd5cfSKaran Tilak Kumar static inline int nvfnic_add_tport(struct fnic *fnic, 1745efdd5cfSKaran Tilak Kumar struct fnic_tport_s *tport, 1755efdd5cfSKaran Tilak Kumar unsigned long flags) 1765efdd5cfSKaran Tilak Kumar { 1775efdd5cfSKaran Tilak Kumar return 0; 1785efdd5cfSKaran Tilak Kumar } 1795efdd5cfSKaran Tilak Kumar 1805efdd5cfSKaran Tilak Kumar static inline void nvfnic_delete_tport(struct fnic_iport_s *iport, 1815efdd5cfSKaran Tilak Kumar struct fnic_tport_s *tport, 1825efdd5cfSKaran Tilak Kumar unsigned long flags) 1835efdd5cfSKaran Tilak Kumar { 1845efdd5cfSKaran Tilak Kumar } 1855efdd5cfSKaran Tilak Kumar 1865efdd5cfSKaran Tilak Kumar static inline void nvfnic_cleanup_all_nvme_ios(struct fnic *fnic) 1875efdd5cfSKaran Tilak Kumar { 1885efdd5cfSKaran Tilak Kumar } 1895efdd5cfSKaran Tilak Kumar 1905efdd5cfSKaran Tilak Kumar static inline void nvfnic_fcpio_nvme_fast_cmpl_handler(struct fnic *fnic, 1915efdd5cfSKaran Tilak Kumar struct fcpio_fw_req *desc) 1925efdd5cfSKaran Tilak Kumar { 1935efdd5cfSKaran Tilak Kumar } 1945efdd5cfSKaran Tilak Kumar 1955efdd5cfSKaran Tilak Kumar static inline void nvfnic_fcpio_ersp_cmpl_handler(struct fnic *fnic, 1965efdd5cfSKaran Tilak Kumar struct fcpio_fw_req *desc, 1975efdd5cfSKaran Tilak Kumar int sw_flag) 1985efdd5cfSKaran Tilak Kumar { 1995efdd5cfSKaran Tilak Kumar } 2005efdd5cfSKaran Tilak Kumar 2015efdd5cfSKaran Tilak Kumar static inline void nvfnic_fcpio_nvme_itmf_cmpl_handler(struct fnic *fnic, 2025efdd5cfSKaran Tilak Kumar struct fcpio_fw_req *desc) 2035efdd5cfSKaran Tilak Kumar { 2045efdd5cfSKaran Tilak Kumar } 2055efdd5cfSKaran Tilak Kumar 2065efdd5cfSKaran Tilak Kumar static inline int nvfnic_get_nvmef_info(struct fnic *fnic, 2075efdd5cfSKaran Tilak Kumar struct fnic_nvmef_info *info) 2085efdd5cfSKaran Tilak Kumar { 2095efdd5cfSKaran Tilak Kumar return 0; 2105efdd5cfSKaran Tilak Kumar } 2115efdd5cfSKaran Tilak Kumar #endif 2125efdd5cfSKaran Tilak Kumar 2135efdd5cfSKaran Tilak Kumar extern const char *fnic_fcpio_status_to_str(unsigned int status); 2145efdd5cfSKaran Tilak Kumar #endif /* _FNIC_NVME_H */ 215