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