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