4ef7b92cb6e4f4b3f8cfc48ee585dde7478708c2
[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 {
116         uint8_t  entry_type;            /* Entry type. */
117         uint8_t  entry_count;           /* Entry count. */
118         uint8_t  sys_define;            /* System defined. */
119         uint8_t  entry_status;          /* Entry Status. */
120         uint32_t sys_define_2;          /* System defined. */
121         uint8_t  reserved_8;
122         uint8_t  reserved_1;
123         uint16_t reserved_2;
124         uint32_t reserved_3;
125         uint8_t  status;
126         uint8_t  reserved_4;
127         uint8_t  command_count;         /* Number of ATIOs allocated. */
128         uint8_t  immed_notify_count;    /* Number of Immediate Notify entries allocated. */
129         uint16_t reserved_5;
130         uint16_t timeout;               /* 0 = 30 seconds, 0xFFFF = disable */
131         uint16_t reserved_6[20];
132 } __attribute__((packed)) elun_entry_t;
133 #define ENABLE_LUN_SUCCESS          0x01
134 #define ENABLE_LUN_RC_NONZERO       0x04
135 #define ENABLE_LUN_INVALID_REQUEST  0x06
136 #define ENABLE_LUN_ALREADY_ENABLED  0x3E
137 #endif
138
139 #ifndef MODIFY_LUN_TYPE
140 #define MODIFY_LUN_TYPE 0x0C      /* Modify LUN entry. */
141 /*
142  * ISP queue - modify LUN entry structure definition.
143  */
144 typedef struct
145 {
146         uint8_t  entry_type;                /* Entry type. */
147         uint8_t  entry_count;               /* Entry count. */
148         uint8_t  sys_define;                /* System defined. */
149         uint8_t  entry_status;              /* Entry Status. */
150         uint32_t sys_define_2;              /* System defined. */
151         uint8_t  reserved_8;
152         uint8_t  reserved_1;
153         uint8_t  operators;
154         uint8_t  reserved_2;
155         uint32_t reserved_3;
156         uint8_t  status;
157         uint8_t  reserved_4;
158         uint8_t  command_count;             /* Number of ATIOs allocated. */
159         uint8_t  immed_notify_count;        /* Number of Immediate Notify */
160         /* entries allocated. */
161         uint16_t reserved_5;
162         uint16_t timeout;                   /* 0 = 30 seconds, 0xFFFF = disable */
163         uint16_t reserved_7[20];
164 } __attribute__((packed)) modify_lun_entry_t;
165 #define MODIFY_LUN_SUCCESS      0x01
166 #define MODIFY_LUN_CMD_ADD BIT_0
167 #define MODIFY_LUN_CMD_SUB BIT_1
168 #define MODIFY_LUN_IMM_ADD BIT_2
169 #define MODIFY_LUN_IMM_SUB BIT_3
170 #endif
171
172 #define GET_TARGET_ID(ha, iocb) ((HAS_EXTENDED_IDS(ha))                 \
173                                  ? le16_to_cpu((iocb)->target.extended) \
174                                  : (uint16_t)(iocb)->target.id.standard)
175
176 #ifndef IMMED_NOTIFY_TYPE
177 #define IMMED_NOTIFY_TYPE 0x0D          /* Immediate notify entry. */
178 /*
179  * ISP queue - immediate notify entry structure definition.
180  */
181 typedef struct
182 {
183         uint8_t  entry_type;                /* Entry type. */
184         uint8_t  entry_count;               /* Entry count. */
185         uint8_t  sys_define;                /* System defined. */
186         uint8_t  entry_status;              /* Entry Status. */
187         uint32_t sys_define_2;              /* System defined. */
188         target_id_t target;
189         uint16_t lun;
190         uint8_t  target_id;
191         uint8_t  reserved_1;
192         uint16_t status_modifier;
193         uint16_t status;
194         uint16_t task_flags;
195         uint16_t seq_id;
196         uint16_t srr_rx_id;
197         uint32_t srr_rel_offs;
198         uint16_t srr_ui;
199 #define SRR_IU_DATA_IN          0x1
200 #define SRR_IU_DATA_OUT         0x5
201 #define SRR_IU_STATUS           0x7
202         uint16_t srr_ox_id;
203         uint8_t reserved_2[30];
204         uint16_t ox_id;
205 } __attribute__((packed)) notify_entry_t;
206 #endif
207
208 #ifndef NOTIFY_ACK_TYPE
209 #define NOTIFY_ACK_TYPE 0x0E      /* Notify acknowledge entry. */
210 /*
211  * ISP queue - notify acknowledge entry structure definition.
212  */
213 typedef struct
214 {
215         uint8_t  entry_type;                /* Entry type. */
216         uint8_t  entry_count;               /* Entry count. */
217         uint8_t  sys_define;                /* System defined. */
218         uint8_t  entry_status;              /* Entry Status. */
219         uint32_t sys_define_2;              /* System defined. */
220         target_id_t target;
221         uint8_t  target_id;
222         uint8_t  reserved_1;
223         uint16_t flags;
224         uint16_t resp_code;
225         uint16_t status;
226         uint16_t task_flags;
227         uint16_t seq_id;
228         uint16_t srr_rx_id;
229         uint32_t srr_rel_offs;
230         uint16_t srr_ui;
231         uint16_t srr_flags;
232         uint16_t srr_reject_code;
233         uint8_t  srr_reject_vendor_uniq;
234         uint8_t  srr_reject_code_expl;
235         uint8_t  reserved_2[26];
236         uint16_t ox_id;
237 } __attribute__((packed)) nack_entry_t;
238 #define NOTIFY_ACK_SRR_FLAGS_ACCEPT     0
239 #define NOTIFY_ACK_SRR_FLAGS_REJECT     1
240
241 #define NOTIFY_ACK_SRR_REJECT_REASON_UNABLE_TO_PERFORM  0x9
242
243 #define NOTIFY_ACK_SRR_FLAGS_REJECT_EXPL_NO_EXPL                0
244 #define NOTIFY_ACK_SRR_FLAGS_REJECT_EXPL_UNABLE_TO_SUPPLY_DATA  0x2a
245
246 #define NOTIFY_ACK_SUCCESS      0x01
247 #endif
248
249 #ifndef ACCEPT_TGT_IO_TYPE
250 #define ACCEPT_TGT_IO_TYPE 0x16 /* Accept target I/O entry. */
251 /*
252  * ISP queue - Accept Target I/O (ATIO) entry structure definition.
253  */
254 typedef struct
255 {
256         uint8_t  entry_type;                /* Entry type. */
257         uint8_t  entry_count;               /* Entry count. */
258         uint8_t  sys_define;                /* System defined. */
259         uint8_t  entry_status;              /* Entry Status. */
260         uint32_t sys_define_2;              /* System defined. */
261         target_id_t target;
262         uint16_t rx_id;
263         uint16_t flags;
264         uint16_t status;
265         uint8_t  command_ref;
266         uint8_t  task_codes;
267         uint8_t  task_flags;
268         uint8_t  execution_codes;
269         uint8_t  cdb[MAX_CMDSZ];
270         uint32_t data_length;
271         uint16_t lun;
272         uint8_t  initiator_port_name[WWN_SIZE]; /* on qla23xx */
273         uint16_t reserved_32[6];
274         uint16_t ox_id;
275 } __attribute__((packed)) atio_entry_t;
276 #endif
277
278 #ifndef CONTINUE_TGT_IO_TYPE
279 #define CONTINUE_TGT_IO_TYPE 0x17
280 /*
281  * ISP queue - Continue Target I/O (CTIO) entry for status mode 0
282  *             structure definition.
283  */
284 typedef struct
285 {
286         uint8_t  entry_type;                /* Entry type. */
287         uint8_t  entry_count;               /* Entry count. */
288         uint8_t  sys_define;                /* System defined. */
289         uint8_t  entry_status;              /* Entry Status. */
290         uint32_t handle;                    /* System defined handle */
291         target_id_t target;
292         uint16_t rx_id;
293         uint16_t flags;
294         uint16_t status;
295         uint16_t timeout;                   /* 0 = 30 seconds, 0xFFFF = disable */
296         uint16_t dseg_count;                /* Data segment count. */
297         uint32_t relative_offset;
298         uint32_t residual;
299         uint16_t reserved_1[3];
300         uint16_t scsi_status;
301         uint32_t transfer_length;
302         uint32_t dseg_0_address[0];
303 } __attribute__((packed)) ctio_common_entry_t;
304 #define ATIO_PATH_INVALID       0x07
305 #define ATIO_CANT_PROV_CAP      0x16
306 #define ATIO_CDB_VALID          0x3D
307
308 #define ATIO_EXEC_READ          BIT_1
309 #define ATIO_EXEC_WRITE         BIT_0
310 #endif
311
312 #ifndef CTIO_A64_TYPE
313 #define CTIO_A64_TYPE 0x1F
314 typedef struct
315 {
316         ctio_common_entry_t common;
317         uint32_t dseg_0_address;            /* Data segment 0 address. */
318         uint32_t dseg_0_length;             /* Data segment 0 length. */
319         uint32_t dseg_1_address;            /* Data segment 1 address. */
320         uint32_t dseg_1_length;             /* Data segment 1 length. */
321         uint32_t dseg_2_address;            /* Data segment 2 address. */
322         uint32_t dseg_2_length;             /* Data segment 2 length. */
323 } __attribute__((packed)) ctio_entry_t;
324 #define CTIO_SUCCESS                    0x01
325 #define CTIO_ABORTED                    0x02
326 #define CTIO_INVALID_RX_ID              0x08
327 #define CTIO_TIMEOUT                    0x0B
328 #define CTIO_LIP_RESET                  0x0E
329 #define CTIO_TARGET_RESET               0x17
330 #define CTIO_PORT_UNAVAILABLE           0x28
331 #define CTIO_PORT_LOGGED_OUT            0x29
332 #define CTIO_PORT_CONF_CHANGED          0x2A
333 #define CTIO_SRR_RECEIVED               0x45
334
335 #endif
336
337 #ifndef CTIO_RET_TYPE
338 #define CTIO_RET_TYPE   0x17            /* CTIO return entry */
339 /*
340  * ISP queue - CTIO returned entry structure definition.
341  */
342 typedef struct
343 {
344         uint8_t  entry_type;                /* Entry type. */
345         uint8_t  entry_count;               /* Entry count. */
346         uint8_t  sys_define;                /* System defined. */
347         uint8_t  entry_status;              /* Entry Status. */
348         uint32_t handle;                    /* System defined handle. */
349         target_id_t target;
350         uint16_t rx_id;
351         uint16_t flags;
352         uint16_t status;
353         uint16_t timeout;           /* 0 = 30 seconds, 0xFFFF = disable */
354         uint16_t dseg_count;        /* Data segment count. */
355         uint32_t relative_offset;
356         uint32_t residual;
357         uint16_t reserved_1[2];
358         uint16_t sense_length;
359         uint16_t scsi_status;
360         uint16_t response_length;
361         uint8_t  sense_data[26];
362 } __attribute__((packed)) ctio_ret_entry_t;
363 #endif
364
365 #define ATIO_TYPE7 0x06 /* Accept target I/O entry for 24xx */
366
367 typedef struct
368 {
369         uint8_t  r_ctl;
370         uint8_t  d_id[3];
371         uint8_t  cs_ctl;
372         uint8_t  s_id[3];
373         uint8_t  type;
374         uint8_t  f_ctl[3];
375         uint8_t  seq_id;
376         uint8_t  df_ctl;
377         uint16_t seq_cnt;
378         uint16_t ox_id;
379         uint16_t rx_id;
380         uint32_t parameter;
381 } __attribute__((packed)) fcp_hdr_t;
382
383 typedef struct
384 {
385         uint8_t  d_id[3];
386         uint8_t  r_ctl;
387         uint8_t  s_id[3];
388         uint8_t  cs_ctl;
389         uint8_t  f_ctl[3];
390         uint8_t  type;
391         uint16_t seq_cnt;
392         uint8_t  df_ctl;
393         uint8_t  seq_id;
394         uint16_t rx_id;
395         uint16_t ox_id;
396         uint32_t parameter;
397 } __attribute__((packed)) fcp_hdr_le_t;
398
399 #define F_CTL_EXCH_CONTEXT_RESP BIT_23
400 #define F_CTL_SEQ_CONTEXT_RESIP BIT_22
401 #define F_CTL_LAST_SEQ          BIT_20
402 #define F_CTL_END_SEQ           BIT_19
403 #define F_CTL_SEQ_INITIATIVE    BIT_16
404
405 #define R_CTL_BASIC_LINK_SERV   0x80
406 #define R_CTL_B_ACC             0x4
407 #define R_CTL_B_RJT             0x5
408
409 typedef struct
410 {
411         uint64_t lun;
412         uint8_t  cmnd_ref;
413         uint8_t  task_attr:3;
414         uint8_t  reserved:5;
415         uint8_t  task_mgmt_flags;
416 #define FCP_CMND_TASK_MGMT_CLEAR_ACA            6
417 #define FCP_CMND_TASK_MGMT_TARGET_RESET         5
418 #define FCP_CMND_TASK_MGMT_LU_RESET             4
419 #define FCP_CMND_TASK_MGMT_CLEAR_TASK_SET       2
420 #define FCP_CMND_TASK_MGMT_ABORT_TASK_SET       1
421         uint8_t  wrdata:1;
422         uint8_t  rddata:1;
423         uint8_t  add_cdb_len:6;
424         uint8_t  cdb[16];
425         /* Valid only if add_cdb_len=0, otherwise this is additional CDB data */
426         uint32_t data_length;
427 } __attribute__((packed)) fcp_cmnd_t;
428
429 /*
430  * ISP queue - Accept Target I/O (ATIO) type 7 entry for 24xx structure
431  * definition.
432  */
433 typedef struct
434 {
435         uint8_t  entry_type;                /* Entry type. */
436         uint8_t  entry_count;               /* Entry count. */
437         uint8_t  fcp_cmnd_len_low;
438         uint8_t  fcp_cmnd_len_high:4;
439         uint8_t  attr:4;
440         uint32_t exchange_addr;
441 #define ATIO_EXCHANGE_ADDRESS_UNKNOWN           0xFFFFFFFF
442         fcp_hdr_t fcp_hdr;
443         fcp_cmnd_t fcp_cmnd;
444 } __attribute__((packed)) atio7_entry_t;
445
446 #define CTIO_TYPE7 0x12 /* Continue target I/O entry (for 24xx) */
447
448 /*
449  * ISP queue - Continue Target I/O (ATIO) type 7 entry (for 24xx) structure
450  * definition.
451  */
452
453 typedef struct
454 {
455         uint8_t  entry_type;                /* Entry type. */
456         uint8_t  entry_count;               /* Entry count. */
457         uint8_t  sys_define;                /* System defined. */
458         uint8_t  entry_status;              /* Entry Status. */
459         uint32_t handle;                    /* System defined handle */
460         uint16_t nport_handle;
461 #define CTIO7_NHANDLE_UNRECOGNIZED      0xFFFF
462         uint16_t timeout;
463         uint16_t dseg_count;                /* Data segment count. */
464         uint8_t  vp_index;
465         uint8_t  add_flags;
466         uint8_t  initiator_id[3];
467         uint8_t  reserved;
468         uint32_t exchange_addr;
469 } __attribute__((packed)) ctio7_common_entry_t;
470
471 typedef struct
472 {
473         ctio7_common_entry_t common;
474         uint16_t reserved1;
475         uint16_t flags;
476         uint32_t residual;
477         uint16_t ox_id;
478         uint16_t scsi_status;
479         uint32_t relative_offset;
480         uint32_t reserved2;
481         uint32_t transfer_length;
482         uint32_t reserved3;
483         uint32_t dseg_0_address[2];         /* Data segment 0 address. */
484         uint32_t dseg_0_length;             /* Data segment 0 length. */
485 } __attribute__((packed)) ctio7_status0_entry_t;
486
487 typedef struct
488 {
489         ctio7_common_entry_t common;
490         uint16_t sense_length;
491         uint16_t flags;
492         uint32_t residual;
493         uint16_t ox_id;
494         uint16_t scsi_status;
495         uint16_t response_len;
496         uint16_t reserved;
497         uint8_t sense_data[24];
498 } __attribute__((packed)) ctio7_status1_entry_t;
499
500 typedef struct
501 {
502         uint8_t  entry_type;                /* Entry type. */
503         uint8_t  entry_count;               /* Entry count. */
504         uint8_t  sys_define;                /* System defined. */
505         uint8_t  entry_status;              /* Entry Status. */
506         uint32_t handle;                    /* System defined handle */
507         uint16_t status;
508         uint16_t timeout;
509         uint16_t dseg_count;                /* Data segment count. */
510         uint8_t  reserved1[6];
511         uint32_t exchange_address;
512         uint16_t reserved2;
513         uint16_t flags;
514         uint32_t residual;
515         uint16_t ox_id;
516         uint16_t reserved3;
517         uint32_t relative_offset;
518         uint8_t  reserved4[24];
519 } __attribute__((packed)) ctio7_fw_entry_t;
520
521 /* CTIO7 flags values */
522 #define CTIO7_FLAGS_SEND_STATUS         BIT_15
523 #define CTIO7_FLAGS_TERMINATE           BIT_14
524 #define CTIO7_FLAGS_CONFORM_REQ         BIT_13
525 #define CTIO7_FLAGS_DONT_RET_CTIO       BIT_8
526 #define CTIO7_FLAGS_STATUS_MODE_0       0
527 #define CTIO7_FLAGS_STATUS_MODE_1       BIT_6
528 #define CTIO7_FLAGS_EXPLICIT_CONFORM    BIT_5
529 #define CTIO7_FLAGS_CONFIRM_SATISF      BIT_4
530 #define CTIO7_FLAGS_DSD_PTR             BIT_2
531 #define CTIO7_FLAGS_DATA_IN             BIT_1
532 #define CTIO7_FLAGS_DATA_OUT            BIT_0
533
534 /*
535  * ISP queue - immediate notify entry structure definition for 24xx.
536  */
537 typedef struct
538 {
539         uint8_t  entry_type;                /* Entry type. */
540         uint8_t  entry_count;               /* Entry count. */
541         uint8_t  sys_define;                /* System defined. */
542         uint8_t  entry_status;              /* Entry Status. */
543         uint32_t reserved;
544         uint16_t nport_handle;
545         uint16_t reserved_2;
546         uint16_t flags;
547 #define NOTIFY24XX_FLAGS_GLOBAL_TPRLO   BIT_1
548 #define NOTIFY24XX_FLAGS_PUREX_IOCB     BIT_0
549         uint16_t srr_rx_id;
550         uint16_t status;
551         uint8_t  status_subcode;
552         uint8_t  reserved_3;
553         uint32_t exchange_address;
554         uint32_t srr_rel_offs;
555         uint16_t srr_ui;
556         uint16_t srr_ox_id;
557         uint8_t  reserved_4[19];
558         uint8_t  vp_index;
559         uint32_t reserved_5;
560         uint8_t  port_id[3];
561         uint8_t  reserved_6;
562         uint16_t reserved_7;
563         uint16_t ox_id;
564 } __attribute__((packed)) notify24xx_entry_t;
565
566 #define ELS_PLOGI                       0x3
567 #define ELS_FLOGI                       0x4
568 #define ELS_LOGO                        0x5
569 #define ELS_PRLI                        0x20
570 #define ELS_PRLO                        0x21
571 #define ELS_TPRLO                       0x24
572 #define ELS_PDISC                       0x50
573 #define ELS_ADISC                       0x52
574
575 /*
576  * ISP queue - notify acknowledge entry structure definition for 24xx.
577  */
578 typedef struct {
579         uint8_t  entry_type;                /* Entry type. */
580         uint8_t  entry_count;               /* Entry count. */
581         uint8_t  sys_define;                /* System defined. */
582         uint8_t  entry_status;              /* Entry Status. */
583         uint32_t handle;
584         uint16_t nport_handle;
585         uint16_t reserved_1;
586         uint16_t flags;
587         uint16_t srr_rx_id;
588         uint16_t status;
589         uint8_t  status_subcode;
590         uint8_t  reserved_3;
591         uint32_t exchange_address;
592         uint32_t srr_rel_offs;
593         uint16_t srr_ui;
594         uint16_t srr_flags;
595         uint8_t  reserved_4[19];
596         uint8_t  vp_index;
597         uint8_t  srr_reject_vendor_uniq;
598         uint8_t  srr_reject_code_expl;
599         uint8_t  srr_reject_code;
600         uint8_t  reserved_5[7];
601         uint16_t ox_id;
602 } __attribute__((packed)) nack24xx_entry_t;
603
604 /*
605  * ISP queue - ABTS received/response entries structure definition for 24xx.
606  */
607 #define ABTS_RECV_24XX          0x54 /* ABTS received (for 24xx) */
608 #define ABTS_RESP_24XX          0x55 /* ABTS responce (for 24xx) */
609
610 typedef struct {
611         uint8_t  entry_type;                /* Entry type. */
612         uint8_t  entry_count;               /* Entry count. */
613         uint8_t  sys_define;                /* System defined. */
614         uint8_t  entry_status;              /* Entry Status. */
615         uint8_t  reserved_1[6];
616         uint16_t nport_handle;
617         uint8_t  reserved_2[3];
618         uint8_t  reserved_3:4;
619         uint8_t  sof_type:4;
620         uint32_t exchange_address;
621         fcp_hdr_le_t fcp_hdr_le;
622         uint8_t  reserved_4[16];
623         uint32_t exchange_addr_to_abort;
624 } __attribute__((packed)) abts24_recv_entry_t;
625
626 #define ABTS_PARAM_ABORT_SEQ            BIT_0
627
628 typedef struct {
629         uint16_t reserved;
630         uint8_t  seq_id_last;
631         uint8_t  seq_id_valid;
632 #define SEQ_ID_VALID    0x80
633 #define SEQ_ID_INVALID  0x00
634         uint16_t rx_id;
635         uint16_t ox_id;
636         uint16_t high_seq_cnt;
637         uint16_t low_seq_cnt;
638 } __attribute__((packed)) ba_acc_le_t;
639
640 typedef struct {
641         uint8_t vendor_uniq;
642         uint8_t reason_expl;
643         uint8_t reason_code;
644 #define BA_RJT_REASON_CODE_INVALID_COMMAND      0x1
645 #define BA_RJT_REASON_CODE_UNABLE_TO_PERFORM    0x9
646         uint8_t reserved;
647 } __attribute__((packed)) ba_rjt_le_t;
648
649 typedef struct {
650         uint8_t  entry_type;                /* Entry type. */
651         uint8_t  entry_count;               /* Entry count. */
652         uint8_t  sys_define;                /* System defined. */
653         uint8_t  entry_status;              /* Entry Status. */
654         uint32_t handle;
655         uint16_t reserved_1;
656         uint16_t nport_handle;
657         uint16_t control_flags;
658 #define ABTS_CONTR_FLG_TERM_EXCHG       BIT_0
659         uint8_t  reserved_2;
660         uint8_t  reserved_3:4;
661         uint8_t  sof_type:4;
662         uint32_t exchange_address;
663         fcp_hdr_le_t fcp_hdr_le;
664         union {
665                 ba_acc_le_t ba_acct;
666                 ba_rjt_le_t ba_rjt;
667         } __attribute__((packed)) payload;
668         uint32_t reserved_4;
669         uint32_t exchange_addr_to_abort;
670 } __attribute__((packed)) abts24_resp_entry_t;
671
672 typedef struct {
673         uint8_t  entry_type;                /* Entry type. */
674         uint8_t  entry_count;               /* Entry count. */
675         uint8_t  sys_define;                /* System defined. */
676         uint8_t  entry_status;              /* Entry Status. */
677         uint32_t handle;
678         uint16_t compl_status;
679 #define ABTS_RESP_COMPL_SUCCESS         0
680 #define ABTS_RESP_COMPL_SUBCODE_ERROR   0x31
681         uint16_t nport_handle;
682         uint16_t reserved_1;
683         uint8_t  reserved_2;
684         uint8_t  reserved_3:4;
685         uint8_t  sof_type:4;
686         uint32_t exchange_address;
687         fcp_hdr_le_t fcp_hdr_le;
688         uint8_t reserved_4[8];
689         uint32_t error_subcode1;
690 #define ABTS_RESP_SUBCODE_ERR_ABORTED_EXCH_NOT_TERM     0x1E
691         uint32_t error_subcode2;
692         uint32_t exchange_addr_to_abort;
693 } __attribute__((packed)) abts24_resp_fw_entry_t;
694
695 /********************************************************************\
696  * Type Definitions used by initiator & target halves
697 \********************************************************************/
698
699 typedef enum {
700         DISABLE_TARGET_MODE = 0,
701         ENABLE_TARGET_MODE = 1
702 } qla2x_tgt_host_action_t;
703
704 struct qla_tgt_initiator
705 {
706         int magic;
707
708         /* Callbacks */
709         void (*tgt24_atio_pkt)(scsi_qla_host_t *ha, atio7_entry_t *pkt);
710         void (*tgt_response_pkt)(scsi_qla_host_t *ha, response_t *pkt);
711         void (*tgt2x_ctio_completion)(scsi_qla_host_t *ha, uint32_t handle);
712         void (*tgt_async_event)(uint16_t code, scsi_qla_host_t *ha,
713                 uint16_t *mailbox);
714         int (*tgt_host_action)(scsi_qla_host_t *ha, qla2x_tgt_host_action_t
715                                                         action);
716         void (*tgt_fc_port_added)(scsi_qla_host_t *ha, fc_port_t *fcport);
717         void (*tgt_fc_port_deleted)(scsi_qla_host_t *ha, fc_port_t *fcport);
718 };
719
720 struct qla_target
721 {
722         int magic;
723
724         /*
725          * Callbacks - H/W lock MUST be held while calling any.
726          *
727          * !!! req_pkt() and issue_marker() could unlock/lock it inside !!!
728          *
729          * But it isn't an issue, since in the current implementation:
730          *
731          *   - Either we in IRQ and only IRQ handler can modify HW data,
732          *     including rings related fields.
733          *
734          *   - Or access to target mode variables from struct q2t_tgt don't
735          *     cross those functions boundaries, except tgt_shutdown, which
736          *     additionally protected by irq_cmd_count.
737          */
738         request_t *(*req_pkt)(scsi_qla_host_t *ha);
739         void (*isp_cmd)(scsi_qla_host_t *ha);
740         void (*enable_tgt_mode)(scsi_qla_host_t *ha);
741         void (*disable_tgt_mode)(scsi_qla_host_t *ha);
742         int (*issue_marker)(scsi_qla_host_t *ha, int ha_locked);
743         void (*mark_all_devices_lost)(scsi_qla_host_t *ha, int defer);
744         int (*get_id_list)(scsi_qla_host_t *ha, void *id_list,
745                 dma_addr_t id_list_dma, uint16_t *entries);
746         int (*get_port_database)(scsi_qla_host_t *ha, fc_port_t *fcport,
747                 uint8_t opt);
748 };
749
750 int qla2xxx_tgt_register_driver(/* IN */  struct qla_tgt_initiator *tgt,
751                                 /* OUT */ struct qla_target *init);
752
753 void qla2xxx_tgt_unregister_driver(void);
754
755 int qla2x00_wait_for_loop_ready(scsi_qla_host_t *ha);
756 int qla2x00_wait_for_hba_online(scsi_qla_host_t *ha);
757
758 #endif /* __QLA2X_TGT_DEF_H */