xref: /openbmc/linux/drivers/scsi/BusLogic.h (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
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  
blogic_busreset(struct blogic_adapter * adapter)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  
blogic_intreset(struct blogic_adapter * adapter)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  
blogic_softreset(struct blogic_adapter * adapter)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  
blogic_hardreset(struct blogic_adapter * adapter)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  
blogic_rdstatus(struct blogic_adapter * adapter)1150  static inline unsigned char blogic_rdstatus(struct blogic_adapter *adapter)
1151  {
1152  	return inb(adapter->io_addr + BLOGIC_STATUS_REG);
1153  }
1154  
blogic_setcmdparam(struct blogic_adapter * adapter,unsigned char value)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  
blogic_rddatain(struct blogic_adapter * adapter)1161  static inline unsigned char blogic_rddatain(struct blogic_adapter *adapter)
1162  {
1163  	return inb(adapter->io_addr + BLOGIC_DATAIN_REG);
1164  }
1165  
blogic_rdint(struct blogic_adapter * adapter)1166  static inline unsigned char blogic_rdint(struct blogic_adapter *adapter)
1167  {
1168  	return inb(adapter->io_addr + BLOGIC_INT_REG);
1169  }
1170  
blogic_rdgeom(struct blogic_adapter * adapter)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  
blogic_execmbox(struct blogic_adapter * adapter)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  
blogic_delay(int seconds)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  
virt_to_32bit_virt(void * virt_addr)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  
blogic_inc_count(unsigned short * count)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  
blogic_addcount(struct blogic_byte_count * bytecount,unsigned int amount)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  
blogic_incszbucket(unsigned int * cmdsz_buckets,unsigned int amount)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