Fixes possible crash, caused by q2t_sess_work_fn() called on several CPUs at time...
[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         unsigned int sess_works_pending:1; /* there are sess_work entries */
133
134         /*
135          * Protected by tgt_mutex AND hardware_lock for writing and tgt_mutex
136          * OR hardware_lock for reading.
137          */
138         unsigned long tgt_stop; /* the driver is being stopped */
139
140         /* Count of sessions refering q2t_tgt. Protected by hardware_lock. */
141         int sess_count;
142
143         /* Protected by hardware_lock. Addition also protected by tgt_mutex. */
144         struct list_head sess_list;
145
146         /* Protected by hardware_lock */
147         struct list_head del_sess_list;
148         struct timer_list sess_del_timer;
149
150         spinlock_t sess_work_lock;
151         struct list_head sess_works_list;
152         struct work_struct sess_work;
153
154         notify24xx_entry_t link_reinit_iocb;
155         wait_queue_head_t waitQ;
156         int notify_ack_expected;
157         int abts_resp_expected;
158         int modify_lun_expected;
159
160         int ctio_srr_id;
161         int imm_srr_id;
162         spinlock_t srr_lock;
163         struct list_head srr_ctio_list;
164         struct list_head srr_imm_list;
165         struct work_struct srr_work;
166
167         struct list_head tgt_list_entry;
168 };
169
170 /*
171  * Equivilant to IT Nexus (Initiator-Target)
172  */
173 struct q2t_sess {
174         uint16_t loop_id;
175         port_id_t s_id;
176
177         unsigned int conf_compl_supported:1;
178         unsigned int deleted:1;
179         unsigned int local:1;
180
181         struct scst_session *scst_sess;
182         struct q2t_tgt *tgt;
183
184         int sess_ref; /* protected by hardware_lock */
185
186         struct list_head sess_list_entry;
187         unsigned long expires;
188         struct list_head del_list_entry;
189
190         uint8_t port_name[WWN_SIZE];
191 };
192
193 struct q2t_cmd {
194         struct q2t_sess *sess;
195         int state;
196         struct scst_cmd *scst_cmd;
197
198         unsigned int conf_compl_supported:1;/* to save extra sess dereferences */
199         unsigned int free_sg:1;
200         unsigned int aborted:1; /* Needed in case of SRR */
201
202         struct scatterlist *sg; /* cmd data buffer SG vector */
203         int sg_cnt;             /* SG segments count */
204         int bufflen;            /* cmd buffer length */
205         int offset;
206         scst_data_direction data_direction;
207         uint32_t tag;
208         dma_addr_t dma_handle;
209         enum dma_data_direction dma_data_direction;
210
211         uint16_t loop_id;                   /* to save extra sess dereferences */
212         struct q2t_tgt *tgt;                /* to save extra sess dereferences */
213
214         union {
215                 atio7_entry_t atio7;
216                 atio_entry_t atio2x;
217         } __attribute__((packed)) atio;
218 };
219
220 struct q2t_sess_work_param {
221         struct list_head sess_works_list_entry;
222         struct q2t_cmd *cmd;
223 };
224
225 struct q2t_mgmt_cmd {
226         struct q2t_sess *sess;
227         unsigned int flags;
228 #define Q24_MGMT_SEND_NACK      1
229         union {
230                 atio7_entry_t atio7;
231                 notify_entry_t notify_entry;
232                 notify24xx_entry_t notify_entry24;
233                 abts24_recv_entry_t abts;
234         } __attribute__((packed)) orig_iocb;
235 };
236
237 struct q2t_prm {
238         struct q2t_cmd *cmd;
239         struct q2t_tgt *tgt;
240         void *pkt;
241         struct scatterlist *sg; /* cmd data buffer SG vector */
242         int seg_cnt;
243         int req_cnt;
244         uint16_t rq_result;
245         uint16_t scsi_status;
246         unsigned char *sense_buffer;
247         int sense_buffer_len;
248         int residual;
249         int add_status_pkt;
250 };
251
252 struct srr_imm {
253         struct list_head srr_list_entry;
254         int srr_id;
255         union {
256                 notify_entry_t notify_entry;
257                 notify24xx_entry_t notify_entry24;
258         } __attribute__((packed)) imm;
259 };
260
261 struct srr_ctio {
262         struct list_head srr_list_entry;
263         int srr_id;
264         struct q2t_cmd *cmd;
265 };
266
267 #define Q2T_XMIT_DATA           1
268 #define Q2T_XMIT_STATUS         2
269 #define Q2T_XMIT_ALL            (Q2T_XMIT_STATUS|Q2T_XMIT_DATA)
270
271 #endif /* __QLA2X00T_H */