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#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 watermark
42 * method to send task set full. We will reserve a fixed number of IOs
43 * 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 32
134struct 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

source code of linux/drivers/scsi/elx/efct/efct_lio.h