summaryrefslogtreecommitdiff
path: root/sys/dev/ic/bhareg.h
blob: 4bf84004e09694a903c51a1a8c0427a892c6d08c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
/*	$OpenBSD: bhareg.h,v 1.4 2008/09/01 17:30:56 deraadt Exp $	*/
/*	$NetBSD: bhareg.h,v 1.12 1998/08/17 00:26:33 mycroft Exp $	*/

/*-
 * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace
 * Simulation Facility, NASA Ames Research Center.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * Originally written by Julian Elischer (julian@tfs.com)
 * for TRW Financial Systems for use under the MACH(2.5) operating system.
 *
 * TRW Financial Systems, in accordance with their agreement with Carnegie
 * Mellon University, makes this software available to CMU to distribute
 * or use in any manner that they see fit as long as this message is kept with
 * the software. For this reason TFS also grants any other persons or
 * organisations permission to use or modify this software.
 *
 * TFS supplies this software to be publicly redistributed
 * on the understanding that TFS is not responsible for the correct
 * functioning of this software in any circumstances.
 */

typedef u_int8_t physaddr[4];
typedef u_int8_t physlen[4];
#define	ltophys	_lto4l
#define	phystol	_4ltol

/*
 * I/O port offsets
 */
#define	BHA_CTRL_PORT		0	/* control (wo) */
#define	BHA_STAT_PORT		0	/* status (ro) */
#define	BHA_CMD_PORT		1	/* command (wo) */
#define	BHA_DATA_PORT		1	/* data (ro) */
#define	BHA_INTR_PORT		2	/* interrupt status (ro) */
#define	BHA_EXTGEOM_PORT	3	/* extended geometry (ro) */

/*
 * BHA_CTRL bits
 */
#define BHA_CTRL_HRST		0x80	/* Hardware reset */
#define BHA_CTRL_SRST		0x40	/* Software reset */
#define BHA_CTRL_IRST		0x20	/* Interrupt reset */
#define BHA_CTRL_SCRST		0x10	/* SCSI bus reset */

/*
 * BHA_STAT bits
 */
#define BHA_STAT_STST		0x80	/* Self test in Progress */
#define BHA_STAT_DIAGF		0x40	/* Diagnostic Failure */
#define BHA_STAT_INIT		0x20	/* Mbx Init required */
#define BHA_STAT_IDLE		0x10	/* Host Adapter Idle */
#define BHA_STAT_CDF		0x08	/* cmd/data out port full */
#define BHA_STAT_DF		0x04	/* Data in port full */
#define BHA_STAT_INVDCMD	0x01	/* Invalid command */
#define	BHA_STAT_BITS	"\020\1invcmd\3df\4cdf\5idle\6init\7diagf\10stst"

/*
 * BHA_CMD opcodes
 */
#define	BHA_NOP			0x00	/* No operation */
#define BHA_MBX_INIT		0x01	/* Mbx initialization */
#define BHA_START_SCSI		0x02	/* start scsi command */
#define	BHA_EXECUTE_BIOS_CMD	0x03	/* execute BIOS command */
#define BHA_INQUIRE_REVISION	0x04	/* Adapter Inquiry */
#define BHA_MBO_INTR_EN		0x05	/* Enable MBO available interrupt */
#define BHA_SEL_TIMEOUT_SET	0x06	/* set selection time-out */
#define BHA_BUS_ON_TIME_SET	0x07	/* set bus-on time */
#define BHA_BUS_OFF_TIME_SET	0x08	/* set bus-off time */
#define BHA_BUS_SPEED_SET	0x09	/* set bus transfer speed */
#define BHA_INQUIRE_DEVICES	0x0a	/* return installed devices 0-7 */
#define BHA_INQUIRE_CONFIG	0x0b	/* return configuration data */
#define BHA_TARGET_EN		0x0c	/* enable target mode */
#define BHA_INQUIRE_SETUP	0x0d	/* return setup data */
#define	BHA_WRITE_LRAM		0x1a	/* write adapter local RAM */
#define	BHA_READ_LRAM		0x1b	/* read adapter local RAM */
#define	BHA_WRITE_CHIP_FIFO	0x1c	/* write bus master chip FIFO */
#define	BHA_READ_CHIP_FIFO	0x1d	/* read bus master chip FIFO */
#define BHA_ECHO		0x1f	/* Echo command byte */
#define	BHA_ADAPTER_DIAGNOSTICS	0x20	/* host adapter diagnostics */
#define	BHA_SET_ADAPTER_OPTIONS	0x21	/* set adapter options */
#define BHA_INQUIRE_DEVICES_2	0x23	/* return installed devices 8-15 */
#define	BHA_INQUIRE_TARG_DEVS	0x24	/* inquire target devices */
#define	BHA_DISABLE_HAC_INTR	0x25	/* disable host adapter interrupt */
#define BHA_MBX_INIT_EXTENDED	0x81	/* Mbx initialization */
#define	BHA_EXECUTE_SCSI_CMD	0x83	/* execute SCSI command */
#define BHA_INQUIRE_REVISION_3	0x84	/* Get 3rd firmware version byte */
#define BHA_INQUIRE_REVISION_4	0x85	/* Get 4th firmware version byte */
#define	BHA_INQUIRE_PCI_INFO	0x86	/* get PCI host adapter information */
#define BHA_INQUIRE_MODEL	0x8b	/* Get hardware ID and revision */
#define	BHA_INQUIRE_PERIOD	0x8c	/* Get synchronous period */
#define BHA_INQUIRE_EXTENDED	0x8d	/* Adapter Setup Inquiry */
#define	BHA_ROUND_ROBIN		0x8f	/* Enable/Disable(default)
					   round robin */
#define	BHA_STORE_LRAM		0x90	/* store host adapter local RAM */
#define	BHA_FETCH_LRAM		0x91	/* fetch host adapter local RAM */
#define	BHA_SAVE_TO_EEPROM	0x92	/* store local RAM data in EEPROM */
#define	BHA_UPLOAD_AUTOSCSI	0x94	/* upload AutoSCSI code */
#define BHA_MODIFY_IOPORT	0x95	/* change or disable I/O port */
#define	BHA_SET_CCB_FORMAT	0x96	/* set CCB format (legacy/wide lun) */
#define	BHA_WRITE_INQUIRY_BUF	0x9a	/* write inquiry buffer */
#define	BHA_READ_INQUIRY_BUF	0x9b	/* read inquiry buffer */
#define	BHA_FLASH_UP_DOWNLOAD	0xa7	/* flash upload/downlod */
#define	BHA_READ_SCAM_DATA	0xa8	/* read SCAM data */
#define	BHA_WRITE_SCAM_DATA	0xa9	/* write SCAM data */

/*
 * BHA_INTR bits
 */
#define BHA_INTR_ANYINTR	0x80	/* Any interrupt */
#define BHA_INTR_SCRD		0x08	/* SCSI reset detected */
#define BHA_INTR_HACC		0x04	/* Command complete */
#define BHA_INTR_MBOA		0x02	/* MBX out empty */
#define BHA_INTR_MBIF		0x01	/* MBX in full */

struct bha_mbx_out {
	physaddr ccb_addr;
	u_int8_t reserved[3];
	u_int8_t cmd;
} __packed;

struct bha_mbx_in {
	physaddr ccb_addr;
	u_int8_t host_stat;
	u_int8_t target_stat;
	u_int8_t reserved;
	u_int8_t comp_stat;
} __packed;

/*
 * mbo.cmd values
 */
#define BHA_MBO_FREE	0x0	/* MBO entry is free */
#define BHA_MBO_START	0x1	/* MBO activate entry */
#define BHA_MBO_ABORT	0x2	/* MBO abort entry */

/*
 * mbi.comp_stat values
 */
#define BHA_MBI_FREE	0x0	/* MBI entry is free */
#define BHA_MBI_OK	0x1	/* completed without error */
#define BHA_MBI_ABORT	0x2	/* aborted ccb */
#define BHA_MBI_UNKNOWN	0x3	/* Tried to abort invalid CCB */
#define BHA_MBI_ERROR	0x4	/* Completed with error */

#if	defined(BIG_DMA)
WARNING...THIS WON'T WORK(won't fit on 1 page)
#if 0
#define      BHA_NSEG 2048    /* Number of scatter gather segments - to much vm */
#endif
#define	BHA_NSEG	128
#else
#define	BHA_NSEG	33
#endif /* BIG_DMA */

struct bha_scat_gath {
	physlen seg_len;
	physaddr seg_addr;
} __packed;

struct bha_ccb {
	u_int8_t	opcode;
#if BYTE_ORDER == LITTLE_ENDIAN
	u_int8_t				:3,
			data_in			:1,
			data_out		:1,
			wide_tag_enable		:1, /* Wide Lun CCB format */
			wide_tag_type		:2; /* Wide Lun CCB format */
#else
	u_int8_t	wide_tag_type		:2, /* Wide Lun CCB format */
			wide_tag_enable		:1, /* Wide Lun CCB format */
			data_out		:1,
			data_in			:1,
						:3;
#endif
	u_int8_t	scsi_cmd_length;
	u_int8_t	req_sense_length;
	/*------------------------------------longword boundary */
	physlen data_length;
	/*------------------------------------longword boundary */
	physaddr data_addr;
	/*------------------------------------longword boundary */
	u_int8_t	reserved1[2];
	u_int8_t	host_stat;
	u_int8_t	target_stat;
	/*------------------------------------longword boundary */
	u_int8_t	target;
#if BYTE_ORDER == LITTLE_ENDIAN
	u_int8_t	lun			:5,
			tag_enable		:1,
			tag_type		:2;
#else
	u_int8_t	tag_type		:2,
			tag_enable		:1,
			lun			:5;
#endif
	struct scsi_generic scsi_cmd;
	u_int8_t	reserved2[1];
	u_int8_t	link_id;
	/*------------------------------------longword boundary */
	physaddr link_addr;
	/*------------------------------------longword boundary */
	physaddr sense_ptr;
/*-----end of HW fields-----------------------longword boundary */
	struct scsi_sense_data scsi_sense;
	/*------------------------------------longword boundary */
	struct bha_scat_gath scat_gath[BHA_NSEG];
	/*------------------------------------longword boundary */
	TAILQ_ENTRY(bha_ccb) chain;
	struct bha_ccb *nexthash;
	bus_addr_t	hashkey;

	struct scsi_xfer *xs;		/* the scsipi_xfer for this cmd */

	int flags;
#define	CCB_ALLOC	0x01
#define	CCB_ABORT	0x02
#ifdef BHADIAG
#define	CCB_SENDING	0x04
#endif
	int timeout;

	/*
	 * This DMA map maps the buffer involved in the transfer.
	 * Its contents are loaded into "scat_gath" above.
	 */
	bus_dmamap_t	dmamap_xfer;
} __packed;

/*
 * opcode fields
 */
#define BHA_INITIATOR_CCB	0x00	/* SCSI Initiator CCB */
#define BHA_TARGET_CCB		0x01	/* SCSI Target CCB */
#define BHA_INIT_SCAT_GATH_CCB	0x02	/* SCSI Initiator with S/G */
#define	BHA_INIT_RESID_CCB	0x03	/* SCSI Initiator w/ residual */
#define	BHA_INIT_RESID_SG_CCB	0x04	/* SCSI Initiator w/ residual and S/G */
#define BHA_RESET_CCB		0x81	/* SCSI Bus reset */

/*
 * bha_ccb.host_stat values
 */
#define BHA_OK		0x00	/* cmd ok */
#define BHA_LINK_OK	0x0a	/* Link cmd ok */
#define BHA_LINK_IT	0x0b	/* Link cmd ok + int */
#define	BHA_DATA_UNDRN		0x0c	/* data underrun error */
#define BHA_SEL_TIMEOUT	0x11	/* Selection time out */
#define BHA_OVER_UNDER	0x12	/* Data over/under run */
#define BHA_BUS_FREE	0x13	/* Bus dropped at unexpected time */
#define BHA_INV_BUS	0x14	/* Invalid bus phase/sequence */
#define BHA_BAD_MBO	0x15	/* Incorrect MBO cmd */
#define BHA_BAD_CCB	0x16	/* Incorrect ccb opcode */
#define BHA_BAD_LINK	0x17	/* Not same values of LUN for links */
#define BHA_INV_TARGET	0x18	/* Invalid target direction */
#define BHA_CCB_DUP	0x19	/* Duplicate CCB received */
#define BHA_INV_CCB	0x1a	/* Invalid CCB or segment list */
#define	BHA_AUTOSENSE_FAILED	0x1b	/* auto REQUEST SENSE failed */
#define	BHA_TAGGED_MSG_REJ	0x1c	/* tagged queueing message rejected */
#define	BHA_UNSUP_MSG_RECVD	0x1d	/* unsupported message received */
#define	BHA_HARDWARE_FAILURE	0x20	/* host adapter hardware failure */
#define	BHA_TARG_IGNORED_ATN	0x21	/* target ignored ATN signal */
#define	BHA_HA_SCSI_BUS_RESET	0x22	/* host adapter asserted RST */
#define	BHA_OTHER_SCSI_BUS_RESET 0x23	/* other device asserted RST */
#define	BHA_BAD_RECONNECT	0x24	/* target reconnected improperly */
#define	BHA_HA_BUS_DEVICE_RESET	0x25	/* host adapter performed BDR */
#define	BHA_ABORT_QUEUE		0x26	/* abort queue generated */
#define	BHA_SOFTWARE_FAILURE	0x27	/* host adapter software failure */
#define	BHA_HARDWARE_WATCHDOG	0x30	/* host adapter watchdog timer fired */
#define	BHA_SCSI_PARITY_ERROR	0x34	/* SCSI parity error detected */

struct bha_extended_inquire {
	struct {
		u_char	opcode;
		u_char	len;
	} __packed cmd;
	struct {
		u_char	bus_type;	/* Type of bus connected to */
#define	BHA_BUS_TYPE_24BIT	'A'	/* ISA bus */
#define	BHA_BUS_TYPE_32BIT	'E'	/* EISA/VLB/PCI bus */
#define	BHA_BUS_TYPE_MCA	'M'	/* MicroChannel bus */
		u_char	bios_address;	/* Address of adapter BIOS */
		u_short sg_limit;
		u_char	mbox_count;
		u_char	mbox_baseaddr[4]; /* packed/unaligned u_int32_t */
		u_char	intrflags;
#define	BHA_INTR_FASTEISA	0x04
#define BHA_INTR_LEVEL	0x40		/* bit 6: level-sensitive interrupt */
		u_char	firmware_level[3]; /* last 3 digits of firmware rev */
		u_char	scsi_flags;	/* supported SCSI  features */
#define BHA_SCSI_WIDE		0x01	/* host adapter is wide */
#define BHA_SCSI_DIFFERENTIAL	0x02	/* host adapter is differential */
#define BHA_SCSI_SCAM		0x04	/* host adapter supports SCAM */
#define BHA_SCSI_ULTRA		0x08	/* host adapter supports Ultra */
#define BHA_SCSI_TERMINATION	0x10	/* host adapter supports smart
					   termination */
	} __packed reply;
} __packed;

struct bha_config {
	struct {
		u_char	opcode;
	} __packed cmd;
	struct {
		u_char  chan;
		u_char  intr;
#if BYTE_ORDER == LITTLE_ENDIAN
		u_char  scsi_dev :3,
				 :5;
#else
		u_char		 :5,
			scsi_dev :3;
#endif
	} __packed reply;
} __packed;

struct bha_toggle {
	struct {
		u_char	opcode;
		u_char	enable;
	} __packed cmd;
} __packed;

struct bha_mailbox {
	struct {
		u_char	opcode;
		u_char	nmbx;
		physaddr addr;
	} __packed cmd;
} __packed;

struct bha_model {
	struct {
		u_char	opcode;
		u_char	len;
	} __packed cmd;
	struct {
		u_char	id[4];		/* i.e bt742a -> '7','4','2','A' */
		u_char	version[2];	/* i.e Board Revision 'H' -> 'H', 0x00 */
	} __packed reply;
} __packed;

struct bha_revision {
	struct {
		u_char	opcode;
	} __packed cmd;
	struct {
		u_char  board_type;
		u_char  custom_feature;
		char    firm_revision;
		u_char  firm_version;
	} __packed reply;
} __packed;

struct bha_digit {
	struct {
		u_char	opcode;
	} __packed cmd;
	struct {
		u_char  digit;
	} __packed reply;
} __packed;

struct bha_devices {
	struct {
		u_char	opcode;
	} __packed cmd;
	struct {
		u_char	lun_map[8];
	} __packed reply;
} __packed;

struct bha_sync {
#if BYTE_ORDER == LITTLE_ENDIAN
	u_char	offset	:4,
		period	:3,
		valid	:1;
#else
	u_char	valid	:1,
		period	:3,
		offset	:4;
#endif
} __packed;

struct bha_setup_reply {
#if BYTE_ORDER == LITTLE_ENDIAN
	u_int8_t	sync_neg	:1,
			parity		:1,
					:6;
#else
	u_int8_t			:6,
			parity		:1,
			sync_neg	:1;
#endif
	u_int8_t	speed;
	u_int8_t	bus_on;
	u_int8_t	bus_off;
	u_int8_t	num_mbx;
	u_int8_t	mbx[3];		/*XXX */
	/* doesn't make sense with 32bit addresses */
	struct bha_sync	sync[8];
	u_int8_t	disc_sts;
} __packed;

/* additional reply data supplied by wide controllers */
struct bha_setup_reply_wide {
	u_int8_t	signature;
	u_int8_t	letter_d;
	u_int8_t	ha_type;
	u_int8_t	low_wide_allowed;
	u_int8_t	low_wide_active;
	struct bha_sync	sync_high[8];
	u_int8_t	high_disc_info;
	u_int8_t	reserved;
	u_int8_t	high_wide_allowed;
	u_int8_t	high_wide_active;
} __packed;

struct bha_setup {
	struct {
		u_char	opcode;
		u_char	len;
	} __packed cmd;
	struct bha_setup_reply reply;
	struct bha_setup_reply_wide reply_w;	/* for wide controllers */
} __packed;

struct bha_period_reply {
	u_char	period[8];
} __packed;

struct bha_period {
	struct {
		u_char	opcode;
		u_char	len;
	} __packed cmd;
	struct bha_period_reply reply;
	struct bha_period_reply reply_w;	/* for wide controllers */
} __packed;

struct bha_isadisable {
	struct {
		u_char	opcode;
		u_char	modifier;
	} __packed cmd;
} __packed;

/*
 * bha_isadisable.modifier parameters
 */
#define BHA_IOMODIFY_330	0x00
#define BHA_IOMODIFY_334	0x01
#define BHA_IOMODIFY_DISABLE1	0x06
#define BHA_IOMODIFY_DISABLE2	0x07

#define INT9	0x01
#define INT10	0x02
#define INT11	0x04
#define INT12	0x08
#define INT14	0x20
#define INT15	0x40

#define EISADMA	0x00
#define CHAN0	0x01
#define CHAN5	0x20
#define CHAN6	0x40
#define CHAN7	0x80