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 | |
29 | struct efct_lio_wq_data { |
30 | struct efct *efct; |
31 | void *ptr; |
32 | struct work_struct work; |
33 | }; |
34 | |
35 | /* Target private efct structure */ |
36 | struct 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 | |
64 | struct efct_scsi_tgt_nport { |
65 | struct efct_lio_nport *lio_nport; |
66 | }; |
67 | |
68 | struct 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 | |
106 | struct 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 */ |
126 | enum { |
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 |
134 | struct 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 | |
147 | struct 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 | |
156 | struct 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 | |
165 | struct 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 | |
174 | struct 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 | |
181 | struct efct_lio_vport_list_t { |
182 | struct list_head list_entry; |
183 | struct efct_lio_vport *lio_vport; |
184 | }; |
185 | |
186 | int efct_scsi_tgt_driver_init(void); |
187 | int efct_scsi_tgt_driver_exit(void); |
188 | |
189 | #endif /*__EFCT_LIO_H__ */ |
190 | |