Merge existing fixes from spi/for-5.14
[platform/kernel/linux-starfive.git] / drivers / scsi / BusLogic.h
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 */