Mention branches and keyring.
[releases.git] / efct / efct_lio.h
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__ */