|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * @OSF_COPYRIGHT@
24: *
25: */
26: /*
27: * HISTORY
28: *
29: * Revision 1.1.1.1 1998/09/22 21:05:48 wsanchez
30: * Import of Mac OS X kernel (~semeria)
31: *
32: * Revision 1.1.1.1 1998/03/07 02:25:59 wsanchez
33: * Import of OSF Mach kernel (~mburg)
34: *
35: * Revision 1.1.7.1 1996/09/17 16:34:56 bruel
36: * removed size_t, already defined in types.h.
37: * [96/09/17 bruel]
38: *
39: * Revision 1.1.4.1 1996/04/17 17:48:54 davidp
40: * Created for use with SVR4 drivers.
41: * [1996/04/11 13:19:26 davidp]
42: *
43: * Revision 1.1.1.2 1996/03/04 17:53:46 calvert
44: * Created for use with SVR4 drivers.
45: *
46: * $EndLog$
47: */
48: /* In vi use ":set ts=4" to edit/view this file
49: */
50: #ifndef _SYS_SDI_H_
51: #define _SYS_SDI_H_ 1
52:
53: #include "scsi/scsi_endian.h"
54:
55: typedef u_long paddr_t;
56: typedef u_int rm_key_t;
57:
58: typedef long hba_clock_t;
59:
60: typedef u_long major_t;
61: typedef u_long minor_t;
62:
63: typedef u_long hba_buf_t; /* just to satisfy declaration */
64: typedef u_long hba_uio_t; /* just to satisfy declaration */
65:
66:
67: struct ver_no {
68: uchar_t sv_release;
69: uchar_t sv_machine;
70: short sv_modes;
71: };
72:
73: struct hba_idata_v4 {
74: int version_num;
75: char *name;
76: uchar_t ha_id;
77: ulong_t ioaddr1;
78: int dmachan1;
79: int iov;
80: int cntlr;
81: int active;
82: ulong_t idata_memaddr;
83: uchar_t idata_ctlorder;
84: uchar_t idata_nbus;
85: ushort_t idata_ntargets;
86: ushort_t idata_nluns;
87: rm_key_t idata_rmkey;
88: void *idata_intrcookie;
89: int idata_cpubind;
90: };
91:
92: struct hba_idata {
93: int version_num;
94: char *name;
95: uchar_t ha_id;
96: ulong_t ioaddr1;
97: int dmachan1;
98: int iov;
99: int cntlr;
100: int active;
101: };
102:
103: #define HBA_SVR4_2 1
104: #define HBA_SVR4_2_2 2
105: #define HBA_SVR4_2MP 3
106:
107: #define HBA_VMASK 0xffff
108:
109: #define HBA_IDATA_EXT 0x10000
110: #define HBA_EXT_INFO 0x20000
111: #define HBA_AUTOCONF 0x40000
112:
113: #define VID_LEN 8
114: #define PID_LEN 16
115: #define REV_LEN 4
116:
117: #define INQ_LEN VID_LEN+PID_LEN+1
118: #define INQ_EXLEN INQ_LEN+REV_LEN
119:
120: struct ident {
121: BITFIELD_2( unsigned char,
122: id_type : 5,
123: id_pqual : 3);
124: BITFIELD_2(unsigned char,
125: id_qualif : 7,
126: id_rmb : 1);
127: uchar_t id_ver;
128: BITFIELD_2(unsigned char,
129: id_form : 4,
130: id_res1 : 4);
131: uchar_t id_len;
132: uchar_t id_vu [3];
133: char id_vendor [VID_LEN];
134: char id_prod [PID_LEN];
135: char id_revnum [REV_LEN];
136: };
137:
138: #define SCSI_INQ_CON 0x0
139: #define SCSI_INQ_TC 0x1
140: #define SCSI_INQ_TNC 0x3
141:
142: struct scsi_adr {
143: int scsi_ctl;
144: int scsi_target;
145: int scsi_lun;
146: int scsi_bus;
147: };
148:
149: struct scsi_ad {
150: ulong_t sa_major;
151: ulong_t sa_minor;
152: uchar_t sa_lun;
153: BITFIELD_2(unsigned char,
154: sa_bus : 3,
155: sa_exta : 5);
156: short sa_ct;
157: };
158:
159: /* sa_ct */
160: #define SDI_SA_CT(c,t) (((c) << 3) | ((t) & 0x07))
161: #define SDI_HAN(sa) (((sa)->sa_ct >> 3) & 0x07)
162: #define SDI_TCN(sa) ((sa)->sa_ct & 0x07)
163:
164: #define SDI_ETCN(sa) ((sa)->sa_exta)
165: #define SDI_EHAN(sa) (((sa)->sa_ct >> 3) & 0x1f)
166:
167: struct sdi_edt {
168: struct sdi_edt *hash_p;
169: short hba_no;
170: uchar_t scsi_id;
171: uchar_t lun;
172: struct owner *curdrv;
173: struct owner *owner_list;
174: ulong_t res1;
175: int pdtype;
176: uchar_t iotype;
177: char inquiry [INQ_EXLEN];
178: struct scsi_adr scsi_adr;
179: ulong_t memaddr;
180: uchar_t ctlorder;
181: struct ident edt_ident;
182: };
183:
184: /* iotype */
185: #define F_DMA 0x001
186: #define F_DMA_24 F_DMA
187: #define F_PIO 0x002
188: #define F_SCGTH 0x004
189: #define F_RMB 0x008
190: #define F_DMA_32 0x010
191: #define F_HDWREA 0x020
192: #define F_RESID 0x040
193:
194: struct mod_operations {
195: int (*modm_install)(void);
196: int (*modm_remove)(void);
197: int (*modm_info)(void);
198: int (*modm_bind)(void);
199: };
200:
201: struct modlink {
202: struct mod_operations *ml_ops;
203: void *ml_type_data;
204: };
205:
206: struct mod_type_data {
207: char *mtd_info;
208: void *mtd_pdata;
209: };
210:
211: struct modwrapper {
212: int mw_rev;
213: int (*mw_load)(void);
214: int (*mw_unload)(void);
215: void (*mw_halt)(void);
216: void *mw_conf_data;
217: struct modlink *mw_modlink;
218: };
219:
220: struct hbadata {
221: struct xsb *sb;
222: };
223:
224: typedef struct physreq {
225: paddr_t phys_align;
226: paddr_t phys_boundary;
227: uchar_t phys_dmasize;
228: uchar_t phys_max_scgth;
229: uchar_t phys_flags;
230: void *phys_brkup_poolp;
231: } physreq_t;
232:
233:
234: typedef struct bcb {
235: uchar_t bcb_addrtypes;
236: uchar_t bcb_flags;
237: size_t bcb_max_xfer;
238: size_t bcb_granularity;
239: physreq_t *bcb_physreqp;
240: } bcb_t;
241:
242: struct hbagetinfo {
243: char *name;
244: char iotype;
245: bcb_t *bcbp;
246: };
247:
248: struct hba_info {
249: int *hba_flag;
250: ulong_t max_xfer;
251: long (*hba_freeblk)(struct hbadata *hdp, int cntlr);
252: struct hbadata *(*hba_getblk)(int flag, int cntlr);
253: long (*hba_icmd)(struct hbadata *hdp, int flag);
254: void (*hba_getinfo)(struct scsi_ad *sap,
255: struct hbagetinfo *hgip);
256: long (*hba_send)(struct hbadata *hdp, int flag);
257: int (*hba_xlat)(struct hbadata *hdp, int bflag, void *procp,
258: int flag);
259: int (*hba_open)(void);
260: int (*hba_close)(void);
261: int (*hba_ioctl)(void);
262: };
263:
264: /* hba_flag */
265: #define HBA_MP 0x01
266: #define HBA_HOT 0x02
267: #define HBA_TIMEOUT 0x04
268:
269: #define SC_EXHAN(minor) (((minor) >> 5) & 0x1f)
270: #define SC_EXTCN(minor) ((((minor) >> 2) & 0x07) | ((minor >> 7) & 0x18))
271: #define SC_EXLUN(minor) (((minor) & 0x03) | ((minor>>10) & 0x1C))
272: #define SC_BUS(minor) (((minor) >> 15) & 0x07)
273:
274: #define SC_MKMINOR(h,t,l,b) ( \
275: (((h) & 0x1f) << 5) | \
276: (((t) & 0x07) << 2) | (((t) & 0x18) << 7) | \
277: ((l) & 0x03) | (((l) & 0x1c) << 10) | \
278: (((b) & 0x07) << 15) \
279: )
280:
281: #define SDI_NAMESZ 49
282:
283: #define SM_POOLSIZE 28
284: #define LG_POOLSIZE (sizeof (struct xsb))
285:
286: #define SCB_TYPE 1
287: #define ISCB_TYPE 2
288: #define SFB_TYPE 3
289:
290: #define SCB_WRITE 0x00
291: #define SCB_READ 0x01
292: #define SCB_LINK 0x02
293: #define SCB_HAAD 0x04
294: #define SCB_PARTBLK 0x08
295:
296: #define SDI_NOALLOC 0x00000000
297: #define SDI_ASW 0x00000001
298: #define SDI_LINKF0 0x00000002
299: #define SDI_LINKF1 0x00000003
300: #define SDI_QFLUSH 0xE0000004
301: #define SDI_ABORT 0xF0000005
302: #define SDI_RESET 0xF0000006
303: #define SDI_CRESET 0xD0000007
304: #define SDI_V2PERR 0xA0000008
305: #define SDI_TIME 0xD0000009
306: #define SDI_NOTEQ 0x8000000A
307: #define SDI_HAERR 0xE000000B
308: #define SDI_MEMERR 0xA000000C
309: #define SDI_SBUSER 0xA000000D
310: #define SDI_CKSTAT 0xD000000E
311: #define SDI_SCBERR 0x8000000F
312: #define SDI_OOS 0xA0000010
313: #define SDI_NOSELE 0x90000011
314: #define SDI_MISMAT 0x90000012
315: #define SDI_PROGRES 0x00000013
316: #define SDI_UNUSED 0x00000014
317: #define SDI_ONEIC 0x80000017
318: #define SDI_SFBERR 0x80000019
319: #define SDI_TCERR 0x9000001A
320:
321: #define SDI_ERROR 0x80000000
322: #define SDI_RETRY 0x40000000
323: #define SDI_MESS 0x20000000
324: #define SDI_SUSPEND 0x10000000
325:
326: #define SFB_NOPF 0x00
327: #define SFB_RESETM 0x01
328: #define SFB_ABORTM 0x02
329: #define SFB_FLUSHR 0x03
330: #define SFB_RESUME 0x04
331: #define SFB_SUSPEND 0x05
332: #define SFB_ADD_DEV 0x06
333: #define SFB_RM_DEV 0x07
334: #define SFB_PAUSE 0x08
335: #define SFB_CONTINUE 0x09
336:
337: #define SDI_386_AT 0x06
338: #define SDI_386_MCA 0x07
339: #define SDI_386_EISA 0x08
340:
341: #define SDI_RET_OK 0
342: #define SDI_RET_ERR -1
343: #define SDI_RET_RETRY 1
344:
345: #define SDI_SEND 0x0081
346: #define SDI_TRESET 0x0082
347: #define SDI_BRESET 0x0084
348: #define HA_VER 0x0083
349: #define SDI_RESERVE 0x0085
350: #define SDI_RELEASE 0x0086
351: #define SDI_RESTAT 0x0087
352: #define HA_GETPARMS 0x008a
353: #define IHA_GETPARMS 0x008b
354: #define HA_SETPARMS 0x008c
355: #define IHA_SETPARMS 0x008d
356: #define HA_GETPPARMS 0x008e
357:
358: struct sense {
359: uchar_t sd_pad0;
360: BITFIELD_2(unsigned char,
361: sd_errc : 7,
362: sd_valid : 1);
363: uchar_t sd_res1;
364: BITFIELD_5(unsigned char,
365: sd_key : 4,
366: sd_res2 : 1,
367: sd_ili : 1,
368: sd_eom : 1,
369: sd_fm : 1);
370: uint_t sd_ba;
371: uchar_t sd_len;
372: uchar_t sd_res3 [4];
373: uchar_t sd_sencode;
374: uchar_t sd_qualifier;
375: uchar_t sd_fru;
376: BITFIELD_5(unsigned char,
377: sd_bitpt : 3,
378: sd_bpv : 1,
379: sd_res4 : 2,
380: sd_cd : 1,
381: sd_res5 : 1);
382: uchar_t sd_field [2];
383: uchar_t sd_res6;
384: uchar_t sd_buffer;
385: uchar_t sd_res7 [2];
386: };
387:
388:
389: struct sb_extra {
390: struct sense sb_sense;
391: };
392:
393: #define sc_priv sc_extra
394:
395: struct sb;
396:
397: struct scb {
398: ulong_t sc_comp_code;
399: void *sc_extra;
400: void (*sc_int)(struct sb *sbp);
401: caddr_t sc_cmdpt;
402: caddr_t sc_datapt;
403: long sc_wd;
404: time_t sc_time;
405: struct scsi_ad sc_dev;
406: ushort_t sc_mode;
407: uchar_t sc_status;
408: char sc_fill;
409: struct sb *sc_link;
410: long sc_cmdsz;
411: long sc_datasz;
412: long sc_resid;
413: hba_clock_t sc_start;
414: };
415:
416: struct sfb {
417: ulong_t sf_comp_code;
418: char *sf_priv;
419: void (*sf_int)(struct sb *sbp);
420: struct scsi_ad sf_dev;
421: ulong_t sf_func;
422: int sf_wd;
423: };
424:
425: struct sb {
426: ulong_t sb_type;
427: union {
428: struct scb b_scb;
429: struct sfb b_sfb;
430: } sb_b;
431: };
432:
433: #define SCB sb_b.b_scb
434: #define SFB sb_b.b_sfb
435:
436: struct xsb {
437: struct sb sb;
438: struct hbadata *hbadata_p;
439: struct owner *owner_p;
440: struct sb_extra extra;
441: };
442:
443: #define S_GOOD 0X00
444: #define S_CKCON 0X02
445: #define S_METGD 0X04
446: #define S_BUSY 0X08
447: #define S_INGD 0X10
448: #define S_INMET 0X12
449: #define S_RESER 0X18
450: #define S_CTERM 0x22
451: #define S_QFULL 0x28
452:
453: #define SLEEP 0
454: #define NOSLEEP 1
455:
456: #define KM_SLEEP SLEEP
457: #define KM_NOSLEEP NOSLEEP
458: #define KM_DMA 2
459: #define KM_REQ_DMA 4
460: #define KM_PHYSCONTIG 8
461:
462: struct mod_drvintr {
463: ushort_t di_magic;
464: ushort_t di_version;
465: char *di_modname;
466: int *di_devflagp;
467: void (*di_handler)(int vect);
468: void *di_hook;
469: };
470:
471: #define MOD_INTR_MAGIC 0xEB13
472: #define MOD_INTR_VER 1
473:
474: struct o_mod_drvintr {
475: struct intr_info *drv_intrinfo;
476: void (*ihndler)(int vect);
477: };
478:
479: #define MOD_INTRVER_MASK 0xff000000
480: #define MOD_INTRVER_42 0x01000000
481:
482: #define INTRVER(infop) ((unsigned int)((infop)->ivect_no & MOD_INTRVER_MASK))
483: #define INTRNO(infop) ((infop)->ivect_no & ~MOD_INTRVER_MASK)
484:
485: struct intr_info0 {
486: int ivect_no;
487: int int_pri;
488: int itype;
489: };
490:
491: struct intr_info {
492: int ivect_no;
493: int int_pri;
494: int itype;
495: int int_cpu;
496: int int_mp;
497: };
498:
499: #endif /* _SYS_SDI_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.