xref: /linux/drivers/scsi/fnic/fnic_nvme.h (revision 35748ddd3b2c91555bd86b8cf88edc90e7317e57)
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