• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 
4   Linux Driver for BusLogic MultiMaster and FlashPoint SCSI Host Adapters
5 
6   Copyright 1995-1998 by Leonard N. Zubkoff <lnz@dandelion.com>
7 
8 
9   The author respectfully requests that any modifications to this software be
10   sent directly to him for evaluation and testing.
11 
12   Special thanks to Wayne Yen, Jin-Lon Hon, and Alex Win of BusLogic, whose
13   advice has been invaluable, to David Gentzel, for writing the original Linux
14   BusLogic driver, and to Paul Gortmaker, for being such a dedicated test site.
15 
16   Finally, special thanks to Mylex/BusLogic for making the FlashPoint SCCB
17   Manager available as freely redistributable source code.
18 
19 */
20 
21 #ifndef _BUSLOGIC_H
22 #define _BUSLOGIC_H
23 
24 
25 #ifndef PACKED
26 #define PACKED __attribute__((packed))
27 #endif
28 
29 /*
30   Define the maximum number of BusLogic Host Adapters supported by this driver.
31 */
32 
33 #define BLOGIC_MAX_ADAPTERS		16
34 
35 
36 /*
37   Define the maximum number of Target Devices supported by this driver.
38 */
39 
40 #define BLOGIC_MAXDEV			16
41 
42 
43 /*
44   Define the maximum number of Scatter/Gather Segments used by this driver.
45   For optimal performance, it is important that this limit be at least as
46   large as the largest single request generated by the I/O Subsystem.
47 */
48 
49 #define BLOGIC_SG_LIMIT		128
50 
51 
52 /*
53   Define the maximum, maximum automatic, minimum automatic, and default Queue
54   Depth to allow for Target Devices depending on whether or not they support
55   Tagged Queuing and whether or not ISA Bounce Buffers are required.
56 */
57 
58 #define BLOGIC_MAX_TAG_DEPTH		64
59 #define BLOGIC_MAX_AUTO_TAG_DEPTH	28
60 #define BLOGIC_MIN_AUTO_TAG_DEPTH	7
61 #define BLOGIC_TAG_DEPTH_BB		3
62 #define BLOGIC_UNTAG_DEPTH		3
63 #define BLOGIC_UNTAG_DEPTH_BB		2
64 
65 
66 /*
67   Define the default amount of time in seconds to wait between a Host Adapter
68   Hard Reset which initiates a SCSI Bus Reset and issuing any SCSI commands.
69   Some SCSI devices get confused if they receive SCSI commands too soon after
70   a SCSI Bus Reset.
71 */
72 
73 #define BLOGIC_BUS_SETTLE_TIME		2
74 
75 
76 /*
77   Define the maximum number of Mailboxes that should be used for MultiMaster
78   Host Adapters.  This number is chosen to be larger than the maximum Host
79   Adapter Queue Depth and small enough so that the Host Adapter structure
80   does not cross an allocation block size boundary.
81 */
82 
83 #define BLOGIC_MAX_MAILBOX		211
84 
85 
86 /*
87   Define the number of CCBs that should be allocated as a group to optimize
88   Kernel memory allocation.
89 */
90 
91 #define BLOGIC_CCB_GRP_ALLOCSIZE	7
92 
93 
94 /*
95   Define the Host Adapter Line and Message Buffer Sizes.
96 */
97 
98 #define BLOGIC_LINEBUF_SIZE		100
99 #define BLOGIC_MSGBUF_SIZE		9700
100 
101 
102 /*
103   Define the Driver Message Levels.
104 */
105 
106 enum blogic_msglevel {
107 	BLOGIC_ANNOUNCE_LEVEL = 0,
108 	BLOGIC_INFO_LEVEL = 1,
109 	BLOGIC_NOTICE_LEVEL = 2,
110 	BLOGIC_WARN_LEVEL = 3,
111 	BLOGIC_ERR_LEVEL = 4
112 };
113 
114 static char *blogic_msglevelmap[] = { KERN_NOTICE, KERN_NOTICE, KERN_NOTICE, KERN_WARNING, KERN_ERR };
115 
116 
117 /*
118   Define Driver Message macros.
119 */
120 
121 #define blogic_announce(format, args...) \
122 	blogic_msg(BLOGIC_ANNOUNCE_LEVEL, format, ##args)
123 
124 #define blogic_info(format, args...) \
125 	blogic_msg(BLOGIC_INFO_LEVEL, format, ##args)
126 
127 #define blogic_notice(format, args...) \
128 	blogic_msg(BLOGIC_NOTICE_LEVEL, format, ##args)
129 
130 #define blogic_warn(format, args...) \
131 	blogic_msg(BLOGIC_WARN_LEVEL, format, ##args)
132 
133 #define blogic_err(format, args...) \
134 	blogic_msg(BLOGIC_ERR_LEVEL, format, ##args)
135 
136 
137 /*
138   Define the types of BusLogic Host Adapters that are supported and the number
139   of I/O Addresses required by each type.
140 */
141 
142 enum blogic_adapter_type {
143 	BLOGIC_MULTIMASTER = 1,
144 	BLOGIC_FLASHPOINT = 2
145 } PACKED;
146 
147 #define BLOGIC_MULTIMASTER_ADDR_COUNT	4
148 #define BLOGIC_FLASHPOINT_ADDR_COUNT	256
149 
150 static int blogic_adapter_addr_count[3] = { 0, BLOGIC_MULTIMASTER_ADDR_COUNT, BLOGIC_FLASHPOINT_ADDR_COUNT };
151 
152 
153 /*
154   Define macros for testing the Host Adapter Type.
155 */
156 
157 #ifdef CONFIG_SCSI_FLASHPOINT
158 
159 #define blogic_multimaster_type(adapter) \
160 	(adapter->adapter_type == BLOGIC_MULTIMASTER)
161 
162 #define blogic_flashpoint_type(adapter) \
163 	(adapter->adapter_type == BLOGIC_FLASHPOINT)
164 
165 #else
166 
167 #define blogic_multimaster_type(adapter)	(true)
168 #define blogic_flashpoint_type(adapter)		(false)
169 
170 #endif
171 
172 
173 /*
174   Define the possible Host Adapter Bus Types.
175 */
176 
177 enum blogic_adapter_bus_type {
178 	BLOGIC_UNKNOWN_BUS = 0,
179 	BLOGIC_ISA_BUS = 1,
180 	BLOGIC_EISA_BUS = 2,
181 	BLOGIC_PCI_BUS = 3,
182 	BLOGIC_VESA_BUS = 4,
183 	BLOGIC_MCA_BUS = 5
184 } PACKED;
185 
186 static char *blogic_adapter_busnames[] = { "Unknown", "ISA", "EISA", "PCI", "VESA", "MCA" };
187 
188 static enum blogic_adapter_bus_type blogic_adater_bus_types[] = {
189 	BLOGIC_VESA_BUS,	/* BT-4xx */
190 	BLOGIC_ISA_BUS,		/* BT-5xx */
191 	BLOGIC_MCA_BUS,		/* BT-6xx */
192 	BLOGIC_EISA_BUS,	/* BT-7xx */
193 	BLOGIC_UNKNOWN_BUS,	/* BT-8xx */
194 	BLOGIC_PCI_BUS		/* BT-9xx */
195 };
196 
197 /*
198   Define the possible Host Adapter BIOS Disk Geometry Translations.
199 */
200 
201 enum blogic_bios_diskgeometry {
202 	BLOGIC_BIOS_NODISK = 0,
203 	BLOGIC_BIOS_DISK64x32 = 1,
204 	BLOGIC_BIOS_DISK128x32 = 2,
205 	BLOGIC_BIOS_DISK255x63 = 3
206 } PACKED;
207 
208 
209 /*
210   Define a 10^18 Statistics Byte Counter data type.
211 */
212 
213 struct blogic_byte_count {
214 	unsigned int units;
215 	unsigned int billions;
216 };
217 
218 
219 /*
220   Define the structure for I/O Address and Bus Probing Information.
221 */
222 
223 struct blogic_probeinfo {
224 	enum blogic_adapter_type adapter_type;
225 	enum blogic_adapter_bus_type adapter_bus_type;
226 	unsigned long io_addr;
227 	unsigned long pci_addr;
228 	struct pci_dev *pci_device;
229 	unsigned char bus;
230 	unsigned char dev;
231 	unsigned char irq_ch;
232 };
233 
234 /*
235   Define the Probe Options.
236 */
237 
238 struct blogic_probe_options {
239 	bool noprobe:1;			/* Bit 0 */
240 	bool noprobe_isa:1;		/* Bit 1 */
241 	bool noprobe_pci:1;		/* Bit 2 */
242 	bool nosort_pci:1;		/* Bit 3 */
243 	bool multimaster_first:1;	/* Bit 4 */
244 	bool flashpoint_first:1;	/* Bit 5 */
245 	bool limited_isa:1;		/* Bit 6 */
246 	bool probe330:1;		/* Bit 7 */
247 	bool probe334:1;		/* Bit 8 */
248 	bool probe230:1;		/* Bit 9 */
249 	bool probe234:1;		/* Bit 10 */
250 	bool probe130:1;		/* Bit 11 */
251 	bool probe134:1;		/* Bit 12 */
252 };
253 
254 /*
255   Define the Global Options.
256 */
257 
258 struct blogic_global_options {
259 	bool trace_probe:1;	/* Bit 0 */
260 	bool trace_hw_reset:1;	/* Bit 1 */
261 	bool trace_config:1;	/* Bit 2 */
262 	bool trace_err:1;	/* Bit 3 */
263 };
264 
265 /*
266   Define the BusLogic SCSI Host Adapter I/O Register Offsets.
267 */
268 
269 #define BLOGIC_CNTRL_REG	0	/* WO register */
270 #define BLOGIC_STATUS_REG	0	/* RO register */
271 #define BLOGIC_CMD_PARM_REG	1	/* WO register */
272 #define BLOGIC_DATAIN_REG	1	/* RO register */
273 #define BLOGIC_INT_REG		2	/* RO register */
274 #define BLOGIC_GEOMETRY_REG	3	/* RO register */
275 
276 /*
277   Define the structure of the write-only Control Register.
278 */
279 
280 union blogic_cntrl_reg {
281 	unsigned char all;
282 	struct {
283 		unsigned char:4;	/* Bits 0-3 */
284 		bool bus_reset:1;	/* Bit 4 */
285 		bool int_reset:1;	/* Bit 5 */
286 		bool soft_reset:1;	/* Bit 6 */
287 		bool hard_reset:1;	/* Bit 7 */
288 	} cr;
289 };
290 
291 /*
292   Define the structure of the read-only Status Register.
293 */
294 
295 union blogic_stat_reg {
296 	unsigned char all;
297 	struct {
298 		bool cmd_invalid:1;	/* Bit 0 */
299 		bool rsvd:1;		/* Bit 1 */
300 		bool datain_ready:1;	/* Bit 2 */
301 		bool cmd_param_busy:1;	/* Bit 3 */
302 		bool adapter_ready:1;	/* Bit 4 */
303 		bool init_reqd:1;	/* Bit 5 */
304 		bool diag_failed:1;	/* Bit 6 */
305 		bool diag_active:1;	/* Bit 7 */
306 	} sr;
307 };
308 
309 /*
310   Define the structure of the read-only Interrupt Register.
311 */
312 
313 union blogic_int_reg {
314 	unsigned char all;
315 	struct {
316 		bool mailin_loaded:1;	/* Bit 0 */
317 		bool mailout_avail:1;	/* Bit 1 */
318 		bool cmd_complete:1;	/* Bit 2 */
319 		bool ext_busreset:1;	/* Bit 3 */
320 		unsigned char rsvd:3;	/* Bits 4-6 */
321 		bool int_valid:1;	/* Bit 7 */
322 	} ir;
323 };
324 
325 /*
326   Define the structure of the read-only Geometry Register.
327 */
328 
329 union blogic_geo_reg {
330 	unsigned char all;
331 	struct {
332 		enum blogic_bios_diskgeometry d0_geo:2;	/* Bits 0-1 */
333 		enum blogic_bios_diskgeometry d1_geo:2;	/* Bits 2-3 */
334 		unsigned char:3;	/* Bits 4-6 */
335 		bool ext_trans_enable:1;	/* Bit 7 */
336 	} gr;
337 };
338 
339 /*
340   Define the BusLogic SCSI Host Adapter Command Register Operation Codes.
341 */
342 
343 enum blogic_opcode {
344 	BLOGIC_TEST_CMP_COMPLETE = 0x00,
345 	BLOGIC_INIT_MBOX = 0x01,
346 	BLOGIC_EXEC_MBOX_CMD = 0x02,
347 	BLOGIC_EXEC_BIOS_CMD = 0x03,
348 	BLOGIC_GET_BOARD_ID = 0x04,
349 	BLOGIC_ENABLE_OUTBOX_AVAIL_INT = 0x05,
350 	BLOGIC_SET_SELECT_TIMEOUT = 0x06,
351 	BLOGIC_SET_PREEMPT_TIME = 0x07,
352 	BLOGIC_SET_TIMEOFF_BUS = 0x08,
353 	BLOGIC_SET_TXRATE = 0x09,
354 	BLOGIC_INQ_DEV0TO7 = 0x0A,
355 	BLOGIC_INQ_CONFIG = 0x0B,
356 	BLOGIC_TGT_MODE = 0x0C,
357 	BLOGIC_INQ_SETUPINFO = 0x0D,
358 	BLOGIC_WRITE_LOCALRAM = 0x1A,
359 	BLOGIC_READ_LOCALRAM = 0x1B,
360 	BLOGIC_WRITE_BUSMASTER_FIFO = 0x1C,
361 	BLOGIC_READ_BUSMASTER_FIFO = 0x1D,
362 	BLOGIC_ECHO_CMDDATA = 0x1F,
363 	BLOGIC_ADAPTER_DIAG = 0x20,
364 	BLOGIC_SET_OPTIONS = 0x21,
365 	BLOGIC_INQ_DEV8TO15 = 0x23,
366 	BLOGIC_INQ_DEV = 0x24,
367 	BLOGIC_DISABLE_INT = 0x25,
368 	BLOGIC_INIT_EXT_MBOX = 0x81,
369 	BLOGIC_EXEC_SCS_CMD = 0x83,
370 	BLOGIC_INQ_FWVER_D3 = 0x84,
371 	BLOGIC_INQ_FWVER_LETTER = 0x85,
372 	BLOGIC_INQ_PCI_INFO = 0x86,
373 	BLOGIC_INQ_MODELNO = 0x8B,
374 	BLOGIC_INQ_SYNC_PERIOD = 0x8C,
375 	BLOGIC_INQ_EXTSETUP = 0x8D,
376 	BLOGIC_STRICT_RR = 0x8F,
377 	BLOGIC_STORE_LOCALRAM = 0x90,
378 	BLOGIC_FETCH_LOCALRAM = 0x91,
379 	BLOGIC_STORE_TO_EEPROM = 0x92,
380 	BLOGIC_LOAD_AUTOSCSICODE = 0x94,
381 	BLOGIC_MOD_IOADDR = 0x95,
382 	BLOGIC_SETCCB_FMT = 0x96,
383 	BLOGIC_WRITE_INQBUF = 0x9A,
384 	BLOGIC_READ_INQBUF = 0x9B,
385 	BLOGIC_FLASH_LOAD = 0xA7,
386 	BLOGIC_READ_SCAMDATA = 0xA8,
387 	BLOGIC_WRITE_SCAMDATA = 0xA9
388 };
389 
390 /*
391   Define the Inquire Board ID reply structure.
392 */
393 
394 struct blogic_board_id {
395 	unsigned char type;		/* Byte 0 */
396 	unsigned char custom_features;	/* Byte 1 */
397 	unsigned char fw_ver_digit1;	/* Byte 2 */
398 	unsigned char fw_ver_digit2;	/* Byte 3 */
399 };
400 
401 /*
402   Define the Inquire Configuration reply structure.
403 */
404 
405 struct blogic_config {
406 	unsigned char:5;	/* Byte 0 Bits 0-4 */
407 	bool dma_ch5:1;		/* Byte 0 Bit 5 */
408 	bool dma_ch6:1;		/* Byte 0 Bit 6 */
409 	bool dma_ch7:1;		/* Byte 0 Bit 7 */
410 	bool irq_ch9:1;		/* Byte 1 Bit 0 */
411 	bool irq_ch10:1;	/* Byte 1 Bit 1 */
412 	bool irq_ch11:1;	/* Byte 1 Bit 2 */
413 	bool irq_ch12:1;	/* Byte 1 Bit 3 */
414 	unsigned char:1;	/* Byte 1 Bit 4 */
415 	bool irq_ch14:1;	/* Byte 1 Bit 5 */
416 	bool irq_ch15:1;	/* Byte 1 Bit 6 */
417 	unsigned char:1;	/* Byte 1 Bit 7 */
418 	unsigned char id:4;	/* Byte 2 Bits 0-3 */
419 	unsigned char:4;	/* Byte 2 Bits 4-7 */
420 };
421 
422 /*
423   Define the Inquire Setup Information reply structure.
424 */
425 
426 struct blogic_syncval {
427 	unsigned char offset:4;		/* Bits 0-3 */
428 	unsigned char tx_period:3;	/* Bits 4-6 */
429 	bool sync:1;			/* Bit 7 */
430 };
431 
432 struct blogic_setup_info {
433 	bool sync:1;				/* Byte 0 Bit 0 */
434 	bool parity:1;				/* Byte 0 Bit 1 */
435 	unsigned char:6;			/* Byte 0 Bits 2-7 */
436 	unsigned char tx_rate;			/* Byte 1 */
437 	unsigned char preempt_time;		/* Byte 2 */
438 	unsigned char timeoff_bus;		/* Byte 3 */
439 	unsigned char mbox_count;		/* Byte 4 */
440 	unsigned char mbox_addr[3];		/* Bytes 5-7 */
441 	struct blogic_syncval sync0to7[8];	/* Bytes 8-15 */
442 	unsigned char disconnect_ok0to7;	/* Byte 16 */
443 	unsigned char sig;			/* Byte 17 */
444 	unsigned char char_d;			/* Byte 18 */
445 	unsigned char bus_type;			/* Byte 19 */
446 	unsigned char wide_tx_ok0to7;		/* Byte 20 */
447 	unsigned char wide_tx_active0to7;	/* Byte 21 */
448 	struct blogic_syncval sync8to15[8];	/* Bytes 22-29 */
449 	unsigned char disconnect_ok8to15;	/* Byte 30 */
450 	unsigned char:8;			/* Byte 31 */
451 	unsigned char wide_tx_ok8to15;		/* Byte 32 */
452 	unsigned char wide_tx_active8to15;	/* Byte 33 */
453 };
454 
455 /*
456   Define the Initialize Extended Mailbox request structure.
457 */
458 
459 struct blogic_extmbox_req {
460 	unsigned char mbox_count;	/* Byte 0 */
461 	u32 base_mbox_addr;		/* Bytes 1-4 */
462 } PACKED;
463 
464 
465 /*
466   Define the Inquire PCI Host Adapter Information reply type.  The ISA
467   Compatible I/O Port values are defined here and are also used with
468   the Modify I/O Address command.
469 */
470 
471 enum blogic_isa_ioport {
472 	BLOGIC_IO_330 = 0,
473 	BLOGIC_IO_334 = 1,
474 	BLOGIC_IO_230 = 2,
475 	BLOGIC_IO_234 = 3,
476 	BLOGIC_IO_130 = 4,
477 	BLOGIC_IO_134 = 5,
478 	BLOGIC_IO_DISABLE = 6,
479 	BLOGIC_IO_DISABLE2 = 7
480 } PACKED;
481 
482 struct blogic_adapter_info {
483 	enum blogic_isa_ioport isa_port;	/* Byte 0 */
484 	unsigned char irq_ch;		/* Byte 1 */
485 	bool low_term:1;		/* Byte 2 Bit 0 */
486 	bool high_term:1;		/* Byte 2 Bit 1 */
487 	unsigned char:2;		/* Byte 2 Bits 2-3 */
488 	bool JP1:1;			/* Byte 2 Bit 4 */
489 	bool JP2:1;			/* Byte 2 Bit 5 */
490 	bool JP3:1;			/* Byte 2 Bit 6 */
491 	bool genericinfo_valid:1;	/* Byte 2 Bit 7 */
492 	unsigned char:8;		/* Byte 3 */
493 };
494 
495 /*
496   Define the Inquire Extended Setup Information reply structure.
497 */
498 
499 struct blogic_ext_setup {
500 	unsigned char bus_type;		/* Byte 0 */
501 	unsigned char bios_addr;	/* Byte 1 */
502 	unsigned short sg_limit;	/* Bytes 2-3 */
503 	unsigned char mbox_count;	/* Byte 4 */
504 	u32 base_mbox_addr;		/* Bytes 5-8 */
505 	struct {
506 		unsigned char:2;	/* Byte 9 Bits 0-1 */
507 		bool fast_on_eisa:1;	/* Byte 9 Bit 2 */
508 		unsigned char:3;	/* Byte 9 Bits 3-5 */
509 		bool level_int:1;	/* Byte 9 Bit 6 */
510 		unsigned char:1;	/* Byte 9 Bit 7 */
511 	} misc;
512 	unsigned char fw_rev[3];	/* Bytes 10-12 */
513 	bool wide:1;			/* Byte 13 Bit 0 */
514 	bool differential:1;		/* Byte 13 Bit 1 */
515 	bool scam:1;			/* Byte 13 Bit 2 */
516 	bool ultra:1;			/* Byte 13 Bit 3 */
517 	bool smart_term:1;		/* Byte 13 Bit 4 */
518 	unsigned char:3;		/* Byte 13 Bits 5-7 */
519 } PACKED;
520 
521 /*
522   Define the Enable Strict Round Robin Mode request type.
523 */
524 
525 enum blogic_rr_req {
526 	BLOGIC_AGGRESSIVE_RR = 0,
527 	BLOGIC_STRICT_RR_MODE = 1
528 } PACKED;
529 
530 
531 /*
532   Define the Fetch Host Adapter Local RAM request type.
533 */
534 
535 #define BLOGIC_BIOS_BASE		0
536 #define BLOGIC_AUTOSCSI_BASE		64
537 
538 struct blogic_fetch_localram {
539 	unsigned char offset;	/* Byte 0 */
540 	unsigned char count;	/* Byte 1 */
541 };
542 
543 /*
544   Define the Host Adapter Local RAM AutoSCSI structure.
545 */
546 
547 struct blogic_autoscsi {
548 	unsigned char factory_sig[2];		/* Bytes 0-1 */
549 	unsigned char info_bytes;		/* Byte 2 */
550 	unsigned char adapter_type[6];		/* Bytes 3-8 */
551 	unsigned char:8;			/* Byte 9 */
552 	bool floppy:1;				/* Byte 10 Bit 0 */
553 	bool floppy_sec:1;			/* Byte 10 Bit 1 */
554 	bool level_int:1;			/* Byte 10 Bit 2 */
555 	unsigned char:2;			/* Byte 10 Bits 3-4 */
556 	unsigned char systemram_bios:3;		/* Byte 10 Bits 5-7 */
557 	unsigned char dma_ch:7;			/* Byte 11 Bits 0-6 */
558 	bool dma_autoconf:1;			/* Byte 11 Bit 7 */
559 	unsigned char irq_ch:7;			/* Byte 12 Bits 0-6 */
560 	bool irq_autoconf:1;			/* Byte 12 Bit 7 */
561 	unsigned char dma_tx_rate;		/* Byte 13 */
562 	unsigned char scsi_id;			/* Byte 14 */
563 	bool low_term:1;			/* Byte 15 Bit 0 */
564 	bool parity:1;				/* Byte 15 Bit 1 */
565 	bool high_term:1;			/* Byte 15 Bit 2 */
566 	bool noisy_cable:1;			/* Byte 15 Bit 3 */
567 	bool fast_sync_neg:1;			/* Byte 15 Bit 4 */
568 	bool reset_enabled:1;			/* Byte 15 Bit 5 */
569 	bool:1;					/* Byte 15 Bit 6 */
570 	bool active_negation:1;			/* Byte 15 Bit 7 */
571 	unsigned char bus_on_delay;		/* Byte 16 */
572 	unsigned char bus_off_delay;		/* Byte 17 */
573 	bool bios_enabled:1;			/* Byte 18 Bit 0 */
574 	bool int19_redir_enabled:1;		/* Byte 18 Bit 1 */
575 	bool ext_trans_enable:1;		/* Byte 18 Bit 2 */
576 	bool removable_as_fixed:1;		/* Byte 18 Bit 3 */
577 	bool:1;					/* Byte 18 Bit 4 */
578 	bool morethan2_drives:1;		/* Byte 18 Bit 5 */
579 	bool bios_int:1;			/* Byte 18 Bit 6 */
580 	bool floptical:1;			/* Byte 19 Bit 7 */
581 	unsigned short dev_enabled;		/* Bytes 19-20 */
582 	unsigned short wide_ok;			/* Bytes 21-22 */
583 	unsigned short fast_ok;			/* Bytes 23-24 */
584 	unsigned short sync_ok;			/* Bytes 25-26 */
585 	unsigned short discon_ok;		/* Bytes 27-28 */
586 	unsigned short send_start_unit;		/* Bytes 29-30 */
587 	unsigned short ignore_bios_scan;	/* Bytes 31-32 */
588 	unsigned char pci_int_pin:2;		/* Byte 33 Bits 0-1 */
589 	unsigned char adapter_ioport:2;		/* Byte 33 Bits 2-3 */
590 	bool strict_rr_enabled:1;		/* Byte 33 Bit 4 */
591 	bool vesabus_33mhzplus:1;		/* Byte 33 Bit 5 */
592 	bool vesa_burst_write:1;		/* Byte 33 Bit 6 */
593 	bool vesa_burst_read:1;			/* Byte 33 Bit 7 */
594 	unsigned short ultra_ok;		/* Bytes 34-35 */
595 	unsigned int:32;			/* Bytes 36-39 */
596 	unsigned char:8;			/* Byte 40 */
597 	unsigned char autoscsi_maxlun;		/* Byte 41 */
598 	bool:1;					/* Byte 42 Bit 0 */
599 	bool scam_dominant:1;			/* Byte 42 Bit 1 */
600 	bool scam_enabled:1;			/* Byte 42 Bit 2 */
601 	bool scam_lev2:1;			/* Byte 42 Bit 3 */
602 	unsigned char:4;			/* Byte 42 Bits 4-7 */
603 	bool int13_exten:1;			/* Byte 43 Bit 0 */
604 	bool:1;					/* Byte 43 Bit 1 */
605 	bool cd_boot:1;				/* Byte 43 Bit 2 */
606 	unsigned char:5;			/* Byte 43 Bits 3-7 */
607 	unsigned char boot_id:4;		/* Byte 44 Bits 0-3 */
608 	unsigned char boot_ch:4;		/* Byte 44 Bits 4-7 */
609 	unsigned char force_scan_order:1;	/* Byte 45 Bit 0 */
610 	unsigned char:7;			/* Byte 45 Bits 1-7 */
611 	unsigned short nontagged_to_alt_ok;	/* Bytes 46-47 */
612 	unsigned short reneg_sync_on_check;	/* Bytes 48-49 */
613 	unsigned char rsvd[10];			/* Bytes 50-59 */
614 	unsigned char manuf_diag[2];		/* Bytes 60-61 */
615 	unsigned short cksum;			/* Bytes 62-63 */
616 } PACKED;
617 
618 /*
619   Define the Host Adapter Local RAM Auto SCSI Byte 45 structure.
620 */
621 
622 struct blogic_autoscsi_byte45 {
623 	unsigned char force_scan_order:1;	/* Bit 0 */
624 	unsigned char:7;	/* Bits 1-7 */
625 };
626 
627 /*
628   Define the Host Adapter Local RAM BIOS Drive Map Byte structure.
629 */
630 
631 #define BLOGIC_BIOS_DRVMAP		17
632 
633 struct blogic_bios_drvmap {
634 	unsigned char tgt_idbit3:1;			/* Bit 0 */
635 	unsigned char:2;				/* Bits 1-2 */
636 	enum blogic_bios_diskgeometry diskgeom:2;	/* Bits 3-4 */
637 	unsigned char tgt_id:3;				/* Bits 5-7 */
638 };
639 
640 /*
641   Define the Set CCB Format request type.  Extended LUN Format CCBs are
642   necessary to support more than 8 Logical Units per Target Device.
643 */
644 
645 enum blogic_setccb_fmt {
646 	BLOGIC_LEGACY_LUN_CCB = 0,
647 	BLOGIC_EXT_LUN_CCB = 1
648 } PACKED;
649 
650 /*
651   Define the Outgoing Mailbox Action Codes.
652 */
653 
654 enum blogic_action {
655 	BLOGIC_OUTBOX_FREE = 0x00,
656 	BLOGIC_MBOX_START = 0x01,
657 	BLOGIC_MBOX_ABORT = 0x02
658 } PACKED;
659 
660 
661 /*
662   Define the Incoming Mailbox Completion Codes.  The MultiMaster Firmware
663   only uses codes 0 - 4.  The FlashPoint SCCB Manager has no mailboxes, so
664   completion codes are stored in the CCB; it only uses codes 1, 2, 4, and 5.
665 */
666 
667 enum blogic_cmplt_code {
668 	BLOGIC_INBOX_FREE = 0x00,
669 	BLOGIC_CMD_COMPLETE_GOOD = 0x01,
670 	BLOGIC_CMD_ABORT_BY_HOST = 0x02,
671 	BLOGIC_CMD_NOTFOUND = 0x03,
672 	BLOGIC_CMD_COMPLETE_ERROR = 0x04,
673 	BLOGIC_INVALID_CCB = 0x05
674 } PACKED;
675 
676 /*
677   Define the Command Control Block (CCB) Opcodes.
678 */
679 
680 enum blogic_ccb_opcode {
681 	BLOGIC_INITIATOR_CCB = 0x00,
682 	BLOGIC_TGT_CCB = 0x01,
683 	BLOGIC_INITIATOR_CCB_SG = 0x02,
684 	BLOGIC_INITIATOR_CCBB_RESIDUAL = 0x03,
685 	BLOGIC_INITIATOR_CCB_SG_RESIDUAL = 0x04,
686 	BLOGIC_BDR = 0x81
687 } PACKED;
688 
689 
690 /*
691   Define the CCB Data Direction Codes.
692 */
693 
694 enum blogic_datadir {
695 	BLOGIC_UNCHECKED_TX = 0,
696 	BLOGIC_DATAIN_CHECKED = 1,
697 	BLOGIC_DATAOUT_CHECKED = 2,
698 	BLOGIC_NOTX = 3
699 };
700 
701 
702 /*
703   Define the Host Adapter Status Codes.  The MultiMaster Firmware does not
704   return status code 0x0C; it uses 0x12 for both overruns and underruns.
705 */
706 
707 enum blogic_adapter_status {
708 	BLOGIC_CMD_CMPLT_NORMAL = 0x00,
709 	BLOGIC_LINK_CMD_CMPLT = 0x0A,
710 	BLOGIC_LINK_CMD_CMPLT_FLAG = 0x0B,
711 	BLOGIC_DATA_UNDERRUN = 0x0C,
712 	BLOGIC_SELECT_TIMEOUT = 0x11,
713 	BLOGIC_DATA_OVERRUN = 0x12,
714 	BLOGIC_NOEXPECT_BUSFREE = 0x13,
715 	BLOGIC_INVALID_BUSPHASE = 0x14,
716 	BLOGIC_INVALID_OUTBOX_CODE = 0x15,
717 	BLOGIC_INVALID_CMD_CODE = 0x16,
718 	BLOGIC_LINKCCB_BADLUN = 0x17,
719 	BLOGIC_BAD_CMD_PARAM = 0x1A,
720 	BLOGIC_AUTOREQSENSE_FAIL = 0x1B,
721 	BLOGIC_TAGQUEUE_REJECT = 0x1C,
722 	BLOGIC_BAD_MSG_RCVD = 0x1D,
723 	BLOGIC_HW_FAIL = 0x20,
724 	BLOGIC_NORESPONSE_TO_ATN = 0x21,
725 	BLOGIC_HW_RESET = 0x22,
726 	BLOGIC_RST_FROM_OTHERDEV = 0x23,
727 	BLOGIC_BAD_RECONNECT = 0x24,
728 	BLOGIC_HW_BDR = 0x25,
729 	BLOGIC_ABRT_QUEUE = 0x26,
730 	BLOGIC_ADAPTER_SW_ERROR = 0x27,
731 	BLOGIC_HW_TIMEOUT = 0x30,
732 	BLOGIC_PARITY_ERR = 0x34
733 } PACKED;
734 
735 
736 /*
737   Define the SCSI Target Device Status Codes.
738 */
739 
740 enum blogic_tgt_status {
741 	BLOGIC_OP_GOOD = 0x00,
742 	BLOGIC_CHECKCONDITION = 0x02,
743 	BLOGIC_DEVBUSY = 0x08
744 } PACKED;
745 
746 /*
747   Define the Queue Tag Codes.
748 */
749 
750 enum blogic_queuetag {
751 	BLOGIC_SIMPLETAG = 0,
752 	BLOGIC_HEADTAG = 1,
753 	BLOGIC_ORDEREDTAG = 2,
754 	BLOGIC_RSVDTAG = 3
755 };
756 
757 /*
758   Define the SCSI Command Descriptor Block (CDB).
759 */
760 
761 #define BLOGIC_CDB_MAXLEN			12
762 
763 
764 /*
765   Define the Scatter/Gather Segment structure required by the MultiMaster
766   Firmware Interface and the FlashPoint SCCB Manager.
767 */
768 
769 struct blogic_sg_seg {
770 	u32 segbytes;	/* Bytes 0-3 */
771 	u32 segdata;	/* Bytes 4-7 */
772 };
773 
774 /*
775   Define the Driver CCB Status Codes.
776 */
777 
778 enum blogic_ccb_status {
779 	BLOGIC_CCB_FREE = 0,
780 	BLOGIC_CCB_ACTIVE = 1,
781 	BLOGIC_CCB_COMPLETE = 2,
782 	BLOGIC_CCB_RESET = 3
783 } PACKED;
784 
785 
786 /*
787   Define the 32 Bit Mode Command Control Block (CCB) structure.  The first 40
788   bytes are defined by and common to both the MultiMaster Firmware and the
789   FlashPoint SCCB Manager.  The next 60 bytes are defined by the FlashPoint
790   SCCB Manager.  The remaining components are defined by the Linux BusLogic
791   Driver.  Extended LUN Format CCBs differ from Legacy LUN Format 32 Bit Mode
792   CCBs only in having the TagEnable and QueueTag fields moved from byte 17 to
793   byte 1, and the Logical Unit field in byte 17 expanded to 6 bits.  In theory,
794   Extended LUN Format CCBs can support up to 64 Logical Units, but in practice
795   many devices will respond improperly to Logical Units between 32 and 63, and
796   the SCSI-2 specification defines Bit 5 as LUNTAR.  Extended LUN Format CCBs
797   are used by recent versions of the MultiMaster Firmware, as well as by the
798   FlashPoint SCCB Manager; the FlashPoint SCCB Manager only supports 32 Logical
799   Units.  Since 64 Logical Units are unlikely to be needed in practice, and
800   since they are problematic for the above reasons, and since limiting them to
801   5 bits simplifies the CCB structure definition, this driver only supports
802   32 Logical Units per Target Device.
803 */
804 
805 struct blogic_ccb {
806 	/*
807 	   MultiMaster Firmware and FlashPoint SCCB Manager Common Portion.
808 	 */
809 	enum blogic_ccb_opcode opcode;			/* Byte 0 */
810 	unsigned char:3;				/* Byte 1 Bits 0-2 */
811 	enum blogic_datadir datadir:2;			/* Byte 1 Bits 3-4 */
812 	bool tag_enable:1;				/* Byte 1 Bit 5 */
813 	enum blogic_queuetag queuetag:2;		/* Byte 1 Bits 6-7 */
814 	unsigned char cdblen;				/* Byte 2 */
815 	unsigned char sense_datalen;			/* Byte 3 */
816 	u32 datalen;					/* Bytes 4-7 */
817 	void *data;					/* Bytes 8-11 */
818 	unsigned char:8;				/* Byte 12 */
819 	unsigned char:8;				/* Byte 13 */
820 	enum blogic_adapter_status adapter_status;	/* Byte 14 */
821 	enum blogic_tgt_status tgt_status;		/* Byte 15 */
822 	unsigned char tgt_id;				/* Byte 16 */
823 	unsigned char lun:5;				/* Byte 17 Bits 0-4 */
824 	bool legacytag_enable:1;			/* Byte 17 Bit 5 */
825 	enum blogic_queuetag legacy_tag:2;		/* Byte 17 Bits 6-7 */
826 	unsigned char cdb[BLOGIC_CDB_MAXLEN];		/* Bytes 18-29 */
827 	unsigned char:8;				/* Byte 30 */
828 	unsigned char:8;				/* Byte 31 */
829 	u32 rsvd_int;					/* Bytes 32-35 */
830 	u32 sensedata;					/* Bytes 36-39 */
831 	/*
832 	   FlashPoint SCCB Manager Defined Portion.
833 	 */
834 	void (*callback) (struct blogic_ccb *);		/* Bytes 40-43 */
835 	u32 base_addr;					/* Bytes 44-47 */
836 	enum blogic_cmplt_code comp_code;		/* Byte 48 */
837 #ifdef CONFIG_SCSI_FLASHPOINT
838 	unsigned char:8;				/* Byte 49 */
839 	u16 os_flags;					/* Bytes 50-51 */
840 	unsigned char private[24];			/* Bytes 52-99 */
841 	void *rsvd1;
842 	void *rsvd2;
843 	unsigned char private2[16];
844 #endif
845 	/*
846 	   BusLogic Linux Driver Defined Portion.
847 	 */
848 	dma_addr_t allocgrp_head;
849 	unsigned int allocgrp_size;
850 	u32 dma_handle;
851 	enum blogic_ccb_status status;
852 	unsigned long serial;
853 	struct scsi_cmnd *command;
854 	struct blogic_adapter *adapter;
855 	struct blogic_ccb *next;
856 	struct blogic_ccb *next_all;
857 	struct blogic_sg_seg sglist[BLOGIC_SG_LIMIT];
858 };
859 
860 /*
861   Define the 32 Bit Mode Outgoing Mailbox structure.
862 */
863 
864 struct blogic_outbox {
865 	u32 ccb;			/* Bytes 0-3 */
866 	u32:24;				/* Bytes 4-6 */
867 	enum blogic_action action;	/* Byte 7 */
868 };
869 
870 /*
871   Define the 32 Bit Mode Incoming Mailbox structure.
872 */
873 
874 struct blogic_inbox {
875 	u32 ccb;					/* Bytes 0-3 */
876 	enum blogic_adapter_status adapter_status;	/* Byte 4 */
877 	enum blogic_tgt_status tgt_status;		/* Byte 5 */
878 	unsigned char:8;				/* Byte 6 */
879 	enum blogic_cmplt_code comp_code;		/* Byte 7 */
880 };
881 
882 
883 /*
884   Define the BusLogic Driver Options structure.
885 */
886 
887 struct blogic_drvr_options {
888 	unsigned short tagq_ok;
889 	unsigned short tagq_ok_mask;
890 	unsigned short bus_settle_time;
891 	unsigned short stop_tgt_inquiry;
892 	unsigned char common_qdepth;
893 	unsigned char qdepth[BLOGIC_MAXDEV];
894 };
895 
896 /*
897   Define the Host Adapter Target Flags structure.
898 */
899 
900 struct blogic_tgt_flags {
901 	bool tgt_exists:1;
902 	bool tagq_ok:1;
903 	bool wide_ok:1;
904 	bool tagq_active:1;
905 	bool wide_active:1;
906 	bool cmd_good:1;
907 	bool tgt_info_in:1;
908 };
909 
910 /*
911   Define the Host Adapter Target Statistics structure.
912 */
913 
914 #define BLOGIC_SZ_BUCKETS			10
915 
916 struct blogic_tgt_stats {
917 	unsigned int cmds_tried;
918 	unsigned int cmds_complete;
919 	unsigned int read_cmds;
920 	unsigned int write_cmds;
921 	struct blogic_byte_count bytesread;
922 	struct blogic_byte_count byteswritten;
923 	unsigned int read_sz_buckets[BLOGIC_SZ_BUCKETS];
924 	unsigned int write_sz_buckets[BLOGIC_SZ_BUCKETS];
925 	unsigned short aborts_request;
926 	unsigned short aborts_tried;
927 	unsigned short aborts_done;
928 	unsigned short bdr_request;
929 	unsigned short bdr_tried;
930 	unsigned short bdr_done;
931 	unsigned short adapter_reset_req;
932 	unsigned short adapter_reset_attempt;
933 	unsigned short adapter_reset_done;
934 };
935 
936 /*
937   Define the FlashPoint Card Handle data type.
938 */
939 
940 #define FPOINT_BADCARD_HANDLE		0xFFFFFFFFL
941 
942 
943 /*
944   Define the FlashPoint Information structure.  This structure is defined
945   by the FlashPoint SCCB Manager.
946 */
947 
948 struct fpoint_info {
949 	u32 base_addr;				/* Bytes 0-3 */
950 	bool present;				/* Byte 4 */
951 	unsigned char irq_ch;			/* Byte 5 */
952 	unsigned char scsi_id;			/* Byte 6 */
953 	unsigned char scsi_lun;			/* Byte 7 */
954 	u16 fw_rev;				/* Bytes 8-9 */
955 	u16 sync_ok;				/* Bytes 10-11 */
956 	u16 fast_ok;				/* Bytes 12-13 */
957 	u16 ultra_ok;				/* Bytes 14-15 */
958 	u16 discon_ok;				/* Bytes 16-17 */
959 	u16 wide_ok;				/* Bytes 18-19 */
960 	bool parity:1;				/* Byte 20 Bit 0 */
961 	bool wide:1;				/* Byte 20 Bit 1 */
962 	bool softreset:1;			/* Byte 20 Bit 2 */
963 	bool ext_trans_enable:1;		/* Byte 20 Bit 3 */
964 	bool low_term:1;			/* Byte 20 Bit 4 */
965 	bool high_term:1;			/* Byte 20 Bit 5 */
966 	bool report_underrun:1;			/* Byte 20 Bit 6 */
967 	bool scam_enabled:1;			/* Byte 20 Bit 7 */
968 	bool scam_lev2:1;			/* Byte 21 Bit 0 */
969 	unsigned char:7;			/* Byte 21 Bits 1-7 */
970 	unsigned char family;			/* Byte 22 */
971 	unsigned char bus_type;			/* Byte 23 */
972 	unsigned char model[3];			/* Bytes 24-26 */
973 	unsigned char relative_cardnum;		/* Byte 27 */
974 	unsigned char rsvd[4];			/* Bytes 28-31 */
975 	u32 os_rsvd;				/* Bytes 32-35 */
976 	unsigned char translation_info[4];	/* Bytes 36-39 */
977 	u32 rsvd2[5];				/* Bytes 40-59 */
978 	u32 sec_range;				/* Bytes 60-63 */
979 };
980 
981 /*
982   Define the BusLogic Driver Host Adapter structure.
983 */
984 
985 struct blogic_adapter {
986 	struct Scsi_Host *scsi_host;
987 	struct pci_dev *pci_device;
988 	enum blogic_adapter_type adapter_type;
989 	enum blogic_adapter_bus_type adapter_bus_type;
990 	unsigned long io_addr;
991 	unsigned long pci_addr;
992 	unsigned short addr_count;
993 	unsigned char host_no;
994 	unsigned char model[9];
995 	unsigned char fw_ver[6];
996 	unsigned char full_model[18];
997 	unsigned char bus;
998 	unsigned char dev;
999 	unsigned char irq_ch;
1000 	unsigned char dma_ch;
1001 	unsigned char scsi_id;
1002 	bool irq_acquired:1;
1003 	bool dma_chan_acquired:1;
1004 	bool ext_trans_enable:1;
1005 	bool parity:1;
1006 	bool reset_enabled:1;
1007 	bool level_int:1;
1008 	bool wide:1;
1009 	bool differential:1;
1010 	bool scam:1;
1011 	bool ultra:1;
1012 	bool ext_lun:1;
1013 	bool terminfo_valid:1;
1014 	bool low_term:1;
1015 	bool high_term:1;
1016 	bool need_bouncebuf:1;
1017 	bool strict_rr:1;
1018 	bool scam_enabled:1;
1019 	bool scam_lev2:1;
1020 	bool adapter_initd:1;
1021 	bool adapter_extreset:1;
1022 	bool adapter_intern_err:1;
1023 	bool processing_ccbs;
1024 	volatile bool adapter_cmd_complete;
1025 	unsigned short adapter_sglimit;
1026 	unsigned short drvr_sglimit;
1027 	unsigned short maxdev;
1028 	unsigned short maxlun;
1029 	unsigned short mbox_count;
1030 	unsigned short initccbs;
1031 	unsigned short inc_ccbs;
1032 	unsigned short alloc_ccbs;
1033 	unsigned short drvr_qdepth;
1034 	unsigned short adapter_qdepth;
1035 	unsigned short untag_qdepth;
1036 	unsigned short common_qdepth;
1037 	unsigned short bus_settle_time;
1038 	unsigned short sync_ok;
1039 	unsigned short fast_ok;
1040 	unsigned short ultra_ok;
1041 	unsigned short wide_ok;
1042 	unsigned short discon_ok;
1043 	unsigned short tagq_ok;
1044 	unsigned short ext_resets;
1045 	unsigned short adapter_intern_errors;
1046 	unsigned short tgt_count;
1047 	unsigned short msgbuflen;
1048 	u32 bios_addr;
1049 	struct blogic_drvr_options *drvr_opts;
1050 	struct fpoint_info fpinfo;
1051 	void *cardhandle;
1052 	struct list_head host_list;
1053 	struct blogic_ccb *all_ccbs;
1054 	struct blogic_ccb *free_ccbs;
1055 	struct blogic_ccb *firstccb;
1056 	struct blogic_ccb *lastccb;
1057 	struct blogic_ccb *bdr_pend[BLOGIC_MAXDEV];
1058 	struct blogic_tgt_flags tgt_flags[BLOGIC_MAXDEV];
1059 	unsigned char qdepth[BLOGIC_MAXDEV];
1060 	unsigned char sync_period[BLOGIC_MAXDEV];
1061 	unsigned char sync_offset[BLOGIC_MAXDEV];
1062 	unsigned char active_cmds[BLOGIC_MAXDEV];
1063 	unsigned int cmds_since_rst[BLOGIC_MAXDEV];
1064 	unsigned long last_seqpoint[BLOGIC_MAXDEV];
1065 	unsigned long last_resettried[BLOGIC_MAXDEV];
1066 	unsigned long last_resetdone[BLOGIC_MAXDEV];
1067 	struct blogic_outbox *first_outbox;
1068 	struct blogic_outbox *last_outbox;
1069 	struct blogic_outbox *next_outbox;
1070 	struct blogic_inbox *first_inbox;
1071 	struct blogic_inbox *last_inbox;
1072 	struct blogic_inbox *next_inbox;
1073 	struct blogic_tgt_stats tgt_stats[BLOGIC_MAXDEV];
1074 	unsigned char *mbox_space;
1075 	dma_addr_t mbox_space_handle;
1076 	unsigned int mbox_sz;
1077 	unsigned long ccb_offset;
1078 	char msgbuf[BLOGIC_MSGBUF_SIZE];
1079 };
1080 
1081 /*
1082   Define a structure for the BIOS Disk Parameters.
1083 */
1084 
1085 struct bios_diskparam {
1086 	int heads;
1087 	int sectors;
1088 	int cylinders;
1089 };
1090 
1091 /*
1092   Define a structure for the SCSI Inquiry command results.
1093 */
1094 
1095 struct scsi_inquiry {
1096 	unsigned char devtype:5;	/* Byte 0 Bits 0-4 */
1097 	unsigned char dev_qual:3;	/* Byte 0 Bits 5-7 */
1098 	unsigned char dev_modifier:7;	/* Byte 1 Bits 0-6 */
1099 	bool rmb:1;			/* Byte 1 Bit 7 */
1100 	unsigned char ansi_ver:3;	/* Byte 2 Bits 0-2 */
1101 	unsigned char ecma_ver:3;	/* Byte 2 Bits 3-5 */
1102 	unsigned char iso_ver:2;	/* Byte 2 Bits 6-7 */
1103 	unsigned char resp_fmt:4;	/* Byte 3 Bits 0-3 */
1104 	unsigned char:2;		/* Byte 3 Bits 4-5 */
1105 	bool TrmIOP:1;			/* Byte 3 Bit 6 */
1106 	bool AENC:1;			/* Byte 3 Bit 7 */
1107 	unsigned char addl_len;		/* Byte 4 */
1108 	unsigned char:8;		/* Byte 5 */
1109 	unsigned char:8;		/* Byte 6 */
1110 	bool SftRe:1;			/* Byte 7 Bit 0 */
1111 	bool CmdQue:1;			/* Byte 7 Bit 1 */
1112 	bool:1;				/* Byte 7 Bit 2 */
1113 	bool linked:1;			/* Byte 7 Bit 3 */
1114 	bool sync:1;			/* Byte 7 Bit 4 */
1115 	bool WBus16:1;			/* Byte 7 Bit 5 */
1116 	bool WBus32:1;			/* Byte 7 Bit 6 */
1117 	bool RelAdr:1;			/* Byte 7 Bit 7 */
1118 	unsigned char vendor[8];	/* Bytes 8-15 */
1119 	unsigned char product[16];	/* Bytes 16-31 */
1120 	unsigned char product_rev[4];	/* Bytes 32-35 */
1121 };
1122 
1123 
1124 /*
1125   Define functions to provide an abstraction for reading and writing the
1126   Host Adapter I/O Registers.
1127 */
1128 
blogic_busreset(struct blogic_adapter * adapter)1129 static inline void blogic_busreset(struct blogic_adapter *adapter)
1130 {
1131 	union blogic_cntrl_reg cr;
1132 	cr.all = 0;
1133 	cr.cr.bus_reset = true;
1134 	outb(cr.all, adapter->io_addr + BLOGIC_CNTRL_REG);
1135 }
1136 
blogic_intreset(struct blogic_adapter * adapter)1137 static inline void blogic_intreset(struct blogic_adapter *adapter)
1138 {
1139 	union blogic_cntrl_reg cr;
1140 	cr.all = 0;
1141 	cr.cr.int_reset = true;
1142 	outb(cr.all, adapter->io_addr + BLOGIC_CNTRL_REG);
1143 }
1144 
blogic_softreset(struct blogic_adapter * adapter)1145 static inline void blogic_softreset(struct blogic_adapter *adapter)
1146 {
1147 	union blogic_cntrl_reg cr;
1148 	cr.all = 0;
1149 	cr.cr.soft_reset = true;
1150 	outb(cr.all, adapter->io_addr + BLOGIC_CNTRL_REG);
1151 }
1152 
blogic_hardreset(struct blogic_adapter * adapter)1153 static inline void blogic_hardreset(struct blogic_adapter *adapter)
1154 {
1155 	union blogic_cntrl_reg cr;
1156 	cr.all = 0;
1157 	cr.cr.hard_reset = true;
1158 	outb(cr.all, adapter->io_addr + BLOGIC_CNTRL_REG);
1159 }
1160 
blogic_rdstatus(struct blogic_adapter * adapter)1161 static inline unsigned char blogic_rdstatus(struct blogic_adapter *adapter)
1162 {
1163 	return inb(adapter->io_addr + BLOGIC_STATUS_REG);
1164 }
1165 
blogic_setcmdparam(struct blogic_adapter * adapter,unsigned char value)1166 static inline void blogic_setcmdparam(struct blogic_adapter *adapter,
1167 					unsigned char value)
1168 {
1169 	outb(value, adapter->io_addr + BLOGIC_CMD_PARM_REG);
1170 }
1171 
blogic_rddatain(struct blogic_adapter * adapter)1172 static inline unsigned char blogic_rddatain(struct blogic_adapter *adapter)
1173 {
1174 	return inb(adapter->io_addr + BLOGIC_DATAIN_REG);
1175 }
1176 
blogic_rdint(struct blogic_adapter * adapter)1177 static inline unsigned char blogic_rdint(struct blogic_adapter *adapter)
1178 {
1179 	return inb(adapter->io_addr + BLOGIC_INT_REG);
1180 }
1181 
blogic_rdgeom(struct blogic_adapter * adapter)1182 static inline unsigned char blogic_rdgeom(struct blogic_adapter *adapter)
1183 {
1184 	return inb(adapter->io_addr + BLOGIC_GEOMETRY_REG);
1185 }
1186 
1187 /*
1188   blogic_execmbox issues an Execute Mailbox Command, which
1189   notifies the Host Adapter that an entry has been made in an Outgoing
1190   Mailbox.
1191 */
1192 
blogic_execmbox(struct blogic_adapter * adapter)1193 static inline void blogic_execmbox(struct blogic_adapter *adapter)
1194 {
1195 	blogic_setcmdparam(adapter, BLOGIC_EXEC_MBOX_CMD);
1196 }
1197 
1198 /*
1199   blogic_delay waits for Seconds to elapse.
1200 */
1201 
blogic_delay(int seconds)1202 static inline void blogic_delay(int seconds)
1203 {
1204 	mdelay(1000 * seconds);
1205 }
1206 
1207 /*
1208   virt_to_32bit_virt maps between Kernel Virtual Addresses and
1209   32 bit Kernel Virtual Addresses.  This avoids compilation warnings
1210   on 64 bit architectures.
1211 */
1212 
virt_to_32bit_virt(void * virt_addr)1213 static inline u32 virt_to_32bit_virt(void *virt_addr)
1214 {
1215 	return (u32) (unsigned long) virt_addr;
1216 }
1217 
1218 /*
1219   blogic_inc_count increments counter by 1, stopping at
1220   65535 rather than wrapping around to 0.
1221 */
1222 
blogic_inc_count(unsigned short * count)1223 static inline void blogic_inc_count(unsigned short *count)
1224 {
1225 	if (*count < 65535)
1226 		(*count)++;
1227 }
1228 
1229 /*
1230   blogic_addcount increments Byte Counter by Amount.
1231 */
1232 
blogic_addcount(struct blogic_byte_count * bytecount,unsigned int amount)1233 static inline void blogic_addcount(struct blogic_byte_count *bytecount,
1234 					unsigned int amount)
1235 {
1236 	bytecount->units += amount;
1237 	if (bytecount->units > 999999999) {
1238 		bytecount->units -= 1000000000;
1239 		bytecount->billions++;
1240 	}
1241 }
1242 
1243 /*
1244   blogic_incszbucket increments the Bucket for Amount.
1245 */
1246 
blogic_incszbucket(unsigned int * cmdsz_buckets,unsigned int amount)1247 static inline void blogic_incszbucket(unsigned int *cmdsz_buckets,
1248 					unsigned int amount)
1249 {
1250 	int index = 0;
1251 	if (amount < 8 * 1024) {
1252 		if (amount < 2 * 1024)
1253 			index = (amount < 1 * 1024 ? 0 : 1);
1254 		else
1255 			index = (amount < 4 * 1024 ? 2 : 3);
1256 	} else if (amount < 128 * 1024) {
1257 		if (amount < 32 * 1024)
1258 			index = (amount < 16 * 1024 ? 4 : 5);
1259 		else
1260 			index = (amount < 64 * 1024 ? 6 : 7);
1261 	} else
1262 		index = (amount < 256 * 1024 ? 8 : 9);
1263 	cmdsz_buckets[index]++;
1264 }
1265 
1266 /*
1267   Define the version number of the FlashPoint Firmware (SCCB Manager).
1268 */
1269 
1270 #define FLASHPOINT_FW_VER		"5.02"
1271 
1272 /*
1273   Define the possible return values from FlashPoint_HandleInterrupt.
1274 */
1275 
1276 #define FPOINT_NORMAL_INT		0x00
1277 #define FPOINT_INTERN_ERR		0xFE
1278 #define FPOINT_EXT_RESET		0xFF
1279 
1280 /*
1281   Define prototypes for the forward referenced BusLogic Driver
1282   Internal Functions.
1283 */
1284 
1285 static const char *blogic_drvr_info(struct Scsi_Host *);
1286 static int blogic_qcmd(struct Scsi_Host *h, struct scsi_cmnd *);
1287 static int blogic_diskparam(struct scsi_device *, struct block_device *, sector_t, int *);
1288 static int blogic_slaveconfig(struct scsi_device *);
1289 static void blogic_qcompleted_ccb(struct blogic_ccb *);
1290 static irqreturn_t blogic_inthandler(int, void *);
1291 static int blogic_resetadapter(struct blogic_adapter *, bool hard_reset);
1292 static void blogic_msg(enum blogic_msglevel, char *, struct blogic_adapter *, ...);
1293 static int __init blogic_setup(char *);
1294 
1295 #endif				/* _BUSLOGIC_H */
1296