• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /* SPDX-License-Identifier: GPL-2.0 */
2  /*
3   * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
4   * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
5   */
6  
7  #if !defined(__EFCT_IO_H__)
8  #define __EFCT_IO_H__
9  
10  #include "efct_lio.h"
11  
12  #define EFCT_LOG_ENABLE_IO_ERRORS(efct)		\
13  		(((efct) != NULL) ? (((efct)->logmask & (1U << 6)) != 0) : 0)
14  
15  #define io_error_log(io, fmt, ...)  \
16  	do { \
17  		if (EFCT_LOG_ENABLE_IO_ERRORS(io->efct)) \
18  			efc_log_warn(io->efct, fmt, ##__VA_ARGS__); \
19  	} while (0)
20  
21  #define SCSI_CMD_BUF_LENGTH	48
22  #define SCSI_RSP_BUF_LENGTH	(FCP_RESP_WITH_EXT + SCSI_SENSE_BUFFERSIZE)
23  #define EFCT_NUM_SCSI_IOS	8192
24  
25  enum efct_io_type {
26  	EFCT_IO_TYPE_IO = 0,
27  	EFCT_IO_TYPE_ELS,
28  	EFCT_IO_TYPE_CT,
29  	EFCT_IO_TYPE_CT_RESP,
30  	EFCT_IO_TYPE_BLS_RESP,
31  	EFCT_IO_TYPE_ABORT,
32  
33  	EFCT_IO_TYPE_MAX,
34  };
35  
36  enum efct_els_state {
37  	EFCT_ELS_REQUEST = 0,
38  	EFCT_ELS_REQUEST_DELAYED,
39  	EFCT_ELS_REQUEST_DELAY_ABORT,
40  	EFCT_ELS_REQ_ABORT,
41  	EFCT_ELS_REQ_ABORTED,
42  	EFCT_ELS_ABORT_IO_COMPL,
43  };
44  
45  /**
46   * Scsi target IO object
47   * @efct:		pointer back to efct
48   * @instance_index:	unique instance index value
49   * @io:			IO display name
50   * @node:		pointer to node
51   * @list_entry:		io list entry
52   * @io_pending_link:	io pending list entry
53   * @ref:		reference counter
54   * @release:		release callback function
55   * @init_task_tag:	initiator task tag (OX_ID) for back-end and SCSI logging
56   * @tgt_task_tag:	target task tag (RX_ID) for back-end and SCSI logging
57   * @hw_tag:		HW layer unique IO id
58   * @tag:		unique IO identifier
59   * @sgl:		SGL
60   * @sgl_allocated:	Number of allocated SGEs
61   * @sgl_count:		Number of SGEs in this SGL
62   * @tgt_io:		backend target private IO data
63   * @exp_xfer_len:	expected data transfer length, based on FC header
64   * @hw_priv:		Declarations private to HW/SLI
65   * @io_type:		indicates what this struct efct_io structure is used for
66   * @hio:		hw io object
67   * @transferred:	Number of bytes transferred
68   * @auto_resp:		set if auto_trsp was set
69   * @low_latency:	set if low latency request
70   * @wq_steering:	selected WQ steering request
71   * @wq_class:		selected WQ class if steering is class
72   * @xfer_req:		transfer size for current request
73   * @scsi_tgt_cb:	target callback function
74   * @scsi_tgt_cb_arg:	target callback function argument
75   * @abort_cb:		abort callback function
76   * @abort_cb_arg:	abort callback function argument
77   * @bls_cb:		BLS callback function
78   * @bls_cb_arg:		BLS callback function argument
79   * @tmf_cmd:		TMF command being processed
80   * @abort_rx_id:	rx_id from the ABTS that initiated the command abort
81   * @cmd_tgt:		True if this is a Target command
82   * @send_abts:		when aborting, indicates ABTS is to be sent
83   * @cmd_ini:		True if this is an Initiator command
84   * @seq_init:		True if local node has sequence initiative
85   * @iparam:		iparams for hw io send call
86   * @hio_type:		HW IO type
87   * @wire_len:		wire length
88   * @hw_cb:		saved HW callback
89   * @io_to_abort:	for abort handling, pointer to IO to abort
90   * @rspbuf:		SCSI Response buffer
91   * @timeout:		Timeout value in seconds for this IO
92   * @cs_ctl:		CS_CTL priority for this IO
93   * @io_free:		Is io object in freelist
94   * @app_id:		application id
95   */
96  struct efct_io {
97  	struct efct		*efct;
98  	u32			instance_index;
99  	const char		*display_name;
100  	struct efct_node	*node;
101  
102  	struct list_head	list_entry;
103  	struct list_head	io_pending_link;
104  	struct kref		ref;
105  	void (*release)(struct kref *arg);
106  	u32			init_task_tag;
107  	u32			tgt_task_tag;
108  	u32			hw_tag;
109  	u32			tag;
110  	struct efct_scsi_sgl	*sgl;
111  	u32			sgl_allocated;
112  	u32			sgl_count;
113  	struct efct_scsi_tgt_io tgt_io;
114  	u32			exp_xfer_len;
115  
116  	void			*hw_priv;
117  
118  	enum efct_io_type	io_type;
119  	struct efct_hw_io	*hio;
120  	size_t			transferred;
121  
122  	bool			auto_resp;
123  	bool			low_latency;
124  	u8			wq_steering;
125  	u8			wq_class;
126  	u64			xfer_req;
127  	efct_scsi_io_cb_t	scsi_tgt_cb;
128  	void			*scsi_tgt_cb_arg;
129  	efct_scsi_io_cb_t	abort_cb;
130  	void			*abort_cb_arg;
131  	efct_scsi_io_cb_t	bls_cb;
132  	void			*bls_cb_arg;
133  	enum efct_scsi_tmf_cmd	tmf_cmd;
134  	u16			abort_rx_id;
135  
136  	bool			cmd_tgt;
137  	bool			send_abts;
138  	bool			cmd_ini;
139  	bool			seq_init;
140  	union efct_hw_io_param_u iparam;
141  	enum efct_hw_io_type	hio_type;
142  	u64			wire_len;
143  	void			*hw_cb;
144  
145  	struct efct_io		*io_to_abort;
146  
147  	struct efc_dma		rspbuf;
148  	u32			timeout;
149  	u8			cs_ctl;
150  	u8			io_free;
151  	u32			app_id;
152  };
153  
154  struct efct_io_cb_arg {
155  	int status;
156  	int ext_status;
157  	void *app;
158  };
159  
160  struct efct_io_pool *
161  efct_io_pool_create(struct efct *efct, u32 num_sgl);
162  int
163  efct_io_pool_free(struct efct_io_pool *io_pool);
164  u32
165  efct_io_pool_allocated(struct efct_io_pool *io_pool);
166  
167  struct efct_io *
168  efct_io_pool_io_alloc(struct efct_io_pool *io_pool);
169  void
170  efct_io_pool_io_free(struct efct_io_pool *io_pool, struct efct_io *io);
171  struct efct_io *
172  efct_io_find_tgt_io(struct efct *efct, struct efct_node *node,
173  		    u16 ox_id, u16 rx_id);
174  #endif /* __EFCT_IO_H__ */
175