brintos

brintos / linux-shallow public Read only

0
0
Text · 4.7 KiB · 569a0d4 Raw
190 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term4 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.5 */6 7#ifndef __EFCT_LIO_H__8#define __EFCT_LIO_H__9 10#include "efct_scsi.h"11#include <target/target_core_base.h>12 13#define efct_lio_io_printf(io, fmt, ...)			\14	efc_log_debug(io->efct,					\15		"[%s] [%04x][i:%04x t:%04x h:%04x]" fmt,\16		io->node->display_name, io->instance_index,	\17		io->init_task_tag, io->tgt_task_tag, io->hw_tag,\18		##__VA_ARGS__)19 20#define efct_lio_tmfio_printf(io, fmt, ...)			\21	efc_log_debug(io->efct,					\22		"[%s] [%04x][i:%04x t:%04x h:%04x][f:%02x]" fmt,\23		io->node->display_name, io->instance_index,	\24		io->init_task_tag, io->tgt_task_tag, io->hw_tag,\25		io->tgt_io.tmf,  ##__VA_ARGS__)26 27#define efct_set_lio_io_state(io, value) (io->tgt_io.state |= value)28 29struct efct_lio_wq_data {30	struct efct		*efct;31	void			*ptr;32	struct work_struct	work;33};34 35/* Target private efct structure */36struct efct_scsi_tgt {37	u32			max_sge;38	u32			max_sgl;39 40	/*41	 * Variables used to send task set full. We are using a high watermark42	 * method to send task set full. We will reserve a fixed number of IOs43	 * per initiator plus a fudge factor. Once we reach this number,44	 * then the target will start sending task set full/busy responses.45	 */46	atomic_t		initiator_count;47	atomic_t		ios_in_use;48	atomic_t		io_high_watermark;49 50	atomic_t		watermark_hit;51	int			watermark_min;52	int			watermark_max;53 54	struct efct_lio_nport	*lio_nport;55	struct efct_lio_tpg	*tpg;56 57	struct list_head	vport_list;58	/* Protects vport list*/59	spinlock_t		efct_lio_lock;60 61	u64			wwnn;62};63 64struct efct_scsi_tgt_nport {65	struct efct_lio_nport	*lio_nport;66};67 68struct efct_node {69	struct list_head	list_entry;70	struct kref		ref;71	void			(*release)(struct kref *arg);72	struct efct		*efct;73	struct efc_node		*node;74	struct se_session	*session;75	spinlock_t		active_ios_lock;76	struct list_head	active_ios;77	char			display_name[EFC_NAME_LENGTH];78	u32			port_fc_id;79	u32			node_fc_id;80	u32			vpi;81	u32			rpi;82	u32			abort_cnt;83};84 85#define EFCT_LIO_STATE_SCSI_RECV_CMD		(1 << 0)86#define EFCT_LIO_STATE_TGT_SUBMIT_CMD		(1 << 1)87#define EFCT_LIO_STATE_TFO_QUEUE_DATA_IN	(1 << 2)88#define EFCT_LIO_STATE_TFO_WRITE_PENDING	(1 << 3)89#define EFCT_LIO_STATE_TGT_EXECUTE_CMD		(1 << 4)90#define EFCT_LIO_STATE_SCSI_SEND_RD_DATA	(1 << 5)91#define EFCT_LIO_STATE_TFO_CHK_STOP_FREE	(1 << 6)92#define EFCT_LIO_STATE_SCSI_DATA_DONE		(1 << 7)93#define EFCT_LIO_STATE_TFO_QUEUE_STATUS		(1 << 8)94#define EFCT_LIO_STATE_SCSI_SEND_RSP		(1 << 9)95#define EFCT_LIO_STATE_SCSI_RSP_DONE		(1 << 10)96#define EFCT_LIO_STATE_TGT_GENERIC_FREE		(1 << 11)97#define EFCT_LIO_STATE_SCSI_RECV_TMF		(1 << 12)98#define EFCT_LIO_STATE_TGT_SUBMIT_TMR		(1 << 13)99#define EFCT_LIO_STATE_TFO_WRITE_PEND_STATUS	(1 << 14)100#define EFCT_LIO_STATE_TGT_GENERIC_REQ_FAILURE  (1 << 15)101 102#define EFCT_LIO_STATE_TFO_ABORTED_TASK		(1 << 29)103#define EFCT_LIO_STATE_TFO_RELEASE_CMD		(1 << 30)104#define EFCT_LIO_STATE_SCSI_CMPL_CMD		(1u << 31)105 106struct efct_scsi_tgt_io {107	struct se_cmd		cmd;108	unsigned char		sense_buffer[TRANSPORT_SENSE_BUFFER];109	enum dma_data_direction	ddir;110	int			task_attr;111	u64			lun;112 113	u32			state;114	u8			tmf;115	struct efct_io		*io_to_abort;116	u32			seg_map_cnt;117	u32			seg_cnt;118	u32			cur_seg;119	enum efct_scsi_io_status err;120	bool			aborting;121	bool			rsp_sent;122	u32			transferred_len;123};124 125/* Handler return codes */126enum {127	SCSI_HANDLER_DATAPHASE_STARTED = 1,128	SCSI_HANDLER_RESP_STARTED,129	SCSI_HANDLER_VALIDATED_DATAPHASE_STARTED,130	SCSI_CMD_NOT_SUPPORTED,131};132 133#define WWN_NAME_LEN		32134struct efct_lio_vport {135	u64			wwpn;136	u64			npiv_wwpn;137	u64			npiv_wwnn;138	unsigned char		wwpn_str[WWN_NAME_LEN];139	struct se_wwn		vport_wwn;140	struct efct_lio_tpg	*tpg;141	struct efct		*efct;142	struct Scsi_Host	*shost;143	struct fc_vport		*fc_vport;144	atomic_t		enable;145};146 147struct efct_lio_nport {148	u64			wwpn;149	unsigned char		wwpn_str[WWN_NAME_LEN];150	struct se_wwn		nport_wwn;151	struct efct_lio_tpg	*tpg;152	struct efct		*efct;153	atomic_t		enable;154};155 156struct efct_lio_tpg_attrib {157	u32			generate_node_acls;158	u32			cache_dynamic_acls;159	u32			demo_mode_write_protect;160	u32			prod_mode_write_protect;161	u32			demo_mode_login_only;162	bool			session_deletion_wait;163};164 165struct efct_lio_tpg {166	struct se_portal_group	tpg;167	struct efct_lio_nport	*nport;168	struct efct_lio_vport	*vport;169	struct efct_lio_tpg_attrib tpg_attrib;170	unsigned short		tpgt;171	bool			enabled;172};173 174struct efct_lio_nacl {175	u64			nport_wwnn;176	char			nport_name[WWN_NAME_LEN];177	struct se_session	*session;178	struct se_node_acl	se_node_acl;179};180 181struct efct_lio_vport_list_t {182	struct list_head	list_entry;183	struct efct_lio_vport	*lio_vport;184};185 186int efct_scsi_tgt_driver_init(void);187int efct_scsi_tgt_driver_exit(void);188 189#endif /*__EFCT_LIO_H__ */190