Removed trailing whitespace.
[mirror/scst/.git] / qla2x00t / qla2x00-target / qla2x00t.h
1 /*
2  *  qla2x00t.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) 2006 - 2009 ID7 Ltd.
8  *
9  *  QLogic 22xx/23xx/24xx/25xx FC target driver.
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, version 2
14  *  of the License.
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 #ifndef __QLA2X00T_H
23 #define __QLA2X00T_H
24
25 #include <qla_def.h>
26 #include <qla2x_tgt.h>
27 #include <qla2x_tgt_def.h>
28
29 #include <scst_debug.h>
30
31 /* Version numbers, the same as for the kernel */
32 #define Q2T_VERSION(a, b, c, d) (((a) << 030) + ((b) << 020) + (c) << 010 + (d))
33 #define Q2T_VERSION_CODE        Q2T_VERSION(1, 0, 2, 0)
34 #define Q2T_VERSION_STRING      "2.0.0"
35 #define Q2T_PROC_VERSION_NAME   "version"
36
37 #define Q2T_MAX_CDB_LEN             16
38 #define Q2T_TIMEOUT                 10  /* in seconds */
39
40 #define Q2T_MAX_HW_PENDING_TIME     60 /* in seconds */
41
42 /* Immediate notify status constants */
43 #define IMM_NTFY_LIP_RESET          0x000E
44 #define IMM_NTFY_LIP_LINK_REINIT    0x000F
45 #define IMM_NTFY_IOCB_OVERFLOW      0x0016
46 #define IMM_NTFY_ABORT_TASK         0x0020
47 #define IMM_NTFY_PORT_LOGOUT        0x0029
48 #define IMM_NTFY_PORT_CONFIG        0x002A
49 #define IMM_NTFY_GLBL_TPRLO         0x002D
50 #define IMM_NTFY_GLBL_LOGO          0x002E
51 #define IMM_NTFY_RESOURCE           0x0034
52 #define IMM_NTFY_MSG_RX             0x0036
53 #define IMM_NTFY_SRR                0x0045
54 #define IMM_NTFY_ELS                0x0046
55
56 /* Immediate notify task flags */
57 #define IMM_NTFY_TASK_MGMT_SHIFT    9
58
59 #define Q2T_CLEAR_ACA               0x40
60 #define Q2T_TARGET_RESET            0x20
61 #define Q2T_LUN_RESET               0x10
62 #define Q2T_CLEAR_TS                0x04
63 #define Q2T_ABORT_TS                0x02
64 #define Q2T_ABORT_ALL_SESS          0xFFFF
65 #define Q2T_ABORT_ALL               0xFFFE
66 #define Q2T_NEXUS_LOSS_SESS         0xFFFD
67 #define Q2T_NEXUS_LOSS              0xFFFC
68
69 /* Notify Acknowledge flags */
70 #define NOTIFY_ACK_RES_COUNT        BIT_8
71 #define NOTIFY_ACK_CLEAR_LIP_RESET  BIT_5
72 #define NOTIFY_ACK_TM_RESP_CODE_VALID BIT_4
73
74 /* Command's states */
75 #define Q2T_STATE_NEW               0   /* New command and SCST processing it */
76 #define Q2T_STATE_NEED_DATA         1   /* SCST needs data to continue */
77 #define Q2T_STATE_DATA_IN           2   /* Data arrived and SCST processing it */
78 #define Q2T_STATE_PROCESSED         3   /* SCST done processing */
79 #define Q2T_STATE_ABORTED           4   /* Command aborted */
80
81 /* Special handles */
82 #define Q2T_NULL_HANDLE             0
83 #define Q2T_SKIP_HANDLE             (0xFFFFFFFF & ~CTIO_COMPLETION_HANDLE_MARK)
84
85 /* ATIO task_codes field */
86 #define ATIO_SIMPLE_QUEUE           0
87 #define ATIO_HEAD_OF_QUEUE          1
88 #define ATIO_ORDERED_QUEUE          2
89 #define ATIO_ACA_QUEUE              4
90 #define ATIO_UNTAGGED               5
91
92 /* TM failed response codes, see FCP (9.4.11 FCP_RSP_INFO) */
93 #define FC_TM_SUCCESS               0
94 #define FC_TM_BAD_FCP_DATA          1
95 #define FC_TM_BAD_CMD               2
96 #define FC_TM_FCP_DATA_MISMATCH     3
97 #define FC_TM_REJECT                4
98 #define FC_TM_FAILED                5
99
100 /*
101  * Error code of q2t_pre_xmit_response() meaning that cmd's exchange was
102  * terminated, so no more actions is needed and success should be returned
103  * to SCST. Must be different from any SCST_TGT_RES_* codes.
104  */
105 #define Q2T_PRE_XMIT_RESP_CMD_ABORTED   0x1717
106
107 #if (BITS_PER_LONG > 32) || defined(CONFIG_HIGHMEM64G)
108 #define pci_dma_lo32(a) (a & 0xffffffff)
109 #define pci_dma_hi32(a) ((((a) >> 16)>>16) & 0xffffffff)
110 #else
111 #define pci_dma_lo32(a) (a & 0xffffffff)
112 #define pci_dma_hi32(a) 0
113 #endif
114
115 struct q2t_tgt {
116         struct scst_tgt *scst_tgt;
117         scsi_qla_host_t *ha;
118
119         /*
120          * To sync between IRQ handlers and q2t_target_release(). Needed,
121          * because req_pkt() can drop/reaquire HW lock inside. Protected by
122          * HW lock.
123          */
124         int irq_cmd_count;
125
126         int datasegs_per_cmd, datasegs_per_cont;
127
128         /* Target's flags, serialized by ha->hardware_lock */
129         unsigned int tgt_enable_64bit_addr:1;   /* 64-bits PCI addressing enabled */
130         unsigned int link_reinit_iocb_pending:1;
131         unsigned int tm_to_unknown:1; /* TM to unknown session was sent */
132
133         /*
134          * Protected by tgt_mutex AND hardware_lock for writing and tgt_mutex
135          * OR hardware_lock for reading.
136          */
137         unsigned long tgt_stop; /* the driver is being stopped */
138
139         /* Count of sessions refering q2t_tgt. Protected by hardware_lock. */
140         int sess_count;
141
142         /* Protected by hardware_lock. Addition also protected by tgt_mutex. */
143         struct list_head sess_list;
144
145         /* Protected by hardware_lock */
146         struct list_head del_sess_list;
147         struct timer_list sess_del_timer;
148
149         spinlock_t sess_work_lock;
150         struct list_head sess_works_list;
151         struct work_struct sess_work;
152
153         notify24xx_entry_t link_reinit_iocb;
154         wait_queue_head_t waitQ;
155         int notify_ack_expected;
156         int abts_resp_expected;
157         int modify_lun_expected;
158
159         int ctio_srr_id;
160         int imm_srr_id;
161         spinlock_t srr_lock;
162         struct list_head srr_ctio_list;
163         struct list_head srr_imm_list;
164         struct work_struct srr_work;
165
166         struct list_head tgt_list_entry;
167 };
168
169 /*
170  * Equivilant to IT Nexus (Initiator-Target)
171  */
172 struct q2t_sess {
173         uint16_t loop_id;
174         port_id_t s_id;
175
176         unsigned int conf_compl_supported:1;
177         unsigned int deleted:1;
178         unsigned int local:1;
179
180         struct scst_session *scst_sess;
181         struct q2t_tgt *tgt;
182
183         int sess_ref; /* protected by hardware_lock */
184
185         struct list_head sess_list_entry;
186         unsigned long expires;
187         struct list_head del_list_entry;
188
189         uint8_t port_name[WWN_SIZE];
190 };
191
192 struct q2t_cmd {
193         struct q2t_sess *sess;
194         int state;
195         struct scst_cmd *scst_cmd;
196
197         unsigned int conf_compl_supported:1;/* to save extra sess dereferences */
198         unsigned int free_sg:1;
199         unsigned int aborted:1; /* Needed in case of SRR */
200
201         struct scatterlist *sg; /* cmd data buffer SG vector */
202         int sg_cnt;             /* SG segments count */
203         int bufflen;            /* cmd buffer length */
204         int offset;
205         scst_data_direction data_direction;
206         uint32_t tag;
207         dma_addr_t dma_handle;
208         enum dma_data_direction dma_data_direction;
209
210         uint16_t loop_id;                   /* to save extra sess dereferences */
211         struct q2t_tgt *tgt;                /* to save extra sess dereferences */
212
213         union {
214                 atio7_entry_t atio7;
215                 atio_entry_t atio2x;
216         } __attribute__((packed)) atio;
217 };
218
219 struct q2t_sess_work_param {
220         struct list_head sess_works_list_entry;
221         struct q2t_cmd *cmd;
222 };
223
224 struct q2t_mgmt_cmd {
225         struct q2t_sess *sess;
226         unsigned int flags;
227 #define Q24_MGMT_SEND_NACK      1
228         union {
229                 atio7_entry_t atio7;
230                 notify_entry_t notify_entry;
231                 notify24xx_entry_t notify_entry24;
232                 abts24_recv_entry_t abts;
233         } __attribute__((packed)) orig_iocb;
234 };
235
236 struct q2t_prm {
237         struct q2t_cmd *cmd;
238         struct q2t_tgt *tgt;
239         void *pkt;
240         struct scatterlist *sg; /* cmd data buffer SG vector */
241         int seg_cnt;
242         int req_cnt;
243         uint16_t rq_result;
244         uint16_t scsi_status;
245         unsigned char *sense_buffer;
246         int sense_buffer_len;
247         int residual;
248         int add_status_pkt;
249 };
250
251 struct srr_imm {
252         struct list_head srr_list_entry;
253         int srr_id;
254         union {
255                 notify_entry_t notify_entry;
256                 notify24xx_entry_t notify_entry24;
257         } __attribute__((packed)) imm;
258 };
259
260 struct srr_ctio {
261         struct list_head srr_list_entry;
262         int srr_id;
263         struct q2t_cmd *cmd;
264 };
265
266 #define Q2T_XMIT_DATA           1
267 #define Q2T_XMIT_STATUS         2
268 #define Q2T_XMIT_ALL            (Q2T_XMIT_STATUS|Q2T_XMIT_DATA)
269
270 #endif /* __QLA2X00T_H */