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