Fixed the following checkpatch complaint:
[mirror/scst/.git] / qla2x00t / qla2x_tgt_def.h
1 /*
2  *  qla2x_tgt_def.h
3  *
4  *  Copyright (C) 2004 - 2009 Vladislav Bolkhovitin <vst@vlnb.net>
5  *  Copyright (C) 2004 - 2005 Leonid Stoljar
6  *  Copyright (C) 2006 Nathaniel Clark <nate@misrule.us>
7  *  Copyright (C) 2007 - 2009 ID7 Ltd.
8  *
9  *  Additional file for the target driver support.
10  *
11  *  This program is free software; you can redistribute it and/or
12  *  modify it under the terms of the GNU General Public License
13  *  as published by the Free Software Foundation; either version 2
14  *  of the License, or (at your option) any later version.
15  *
16  *  This program is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  *  GNU General Public License for more details.
20  */
21 /*
22  * This is the global def file that is useful for including from the
23  * target portion.
24  */
25
26 #ifndef __QLA2X_TGT_DEF_H
27 #define __QLA2X_TGT_DEF_H
28
29 #include "qla_def.h"
30
31 #ifndef CONFIG_SCSI_QLA2XXX_TARGET
32 #error __FILE__ " included without CONFIG_SCSI_QLA2XXX_TARGET"
33 #endif
34
35 #ifndef ENTER
36 #define ENTER(a)
37 #endif
38
39 #ifndef LEAVE
40 #define LEAVE(a)
41 #endif
42
43 #define QLA2X_TARGET_MAGIC      263
44 #define QLA2X_INITIATOR_MAGIC   57216
45
46 #define QLA2X00_COMMAND_COUNT_INIT      250
47 #define QLA2X00_IMMED_NOTIFY_COUNT_INIT 250
48
49 /*
50  * Used to mark which completion handles (for RIO Status's) are for CTIO's
51  * vs. regular (non-target) info. This is checked for in
52  * qla2x00_process_response_queue() to see if a handle coming back in a
53  * multi-complete should come to the tgt driver or be handled there by qla2xxx
54  */
55 #define CTIO_COMPLETION_HANDLE_MARK     BIT_29
56 #if (CTIO_COMPLETION_HANDLE_MARK <= MAX_OUTSTANDING_COMMANDS)
57 #error "Hackish CTIO_COMPLETION_HANDLE_MARK no longer larger than MAX_OUTSTANDING_COMMANDS"
58 #endif
59 #define HANDLE_IS_CTIO_COMP(h) (h & CTIO_COMPLETION_HANDLE_MARK)
60
61 /* Used to mark CTIO as intermediate */
62 #define CTIO_INTERMEDIATE_HANDLE_MARK   BIT_30
63
64 #ifndef OF_SS_MODE_0
65 /*
66  * ISP target entries - Flags bit definitions.
67  */
68 #define OF_SS_MODE_0        0
69 #define OF_SS_MODE_1        1
70 #define OF_SS_MODE_2        2
71 #define OF_SS_MODE_3        3
72
73 #define OF_EXPL_CONF        BIT_5       /* Explicit Confirmation Requested */
74 #define OF_DATA_IN          BIT_6       /* Data in to initiator */
75                                         /*  (data from target to initiator) */
76 #define OF_DATA_OUT         BIT_7       /* Data out from initiator */
77                                         /*  (data from initiator to target) */
78 #define OF_NO_DATA          (BIT_7 | BIT_6)
79 #define OF_INC_RC           BIT_8       /* Increment command resource count */
80 #define OF_FAST_POST        BIT_9       /* Enable mailbox fast posting. */
81 #define OF_CONF_REQ         BIT_13      /* Confirmation Requested */
82 #define OF_TERM_EXCH        BIT_14      /* Terminate exchange */
83 #define OF_SSTS             BIT_15      /* Send SCSI status */
84 #endif
85
86 #ifndef DATASEGS_PER_COMMAND32
87 #define DATASEGS_PER_COMMAND32    3
88 #define DATASEGS_PER_CONT32       7
89 #define QLA_MAX_SG32(ql) \
90    (((ql) > 0) ? (DATASEGS_PER_COMMAND32 + DATASEGS_PER_CONT32*((ql) - 1)) : 0)
91
92 #define DATASEGS_PER_COMMAND64    2
93 #define DATASEGS_PER_CONT64       5
94 #define QLA_MAX_SG64(ql) \
95    (((ql) > 0) ? (DATASEGS_PER_COMMAND64 + DATASEGS_PER_CONT64*((ql) - 1)) : 0)
96 #endif
97
98 #ifndef DATASEGS_PER_COMMAND_24XX
99 #define DATASEGS_PER_COMMAND_24XX 1
100 #define DATASEGS_PER_CONT_24XX    5
101 #define QLA_MAX_SG_24XX(ql) \
102    (min(1270, ((ql) > 0) ? (DATASEGS_PER_COMMAND_24XX + DATASEGS_PER_CONT_24XX*((ql) - 1)) : 0))
103 #endif
104
105 /********************************************************************\
106  * ISP Queue types left out of new QLogic driver (from old version)
107 \********************************************************************/
108
109 #ifndef ENABLE_LUN_TYPE
110 #define ENABLE_LUN_TYPE 0x0B            /* Enable LUN entry. */
111 /*
112  * ISP queue - enable LUN entry structure definition.
113  */
114 typedef struct {
115         uint8_t  entry_type;            /* Entry type. */
116         uint8_t  entry_count;           /* Entry count. */
117         uint8_t  sys_define;            /* System defined. */
118         uint8_t  entry_status;          /* Entry Status. */
119         uint32_t sys_define_2;          /* System defined. */
120         uint8_t  reserved_8;
121         uint8_t  reserved_1;
122         uint16_t reserved_2;
123         uint32_t reserved_3;
124         uint8_t  status;
125         uint8_t  reserved_4;
126         uint8_t  command_count;         /* Number of ATIOs allocated. */
127         uint8_t  immed_notify_count;    /* Number of Immediate Notify entries allocated. */
128         uint16_t reserved_5;
129         uint16_t timeout;               /* 0 = 30 seconds, 0xFFFF = disable */
130         uint16_t reserved_6[20];
131 } __attribute__((packed)) elun_entry_t;
132 #define ENABLE_LUN_SUCCESS          0x01
133 #define ENABLE_LUN_RC_NONZERO       0x04
134 #define ENABLE_LUN_INVALID_REQUEST  0x06
135 #define ENABLE_LUN_ALREADY_ENABLED  0x3E
136 #endif
137
138 #ifndef MODIFY_LUN_TYPE
139 #define MODIFY_LUN_TYPE 0x0C      /* Modify LUN entry. */
140 /*
141  * ISP queue - modify LUN entry structure definition.
142  */
143 typedef struct {
144         uint8_t  entry_type;                /* Entry type. */
145         uint8_t  entry_count;               /* Entry count. */
146         uint8_t  sys_define;                /* System defined. */
147         uint8_t  entry_status;              /* Entry Status. */
148         uint32_t sys_define_2;              /* System defined. */
149         uint8_t  reserved_8;
150         uint8_t  reserved_1;
151         uint8_t  operators;
152         uint8_t  reserved_2;
153         uint32_t reserved_3;
154         uint8_t  status;
155         uint8_t  reserved_4;
156         uint8_t  command_count;             /* Number of ATIOs allocated. */
157         uint8_t  immed_notify_count;        /* Number of Immediate Notify */
158         /* entries allocated. */
159         uint16_t reserved_5;
160         uint16_t timeout;                   /* 0 = 30 seconds, 0xFFFF = disable */
161         uint16_t reserved_7[20];
162 } __attribute__((packed)) modify_lun_entry_t;
163 #define MODIFY_LUN_SUCCESS      0x01
164 #define MODIFY_LUN_CMD_ADD BIT_0
165 #define MODIFY_LUN_CMD_SUB BIT_1
166 #define MODIFY_LUN_IMM_ADD BIT_2
167 #define MODIFY_LUN_IMM_SUB BIT_3
168 #endif
169
170 #define GET_TARGET_ID(ha, iocb) ((HAS_EXTENDED_IDS(ha))                 \
171                                  ? le16_to_cpu((iocb)->target.extended) \
172                                  : (uint16_t)(iocb)->target.id.standard)
173
174 #ifndef IMMED_NOTIFY_TYPE
175 #define IMMED_NOTIFY_TYPE 0x0D          /* Immediate notify entry. */
176 /*
177  * ISP queue - immediate notify entry structure definition.
178  */
179 typedef struct {
180         uint8_t  entry_type;                /* Entry type. */
181         uint8_t  entry_count;               /* Entry count. */
182         uint8_t  sys_define;                /* System defined. */
183         uint8_t  entry_status;              /* Entry Status. */
184         uint32_t sys_define_2;              /* System defined. */
185         target_id_t target;
186         uint16_t lun;
187         uint8_t  target_id;
188         uint8_t  reserved_1;
189         uint16_t status_modifier;
190         uint16_t status;
191         uint16_t task_flags;
192         uint16_t seq_id;
193         uint16_t srr_rx_id;
194         uint32_t srr_rel_offs;
195         uint16_t srr_ui;
196 #define SRR_IU_DATA_IN          0x1
197 #define SRR_IU_DATA_OUT         0x5
198 #define SRR_IU_STATUS           0x7
199         uint16_t srr_ox_id;
200         uint8_t reserved_2[30];
201         uint16_t ox_id;
202 } __attribute__((packed)) notify_entry_t;
203 #endif
204
205 #ifndef NOTIFY_ACK_TYPE
206 #define NOTIFY_ACK_TYPE 0x0E      /* Notify acknowledge entry. */
207 /*
208  * ISP queue - notify acknowledge entry structure definition.
209  */
210 typedef struct {
211         uint8_t  entry_type;                /* Entry type. */
212         uint8_t  entry_count;               /* Entry count. */
213         uint8_t  sys_define;                /* System defined. */
214         uint8_t  entry_status;              /* Entry Status. */
215         uint32_t sys_define_2;              /* System defined. */
216         target_id_t target;
217         uint8_t  target_id;
218         uint8_t  reserved_1;
219         uint16_t flags;
220         uint16_t resp_code;
221         uint16_t status;
222         uint16_t task_flags;
223         uint16_t seq_id;
224         uint16_t srr_rx_id;
225         uint32_t srr_rel_offs;
226         uint16_t srr_ui;
227         uint16_t srr_flags;
228         uint16_t srr_reject_code;
229         uint8_t  srr_reject_vendor_uniq;
230         uint8_t  srr_reject_code_expl;
231         uint8_t  reserved_2[26];
232         uint16_t ox_id;
233 } __attribute__((packed)) nack_entry_t;
234 #define NOTIFY_ACK_SRR_FLAGS_ACCEPT     0
235 #define NOTIFY_ACK_SRR_FLAGS_REJECT     1
236
237 #define NOTIFY_ACK_SRR_REJECT_REASON_UNABLE_TO_PERFORM  0x9
238
239 #define NOTIFY_ACK_SRR_FLAGS_REJECT_EXPL_NO_EXPL                0
240 #define NOTIFY_ACK_SRR_FLAGS_REJECT_EXPL_UNABLE_TO_SUPPLY_DATA  0x2a
241
242 #define NOTIFY_ACK_SUCCESS      0x01
243 #endif
244
245 #ifndef ACCEPT_TGT_IO_TYPE
246 #define ACCEPT_TGT_IO_TYPE 0x16 /* Accept target I/O entry. */
247 /*
248  * ISP queue - Accept Target I/O (ATIO) entry structure definition.
249  */
250 typedef struct {
251         uint8_t  entry_type;                /* Entry type. */
252         uint8_t  entry_count;               /* Entry count. */
253         uint8_t  sys_define;                /* System defined. */
254         uint8_t  entry_status;              /* Entry Status. */
255         uint32_t sys_define_2;              /* System defined. */
256         target_id_t target;
257         uint16_t rx_id;
258         uint16_t flags;
259         uint16_t status;
260         uint8_t  command_ref;
261         uint8_t  task_codes;
262         uint8_t  task_flags;
263         uint8_t  execution_codes;
264         uint8_t  cdb[MAX_CMDSZ];
265         uint32_t data_length;
266         uint16_t lun;
267         uint8_t  initiator_port_name[WWN_SIZE]; /* on qla23xx */
268         uint16_t reserved_32[6];
269         uint16_t ox_id;
270 } __attribute__((packed)) atio_entry_t;
271 #endif
272
273 #ifndef CONTINUE_TGT_IO_TYPE
274 #define CONTINUE_TGT_IO_TYPE 0x17
275 /*
276  * ISP queue - Continue Target I/O (CTIO) entry for status mode 0
277  *             structure definition.
278  */
279 typedef struct {
280         uint8_t  entry_type;                /* Entry type. */
281         uint8_t  entry_count;               /* Entry count. */
282         uint8_t  sys_define;                /* System defined. */
283         uint8_t  entry_status;              /* Entry Status. */
284         uint32_t handle;                    /* System defined handle */
285         target_id_t target;
286         uint16_t rx_id;
287         uint16_t flags;
288         uint16_t status;
289         uint16_t timeout;                   /* 0 = 30 seconds, 0xFFFF = disable */
290         uint16_t dseg_count;                /* Data segment count. */
291         uint32_t relative_offset;
292         uint32_t residual;
293         uint16_t reserved_1[3];
294         uint16_t scsi_status;
295         uint32_t transfer_length;
296         uint32_t dseg_0_address[0];
297 } __attribute__((packed)) ctio_common_entry_t;
298 #define ATIO_PATH_INVALID       0x07
299 #define ATIO_CANT_PROV_CAP      0x16
300 #define ATIO_CDB_VALID          0x3D
301
302 #define ATIO_EXEC_READ          BIT_1
303 #define ATIO_EXEC_WRITE         BIT_0
304 #endif
305
306 #ifndef CTIO_A64_TYPE
307 #define CTIO_A64_TYPE 0x1F
308 typedef struct {
309         ctio_common_entry_t common;
310         uint32_t dseg_0_address;            /* Data segment 0 address. */
311         uint32_t dseg_0_length;             /* Data segment 0 length. */
312         uint32_t dseg_1_address;            /* Data segment 1 address. */
313         uint32_t dseg_1_length;             /* Data segment 1 length. */
314         uint32_t dseg_2_address;            /* Data segment 2 address. */
315         uint32_t dseg_2_length;             /* Data segment 2 length. */
316 } __attribute__((packed)) ctio_entry_t;
317 #define CTIO_SUCCESS                    0x01
318 #define CTIO_ABORTED                    0x02
319 #define CTIO_INVALID_RX_ID              0x08
320 #define CTIO_TIMEOUT                    0x0B
321 #define CTIO_LIP_RESET                  0x0E
322 #define CTIO_TARGET_RESET               0x17
323 #define CTIO_PORT_UNAVAILABLE           0x28
324 #define CTIO_PORT_LOGGED_OUT            0x29
325 #define CTIO_PORT_CONF_CHANGED          0x2A
326 #define CTIO_SRR_RECEIVED               0x45
327
328 #endif
329
330 #ifndef CTIO_RET_TYPE
331 #define CTIO_RET_TYPE   0x17            /* CTIO return entry */
332 /*
333  * ISP queue - CTIO returned entry structure definition.
334  */
335 typedef struct {
336         uint8_t  entry_type;                /* Entry type. */
337         uint8_t  entry_count;               /* Entry count. */
338         uint8_t  sys_define;                /* System defined. */
339         uint8_t  entry_status;              /* Entry Status. */
340         uint32_t handle;                    /* System defined handle. */
341         target_id_t target;
342         uint16_t rx_id;
343         uint16_t flags;
344         uint16_t status;
345         uint16_t timeout;           /* 0 = 30 seconds, 0xFFFF = disable */
346         uint16_t dseg_count;        /* Data segment count. */
347         uint32_t relative_offset;
348         uint32_t residual;
349         uint16_t reserved_1[2];
350         uint16_t sense_length;
351         uint16_t scsi_status;
352         uint16_t response_length;
353         uint8_t  sense_data[26];
354 } __attribute__((packed)) ctio_ret_entry_t;
355 #endif
356
357 #define ATIO_TYPE7 0x06 /* Accept target I/O entry for 24xx */
358
359 typedef struct {
360         uint8_t  r_ctl;
361         uint8_t  d_id[3];
362         uint8_t  cs_ctl;
363         uint8_t  s_id[3];
364         uint8_t  type;
365         uint8_t  f_ctl[3];
366         uint8_t  seq_id;
367         uint8_t  df_ctl;
368         uint16_t seq_cnt;
369         uint16_t ox_id;
370         uint16_t rx_id;
371         uint32_t parameter;
372 } __attribute__((packed)) fcp_hdr_t;
373
374 typedef struct {
375         uint8_t  d_id[3];
376         uint8_t  r_ctl;
377         uint8_t  s_id[3];
378         uint8_t  cs_ctl;
379         uint8_t  f_ctl[3];
380         uint8_t  type;
381         uint16_t seq_cnt;
382         uint8_t  df_ctl;
383         uint8_t  seq_id;
384         uint16_t rx_id;
385         uint16_t ox_id;
386         uint32_t parameter;
387 } __attribute__((packed)) fcp_hdr_le_t;
388
389 #define F_CTL_EXCH_CONTEXT_RESP BIT_23
390 #define F_CTL_SEQ_CONTEXT_RESIP BIT_22
391 #define F_CTL_LAST_SEQ          BIT_20
392 #define F_CTL_END_SEQ           BIT_19
393 #define F_CTL_SEQ_INITIATIVE    BIT_16
394
395 #define R_CTL_BASIC_LINK_SERV   0x80
396 #define R_CTL_B_ACC             0x4
397 #define R_CTL_B_RJT             0x5
398
399 typedef struct {
400         uint64_t lun;
401         uint8_t  cmnd_ref;
402         uint8_t  task_attr:3;
403         uint8_t  reserved:5;
404         uint8_t  task_mgmt_flags;
405 #define FCP_CMND_TASK_MGMT_CLEAR_ACA            6
406 #define FCP_CMND_TASK_MGMT_TARGET_RESET         5
407 #define FCP_CMND_TASK_MGMT_LU_RESET             4
408 #define FCP_CMND_TASK_MGMT_CLEAR_TASK_SET       2
409 #define FCP_CMND_TASK_MGMT_ABORT_TASK_SET       1
410         uint8_t  wrdata:1;
411         uint8_t  rddata:1;
412         uint8_t  add_cdb_len:6;
413         uint8_t  cdb[16];
414         /* Valid only if add_cdb_len=0, otherwise this is additional CDB data */
415         uint32_t data_length;
416 } __attribute__((packed)) fcp_cmnd_t;
417
418 /*
419  * ISP queue - Accept Target I/O (ATIO) type 7 entry for 24xx structure
420  * definition.
421  */
422 typedef struct {
423         uint8_t  entry_type;                /* Entry type. */
424         uint8_t  entry_count;               /* Entry count. */
425         uint8_t  fcp_cmnd_len_low;
426         uint8_t  fcp_cmnd_len_high:4;
427         uint8_t  attr:4;
428         uint32_t exchange_addr;
429 #define ATIO_EXCHANGE_ADDRESS_UNKNOWN           0xFFFFFFFF
430         fcp_hdr_t fcp_hdr;
431         fcp_cmnd_t fcp_cmnd;
432 } __attribute__((packed)) atio7_entry_t;
433
434 #define CTIO_TYPE7 0x12 /* Continue target I/O entry (for 24xx) */
435
436 /*
437  * ISP queue - Continue Target I/O (ATIO) type 7 entry (for 24xx) structure
438  * definition.
439  */
440
441 typedef struct {
442         uint8_t  entry_type;                /* Entry type. */
443         uint8_t  entry_count;               /* Entry count. */
444         uint8_t  sys_define;                /* System defined. */
445         uint8_t  entry_status;              /* Entry Status. */
446         uint32_t handle;                    /* System defined handle */
447         uint16_t nport_handle;
448 #define CTIO7_NHANDLE_UNRECOGNIZED      0xFFFF
449         uint16_t timeout;
450         uint16_t dseg_count;                /* Data segment count. */
451         uint8_t  vp_index;
452         uint8_t  add_flags;
453         uint8_t  initiator_id[3];
454         uint8_t  reserved;
455         uint32_t exchange_addr;
456 } __attribute__((packed)) ctio7_common_entry_t;
457
458 typedef struct {
459         ctio7_common_entry_t common;
460         uint16_t reserved1;
461         uint16_t flags;
462         uint32_t residual;
463         uint16_t ox_id;
464         uint16_t scsi_status;
465         uint32_t relative_offset;
466         uint32_t reserved2;
467         uint32_t transfer_length;
468         uint32_t reserved3;
469         uint32_t dseg_0_address[2];         /* Data segment 0 address. */
470         uint32_t dseg_0_length;             /* Data segment 0 length. */
471 } __attribute__((packed)) ctio7_status0_entry_t;
472
473 typedef struct {
474         ctio7_common_entry_t common;
475         uint16_t sense_length;
476         uint16_t flags;
477         uint32_t residual;
478         uint16_t ox_id;
479         uint16_t scsi_status;
480         uint16_t response_len;
481         uint16_t reserved;
482         uint8_t sense_data[24];
483 } __attribute__((packed)) ctio7_status1_entry_t;
484
485 typedef struct {
486         uint8_t  entry_type;                /* Entry type. */
487         uint8_t  entry_count;               /* Entry count. */
488         uint8_t  sys_define;                /* System defined. */
489         uint8_t  entry_status;              /* Entry Status. */
490         uint32_t handle;                    /* System defined handle */
491         uint16_t status;
492         uint16_t timeout;
493         uint16_t dseg_count;                /* Data segment count. */
494         uint8_t  reserved1[6];
495         uint32_t exchange_address;
496         uint16_t reserved2;
497         uint16_t flags;
498         uint32_t residual;
499         uint16_t ox_id;
500         uint16_t reserved3;
501         uint32_t relative_offset;
502         uint8_t  reserved4[24];
503 } __attribute__((packed)) ctio7_fw_entry_t;
504
505 /* CTIO7 flags values */
506 #define CTIO7_FLAGS_SEND_STATUS         BIT_15
507 #define CTIO7_FLAGS_TERMINATE           BIT_14
508 #define CTIO7_FLAGS_CONFORM_REQ         BIT_13
509 #define CTIO7_FLAGS_DONT_RET_CTIO       BIT_8
510 #define CTIO7_FLAGS_STATUS_MODE_0       0
511 #define CTIO7_FLAGS_STATUS_MODE_1       BIT_6
512 #define CTIO7_FLAGS_EXPLICIT_CONFORM    BIT_5
513 #define CTIO7_FLAGS_CONFIRM_SATISF      BIT_4
514 #define CTIO7_FLAGS_DSD_PTR             BIT_2
515 #define CTIO7_FLAGS_DATA_IN             BIT_1
516 #define CTIO7_FLAGS_DATA_OUT            BIT_0
517
518 /*
519  * ISP queue - immediate notify entry structure definition for 24xx.
520  */
521 typedef struct {
522         uint8_t  entry_type;                /* Entry type. */
523         uint8_t  entry_count;               /* Entry count. */
524         uint8_t  sys_define;                /* System defined. */
525         uint8_t  entry_status;              /* Entry Status. */
526         uint32_t reserved;
527         uint16_t nport_handle;
528         uint16_t reserved_2;
529         uint16_t flags;
530 #define NOTIFY24XX_FLAGS_GLOBAL_TPRLO   BIT_1
531 #define NOTIFY24XX_FLAGS_PUREX_IOCB     BIT_0
532         uint16_t srr_rx_id;
533         uint16_t status;
534         uint8_t  status_subcode;
535         uint8_t  reserved_3;
536         uint32_t exchange_address;
537         uint32_t srr_rel_offs;
538         uint16_t srr_ui;
539         uint16_t srr_ox_id;
540         uint8_t  reserved_4[19];
541         uint8_t  vp_index;
542         uint32_t reserved_5;
543         uint8_t  port_id[3];
544         uint8_t  reserved_6;
545         uint16_t reserved_7;
546         uint16_t ox_id;
547 } __attribute__((packed)) notify24xx_entry_t;
548
549 #define ELS_PLOGI                       0x3
550 #define ELS_FLOGI                       0x4
551 #define ELS_LOGO                        0x5
552 #define ELS_PRLI                        0x20
553 #define ELS_PRLO                        0x21
554 #define ELS_TPRLO                       0x24
555 #define ELS_PDISC                       0x50
556 #define ELS_ADISC                       0x52
557
558 /*
559  * ISP queue - notify acknowledge entry structure definition for 24xx.
560  */
561 typedef struct {
562         uint8_t  entry_type;                /* Entry type. */
563         uint8_t  entry_count;               /* Entry count. */
564         uint8_t  sys_define;                /* System defined. */
565         uint8_t  entry_status;              /* Entry Status. */
566         uint32_t handle;
567         uint16_t nport_handle;
568         uint16_t reserved_1;
569         uint16_t flags;
570         uint16_t srr_rx_id;
571         uint16_t status;
572         uint8_t  status_subcode;
573         uint8_t  reserved_3;
574         uint32_t exchange_address;
575         uint32_t srr_rel_offs;
576         uint16_t srr_ui;
577         uint16_t srr_flags;
578         uint8_t  reserved_4[19];
579         uint8_t  vp_index;
580         uint8_t  srr_reject_vendor_uniq;
581         uint8_t  srr_reject_code_expl;
582         uint8_t  srr_reject_code;
583         uint8_t  reserved_5[7];
584         uint16_t ox_id;
585 } __attribute__((packed)) nack24xx_entry_t;
586
587 /*
588  * ISP queue - ABTS received/response entries structure definition for 24xx.
589  */
590 #define ABTS_RECV_24XX          0x54 /* ABTS received (for 24xx) */
591 #define ABTS_RESP_24XX          0x55 /* ABTS responce (for 24xx) */
592
593 typedef struct {
594         uint8_t  entry_type;                /* Entry type. */
595         uint8_t  entry_count;               /* Entry count. */
596         uint8_t  sys_define;                /* System defined. */
597         uint8_t  entry_status;              /* Entry Status. */
598         uint8_t  reserved_1[6];
599         uint16_t nport_handle;
600         uint8_t  reserved_2[3];
601         uint8_t  reserved_3:4;
602         uint8_t  sof_type:4;
603         uint32_t exchange_address;
604         fcp_hdr_le_t fcp_hdr_le;
605         uint8_t  reserved_4[16];
606         uint32_t exchange_addr_to_abort;
607 } __attribute__((packed)) abts24_recv_entry_t;
608
609 #define ABTS_PARAM_ABORT_SEQ            BIT_0
610
611 typedef struct {
612         uint16_t reserved;
613         uint8_t  seq_id_last;
614         uint8_t  seq_id_valid;
615 #define SEQ_ID_VALID    0x80
616 #define SEQ_ID_INVALID  0x00
617         uint16_t rx_id;
618         uint16_t ox_id;
619         uint16_t high_seq_cnt;
620         uint16_t low_seq_cnt;
621 } __attribute__((packed)) ba_acc_le_t;
622
623 typedef struct {
624         uint8_t vendor_uniq;
625         uint8_t reason_expl;
626         uint8_t reason_code;
627 #define BA_RJT_REASON_CODE_INVALID_COMMAND      0x1
628 #define BA_RJT_REASON_CODE_UNABLE_TO_PERFORM    0x9
629         uint8_t reserved;
630 } __attribute__((packed)) ba_rjt_le_t;
631
632 typedef struct {
633         uint8_t  entry_type;                /* Entry type. */
634         uint8_t  entry_count;               /* Entry count. */
635         uint8_t  sys_define;                /* System defined. */
636         uint8_t  entry_status;              /* Entry Status. */
637         uint32_t handle;
638         uint16_t reserved_1;
639         uint16_t nport_handle;
640         uint16_t control_flags;
641 #define ABTS_CONTR_FLG_TERM_EXCHG       BIT_0
642         uint8_t  reserved_2;
643         uint8_t  reserved_3:4;
644         uint8_t  sof_type:4;
645         uint32_t exchange_address;
646         fcp_hdr_le_t fcp_hdr_le;
647         union {
648                 ba_acc_le_t ba_acct;
649                 ba_rjt_le_t ba_rjt;
650         } __attribute__((packed)) payload;
651         uint32_t reserved_4;
652         uint32_t exchange_addr_to_abort;
653 } __attribute__((packed)) abts24_resp_entry_t;
654
655 typedef struct {
656         uint8_t  entry_type;                /* Entry type. */
657         uint8_t  entry_count;               /* Entry count. */
658         uint8_t  sys_define;                /* System defined. */
659         uint8_t  entry_status;              /* Entry Status. */
660         uint32_t handle;
661         uint16_t compl_status;
662 #define ABTS_RESP_COMPL_SUCCESS         0
663 #define ABTS_RESP_COMPL_SUBCODE_ERROR   0x31
664         uint16_t nport_handle;
665         uint16_t reserved_1;
666         uint8_t  reserved_2;
667         uint8_t  reserved_3:4;
668         uint8_t  sof_type:4;
669         uint32_t exchange_address;
670         fcp_hdr_le_t fcp_hdr_le;
671         uint8_t reserved_4[8];
672         uint32_t error_subcode1;
673 #define ABTS_RESP_SUBCODE_ERR_ABORTED_EXCH_NOT_TERM     0x1E
674         uint32_t error_subcode2;
675         uint32_t exchange_addr_to_abort;
676 } __attribute__((packed)) abts24_resp_fw_entry_t;
677
678 /********************************************************************\
679  * Type Definitions used by initiator & target halves
680 \********************************************************************/
681
682 typedef enum {
683         DISABLE_TARGET_MODE = 0,
684         ENABLE_TARGET_MODE = 1
685 } qla2x_tgt_host_action_t;
686
687 struct qla_tgt_initiator {
688         int magic;
689
690         /* Callbacks */
691         void (*tgt24_atio_pkt)(scsi_qla_host_t *ha, atio7_entry_t *pkt);
692         void (*tgt_response_pkt)(scsi_qla_host_t *ha, response_t *pkt);
693         void (*tgt2x_ctio_completion)(scsi_qla_host_t *ha, uint32_t handle);
694         void (*tgt_async_event)(uint16_t code, scsi_qla_host_t *ha,
695                 uint16_t *mailbox);
696         int (*tgt_host_action)(scsi_qla_host_t *ha, qla2x_tgt_host_action_t
697                                                         action);
698         void (*tgt_fc_port_added)(scsi_qla_host_t *ha, fc_port_t *fcport);
699         void (*tgt_fc_port_deleted)(scsi_qla_host_t *ha, fc_port_t *fcport);
700 };
701
702 struct qla_target {
703         int magic;
704
705         /*
706          * Callbacks - H/W lock MUST be held while calling any.
707          *
708          * !!! req_pkt() and issue_marker() could unlock/lock it inside !!!
709          *
710          * But it isn't an issue, since in the current implementation:
711          *
712          *   - Either we in IRQ and only IRQ handler can modify HW data,
713          *     including rings related fields.
714          *
715          *   - Or access to target mode variables from struct q2t_tgt don't
716          *     cross those functions boundaries, except tgt_shutdown, which
717          *     additionally protected by irq_cmd_count.
718          */
719         request_t *(*req_pkt)(scsi_qla_host_t *ha);
720         void (*isp_cmd)(scsi_qla_host_t *ha);
721         void (*enable_tgt_mode)(scsi_qla_host_t *ha);
722         void (*disable_tgt_mode)(scsi_qla_host_t *ha);
723         int (*issue_marker)(scsi_qla_host_t *ha, int ha_locked);
724         void (*mark_all_devices_lost)(scsi_qla_host_t *ha, int defer);
725         int (*get_id_list)(scsi_qla_host_t *ha, void *id_list,
726                 dma_addr_t id_list_dma, uint16_t *entries);
727         int (*get_port_database)(scsi_qla_host_t *ha, fc_port_t *fcport,
728                 uint8_t opt);
729 };
730
731 int qla2xxx_tgt_register_driver(/* IN */  struct qla_tgt_initiator *tgt,
732                                 /* OUT */ struct qla_target *init);
733
734 void qla2xxx_tgt_unregister_driver(void);
735
736 int qla2x00_wait_for_loop_ready(scsi_qla_host_t *ha);
737 int qla2x00_wait_for_hba_online(scsi_qla_host_t *ha);
738
739 #endif /* __QLA2X_TGT_DEF_H */