60845d66ee8d6908ab51d5af15aba15291e6ceb2
[mirror/scst/.git] / mpt / mpt_scst.h
1 #ifndef __MPT_SCST_H
2 #define __MPT_SCST_H
3
4 #if defined(MODULE) && !defined(__GENKSYMS__)
5 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))
6 #include <linux/config.h>
7 #else
8 #include <linux/autoconf.h>
9 #endif
10 #include <linux/module.h>
11 #endif
12
13 #ifdef __linux__
14 #include <linux/delay.h>
15 #include <linux/errno.h>
16 #include <linux/init.h>
17 #include <linux/kernel.h>
18 #include <linux/slab.h>
19 #include <linux/miscdevice.h>
20 #include <linux/proc_fs.h>
21 #include <linux/smp_lock.h>
22 #include <linux/highmem.h>
23 #include <linux/version.h>
24 #include <scsi/scsi_device.h>
25
26 #include <asm/uaccess.h>
27 #include <asm/io.h>
28 #include <asm/div64.h>
29 #endif
30
31 #define _HS_SLEEP ,0
32 #define _IOC_ID ioc
33 #define _HANDLE_IOC_ID ioc
34
35 #ifndef MPT_STM_64_BIT_DMA  /* determines the size of DMA addresses */
36 #define MPT_STM_64_BIT_DMA 1
37 #endif
38
39 #include "mptbase.h"
40
41 #ifndef MPI_IOCLOGINFO_FC_LINK_ALREADY_INITIALIZED
42 #define MPI_IOCLOGINFO_FC_LINK_ALREADY_INITIALIZED 0x24000002
43 #endif
44
45 #define MF_TO_INDEX(mf) le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx)
46
47 #include "scsi3.h"
48
49 /*****************************************************************************/
50 #ifdef MPI_STM_IO_DEBUG
51 #define dioprintk printk
52 #else
53 #define dioprintk printk
54 #endif
55
56 typedef MPI_TARGET_FCP_CMD_BUFFER FCP_CMD;
57
58 typedef MPI_TARGET_SCSI_SPI_CMD_BUFFER SCSI_CMD;
59
60 #define SSP_CMD_FRAME           0x06
61 #define SSP_TASK_FRAME          0x16
62
63 typedef MPI_TARGET_SSP_CMD_BUFFER SSP_CMD;
64 typedef MPI_TARGET_SSP_TASK_BUFFER SSP_TASK;
65
66 #define FCP_REQUEST_CONFIRM     (1<<4)
67 #define FCP_RESID_UNDER         (1<<3)
68 #define FCP_RESID_OVER          (1<<2)
69 #define FCP_SENSE_LEN_VALID     (1<<1)
70 #define FCP_RSP_LEN_VALID       (1<<0)
71
72 typedef struct _FCP_RSP  /* this struct is wrong in rev 1.02.04 of mpi_targ.h */
73 {
74     U8      Reserved0[8];                               /* 00h */
75     U8      Reserved1[2];                               /* 08h */
76     U8      FcpFlags;                                   /* 0Ah */
77     U8      FcpStatus;                                  /* 0Bh */
78     U32     FcpResid;                                   /* 0Ch */
79     U32     FcpSenseLength;                             /* 10h */
80     U32     FcpResponseLength;                          /* 14h */
81     U8      FcpResponseData[8];                         /* 18h */
82     U8      FcpSenseData[32]; /* Pad to 64 bytes */     /* 20h */
83 } FCP_RSP;
84
85 #define SCSI_SENSE_LEN_VALID    (1<<1)
86 #define SCSI_RSP_LEN_VALID      (1<<0)
87
88 typedef MPI_TARGET_SCSI_SPI_STATUS_IU SCSI_RSP;
89
90 #define SSP_SENSE_LEN_VALID     (1<<1)
91 #define SSP_RSP_LEN_VALID       (1<<0)
92
93 typedef MPI_TARGET_SSP_RSP_IU SSP_RSP;
94
95
96 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
97
98 /*
99  *  Fusion MPT STM private structures
100  */
101
102 #define IsFc(priv)      \
103     (priv->ioc->pfacts[0].PortType == MPI_PORTFACTS_PORTTYPE_FC)
104 #define IsScsi(priv)    \
105     (priv->ioc->pfacts[0].PortType == MPI_PORTFACTS_PORTTYPE_SCSI)
106 #define IsSas(priv)    \
107     (priv->ioc->pfacts[0].PortType == MPI_PORTFACTS_PORTTYPE_SAS)
108
109 #define ABORT_ALL               (-1)
110
111 #define NUM_CMD_BUFFERS         128
112 #define NUM_ELS_BUFFERS         64
113
114 #define NUM_ALIASES             0  /* 0 to 125, hardware restriction */
115
116 #define ELS                     0x22
117 #define FC4LS                   0x32
118 #define ABTS                    0x81
119 #define BA_ACC                  0x84
120
121 #define LS_RJT                  0x01
122 #define LS_ACC                  0x02
123 #define PLOGI                   0x03
124 #define LOGO                    0x05
125 #define SRR                     0x14
126 #define PRLI                    0x20
127 #define PRLO                    0x21
128 #define ADISC                   0x52
129 #define RSCN                    0x61
130
131 typedef struct _MPT_SGE
132 {
133     u32                 length;
134 #if MPT_STM_64_BIT_DMA
135     u64                 address;
136 #else
137     u32                 address;
138 #endif
139 } MPT_SGE;
140
141 #define NUM_SGES        64
142 #define NUM_CHAINS      (NUM_SGES/8)    /* one chain for every 8 SGEs */
143
144 typedef struct _CMD {
145     u8                  cmd[64];
146     u8                  rsp[64];
147     MPT_SGE             chain_sge[NUM_SGES+NUM_CHAINS];
148     u32                 reply_word;
149     int                 alias;
150     int                 lun;
151     int                 tag;
152 } CMD;
153
154 typedef struct _FC_ELS {
155     u32                 fc_els[32];
156 } FC_ELS;
157
158 typedef struct _MPT_STM_HW {
159     CMD                 cmd_buf[NUM_CMD_BUFFERS];
160     FC_ELS              fc_link_serv_buf[NUM_ELS_BUFFERS];
161     u32                 config_buf[256];
162     u32                 ctsend_buf[256];
163     u32                 exlink_buf[32];
164 } MPT_STM_HW;
165
166 typedef struct _MPT_SGL
167 {
168     u32                 num_sges;
169     MPT_SGE             sge[NUM_SGES];
170 } MPT_SGL;
171
172 typedef struct _MPT_STM_PRIV
173 {
174     MPT_ADAPTER         *ioc;
175     int                 enable_target_mode;
176     int                 fcp2_capable;
177     int                 num_sge_chain;
178     int                 num_sge_target_assist;
179     int                 num_cmd_buffers;
180     int                 num_els_buffers;
181     int                 num_aliases;
182     MPT_STM_HW          *hw;
183     dma_addr_t          hw_dma;
184     U64                 wwnn;
185     U64                 wwpn;
186     int                 port_id;
187     int                 scsi_port_config;
188     int                 scsi_id_config;
189     int                 protocol;
190     volatile int        port_flags;
191     volatile int        port_speed;
192     volatile int        port_state;
193     volatile int        device_changed;
194     int                 port_enable_loginfo;
195     volatile int        port_enable_pending;
196     volatile int        target_mode_abort_pending;
197     volatile int        link_serv_abort_pending;
198     volatile int        fc_primitive_send_pending;
199     volatile int        ex_link_service_send_pending;
200     volatile int        config_pending;
201     volatile int        in_reset;
202     volatile int        poll_enabled;
203     volatile int        exiting;
204     MPT_FRAME_HDR       *config_mf;
205     ConfigReply_t       config_rep;
206     volatile int        io_state[NUM_CMD_BUFFERS];
207     volatile int        els_state[NUM_ELS_BUFFERS];
208     MPT_FRAME_HDR       *current_mf[NUM_CMD_BUFFERS];
209     MPT_FRAME_HDR       *status_deferred_mf[NUM_CMD_BUFFERS];
210     MPT_SGL             sgl;
211     SCSIPortPage0_t SCSIPortPage0;
212     SCSIPortPage1_t SCSIPortPage1;
213     SCSIPortPage2_t SCSIPortPage2;
214 #define NUM_SCSI_DEVICES       16
215     SCSIDevicePage1_t SCSIDevicePage1[NUM_SCSI_DEVICES];
216     struct mpt_tgt *tgt;
217     struct scst_cmd *scst_cmd[NUM_CMD_BUFFERS];
218     atomic_t pending_sense[NUM_SCSI_DEVICES];
219     u8 pending_sense_buffer[NUM_SCSI_DEVICES][SCSI_SENSE_BUFFERSIZE];
220 } MPT_STM_PRIV;
221
222 #define IO_STATE_POSTED                 0x1
223 #define IO_STATE_DATA_SENT              0x2
224 #define IO_STATE_STATUS_SENT            0x4
225 #define IO_STATE_STATUS_DEFERRED        0x8
226 #define IO_STATE_INCOMPLETE             0x10
227 #define IO_STATE_AUTO_REPOST            0x20
228 #define IO_STATE_ABORTED                0x40
229 #define IO_STATE_HIGH_PRIORITY          0x80
230 #define IO_STATE_REQUEST_ABORTED        0x100
231 #define IO_STATE_REISSUE_REQUEST        0x200
232 #define IO_STATE_ADJUST_OFFSET          0x400
233 #define IO_STATE_CONVERT_TA_TO_TSS      0x800
234 #define IO_STATE_REDO_COMMAND           0x1000
235
236 #define get2bytes(x, y) ((x[y] << 8) + x[y+1])
237 #define get3bytes(x, y) ((x[y] << 16) + (x[y+1] << 8) + x[y+2])
238 #define get4bytes(x, y) ((x[y] << 24) + (x[y+1] << 16) + (x[y+2] << 8) + x[y+3])
239 #define get8bytes(x, y) (((u64)get4bytes(x, y) << 32) + get4bytes(x, y+4))
240
241 #define InitiatorIndex_0100 Reserved_0100_InitiatorIndex
242 #define FWVersion_0101 Reserved_0101_FWVersion
243 #define EventDataSasPhyLinkStatus_t MpiEventDataSasPhyLinkStatus_t
244
245 #ifndef MPI_FCPORTPAGE1_FLAGS_FORCE_USE_NOSEEPROM_WWNS
246 #define MPI_FCPORTPAGE1_FLAGS_FORCE_USE_NOSEEPROM_WWNS  (0x02000000)
247 #endif
248
249 #ifndef PRIORITY_REASON_TARGET_BUSY
250 #define PRIORITY_REASON_TARGET_BUSY             (0x09)
251 #endif
252
253 #if MPT_STM_64_BIT_DMA
254 #define MPT_STM_SIMPLE SGESimple64_t
255 #define MPT_STM_CHAIN SGEChain64_t
256 #define MPI_SGE_FLAGS_MPT_STM_ADDRESSING MPI_SGE_FLAGS_64_BIT_ADDRESSING
257 #define stm_get_dma_addr(x, y)                \
258     x = le32_to_cpu(y.Low);                   \
259     if (sizeof(dma_addr_t) == sizeof(u64))    \
260         x |= (u64)le32_to_cpu(y.High)<<32;
261 #define stm_set_dma_addr(x, y)                \
262     x.Low = cpu_to_le32(y);                   \
263     if (sizeof(dma_addr_t) == sizeof(u64))    \
264         x.High = cpu_to_le32((u64)y>>32);     \
265     else                                      \
266         x.High = 0;
267 #else
268 #define MPT_STM_SIMPLE SGESimple32_t
269 #define MPT_STM_CHAIN SGEChain32_t
270 #define MPI_SGE_FLAGS_MPT_STM_ADDRESSING MPI_SGE_FLAGS_32_BIT_ADDRESSING
271 #define stm_get_dma_addr(x, y)                \
272     x = le32_to_cpu(y);
273 #define stm_set_dma_addr(x, y)                \
274     x = cpu_to_le32(y);
275 #endif
276
277 #ifndef MPT_MAX_ADAPTERS
278 #define MPT_MAX_ADAPTERS 18
279 #endif
280
281 #ifndef MPI_MANUFACTPAGE_DEVICEID_FC949X
282 #define MPI_MANUFACTPAGE_DEVICEID_FC949X 0x640
283 #endif
284 #ifndef MPI_MANUFACTPAGE_DEVICEID_FC939X
285 #define MPI_MANUFACTPAGE_DEVICEID_FC939X 0x642
286 #endif
287
288 #ifndef MPI_IOCSTATUS_EEDP_GUARD_ERROR
289 #define MPI_IOCSTATUS_EEDP_GUARD_ERROR 0x4d
290 #endif
291 #ifndef MPI_IOCSTATUS_EEDP_REF_TAG_ERROR
292 #define MPI_IOCSTATUS_EEDP_REF_TAG_ERROR 0x4e
293 #endif
294 #ifndef MPI_IOCSTATUS_EEDP_APP_TAG_ERROR
295 #define MPI_IOCSTATUS_EEDP_APP_TAG_ERROR 0x4f
296 #endif
297
298 #define MPT_MAX_CDB_LEN 16
299 #define MPT_TIMEOUT 30
300
301 /* Immediate notify status constants */
302 #define IMM_NTFY_LIP_RESET          MPI_EVENT_LOOP_STATE_CHANGE
303 #define IMM_NTFY_IOCB_OVERFLOW      0x0016
304 #define IMM_NTFY_ABORT_TASK         0x0020
305 #define IMM_NTFY_PORT_LOGOUT        MPI_EVENT_LOGOUT
306 #define IMM_NTFY_PORT_CONFIG        MPI_EVENT_LINK_STATUS_CHANGE
307 #define IMM_NTFY_GLBL_TPRLO         MPI_EVENT_LINK_STATUS_CHANGE
308 #define IMM_NTFY_GLBL_LOGO          MPI_EVENT_LINK_STATUS_CHANGE
309 #define IMM_NTFY_RESOURCE           0x0034
310 #define IMM_NTFY_MSG_RX             0x0036
311
312 /* Immediate notify task flags */
313 #define IMM_NTFY_ABORT_TS1          0x01
314 #define IMM_NTFY_ABORT_TS2          0x02
315 #define IMM_NTFY_CLEAR_TS           0x04
316 #define IMM_NTFY_LUN_RESET1         0x08
317 #define IMM_NTFY_LUN_RESET2         0x10
318 #define IMM_NTFY_TARGET_RESET       0x20
319 #define IMM_NTFY_CLEAR_ACA          0x40
320
321 /* Command's states */
322 #define MPT_STATE_NEW              1    /* New command and SCST processes it */
323 #define MPT_STATE_NEED_DATA        2    /* SCST needs data to process */
324 #define MPT_STATE_DATA_IN          3    /* Data arrived and SCST processes it */
325 #define MPT_STATE_DATA_OUT         4
326 #define MPT_STATE_PROCESSED        5    /* SCST done processing */
327
328 /* Target's flags */
329 #define MPT_TGT_SHUTDOWN            0   /* The driver is being released */
330 #define MPT_TGT_ENABLE_64BIT_ADDR   1   /* 64-bits PCI addressing enabled */
331
332 /* Session's flags */
333 #define MPT_SESS_INITING            0   /* The session is being unregistered */
334 #define MPT_SESS_SHUTDOWN           1   /* The session is being unregistered */
335
336 /* pending sense states */
337 #define MPT_STATUS_SENSE_IDLE      0 /* no cached pending sense */
338 #define MPT_STATUS_SENSE_ATTEMPT   1 /* attempt to send status and sense */
339 #define MPT_STATUS_SENSE_NOT_SENT  2 /* sense couldn't be sent with status */
340 #define MPT_STATUS_SENSE_HANDLE_RQ 3 /* REQUEST SENSE handled with cached sense */
341
342 struct mpt_cmd
343 {
344         struct mpt_sess *sess;
345         struct scst_cmd *scst_cmd;
346         MPT_STM_PRIV *priv;
347         CMD *CMD;
348         u32 reply_word;
349         struct list_head delayed_cmds_entry;
350         int state;
351         dma_addr_t dma_handle;
352 };
353
354 struct mpt_sess
355 {
356         struct scst_session *scst_sess;
357         struct mpt_tgt *tgt;
358         int init_index;
359         unsigned long sess_flags;
360         struct list_head delayed_cmds;
361 };
362
363 struct mpt_tgt
364 {
365         struct scst_tgt *scst_tgt;
366         MPT_STM_PRIV *priv;
367         int datasegs_per_cmd, datasegs_per_cont;
368         unsigned long tgt_flags;
369         atomic_t sess_count;
370         wait_queue_head_t waitQ;
371         struct mpt_sess *sess[256];
372         int target_enable;
373 };
374
375 struct mpt_mgmt_cmd
376 {
377         struct mpt_sess *sess;
378         int task_mgmt;
379 };
380
381 #endif