cc83e50e4f22e4a08e5172ed12f0272ef9bfc4ff
[mirror/scst/.git] / qla2x00t / qla2x_tgt_def.h
1 /*
2  *  qla2x_tgt_def.h
3  *
4  *  Copyright (C) 2004 - 2008 Vladislav Bolkhovitin <vst@vlnb.net>
5  *  Copyright (C) 2004 - 2005 Leonid Stoljar
6  *
7  *  Additional file for the target driver support. Intended to define
8  *  for 2200 and 2300 thier own exported symbols with unique names.
9  *
10  *  This program is free software; you can redistribute it and/or
11  *  modify it under the terms of the GNU General Public License
12  *  as published by the Free Software Foundation; either version 2
13  *  of the License, or (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  *  GNU General Public License for more details.
19  */
20 /*
21  * This is the global def file that is useful for including from the
22  * target portion.
23  */
24
25 #ifndef __QLA2X_TGT_DEF_H
26 #define __QLA2X_TGT_DEF_H
27
28 #include "qla_def.h"
29
30 #ifndef CONFIG_SCSI_QLA2XXX_TARGET
31 #error __FILE__ " included without CONFIG_SCSI_QLA2XXX_TARGET"
32 #endif
33
34 #ifndef ENTER
35 #define ENTER(a)
36 #endif
37
38 #ifndef LEAVE
39 #define LEAVE(a)
40 #endif
41
42 #define QLA2X_TARGET_MAGIC      153
43 #define QLA2X_INITIATOR_MAGIC   54208
44
45 #define QLA2X00_COMMAND_COUNT_INIT      250
46 #define QLA2X00_IMMED_NOTIFY_COUNT_INIT 250
47
48 #define QLA_EXTENDED_LUN 1
49
50 /*
51  * Used to mark which completion handles (for RIO Status's) are for CTIO's
52  * vs. regular (non-target) info.
53  */
54 #define CTIO_COMPLETION_HANDLE_MARK     BIT_15
55 #if (CTIO_COMPLETION_HANDLE_MARK <= MAX_OUTSTANDING_COMMANDS)
56 #error "Hackish CTIO_COMPLETION_HANDLE_MARK no longer larger than MAX_OUTSTANDING_COMMANDS"
57 #endif
58 #define HANDLE_IS_CTIO_COMP(h) (h & CTIO_COMPLETION_HANDLE_MARK)
59
60 #ifndef OF_SS_MODE_0
61 /*
62  * ISP target entries - Flags bit definitions.
63  */
64 #define OF_SS_MODE_0        0
65 #define OF_SS_MODE_1        1
66 #define OF_SS_MODE_2        2
67 #define OF_SS_MODE_3        3
68
69 #define OF_RESET            BIT_5       /* Reset LIP flag */
70 #define OF_DATA_IN          BIT_6       /* Data in to initiator */
71                                         /*  (data from target to initiator) */
72 #define OF_DATA_OUT         BIT_7       /* Data out from initiator */
73                                         /*  (data from initiator to target) */
74 #define OF_NO_DATA          (BIT_7 | BIT_6)
75 #define OF_INC_RC           BIT_8       /* Increment command resource count */
76 #define OF_FAST_POST        BIT_9       /* Enable mailbox fast posting. */
77 #define OF_TERM_EXCH        BIT_14      /* Terminate exchange */
78 #define OF_SSTS             BIT_15      /* Send SCSI status */
79 #endif
80
81 #ifndef DATASEGS_PER_COMMAND32
82 #define DATASEGS_PER_COMMAND32    3
83 #define DATASEGS_PER_CONT32       7
84 #define QLA_MAX_SG32(ql) \
85    (DATASEGS_PER_COMMAND32 + (((ql) > 0) ? DATASEGS_PER_CONT32*((ql) - 1) : 0))
86
87 #define DATASEGS_PER_COMMAND64    2
88 #define DATASEGS_PER_CONT64       5
89 #define QLA_MAX_SG64(ql) \
90    (DATASEGS_PER_COMMAND64 + (((ql) > 0) ? DATASEGS_PER_CONT64*((ql) - 1) : 0))
91 #endif
92
93 /********************************************************************\
94  * ISP Queue types left out of new QLogic driver (from old version)
95 \********************************************************************/
96
97 #ifndef ENABLE_LUN_TYPE
98 #define ENABLE_LUN_TYPE 0x0B            /* Enable LUN entry. */
99 /*!
100  * ISP queue - enable LUN entry structure definition.
101  */
102 typedef struct
103 {
104         uint8_t  entry_type;            /* Entry type. */
105         uint8_t  entry_count;           /* Entry count. */
106         uint8_t  sys_define;            /* System defined. */
107         uint8_t  entry_status;          /* Entry Status. */
108         uint32_t sys_define_2;          /* System defined. */
109         uint8_t  reserved_8;
110         uint8_t  reserved_1;
111         uint16_t reserved_2;
112         uint32_t reserved_3;
113         uint8_t  status;
114         uint8_t  reserved_4;
115         uint8_t  command_count;         /* Number of ATIOs allocated. */
116         uint8_t  immed_notify_count;    /* Number of Immediate Notify entries allocated. */
117         uint16_t reserved_5;
118         uint16_t timeout;               /* 0 = 30 seconds, 0xFFFF = disable */
119         uint16_t reserved_6[20];
120 } elun_entry_t;
121 #define ENABLE_LUN_SUCCESS          0x01
122 #define ENABLE_LUN_RC_NONZERO       0x04
123 #define ENABLE_LUN_INVALID_REQUEST  0x06
124 #define ENABLE_LUN_ALREADY_ENABLED  0x3E
125 #endif
126
127 #ifndef MODIFY_LUN_TYPE
128 #define MODIFY_LUN_TYPE 0x0C      //!< Modify LUN entry.
129 /*
130  * ISP queue - modify LUN entry structure definition.
131  */
132 typedef struct
133 {
134         uint8_t  entry_type;                /* Entry type. */
135         uint8_t  entry_count;               /* Entry count. */
136         uint8_t  sys_define;                /* System defined. */
137         uint8_t  entry_status;              /* Entry Status. */
138         uint32_t sys_define_2;              /* System defined. */
139         uint8_t  reserved_8;
140         uint8_t  reserved_1;
141         uint8_t  operators;
142         uint8_t  reserved_2;
143         uint32_t reserved_3;
144         uint8_t  status;
145         uint8_t  reserved_4;
146         uint8_t  command_count;             /* Number of ATIOs allocated. */
147         uint8_t  immed_notify_count;        /* Number of Immediate Notify */
148         /* entries allocated. */
149         uint16_t reserved_5;
150         uint16_t timeout;                   /* 0 = 30 seconds, 0xFFFF = disable */
151         uint16_t reserved_7[20];
152 }modify_lun_entry_t;
153 #define MODIFY_LUN_SUCCESS      0x01
154 #define MODIFY_LUN_CMD_ADD BIT_0
155 #define MODIFY_LUN_CMD_SUB BIT_1
156 #define MODIFY_LUN_IMM_ADD BIT_2
157 #define MODIFY_LUN_IMM_SUB BIT_3
158 #endif
159
160
161 #define GET_TARGET_ID(ha, iocb) ((HAS_EXTENDED_IDS(ha))                 \
162                                  ? le16_to_cpu((iocb)->target.extended) \
163                                  : (uint16_t)(iocb)->target.id.standard)
164
165 #ifndef IMMED_NOTIFY_TYPE
166 #define IMMED_NOTIFY_TYPE 0x0D/* Immediate notify entry. */
167 /*
168  * ISP queue - immediate notify entry structure definition.
169  */
170 typedef struct
171 {
172         uint8_t  entry_type;                /* Entry type. */
173         uint8_t  entry_count;               /* Entry count. */
174         uint8_t  sys_define;                /* System defined. */
175         uint8_t  entry_status;              /* Entry Status. */
176         uint32_t sys_define_2;              /* System defined. */
177         target_id_t target;
178         uint16_t lun;
179         uint32_t reserved_2;
180         uint16_t status;
181         uint16_t task_flags;
182         uint16_t seq_id;
183         uint16_t reserved_5[11];
184         uint16_t scsi_status;
185         uint8_t  sense_data[16];
186         uint16_t ox_id;
187 }notify_entry_t;
188 #endif
189
190 #ifndef NOTIFY_ACK_TYPE
191 #define NOTIFY_ACK_TYPE 0x0E      /* Notify acknowledge entry. */
192 /*
193  * ISP queue - notify acknowledge entry structure definition.
194  */
195 typedef struct
196 {
197         uint8_t  entry_type;                /* Entry type. */
198         uint8_t  entry_count;               /* Entry count. */
199         uint8_t  sys_define;                /* System defined. */
200         uint8_t  entry_status;              /* Entry Status. */
201         uint32_t sys_define_2;              /* System defined. */
202         target_id_t target;
203         uint8_t  reserved_1;
204         uint8_t  target_id;
205         uint16_t flags;
206         uint16_t resp_code;
207         uint16_t status;
208         uint16_t task_flags;
209         uint16_t seq_id;
210         uint16_t reserved_3[20];
211         uint16_t ox_id;
212 }nack_entry_t;
213 #define NOTIFY_ACK_SUCCESS      0x01
214 #endif
215
216 #ifndef ACCEPT_TGT_IO_TYPE
217 #define ACCEPT_TGT_IO_TYPE 0x16 /* Accept target I/O entry. */
218 /*
219  * ISP queue - Accept Target I/O (ATIO) entry structure definition.
220  */
221 typedef struct
222 {
223         uint8_t  entry_type;                /* Entry type. */
224         uint8_t  entry_count;               /* Entry count. */
225         uint8_t  sys_define;                /* System defined. */
226         uint8_t  entry_status;              /* Entry Status. */
227         uint32_t sys_define_2;              /* System defined. */
228         target_id_t target;
229         uint16_t exchange_id;
230         uint16_t flags;
231         uint16_t status;
232         uint8_t  command_ref;
233         uint8_t  task_codes;
234         uint8_t  task_flags;
235         uint8_t  execution_codes;
236         uint8_t  cdb[MAX_CMDSZ];
237         uint32_t data_length;
238         uint16_t lun;
239         uint8_t  initiator_port_name[WWN_SIZE]; /* on qla23xx */
240         uint8_t  reserved2[12];
241         uint16_t ox_id;
242 }atio_entry_t;
243 #endif
244
245 #ifndef CONTINUE_TGT_IO_TYPE
246 #define CONTINUE_TGT_IO_TYPE 0x17
247 /*
248  * ISP queue - Continue Target I/O (CTIO) entry for status mode 0
249  *             structure definition.
250  */
251 typedef struct
252 {
253         uint8_t  entry_type;                /* Entry type. */
254         uint8_t  entry_count;               /* Entry count. */
255         uint8_t  sys_define;                /* System defined. */
256         uint8_t  entry_status;              /* Entry Status. */
257         uint32_t handle;                    /* System defined handle */
258         target_id_t target;
259         uint16_t exchange_id;
260         uint16_t flags;
261         uint16_t status;
262         uint16_t timeout;                   /* 0 = 30 seconds, 0xFFFF = disable */
263         uint16_t dseg_count;                /* Data segment count. */
264         uint32_t relative_offset;
265         uint32_t residual;
266         uint16_t reserved_1[3];
267         uint16_t scsi_status;
268         uint32_t transfer_length;
269         uint32_t dseg_0_address[0];
270 }ctio_common_entry_t;
271 #define ATIO_PATH_INVALID       0x07
272 #define ATIO_CANT_PROV_CAP      0x16
273 #define ATIO_CDB_VALID          0x3D
274
275 #define ATIO_EXEC_READ          BIT_1
276 #define ATIO_EXEC_WRITE         BIT_0
277 #endif
278
279 #ifndef CTIO_A64_TYPE
280 #define CTIO_A64_TYPE 0x1F
281 typedef struct
282 {
283         ctio_common_entry_t common;
284         uint32_t dseg_0_address;            /* Data segment 0 address. */
285         uint32_t dseg_0_length;             /* Data segment 0 length. */
286         uint32_t dseg_1_address;            /* Data segment 1 address. */
287         uint32_t dseg_1_length;             /* Data segment 1 length. */
288         uint32_t dseg_2_address;            /* Data segment 2 address. */
289         uint32_t dseg_2_length;             /* Data segment 2 length. */
290 }ctio_entry_t;
291 #define CTIO_SUCCESS                    0x01
292 #define CTIO_ABORTED                    0x02
293 #define CTIO_INVALID_RX_ID              0x08
294 #define CTIO_TIMEOUT                    0x0B
295 #define CTIO_LIP_RESET                  0x0E
296 #define CTIO_TARGET_RESET               0x17
297 #define CTIO_PORT_UNAVAILABLE           0x28
298 #define CTIO_PORT_LOGGED_OUT            0x29
299 #endif
300
301 #ifndef CTIO_RET_TYPE
302 #define CTIO_RET_TYPE   0x17            /* CTIO return entry */
303 /*
304  * ISP queue - CTIO returned entry structure definition.
305  */
306 typedef struct
307 {
308         uint8_t  entry_type;                /* Entry type. */
309         uint8_t  entry_count;               /* Entry count. */
310         uint8_t  sys_define;                /* System defined. */
311         uint8_t  entry_status;              /* Entry Status. */
312         uint32_t handle;                    /* System defined handle. */
313         target_id_t target;
314         uint16_t exchange_id;
315         uint16_t flags;
316         uint16_t status;
317         uint16_t timeout;           /* 0 = 30 seconds, 0xFFFF = disable */
318         uint16_t dseg_count;        /* Data segment count. */
319         uint32_t relative_offset;
320         uint32_t residual;
321         uint16_t reserved_1[2];
322         uint16_t sense_length;
323         uint16_t scsi_status;
324         uint16_t response_length;
325         uint8_t  sense_data[26];
326 }ctio_ret_entry_t;
327 #endif
328
329 /********************************************************************\
330  * Type Definitions used by initiator & target halves
331 \********************************************************************/
332
333 typedef enum {
334         DISABLE_TARGET_MODE = 0,
335         ENABLE_TARGET_MODE = 1
336 } qla2x_tgt_host_action_t;
337
338 struct qla2x_tgt_initiator
339 {
340         int magic;
341
342         /* Callbacks */
343         void (*tgt_response_pkt)(scsi_qla_host_t *ha, sts_entry_t *pkt);
344         void (*tgt_ctio_completion)(scsi_qla_host_t *ha, uint32_t handle);
345         void (*tgt_async_event)(uint16_t code, scsi_qla_host_t *ha, uint16_t *mailbox);
346         void (*tgt_host_action)(scsi_qla_host_t *ha, qla2x_tgt_host_action_t action);
347 };
348
349 struct qla2x_tgt_target
350 {
351         int magic;
352
353         /* Callbacks - H/W lock MUST be held while calling any */
354         request_t *(*req_pkt)(scsi_qla_host_t *ha);
355         void (*isp_cmd)(scsi_qla_host_t *ha);
356         void (*enable_lun)(scsi_qla_host_t *ha);
357         void (*disable_lun)(scsi_qla_host_t *ha);
358         int (*issue_marker)(scsi_qla_host_t *ha);
359         cont_entry_t *(*req_cont_pkt)(scsi_qla_host_t *ha);
360         int (*get_counts)(scsi_qla_host_t *ha, uint8_t *cmd, uint8_t *imm);
361 };
362
363 int qla2xxx_tgt_register_driver(/* IN */  struct qla2x_tgt_initiator *tgt,
364                                 /* OUT */ struct qla2x_tgt_target *init);
365
366 void qla2xxx_tgt_unregister_driver(void);
367
368 #endif