Merge commit 'crater/master'
[dragonfly.git] / sys / dev / raid / asr / osd_unix.h
blob4ab329a32132b76d169970c71b00c2d0b8974de7
1 /* $FreeBSD: src/sys/dev/asr/osd_unix.h,v 1.1.2.2 2001/08/23 05:21:29 scottl Exp $ */
2 /* $DragonFly: src/sys/dev/raid/asr/osd_unix.h,v 1.3 2004/07/02 15:53:01 joerg Exp $ */
3 /*
4 * Copyright (c) 1996-1999 Distributed Processing Technology Corporation
5 * All rights reserved.
7 * Redistribution and use in source form, with or without modification, are
8 * permitted provided that redistributions of source code must retain the
9 * above copyright notice, this list of conditions and the following disclaimer.
11 * This software is provided `as is' by Distributed Processing Technology and
12 * any express or implied warranties, including, but not limited to, the
13 * implied warranties of merchantability and fitness for a particular purpose,
14 * are disclaimed. In no event shall Distributed Processing Technology be
15 * liable for any direct, indirect, incidental, special, exemplary or
16 * consequential damages (including, but not limited to, procurement of
17 * substitute goods or services; loss of use, data, or profits; or business
18 * interruptions) however caused and on any theory of liability, whether in
19 * contract, strict liability, or tort (including negligence or otherwise)
20 * arising in any way out of the use of this driver software, even if advised
21 * of the possibility of such damage.
25 #ifndef __OSD_UNIX_H
26 #define __OSD_UNIX_H
28 #include <sys/ioccom.h>
30 /*File - OSD_UNIX.H */
31 /*****************************************************************************/
32 /* */
33 /*Description: */
34 /* */
35 /* This file contains definitions for the UNIX OS dependent layer of the */
36 /*DPT engine. */
37 /* */
38 /*Copyright Distributed Processing Technology, Corp. */
39 /* 140 Candace Dr. */
40 /* Maitland, Fl. 32751 USA */
41 /* Phone: (407) 830-5522 Fax: (407) 260-5366 */
42 /* All Rights Reserved */
43 /* */
44 /*Author: Bob Pasteur */
45 /*Date: 5/28/93 */
46 /* */
47 /*Editors: */
48 /* 3/7/96 salyzyn@dpt.com */
49 /* Added BSDi extensions */
50 /* 30/9/99 salyzyn@dpt.com */
51 /* Added I2ORESCANCMD */
52 /* 7/12/99 salyzyn@dpt.com */
53 /* Added I2ORESETCMD */
54 /* */
55 /*Remarks: */
56 /* */
57 /* */
58 /*****************************************************************************/
60 /* Definitions - Defines & Constants ---------------------------------------*/
62 #define DPT_TurnAroundKey 0x01 /* TurnAround Message Type for engine */
63 #define DPT_EngineKey 0x02 /* Message Que and Type for engine */
64 #define DPT_LoggerKey 0x03 /* Message Type For Logger */
65 #define DPT_CommEngineKey 0x04 /* Message Que Type Created */
67 #define MSG_RECEIVE 0x40000000 /* Ored Into Logger PID For Return Msg */
69 #define ENGMSG_ECHO 0x00 /* Turnarround Echo Engine Message */
70 #define ENGMSG_OPEN 0x01 /* Turnarround Open Engine Message */
71 #define ENGMSG_CLOSE 0x02 /* Turnarround Close Engine Message */
73 /* Message Que Creation Flags */
75 #define MSG_URD 00400
76 #define MSG_UWR 00200
77 #define MSG_GRD 00040
78 #define MSG_GWR 00020
79 #define MSG_ORD 00004
80 #define MSG_OWR 00002
81 #define MSG_ALLRD 00444
82 #define MSG_ALLWR 00222
84 /* Message Que Creation Flags */
86 #define SHM_URD 00400
87 #define SHM_UWR 00200
88 #define SHM_GRD 00040
89 #define SHM_GWR 00020
90 #define SHM_ORD 00004
91 #define SHM_OWR 00002
92 #define SHM_ALLRD 00444
93 #define SHM_ALLWR 00222
95 /* Program Exit Codes */
97 #define ExitGoodStatus 0
98 #define ExitBadParameter 1
99 #define ExitSignalFail 3
100 #define ExitMsqAllocFail 5
101 #define ExitBuffAllocFail 6
102 #define ExitMsgSendFail 8
103 #define ExitMsgReceiveFail 9
105 #define ExitEngOpenFail 10
106 #define ExitDuplicateEngine 11
108 #define ExitCommAllocFail 12
109 #define ExitDuplicateCommEng 13
110 #define ExitCommConnectFail 14
112 #ifndef MAX_HAS
114 #define MAX_HAS 18
115 #define MAX_NAME 100
117 #endif /* ifndef MAX_HAS */
120 typedef struct {
121 uCHAR ConfigLength[4]; /* Len in bytes after this field. */
122 uCHAR EATAsignature[4];
123 uCHAR EATAversion;
124 uCHAR Flags1;
125 uCHAR PadLength[2];
126 uCHAR HBA[4];
127 uCHAR CPlength[4]; /* Command Packet Length */
128 uCHAR SPlength[4]; /* Status Packet Length */
129 uCHAR QueueSize[2]; /* Controller Que depth */
130 uCHAR SG_Size[4];
131 uCHAR Flags2;
132 uCHAR Reserved0; /* Reserved Field */
133 uCHAR Flags3;
134 uCHAR ScsiValues;
135 uCHAR MaxLUN; /* Maximun LUN Supported */
136 uCHAR Flags4;
137 uCHAR RaidNum; /* RAID HBA Number For Stripping */
138 uCHAR Reserved3; /* Reserved Field */
139 } DptReadConfig_t;
141 #if defined ( _DPT_SOLARIS )
143 #include <sys/types.h>
144 #include <sys/ddidmareq.h>
145 #include <sys/mutex.h>
146 #include <sys/scsi/scsi.h>
147 //#define _KERNEL
148 #include <sys/dditypes.h>
149 #include <sys/ddi_impldefs.h>
150 #include <sys/scsi/impl/transport.h>
151 //#undef _KERNEL
153 #undef MSG_DISCONNECT
154 #define MSG_DISCONNECT 0x11L
156 #define EATAUSRCMD 1
157 #define DPT_SIGNATURE 2
158 #define DPT_NUMCTRLS 3
159 #define DPT_CTRLINFO 4
160 #define DPT_SYSINFO 5
161 #define DPT_BLINKLED 6
162 #define I2OUSRCMD 7
163 //#define I2ORESCANCMD 8 /* Use DPT_IO_ACCESS instead */
164 //#define I2ORESETCMD 9 /* Use DPT_IO_ACCESS instead */
166 #define DPT_MAX_DMA_SEGS 32 /* Max used Scatter/Gather seg */
168 struct dpt_sg {
169 paddr_t data_addr;
170 uLONG data_len;
173 typedef struct {
174 uSHORT NumHBAs;
175 uLONG IOAddrs[18];
176 } GetHbaInfo_t;
178 #elif defined(_DPT_DGUX)
180 #ifndef _IOWR
181 # define _IOWR(x,y,z) (0x0fff3900|y)
182 #endif
183 #ifndef _IOW
184 # define _IOW(x,y,z) (0x0fff3900|y)
185 #endif
186 #ifndef _IOR
187 # define _IOR(x,y,z) (0x0fff3900|y)
188 #endif
189 #ifndef _IO
190 # define _IO(x,y) (0x0fff3900|y)
191 #endif
192 /* EATA PassThrough Command */
193 #define EATAUSRCMD _IOWR('D',65,EATA_CP)
194 /* Get Signature Structure */
195 #define DPT_SIGNATURE _IOR('D',67,dpt_sig_S)
196 /* Get Number Of DPT Adapters */
197 #define DPT_NUMCTRLS _IOR('D',68,int)
198 /* Get Adapter Info Structure */
199 #define DPT_CTRLINFO _IOR('D',69,CtrlInfo)
200 /* Get System Info Structure */
201 #define DPT_SYSINFO _IOR('D',72,sysInfo_S)
202 /* Get Blink LED Code */
203 #define DPT_BLINKLED _IOR('D',75,int)
204 /* Get Statistical information (if available) */
205 #define DPT_STATS_INFO _IOR('D',80,STATS_DATA)
206 /* Clear the statistical information */
207 #define DPT_STATS_CLEAR _IO('D',81)
208 /* Send an I2O command */
209 #define I2OUSRCMD _IO('D',76)
210 /* Inform driver to re-acquire LCT information */
211 #define I2ORESCANCMD _IO('D',77)
212 /* Inform driver to reset adapter */
213 #define I2ORESETCMD _IO('D',78)
215 #elif defined (SNI_MIPS)
216 /* Unix Ioctl Command definitions */
218 #define EATAUSRCMD (('D'<<8)|65)
219 #define DPT_DEBUG (('D'<<8)|66)
220 #define DPT_SIGNATURE (('D'<<8)|67)
221 #define DPT_NUMCTRLS (('D'<<8)|68)
222 #define DPT_CTRLINFO (('D'<<8)|69)
223 #define DPT_STATINFO (('D'<<8)|70)
224 #define DPT_CLRSTAT (('D'<<8)|71)
225 #define DPT_SYSINFO (('D'<<8)|72)
226 /* Set Timeout Value */
227 #define DPT_TIMEOUT (('D'<<8)|73)
228 /* Get config Data */
229 #define DPT_CONFIG (('D'<<8)|74)
230 /* Get config Data */
231 #define DPT_BLINKLED (('D'<<8)|75)
232 /* Get Statistical information (if available) */
233 #define DPT_STATS_INFO (('D'<<8)|80)
234 /* Clear the statistical information */
235 #define DPT_STATS_CLEAR (('D'<<8)|81)
236 /* Send an I2O command */
237 #define I2OUSRCMD (('D'<<8)|76)
238 /* Inform driver to re-acquire LCT information */
239 #define I2ORESCANCMD (('D'<<8)|77)
240 /* Inform driver to reset adapter */
241 #define I2ORESETCMD (('D'<<8)|78)
243 #else
245 /* Unix Ioctl Command definitions */
247 #ifdef _DPT_AIX
249 #undef _IOWR
250 #undef _IOW
251 #undef _IOR
252 #undef _IO
253 #endif
255 #ifndef _IOWR
256 # define _IOWR(x,y,z) (((x)<<8)|y)
257 #endif
258 #ifndef _IOW
259 # define _IOW(x,y,z) (((x)<<8)|y)
260 #endif
261 #ifndef _IOR
262 # define _IOR(x,y,z) (((x)<<8)|y)
263 #endif
264 #ifndef _IO
265 # define _IO(x,y) (((x)<<8)|y)
266 #endif
267 /* EATA PassThrough Command */
268 #define EATAUSRCMD _IOWR('D',65,EATA_CP)
269 /* Set Debug Level If Enabled */
270 #define DPT_DEBUG _IOW('D',66,int)
271 /* Get Signature Structure */
272 #define DPT_SIGNATURE _IOR('D',67,dpt_sig_S)
273 #if defined __bsdi__
274 #define DPT_SIGNATURE_PACKED _IOR('D',67,dpt_sig_S_Packed)
275 #endif
276 /* Get Number Of DPT Adapters */
277 #define DPT_NUMCTRLS _IOR('D',68,int)
278 /* Get Adapter Info Structure */
279 #define DPT_CTRLINFO _IOR('D',69,CtrlInfo)
280 /* Get Statistics If Enabled */
281 #define DPT_STATINFO _IO('D',70)
282 /* Clear Stats If Enabled */
283 #define DPT_CLRSTAT _IO('D',71)
284 /* Get System Info Structure */
285 #define DPT_SYSINFO _IOR('D',72,sysInfo_S)
286 /* Set Timeout Value */
287 #define DPT_TIMEOUT _IO('D',73)
288 /* Get config Data */
289 #define DPT_CONFIG _IO('D',74)
290 /* Get Blink LED Code */
291 #define DPT_BLINKLED _IOR('D',75,int)
292 /* Get Statistical information (if available) */
293 #define DPT_STATS_INFO _IOR('D',80,STATS_DATA)
294 /* Clear the statistical information */
295 #define DPT_STATS_CLEAR _IO('D',81)
296 /* Get Performance metrics */
297 #define DPT_PERF_INFO _IOR('D',82,dpt_perf_t)
298 /* Send an I2O command */
299 #define I2OUSRCMD _IO('D',76)
300 /* Inform driver to re-acquire LCT information */
301 #define I2ORESCANCMD _IO('D',77)
302 /* Inform driver to reset adapter */
303 #define I2ORESETCMD _IO('D',78)
304 #if defined _DPT_LINUX
305 /* See if the target is mounted */
306 #define DPT_TARGET_BUSY _IOR('D',79, TARGET_BUSY_T)
307 #endif
310 #endif /* _DPT_SOLARIS else */
312 /* Adapter Flags Field Bit Definitions */
314 #define CTLR_INSTALLED 0x00000001 /* Adapter Was Installed */
315 #define CTLR_DMA 0x00000002 /* DMA Supported */
316 #define CTLR_OVERLAP 0x00000004 /* Overlapped Commands Support */
317 #define CTLR_SECONDARY 0x00000008 /* I/O Address Not 0x1f0 */
318 #define CTLR_BLINKLED 0x00000010 /* Adapter In Blink LED State */
319 #define CTLR_HBACI 0x00000020 /* Cache Inhibit Supported */
320 #define CTLR_CACHE 0x00000040 /* Adapter Has Cache */
321 #define CTLR_SANE 0x00000080 /* Adapter Functioning OK */
322 #define CTLR_BUS_QUIET 0x00000100 /* Bus Quite On This Adapter */
323 #define CTLR_ABOVE_16 0x00000200 /* Support For Mem. Above 16 MB */
324 #define CTLR_SCAT_GATH 0x00000400 /* Scatter Gather Supported */
327 /* Definitions - Structure & Typedef ---------------------------------------*/
329 typedef struct {
330 uLONG MsgID;
331 DPT_TAG_T engineTag;
332 DPT_TAG_T targetTag;
333 DPT_MSG_T engEvent;
334 long BufferID;
335 uLONG FromEngBuffOffset;
336 uLONG callerID;
337 DPT_RTN_T result;
338 uLONG timeOut;
339 } MsgHdr;
341 #define MsgDataSize sizeof(MsgHdr) - 4
343 #ifndef SNI_MIPS
345 /*-------------------------------------------------------------------------*/
346 /* EATA Command Packet definition */
347 /*-------------------------------------------------------------------------*/
349 typedef struct EATACommandPacket {
351 #ifdef _DPT_UNIXWARE
353 uCHAR EataID[4];
354 uINT EataCmd;
355 uCHAR *CmdBuffer;
357 #endif /* _DPT_UNIXWARE */
359 #ifdef _DPT_AIX
361 uCHAR HbaTargetID;
362 uCHAR HbaLUN;
364 #endif /* _DPT_AIX */
366 uCHAR cp_Flags1; /* Command Flags */
367 uCHAR cp_Req_Len; /* AutoRequestSense Data length. */
368 uCHAR cp_Resv1[3]; /* Reserved Fields */
369 uCHAR cp_Flags2;
370 uCHAR cp_Flags3;
371 uCHAR cp_ScsiAddr;
372 uCHAR cp_msg0; /* Identify and Disconnect Message. */
373 uCHAR cp_msg1;
374 uCHAR cp_msg2;
375 uCHAR cp_msg3;
376 uCHAR cp_cdb[12]; /* SCSI cdb for command. */
377 uLONG cp_dataLen; /* Data length in Bytes for command. */
378 uLONG cp_Vue; /* Vendor Unique Area */
379 uCHAR *cp_DataAddr; /* Data Address For The Command. */
380 uCHAR *cp_SpAddr; /* Status Packet Physical Address. */
381 uCHAR *cp_SenseAddr; /* AutoRequestSense Data Phy Address. */
383 #ifdef _DPT_SOLARIS
385 uCHAR HostStatus;
386 uCHAR TargetStatus;
387 uCHAR CdbLength;
388 uCHAR SG_Size;
389 struct scsi_arq_status ReqSenseData;
390 struct dpt_sg SG_List[DPT_MAX_DMA_SEGS];
391 union {
392 char *b_scratch;
393 struct scsi_cmd *b_ownerp;
394 } cc;
395 paddr_t ccb_paddr;
396 uSHORT IOAddress;
398 #else /* _DPT_SOLARIS */
400 uLONG TimeOut ;
401 uCHAR HostStatus;
402 uCHAR TargetStatus;
403 uCHAR Retries;
405 #endif /* _DPT_SOLARIS else */
407 } EATA_CP;
408 #endif /* SNI_MIPS */
411 /* Control Flags 1 Definitions */
413 #define SCSI_RESET 0x01 /* Cause a SCSI Bus reset on the cmd */
414 #define HBA_INIT 0x02 /* Cause Controller to reInitialize */
415 #define AUTO_REQ_SENSE 0x04 /* Do Auto Request Sense on errors */
416 #define SCATTER_GATHER 0x08 /* Data Ptr points to a SG Packet */
417 #define INTERPRET 0x20 /* Interpret the SCSI cdb of own use */
418 #define DATA_OUT 0x04 /* Data Out phase with command */
419 #define DATA_IN 0x08 /* Data In phase with command */
421 /* Control Flags 2 Definitions */
423 #define FIRMWARE_NESTED 0x01
426 /* Control Flags 3 Definitions */
428 #define PHYSICAL_UNIT 0x01 /* Send Command Directly To Target */
429 #define IAT 0x02 /* Inhibit Address Translation */
430 #define HBACI 0x04 /* Inhibit Caching */
433 /* Structure Returned From Get Controller Info */
435 typedef struct {
437 uCHAR state; /* Operational state */
438 uCHAR id; /* Host adapter SCSI id */
439 int vect; /* Interrupt vector number */
440 int base; /* Base I/O address */
441 int njobs; /* # of jobs sent to HA */
442 int qdepth; /* Controller queue depth. */
443 int wakebase; /* mpx wakeup base index. */
444 uLONG SGsize; /* Scatter/Gather list size. */
445 unsigned heads; /* heads for drives on cntlr. */
446 unsigned sectors; /* sectors for drives on cntlr. */
447 uCHAR do_drive32; /* Flag for Above 16 MB Ability */
448 uCHAR BusQuiet; /* SCSI Bus Quiet Flag */
449 char idPAL[4]; /* 4 Bytes Of The ID Pal */
450 uCHAR primary; /* 1 For Primary, 0 For Secondary */
451 uCHAR eataVersion; /* EATA Version */
452 uLONG cpLength; /* EATA Command Packet Length */
453 uLONG spLength; /* EATA Status Packet Length */
454 uCHAR drqNum; /* DRQ Index (0,5,6,7) */
455 uCHAR flag1; /* EATA Flags 1 (Byte 9) */
456 uCHAR flag2; /* EATA Flags 2 (Byte 30) */
458 } CtrlInfo;
460 #ifndef SNI_MIPS
461 #ifdef _DPT_UNIXWARE
463 typedef struct {
465 uINT state; /* Operational state */
466 uCHAR id[4]; /* Host adapter SCSI id */
467 uINT vect; /* Interrupt vector number */
468 uLONG base; /* Base I/O address */
469 int ha_max_jobs; /* Max number of Active Jobs */
470 uLONG ha_cacheParams;
471 int ha_nbus; /* Number Of Busses on HBA */
472 int ha_ntargets; /* Number Of Targets Supported */
473 int ha_nluns; /* Number Of LUNs Supported */
474 int ha_tshift; /* Shift value for target */
475 int ha_bshift; /* Shift value for bus */
476 uINT ha_npend; /* # of jobs sent to HA */
477 int ha_active_jobs; /* Number Of Active Jobs */
479 } HbaInfo;
481 /* SDI ioctl prefix for hba specific ioctl's */
483 #define SDI_IOC (('S'<<24)|('D'<<16)|('I'<<8))
485 #define SDI_HBANAME ((SDI_IOC)|0x14) /* Get HBA module name */
486 #define SDI_SEND 0x0081 /* Send a SCSI command */
488 #else
490 typedef struct {
492 uLONG flags; /* Operational State Flags */
493 uCHAR id[4]; /* Host Adapter SCSI ID */
494 int vect; /* Interrupt Vector Number */
495 int base; /* Base I/O Address */
496 int njobs; /* # Of CCBs Outstanding To HBA */
497 int qdepth; /* Controller Queue depth. */
498 uLONG SGsize; /* Scatter/Gather List Size. */
499 char idPAL[4]; /* 4 Bytes Of The ID Pal */
500 uCHAR eataVersion; /* EATA Version */
501 uLONG cpLength; /* EATA Command Packet Length */
502 uLONG spLength; /* EATA Status Packet Length */
503 uCHAR drqNum; /* DRQ Index (0,5,6,7) */
504 uCHAR eataflag1; /* EATA Flags 1 (Byte 9) */
505 uCHAR eataflag2; /* EATA Flags 2 (Byte 30) */
506 uCHAR maxChannel; /* Maximum Channel Number */
507 uCHAR maxID; /* Maximum Target ID */
508 uCHAR maxLUN; /* Maximum LUN */
509 uCHAR HbaBusType; /* HBA Bus Type, EISA, PCI, etc */
510 uCHAR RaidNum; /* Host Adapter RAID Number */
512 } HbaInfo;
514 #endif /* _DPT_UNIXWARE */
515 #endif /* SNI_MIPS */
518 #ifdef _DPT_AIX
521 * DPT Host Adapter config information structure - this structure contains
522 * configuration information about an adapter. It is imbedded into the
523 * dpt_ctl structure.
526 typedef struct dpt_cfg {
527 uchar flags; /* Operational state flags */
528 uchar id[4]; /* Host adapter SCSI IDs */
529 int vect; /* Interrupt vector number */
530 ulong base_addr; /* Base I/O address */
531 int qdepth; /* Controller queue depth. */
532 ulong SGsize; /* Max scatter/gather list sz */
533 ulong SGmax; /* Max s/g we can use per req */
534 uchar eataVersion; /* EATA version */
535 ushort cpPadLen; /* # of pad bytes sent to HA for
536 PIO commands */
537 ulong cpLength; /* EATA Command Packet length */
538 ulong spLength; /* EATA Status Packet length */
539 uchar eataflag1; /* EATA Flags 1 (Byte 9) */
540 uchar eataflag2; /* EATA Flags 2 (Byte 30) */
541 uchar maxChan; /* Maximum Channel number */
542 uchar maxID; /* Maximum target ID */
543 uchar maxLUN; /* Maximum LUN */
544 uchar HbaBusType; /* HBA bus type, EISA, PCI, etc */
545 uchar RaidNum; /* Host adapter RAID number */
546 } DptCfg_t;
548 #endif /* _DPT_AIX */
551 #define MAX_ELEMENT_COUNT 64
552 #define MAX_BUCKET_COUNT 10
555 * DPT statistics structure definitions
557 typedef struct IO_SIZE_STATS
559 uLONG TotalIoCount;
560 uLONG IoCountRead;
561 uLONG IoCountReadSg;
562 uLONG IoCountWrite;
563 uLONG IoCountWriteSg;
564 uLONG UnalignedIoAddress;
565 uLONG SgElementCount[MAX_ELEMENT_COUNT];
567 } IO_SIZE_STATS_T, *pIO_SIZE_STATS_T;
569 typedef struct STATS_DATA
571 uLONG TotalIoCount;
572 uLONG TotalUnCachedIoCount;
573 uLONG MaxOutstandingIoCount;
574 uLONG CurrentOutstandingIoCount;
575 uLONG OutstandingIoRunningCount;
576 uLONG UnalignedPktCount;
577 uLONG UnalignedSgCount;
578 uLONG NonPageListAddressSgCount;
579 uLONG MaxMessagesPerInterrupt;
580 IO_SIZE_STATS_T IoSize[MAX_BUCKET_COUNT];
582 } STATS_DATA_T, *pSTATS_DATA_T;
584 typedef struct TARGET_BUSY
586 uLONG channel;
587 uLONG id;
588 uLONG lun;
589 uLONG isBusy;
590 } TARGET_BUSY_T;
591 #endif /* __OSD_UNIX_H */