]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/scsi/BusLogic.c
Merge remote-tracking branch 'input/next'
[karo-tx-linux.git] / drivers / scsi / BusLogic.c
1
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   This program is free software; you may redistribute and/or modify it under
9   the terms of the GNU General Public License Version 2 as published by the
10   Free Software Foundation.
11
12   This program is distributed in the hope that it will be useful, but
13   WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
14   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15   for complete details.
16
17   The author respectfully requests that any modifications to this software be
18   sent directly to him for evaluation and testing.
19
20   Special thanks to Wayne Yen, Jin-Lon Hon, and Alex Win of BusLogic, whose
21   advice has been invaluable, to David Gentzel, for writing the original Linux
22   BusLogic driver, and to Paul Gortmaker, for being such a dedicated test site.
23
24   Finally, special thanks to Mylex/BusLogic for making the FlashPoint SCCB
25   Manager available as freely redistributable source code.
26
27 */
28
29 #define blogic_drvr_version             "2.1.16"
30 #define blogic_drvr_date                "18 July 2002"
31
32 #include <linux/module.h>
33 #include <linux/init.h>
34 #include <linux/interrupt.h>
35 #include <linux/types.h>
36 #include <linux/blkdev.h>
37 #include <linux/delay.h>
38 #include <linux/ioport.h>
39 #include <linux/mm.h>
40 #include <linux/stat.h>
41 #include <linux/pci.h>
42 #include <linux/spinlock.h>
43 #include <linux/jiffies.h>
44 #include <linux/dma-mapping.h>
45 #include <linux/slab.h>
46 #include <scsi/scsicam.h>
47
48 #include <asm/dma.h>
49 #include <asm/io.h>
50
51 #include <scsi/scsi.h>
52 #include <scsi/scsi_cmnd.h>
53 #include <scsi/scsi_device.h>
54 #include <scsi/scsi_host.h>
55 #include <scsi/scsi_tcq.h>
56 #include "BusLogic.h"
57 #include "FlashPoint.c"
58
59 #ifndef FAILURE
60 #define FAILURE (-1)
61 #endif
62
63 static struct scsi_host_template blogic_template;
64
65 /*
66   blogic_drvr_options_count is a count of the number of BusLogic Driver
67   Options specifications provided via the Linux Kernel Command Line or via
68   the Loadable Kernel Module Installation Facility.
69 */
70
71 static int blogic_drvr_options_count;
72
73
74 /*
75   blogic_drvr_options is an array of Driver Options structures representing
76   BusLogic Driver Options specifications provided via the Linux Kernel Command
77   Line or via the Loadable Kernel Module Installation Facility.
78 */
79
80 static struct blogic_drvr_options blogic_drvr_options[BLOGIC_MAX_ADAPTERS];
81
82
83 /*
84   BusLogic can be assigned a string by insmod.
85 */
86
87 MODULE_LICENSE("GPL");
88 #ifdef MODULE
89 static char *BusLogic;
90 module_param(BusLogic, charp, 0);
91 #endif
92
93
94 /*
95   blogic_probe_options is a set of Probe Options to be applied across
96   all BusLogic Host Adapters.
97 */
98
99 static struct blogic_probe_options blogic_probe_options;
100
101
102 /*
103   blogic_global_options is a set of Global Options to be applied across
104   all BusLogic Host Adapters.
105 */
106
107 static struct blogic_global_options blogic_global_options;
108
109 static LIST_HEAD(blogic_host_list);
110
111 /*
112   blogic_probeinfo_count is the number of entries in blogic_probeinfo_list.
113 */
114
115 static int blogic_probeinfo_count;
116
117
118 /*
119   blogic_probeinfo_list is the list of I/O Addresses and Bus Probe Information
120   to be checked for potential BusLogic Host Adapters.  It is initialized by
121   interrogating the PCI Configuration Space on PCI machines as well as from the
122   list of standard BusLogic I/O Addresses.
123 */
124
125 static struct blogic_probeinfo *blogic_probeinfo_list;
126
127
128 /*
129   blogic_cmd_failure_reason holds a string identifying the reason why a
130   call to blogic_cmd failed.  It is only non-NULL when blogic_cmd
131   returns a failure code.
132 */
133
134 static char *blogic_cmd_failure_reason;
135
136 /*
137   blogic_announce_drvr announces the Driver Version and Date, Author's
138   Name, Copyright Notice, and Electronic Mail Address.
139 */
140
141 static void blogic_announce_drvr(struct blogic_adapter *adapter)
142 {
143         blogic_announce("***** BusLogic SCSI Driver Version " blogic_drvr_version " of " blogic_drvr_date " *****\n", adapter);
144         blogic_announce("Copyright 1995-1998 by Leonard N. Zubkoff " "<lnz@dandelion.com>\n", adapter);
145 }
146
147
148 /*
149   blogic_drvr_info returns the Host Adapter Name to identify this SCSI
150   Driver and Host Adapter.
151 */
152
153 static const char *blogic_drvr_info(struct Scsi_Host *host)
154 {
155         struct blogic_adapter *adapter =
156                                 (struct blogic_adapter *) host->hostdata;
157         return adapter->full_model;
158 }
159
160 /*
161   blogic_init_ccbs initializes a group of Command Control Blocks (CCBs)
162   for Host Adapter from the blk_size bytes located at blk_pointer.  The newly
163   created CCBs are added to Host Adapter's free list.
164 */
165
166 static void blogic_init_ccbs(struct blogic_adapter *adapter, void *blk_pointer,
167                                 int blk_size, dma_addr_t blkp)
168 {
169         struct blogic_ccb *ccb = (struct blogic_ccb *) blk_pointer;
170         unsigned int offset = 0;
171         memset(blk_pointer, 0, blk_size);
172         ccb->allocgrp_head = blkp;
173         ccb->allocgrp_size = blk_size;
174         while ((blk_size -= sizeof(struct blogic_ccb)) >= 0) {
175                 ccb->status = BLOGIC_CCB_FREE;
176                 ccb->adapter = adapter;
177                 ccb->dma_handle = (u32) blkp + offset;
178                 if (blogic_flashpoint_type(adapter)) {
179                         ccb->callback = blogic_qcompleted_ccb;
180                         ccb->base_addr = adapter->fpinfo.base_addr;
181                 }
182                 ccb->next = adapter->free_ccbs;
183                 ccb->next_all = adapter->all_ccbs;
184                 adapter->free_ccbs = ccb;
185                 adapter->all_ccbs = ccb;
186                 adapter->alloc_ccbs++;
187                 ccb++;
188                 offset += sizeof(struct blogic_ccb);
189         }
190 }
191
192
193 /*
194   blogic_create_initccbs allocates the initial CCBs for Host Adapter.
195 */
196
197 static bool __init blogic_create_initccbs(struct blogic_adapter *adapter)
198 {
199         int blk_size = BLOGIC_CCB_GRP_ALLOCSIZE * sizeof(struct blogic_ccb);
200         void *blk_pointer;
201         dma_addr_t blkp;
202
203         while (adapter->alloc_ccbs < adapter->initccbs) {
204                 blk_pointer = pci_alloc_consistent(adapter->pci_device,
205                                                         blk_size, &blkp);
206                 if (blk_pointer == NULL) {
207                         blogic_err("UNABLE TO ALLOCATE CCB GROUP - DETACHING\n",
208                                         adapter);
209                         return false;
210                 }
211                 blogic_init_ccbs(adapter, blk_pointer, blk_size, blkp);
212         }
213         return true;
214 }
215
216
217 /*
218   blogic_destroy_ccbs deallocates the CCBs for Host Adapter.
219 */
220
221 static void blogic_destroy_ccbs(struct blogic_adapter *adapter)
222 {
223         struct blogic_ccb *next_ccb = adapter->all_ccbs, *ccb, *lastccb = NULL;
224         adapter->all_ccbs = NULL;
225         adapter->free_ccbs = NULL;
226         while ((ccb = next_ccb) != NULL) {
227                 next_ccb = ccb->next_all;
228                 if (ccb->allocgrp_head) {
229                         if (lastccb)
230                                 pci_free_consistent(adapter->pci_device,
231                                                 lastccb->allocgrp_size, lastccb,
232                                                 lastccb->allocgrp_head);
233                         lastccb = ccb;
234                 }
235         }
236         if (lastccb)
237                 pci_free_consistent(adapter->pci_device, lastccb->allocgrp_size,
238                                         lastccb, lastccb->allocgrp_head);
239 }
240
241
242 /*
243   blogic_create_addlccbs allocates Additional CCBs for Host Adapter.  If
244   allocation fails and there are no remaining CCBs available, the Driver Queue
245   Depth is decreased to a known safe value to avoid potential deadlocks when
246   multiple host adapters share the same IRQ Channel.
247 */
248
249 static void blogic_create_addlccbs(struct blogic_adapter *adapter,
250                                         int addl_ccbs, bool print_success)
251 {
252         int blk_size = BLOGIC_CCB_GRP_ALLOCSIZE * sizeof(struct blogic_ccb);
253         int prev_alloc = adapter->alloc_ccbs;
254         void *blk_pointer;
255         dma_addr_t blkp;
256         if (addl_ccbs <= 0)
257                 return;
258         while (adapter->alloc_ccbs - prev_alloc < addl_ccbs) {
259                 blk_pointer = pci_alloc_consistent(adapter->pci_device,
260                                                         blk_size, &blkp);
261                 if (blk_pointer == NULL)
262                         break;
263                 blogic_init_ccbs(adapter, blk_pointer, blk_size, blkp);
264         }
265         if (adapter->alloc_ccbs > prev_alloc) {
266                 if (print_success)
267                         blogic_notice("Allocated %d additional CCBs (total now %d)\n", adapter, adapter->alloc_ccbs - prev_alloc, adapter->alloc_ccbs);
268                 return;
269         }
270         blogic_notice("Failed to allocate additional CCBs\n", adapter);
271         if (adapter->drvr_qdepth > adapter->alloc_ccbs - adapter->tgt_count) {
272                 adapter->drvr_qdepth = adapter->alloc_ccbs - adapter->tgt_count;
273                 adapter->scsi_host->can_queue = adapter->drvr_qdepth;
274         }
275 }
276
277 /*
278   blogic_alloc_ccb allocates a CCB from Host Adapter's free list,
279   allocating more memory from the Kernel if necessary.  The Host Adapter's
280   Lock should already have been acquired by the caller.
281 */
282
283 static struct blogic_ccb *blogic_alloc_ccb(struct blogic_adapter *adapter)
284 {
285         static unsigned long serial;
286         struct blogic_ccb *ccb;
287         ccb = adapter->free_ccbs;
288         if (ccb != NULL) {
289                 ccb->serial = ++serial;
290                 adapter->free_ccbs = ccb->next;
291                 ccb->next = NULL;
292                 if (adapter->free_ccbs == NULL)
293                         blogic_create_addlccbs(adapter, adapter->inc_ccbs,
294                                                 true);
295                 return ccb;
296         }
297         blogic_create_addlccbs(adapter, adapter->inc_ccbs, true);
298         ccb = adapter->free_ccbs;
299         if (ccb == NULL)
300                 return NULL;
301         ccb->serial = ++serial;
302         adapter->free_ccbs = ccb->next;
303         ccb->next = NULL;
304         return ccb;
305 }
306
307
308 /*
309   blogic_dealloc_ccb deallocates a CCB, returning it to the Host Adapter's
310   free list.  The Host Adapter's Lock should already have been acquired by the
311   caller.
312 */
313
314 static void blogic_dealloc_ccb(struct blogic_ccb *ccb)
315 {
316         struct blogic_adapter *adapter = ccb->adapter;
317
318         scsi_dma_unmap(ccb->command);
319         pci_unmap_single(adapter->pci_device, ccb->sensedata,
320                          ccb->sense_datalen, PCI_DMA_FROMDEVICE);
321
322         ccb->command = NULL;
323         ccb->status = BLOGIC_CCB_FREE;
324         ccb->next = adapter->free_ccbs;
325         adapter->free_ccbs = ccb;
326 }
327
328
329 /*
330   blogic_cmd sends the command opcode to adapter, optionally
331   providing paramlen bytes of param and receiving at most
332   replylen bytes of reply; any excess reply data is received but
333   discarded.
334
335   On success, this function returns the number of reply bytes read from
336   the Host Adapter (including any discarded data); on failure, it returns
337   -1 if the command was invalid, or -2 if a timeout occurred.
338
339   blogic_cmd is called exclusively during host adapter detection and
340   initialization, so performance and latency are not critical, and exclusive
341   access to the Host Adapter hardware is assumed.  Once the host adapter and
342   driver are initialized, the only Host Adapter command that is issued is the
343   single byte Execute Mailbox Command operation code, which does not require
344   waiting for the Host Adapter Ready bit to be set in the Status Register.
345 */
346
347 static int blogic_cmd(struct blogic_adapter *adapter, enum blogic_opcode opcode,
348                         void *param, int paramlen, void *reply, int replylen)
349 {
350         unsigned char *param_p = (unsigned char *) param;
351         unsigned char *reply_p = (unsigned char *) reply;
352         union blogic_stat_reg statusreg;
353         union blogic_int_reg intreg;
354         unsigned long processor_flag = 0;
355         int reply_b = 0, result;
356         long timeout;
357         /*
358            Clear out the Reply Data if provided.
359          */
360         if (replylen > 0)
361                 memset(reply, 0, replylen);
362         /*
363            If the IRQ Channel has not yet been acquired, then interrupts
364            must be disabled while issuing host adapter commands since a
365            Command Complete interrupt could occur if the IRQ Channel was
366            previously enabled by another BusLogic Host Adapter or another
367            driver sharing the same IRQ Channel.
368          */
369         if (!adapter->irq_acquired)
370                 local_irq_save(processor_flag);
371         /*
372            Wait for the Host Adapter Ready bit to be set and the
373            Command/Parameter Register Busy bit to be reset in the Status
374            Register.
375          */
376         timeout = 10000;
377         while (--timeout >= 0) {
378                 statusreg.all = blogic_rdstatus(adapter);
379                 if (statusreg.sr.adapter_ready && !statusreg.sr.cmd_param_busy)
380                         break;
381                 udelay(100);
382         }
383         if (timeout < 0) {
384                 blogic_cmd_failure_reason =
385                                 "Timeout waiting for Host Adapter Ready";
386                 result = -2;
387                 goto done;
388         }
389         /*
390            Write the opcode to the Command/Parameter Register.
391          */
392         adapter->adapter_cmd_complete = false;
393         blogic_setcmdparam(adapter, opcode);
394         /*
395            Write any additional Parameter Bytes.
396          */
397         timeout = 10000;
398         while (paramlen > 0 && --timeout >= 0) {
399                 /*
400                    Wait 100 microseconds to give the Host Adapter enough
401                    time to determine whether the last value written to the
402                    Command/Parameter Register was valid or not. If the
403                    Command Complete bit is set in the Interrupt Register,
404                    then the Command Invalid bit in the Status Register will
405                    be reset if the Operation Code or Parameter was valid
406                    and the command has completed, or set if the Operation
407                    Code or Parameter was invalid. If the Data In Register
408                    Ready bit is set in the Status Register, then the
409                    Operation Code was valid, and data is waiting to be read
410                    back from the Host Adapter. Otherwise, wait for the
411                    Command/Parameter Register Busy bit in the Status
412                    Register to be reset.
413                  */
414                 udelay(100);
415                 intreg.all = blogic_rdint(adapter);
416                 statusreg.all = blogic_rdstatus(adapter);
417                 if (intreg.ir.cmd_complete)
418                         break;
419                 if (adapter->adapter_cmd_complete)
420                         break;
421                 if (statusreg.sr.datain_ready)
422                         break;
423                 if (statusreg.sr.cmd_param_busy)
424                         continue;
425                 blogic_setcmdparam(adapter, *param_p++);
426                 paramlen--;
427         }
428         if (timeout < 0) {
429                 blogic_cmd_failure_reason =
430                                 "Timeout waiting for Parameter Acceptance";
431                 result = -2;
432                 goto done;
433         }
434         /*
435            The Modify I/O Address command does not cause a Command Complete
436            Interrupt.
437          */
438         if (opcode == BLOGIC_MOD_IOADDR) {
439                 statusreg.all = blogic_rdstatus(adapter);
440                 if (statusreg.sr.cmd_invalid) {
441                         blogic_cmd_failure_reason =
442                                         "Modify I/O Address Invalid";
443                         result = -1;
444                         goto done;
445                 }
446                 if (blogic_global_options.trace_config)
447                         blogic_notice("blogic_cmd(%02X) Status = %02X: " "(Modify I/O Address)\n", adapter, opcode, statusreg.all);
448                 result = 0;
449                 goto done;
450         }
451         /*
452            Select an appropriate timeout value for awaiting command completion.
453          */
454         switch (opcode) {
455         case BLOGIC_INQ_DEV0TO7:
456         case BLOGIC_INQ_DEV8TO15:
457         case BLOGIC_INQ_DEV:
458                 /* Approximately 60 seconds. */
459                 timeout = 60 * 10000;
460                 break;
461         default:
462                 /* Approximately 1 second. */
463                 timeout = 10000;
464                 break;
465         }
466         /*
467            Receive any Reply Bytes, waiting for either the Command
468            Complete bit to be set in the Interrupt Register, or for the
469            Interrupt Handler to set the Host Adapter Command Completed
470            bit in the Host Adapter structure.
471          */
472         while (--timeout >= 0) {
473                 intreg.all = blogic_rdint(adapter);
474                 statusreg.all = blogic_rdstatus(adapter);
475                 if (intreg.ir.cmd_complete)
476                         break;
477                 if (adapter->adapter_cmd_complete)
478                         break;
479                 if (statusreg.sr.datain_ready) {
480                         if (++reply_b <= replylen)
481                                 *reply_p++ = blogic_rddatain(adapter);
482                         else
483                                 blogic_rddatain(adapter);
484                 }
485                 if (opcode == BLOGIC_FETCH_LOCALRAM &&
486                                 statusreg.sr.adapter_ready)
487                         break;
488                 udelay(100);
489         }
490         if (timeout < 0) {
491                 blogic_cmd_failure_reason =
492                                         "Timeout waiting for Command Complete";
493                 result = -2;
494                 goto done;
495         }
496         /*
497            Clear any pending Command Complete Interrupt.
498          */
499         blogic_intreset(adapter);
500         /*
501            Provide tracing information if requested.
502          */
503         if (blogic_global_options.trace_config) {
504                 int i;
505                 blogic_notice("blogic_cmd(%02X) Status = %02X: %2d ==> %2d:",
506                                 adapter, opcode, statusreg.all, replylen,
507                                 reply_b);
508                 if (replylen > reply_b)
509                         replylen = reply_b;
510                 for (i = 0; i < replylen; i++)
511                         blogic_notice(" %02X", adapter,
512                                         ((unsigned char *) reply)[i]);
513                 blogic_notice("\n", adapter);
514         }
515         /*
516            Process Command Invalid conditions.
517          */
518         if (statusreg.sr.cmd_invalid) {
519                 /*
520                    Some early BusLogic Host Adapters may not recover
521                    properly from a Command Invalid condition, so if this
522                    appears to be the case, a Soft Reset is issued to the
523                    Host Adapter.  Potentially invalid commands are never
524                    attempted after Mailbox Initialization is performed,
525                    so there should be no Host Adapter state lost by a
526                    Soft Reset in response to a Command Invalid condition.
527                  */
528                 udelay(1000);
529                 statusreg.all = blogic_rdstatus(adapter);
530                 if (statusreg.sr.cmd_invalid || statusreg.sr.rsvd ||
531                                 statusreg.sr.datain_ready ||
532                                 statusreg.sr.cmd_param_busy ||
533                                 !statusreg.sr.adapter_ready ||
534                                 !statusreg.sr.init_reqd ||
535                                 statusreg.sr.diag_active ||
536                                 statusreg.sr.diag_failed) {
537                         blogic_softreset(adapter);
538                         udelay(1000);
539                 }
540                 blogic_cmd_failure_reason = "Command Invalid";
541                 result = -1;
542                 goto done;
543         }
544         /*
545            Handle Excess Parameters Supplied conditions.
546          */
547         if (paramlen > 0) {
548                 blogic_cmd_failure_reason = "Excess Parameters Supplied";
549                 result = -1;
550                 goto done;
551         }
552         /*
553            Indicate the command completed successfully.
554          */
555         blogic_cmd_failure_reason = NULL;
556         result = reply_b;
557         /*
558            Restore the interrupt status if necessary and return.
559          */
560 done:
561         if (!adapter->irq_acquired)
562                 local_irq_restore(processor_flag);
563         return result;
564 }
565
566
567 /*
568   blogic_add_probeaddr_isa appends a single ISA I/O Address to the list
569   of I/O Address and Bus Probe Information to be checked for potential BusLogic
570   Host Adapters.
571 */
572
573 static void __init blogic_add_probeaddr_isa(unsigned long io_addr)
574 {
575         struct blogic_probeinfo *probeinfo;
576         if (blogic_probeinfo_count >= BLOGIC_MAX_ADAPTERS)
577                 return;
578         probeinfo = &blogic_probeinfo_list[blogic_probeinfo_count++];
579         probeinfo->adapter_type = BLOGIC_MULTIMASTER;
580         probeinfo->adapter_bus_type = BLOGIC_ISA_BUS;
581         probeinfo->io_addr = io_addr;
582         probeinfo->pci_device = NULL;
583 }
584
585
586 /*
587   blogic_init_probeinfo_isa initializes the list of I/O Address and
588   Bus Probe Information to be checked for potential BusLogic SCSI Host Adapters
589   only from the list of standard BusLogic MultiMaster ISA I/O Addresses.
590 */
591
592 static void __init blogic_init_probeinfo_isa(struct blogic_adapter *adapter)
593 {
594         /*
595            If BusLogic Driver Options specifications requested that ISA
596            Bus Probes be inhibited, do not proceed further.
597          */
598         if (blogic_probe_options.noprobe_isa)
599                 return;
600         /*
601            Append the list of standard BusLogic MultiMaster ISA I/O Addresses.
602          */
603         if (!blogic_probe_options.limited_isa || blogic_probe_options.probe330)
604                 blogic_add_probeaddr_isa(0x330);
605         if (!blogic_probe_options.limited_isa || blogic_probe_options.probe334)
606                 blogic_add_probeaddr_isa(0x334);
607         if (!blogic_probe_options.limited_isa || blogic_probe_options.probe230)
608                 blogic_add_probeaddr_isa(0x230);
609         if (!blogic_probe_options.limited_isa || blogic_probe_options.probe234)
610                 blogic_add_probeaddr_isa(0x234);
611         if (!blogic_probe_options.limited_isa || blogic_probe_options.probe130)
612                 blogic_add_probeaddr_isa(0x130);
613         if (!blogic_probe_options.limited_isa || blogic_probe_options.probe134)
614                 blogic_add_probeaddr_isa(0x134);
615 }
616
617
618 #ifdef CONFIG_PCI
619
620
621 /*
622   blogic_sort_probeinfo sorts a section of blogic_probeinfo_list in order
623   of increasing PCI Bus and Device Number.
624 */
625
626 static void __init blogic_sort_probeinfo(struct blogic_probeinfo
627                                         *probeinfo_list, int probeinfo_cnt)
628 {
629         int last_exchange = probeinfo_cnt - 1, bound, j;
630
631         while (last_exchange > 0) {
632                 bound = last_exchange;
633                 last_exchange = 0;
634                 for (j = 0; j < bound; j++) {
635                         struct blogic_probeinfo *probeinfo1 =
636                                                         &probeinfo_list[j];
637                         struct blogic_probeinfo *probeinfo2 =
638                                                         &probeinfo_list[j + 1];
639                         if (probeinfo1->bus > probeinfo2->bus ||
640                                 (probeinfo1->bus == probeinfo2->bus &&
641                                 (probeinfo1->dev > probeinfo2->dev))) {
642                                 struct blogic_probeinfo tmp_probeinfo;
643
644                                 memcpy(&tmp_probeinfo, probeinfo1,
645                                         sizeof(struct blogic_probeinfo));
646                                 memcpy(probeinfo1, probeinfo2,
647                                         sizeof(struct blogic_probeinfo));
648                                 memcpy(probeinfo2, &tmp_probeinfo,
649                                         sizeof(struct blogic_probeinfo));
650                                 last_exchange = j;
651                         }
652                 }
653         }
654 }
655
656
657 /*
658   blogic_init_mm_probeinfo initializes the list of I/O Address
659   and Bus Probe Information to be checked for potential BusLogic MultiMaster
660   SCSI Host Adapters by interrogating the PCI Configuration Space on PCI
661   machines as well as from the list of standard BusLogic MultiMaster ISA
662   I/O Addresses.  It returns the number of PCI MultiMaster Host Adapters found.
663 */
664
665 static int __init blogic_init_mm_probeinfo(struct blogic_adapter *adapter)
666 {
667         struct blogic_probeinfo *pr_probeinfo =
668                 &blogic_probeinfo_list[blogic_probeinfo_count];
669         int nonpr_mmindex = blogic_probeinfo_count + 1;
670         int nonpr_mmcount = 0, mmcount = 0;
671         bool force_scan_order = false;
672         bool force_scan_order_checked = false;
673         bool addr_seen[6];
674         struct pci_dev *pci_device = NULL;
675         int i;
676         if (blogic_probeinfo_count >= BLOGIC_MAX_ADAPTERS)
677                 return 0;
678         blogic_probeinfo_count++;
679         for (i = 0; i < 6; i++)
680                 addr_seen[i] = false;
681         /*
682            Iterate over the MultiMaster PCI Host Adapters.  For each
683            enumerated host adapter, determine whether its ISA Compatible
684            I/O Port is enabled and if so, whether it is assigned the
685            Primary I/O Address.  A host adapter that is assigned the
686            Primary I/O Address will always be the preferred boot device.
687            The MultiMaster BIOS will first recognize a host adapter at
688            the Primary I/O Address, then any other PCI host adapters,
689            and finally any host adapters located at the remaining
690            standard ISA I/O Addresses.  When a PCI host adapter is found
691            with its ISA Compatible I/O Port enabled, a command is issued
692            to disable the ISA Compatible I/O Port, and it is noted that the
693            particular standard ISA I/O Address need not be probed.
694          */
695         pr_probeinfo->io_addr = 0;
696         while ((pci_device = pci_get_device(PCI_VENDOR_ID_BUSLOGIC,
697                                         PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER,
698                                         pci_device)) != NULL) {
699                 struct blogic_adapter *host_adapter = adapter;
700                 struct blogic_adapter_info adapter_info;
701                 enum blogic_isa_ioport mod_ioaddr_req;
702                 unsigned char bus;
703                 unsigned char device;
704                 unsigned int irq_ch;
705                 unsigned long base_addr0;
706                 unsigned long base_addr1;
707                 unsigned long io_addr;
708                 unsigned long pci_addr;
709
710                 if (pci_enable_device(pci_device))
711                         continue;
712
713                 if (pci_set_dma_mask(pci_device, DMA_BIT_MASK(32)))
714                         continue;
715
716                 bus = pci_device->bus->number;
717                 device = pci_device->devfn >> 3;
718                 irq_ch = pci_device->irq;
719                 io_addr = base_addr0 = pci_resource_start(pci_device, 0);
720                 pci_addr = base_addr1 = pci_resource_start(pci_device, 1);
721
722                 if (pci_resource_flags(pci_device, 0) & IORESOURCE_MEM) {
723                         blogic_err("BusLogic: Base Address0 0x%X not I/O for " "MultiMaster Host Adapter\n", NULL, base_addr0);
724                         blogic_err("at PCI Bus %d Device %d I/O Address 0x%X\n", NULL, bus, device, io_addr);
725                         continue;
726                 }
727                 if (pci_resource_flags(pci_device, 1) & IORESOURCE_IO) {
728                         blogic_err("BusLogic: Base Address1 0x%X not Memory for " "MultiMaster Host Adapter\n", NULL, base_addr1);
729                         blogic_err("at PCI Bus %d Device %d PCI Address 0x%X\n", NULL, bus, device, pci_addr);
730                         continue;
731                 }
732                 if (irq_ch == 0) {
733                         blogic_err("BusLogic: IRQ Channel %d invalid for " "MultiMaster Host Adapter\n", NULL, irq_ch);
734                         blogic_err("at PCI Bus %d Device %d I/O Address 0x%X\n", NULL, bus, device, io_addr);
735                         continue;
736                 }
737                 if (blogic_global_options.trace_probe) {
738                         blogic_notice("BusLogic: PCI MultiMaster Host Adapter " "detected at\n", NULL);
739                         blogic_notice("BusLogic: PCI Bus %d Device %d I/O Address " "0x%X PCI Address 0x%X\n", NULL, bus, device, io_addr, pci_addr);
740                 }
741                 /*
742                    Issue the Inquire PCI Host Adapter Information command to determine
743                    the ISA Compatible I/O Port.  If the ISA Compatible I/O Port is
744                    known and enabled, note that the particular Standard ISA I/O
745                    Address should not be probed.
746                  */
747                 host_adapter->io_addr = io_addr;
748                 blogic_intreset(host_adapter);
749                 if (blogic_cmd(host_adapter, BLOGIC_INQ_PCI_INFO, NULL, 0,
750                                 &adapter_info, sizeof(adapter_info)) ==
751                                 sizeof(adapter_info)) {
752                         if (adapter_info.isa_port < 6)
753                                 addr_seen[adapter_info.isa_port] = true;
754                 } else
755                         adapter_info.isa_port = BLOGIC_IO_DISABLE;
756                 /*
757                    Issue the Modify I/O Address command to disable the
758                    ISA Compatible I/O Port. On PCI Host Adapters, the
759                    Modify I/O Address command allows modification of the
760                    ISA compatible I/O Address that the Host Adapter
761                    responds to; it does not affect the PCI compliant
762                    I/O Address assigned at system initialization.
763                  */
764                 mod_ioaddr_req = BLOGIC_IO_DISABLE;
765                 blogic_cmd(host_adapter, BLOGIC_MOD_IOADDR, &mod_ioaddr_req,
766                                 sizeof(mod_ioaddr_req), NULL, 0);
767                 /*
768                    For the first MultiMaster Host Adapter enumerated,
769                    issue the Fetch Host Adapter Local RAM command to read
770                    byte 45 of the AutoSCSI area, for the setting of the
771                    "Use Bus And Device # For PCI Scanning Seq." option.
772                    Issue the Inquire Board ID command since this option is
773                    only valid for the BT-948/958/958D.
774                  */
775                 if (!force_scan_order_checked) {
776                         struct blogic_fetch_localram fetch_localram;
777                         struct blogic_autoscsi_byte45 autoscsi_byte45;
778                         struct blogic_board_id id;
779
780                         fetch_localram.offset = BLOGIC_AUTOSCSI_BASE + 45;
781                         fetch_localram.count = sizeof(autoscsi_byte45);
782                         blogic_cmd(host_adapter, BLOGIC_FETCH_LOCALRAM,
783                                         &fetch_localram, sizeof(fetch_localram),
784                                         &autoscsi_byte45,
785                                         sizeof(autoscsi_byte45));
786                         blogic_cmd(host_adapter, BLOGIC_GET_BOARD_ID, NULL, 0,
787                                         &id, sizeof(id));
788                         if (id.fw_ver_digit1 == '5')
789                                 force_scan_order =
790                                         autoscsi_byte45.force_scan_order;
791                         force_scan_order_checked = true;
792                 }
793                 /*
794                    Determine whether this MultiMaster Host Adapter has its
795                    ISA Compatible I/O Port enabled and is assigned the
796                    Primary I/O Address. If it does, then it is the Primary
797                    MultiMaster Host Adapter and must be recognized first.
798                    If it does not, then it is added to the list for probing
799                    after any Primary MultiMaster Host Adapter is probed.
800                  */
801                 if (adapter_info.isa_port == BLOGIC_IO_330) {
802                         pr_probeinfo->adapter_type = BLOGIC_MULTIMASTER;
803                         pr_probeinfo->adapter_bus_type = BLOGIC_PCI_BUS;
804                         pr_probeinfo->io_addr = io_addr;
805                         pr_probeinfo->pci_addr = pci_addr;
806                         pr_probeinfo->bus = bus;
807                         pr_probeinfo->dev = device;
808                         pr_probeinfo->irq_ch = irq_ch;
809                         pr_probeinfo->pci_device = pci_dev_get(pci_device);
810                         mmcount++;
811                 } else if (blogic_probeinfo_count < BLOGIC_MAX_ADAPTERS) {
812                         struct blogic_probeinfo *probeinfo =
813                                 &blogic_probeinfo_list[blogic_probeinfo_count++];
814                         probeinfo->adapter_type = BLOGIC_MULTIMASTER;
815                         probeinfo->adapter_bus_type = BLOGIC_PCI_BUS;
816                         probeinfo->io_addr = io_addr;
817                         probeinfo->pci_addr = pci_addr;
818                         probeinfo->bus = bus;
819                         probeinfo->dev = device;
820                         probeinfo->irq_ch = irq_ch;
821                         probeinfo->pci_device = pci_dev_get(pci_device);
822                         nonpr_mmcount++;
823                         mmcount++;
824                 } else
825                         blogic_warn("BusLogic: Too many Host Adapters " "detected\n", NULL);
826         }
827         /*
828            If the AutoSCSI "Use Bus And Device # For PCI Scanning Seq."
829            option is ON for the first enumerated MultiMaster Host Adapter,
830            and if that host adapter is a BT-948/958/958D, then the
831            MultiMaster BIOS will recognize MultiMaster Host Adapters in
832            the order of increasing PCI Bus and Device Number. In that case,
833            sort the probe information into the same order the BIOS uses.
834            If this option is OFF, then the MultiMaster BIOS will recognize
835            MultiMaster Host Adapters in the order they are enumerated by
836            the PCI BIOS, and hence no sorting is necessary.
837          */
838         if (force_scan_order)
839                 blogic_sort_probeinfo(&blogic_probeinfo_list[nonpr_mmindex],
840                                         nonpr_mmcount);
841         /*
842            If no PCI MultiMaster Host Adapter is assigned the Primary
843            I/O Address, then the Primary I/O Address must be probed
844            explicitly before any PCI host adapters are probed.
845          */
846         if (!blogic_probe_options.noprobe_isa)
847                 if (pr_probeinfo->io_addr == 0 &&
848                                 (!blogic_probe_options.limited_isa ||
849                                  blogic_probe_options.probe330)) {
850                         pr_probeinfo->adapter_type = BLOGIC_MULTIMASTER;
851                         pr_probeinfo->adapter_bus_type = BLOGIC_ISA_BUS;
852                         pr_probeinfo->io_addr = 0x330;
853                 }
854         /*
855            Append the list of standard BusLogic MultiMaster ISA I/O Addresses,
856            omitting the Primary I/O Address which has already been handled.
857          */
858         if (!blogic_probe_options.noprobe_isa) {
859                 if (!addr_seen[1] &&
860                                 (!blogic_probe_options.limited_isa ||
861                                  blogic_probe_options.probe334))
862                         blogic_add_probeaddr_isa(0x334);
863                 if (!addr_seen[2] &&
864                                 (!blogic_probe_options.limited_isa ||
865                                  blogic_probe_options.probe230))
866                         blogic_add_probeaddr_isa(0x230);
867                 if (!addr_seen[3] &&
868                                 (!blogic_probe_options.limited_isa ||
869                                  blogic_probe_options.probe234))
870                         blogic_add_probeaddr_isa(0x234);
871                 if (!addr_seen[4] &&
872                                 (!blogic_probe_options.limited_isa ||
873                                  blogic_probe_options.probe130))
874                         blogic_add_probeaddr_isa(0x130);
875                 if (!addr_seen[5] &&
876                                 (!blogic_probe_options.limited_isa ||
877                                  blogic_probe_options.probe134))
878                         blogic_add_probeaddr_isa(0x134);
879         }
880         /*
881            Iterate over the older non-compliant MultiMaster PCI Host Adapters,
882            noting the PCI bus location and assigned IRQ Channel.
883          */
884         pci_device = NULL;
885         while ((pci_device = pci_get_device(PCI_VENDOR_ID_BUSLOGIC,
886                                         PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC,
887                                         pci_device)) != NULL) {
888                 unsigned char bus;
889                 unsigned char device;
890                 unsigned int irq_ch;
891                 unsigned long io_addr;
892
893                 if (pci_enable_device(pci_device))
894                         continue;
895
896                 if (pci_set_dma_mask(pci_device, DMA_BIT_MASK(32)))
897                         continue;
898
899                 bus = pci_device->bus->number;
900                 device = pci_device->devfn >> 3;
901                 irq_ch = pci_device->irq;
902                 io_addr = pci_resource_start(pci_device, 0);
903
904                 if (io_addr == 0 || irq_ch == 0)
905                         continue;
906                 for (i = 0; i < blogic_probeinfo_count; i++) {
907                         struct blogic_probeinfo *probeinfo =
908                                                 &blogic_probeinfo_list[i];
909                         if (probeinfo->io_addr == io_addr &&
910                                 probeinfo->adapter_type == BLOGIC_MULTIMASTER) {
911                                 probeinfo->adapter_bus_type = BLOGIC_PCI_BUS;
912                                 probeinfo->pci_addr = 0;
913                                 probeinfo->bus = bus;
914                                 probeinfo->dev = device;
915                                 probeinfo->irq_ch = irq_ch;
916                                 probeinfo->pci_device = pci_dev_get(pci_device);
917                                 break;
918                         }
919                 }
920         }
921         return mmcount;
922 }
923
924
925 /*
926   blogic_init_fp_probeinfo initializes the list of I/O Address
927   and Bus Probe Information to be checked for potential BusLogic FlashPoint
928   Host Adapters by interrogating the PCI Configuration Space.  It returns the
929   number of FlashPoint Host Adapters found.
930 */
931
932 static int __init blogic_init_fp_probeinfo(struct blogic_adapter *adapter)
933 {
934         int fpindex = blogic_probeinfo_count, fpcount = 0;
935         struct pci_dev *pci_device = NULL;
936         /*
937            Interrogate PCI Configuration Space for any FlashPoint Host Adapters.
938          */
939         while ((pci_device = pci_get_device(PCI_VENDOR_ID_BUSLOGIC,
940                                         PCI_DEVICE_ID_BUSLOGIC_FLASHPOINT,
941                                         pci_device)) != NULL) {
942                 unsigned char bus;
943                 unsigned char device;
944                 unsigned int irq_ch;
945                 unsigned long base_addr0;
946                 unsigned long base_addr1;
947                 unsigned long io_addr;
948                 unsigned long pci_addr;
949
950                 if (pci_enable_device(pci_device))
951                         continue;
952
953                 if (pci_set_dma_mask(pci_device, DMA_BIT_MASK(32)))
954                         continue;
955
956                 bus = pci_device->bus->number;
957                 device = pci_device->devfn >> 3;
958                 irq_ch = pci_device->irq;
959                 io_addr = base_addr0 = pci_resource_start(pci_device, 0);
960                 pci_addr = base_addr1 = pci_resource_start(pci_device, 1);
961 #ifdef CONFIG_SCSI_FLASHPOINT
962                 if (pci_resource_flags(pci_device, 0) & IORESOURCE_MEM) {
963                         blogic_err("BusLogic: Base Address0 0x%X not I/O for " "FlashPoint Host Adapter\n", NULL, base_addr0);
964                         blogic_err("at PCI Bus %d Device %d I/O Address 0x%X\n", NULL, bus, device, io_addr);
965                         continue;
966                 }
967                 if (pci_resource_flags(pci_device, 1) & IORESOURCE_IO) {
968                         blogic_err("BusLogic: Base Address1 0x%X not Memory for " "FlashPoint Host Adapter\n", NULL, base_addr1);
969                         blogic_err("at PCI Bus %d Device %d PCI Address 0x%X\n", NULL, bus, device, pci_addr);
970                         continue;
971                 }
972                 if (irq_ch == 0) {
973                         blogic_err("BusLogic: IRQ Channel %d invalid for " "FlashPoint Host Adapter\n", NULL, irq_ch);
974                         blogic_err("at PCI Bus %d Device %d I/O Address 0x%X\n", NULL, bus, device, io_addr);
975                         continue;
976                 }
977                 if (blogic_global_options.trace_probe) {
978                         blogic_notice("BusLogic: FlashPoint Host Adapter " "detected at\n", NULL);
979                         blogic_notice("BusLogic: PCI Bus %d Device %d I/O Address " "0x%X PCI Address 0x%X\n", NULL, bus, device, io_addr, pci_addr);
980                 }
981                 if (blogic_probeinfo_count < BLOGIC_MAX_ADAPTERS) {
982                         struct blogic_probeinfo *probeinfo =
983                                 &blogic_probeinfo_list[blogic_probeinfo_count++];
984                         probeinfo->adapter_type = BLOGIC_FLASHPOINT;
985                         probeinfo->adapter_bus_type = BLOGIC_PCI_BUS;
986                         probeinfo->io_addr = io_addr;
987                         probeinfo->pci_addr = pci_addr;
988                         probeinfo->bus = bus;
989                         probeinfo->dev = device;
990                         probeinfo->irq_ch = irq_ch;
991                         probeinfo->pci_device = pci_dev_get(pci_device);
992                         fpcount++;
993                 } else
994                         blogic_warn("BusLogic: Too many Host Adapters " "detected\n", NULL);
995 #else
996                 blogic_err("BusLogic: FlashPoint Host Adapter detected at " "PCI Bus %d Device %d\n", NULL, bus, device);
997                 blogic_err("BusLogic: I/O Address 0x%X PCI Address 0x%X, irq %d, " "but FlashPoint\n", NULL, io_addr, pci_addr, irq_ch);
998                 blogic_err("BusLogic: support was omitted in this kernel " "configuration.\n", NULL);
999 #endif
1000         }
1001         /*
1002            The FlashPoint BIOS will scan for FlashPoint Host Adapters in the order of
1003            increasing PCI Bus and Device Number, so sort the probe information into
1004            the same order the BIOS uses.
1005          */
1006         blogic_sort_probeinfo(&blogic_probeinfo_list[fpindex], fpcount);
1007         return fpcount;
1008 }
1009
1010
1011 /*
1012   blogic_init_probeinfo_list initializes the list of I/O Address and Bus
1013   Probe Information to be checked for potential BusLogic SCSI Host Adapters by
1014   interrogating the PCI Configuration Space on PCI machines as well as from the
1015   list of standard BusLogic MultiMaster ISA I/O Addresses.  By default, if both
1016   FlashPoint and PCI MultiMaster Host Adapters are present, this driver will
1017   probe for FlashPoint Host Adapters first unless the BIOS primary disk is
1018   controlled by the first PCI MultiMaster Host Adapter, in which case
1019   MultiMaster Host Adapters will be probed first.  The BusLogic Driver Options
1020   specifications "MultiMasterFirst" and "FlashPointFirst" can be used to force
1021   a particular probe order.
1022 */
1023
1024 static void __init blogic_init_probeinfo_list(struct blogic_adapter *adapter)
1025 {
1026         /*
1027            If a PCI BIOS is present, interrogate it for MultiMaster and
1028            FlashPoint Host Adapters; otherwise, default to the standard
1029            ISA MultiMaster probe.
1030          */
1031         if (!blogic_probe_options.noprobe_pci) {
1032                 if (blogic_probe_options.multimaster_first) {
1033                         blogic_init_mm_probeinfo(adapter);
1034                         blogic_init_fp_probeinfo(adapter);
1035                 } else if (blogic_probe_options.flashpoint_first) {
1036                         blogic_init_fp_probeinfo(adapter);
1037                         blogic_init_mm_probeinfo(adapter);
1038                 } else {
1039                         int fpcount = blogic_init_fp_probeinfo(adapter);
1040                         int mmcount = blogic_init_mm_probeinfo(adapter);
1041                         if (fpcount > 0 && mmcount > 0) {
1042                                 struct blogic_probeinfo *probeinfo =
1043                                         &blogic_probeinfo_list[fpcount];
1044                                 struct blogic_adapter *myadapter = adapter;
1045                                 struct blogic_fetch_localram fetch_localram;
1046                                 struct blogic_bios_drvmap d0_mapbyte;
1047
1048                                 while (probeinfo->adapter_bus_type !=
1049                                                 BLOGIC_PCI_BUS)
1050                                         probeinfo++;
1051                                 myadapter->io_addr = probeinfo->io_addr;
1052                                 fetch_localram.offset =
1053                                         BLOGIC_BIOS_BASE + BLOGIC_BIOS_DRVMAP;
1054                                 fetch_localram.count = sizeof(d0_mapbyte);
1055                                 blogic_cmd(myadapter, BLOGIC_FETCH_LOCALRAM,
1056                                                 &fetch_localram,
1057                                                 sizeof(fetch_localram),
1058                                                 &d0_mapbyte,
1059                                                 sizeof(d0_mapbyte));
1060                                 /*
1061                                    If the Map Byte for BIOS Drive 0 indicates
1062                                    that BIOS Drive 0 is controlled by this
1063                                    PCI MultiMaster Host Adapter, then reverse
1064                                    the probe order so that MultiMaster Host
1065                                    Adapters are probed before FlashPoint Host
1066                                    Adapters.
1067                                  */
1068                                 if (d0_mapbyte.diskgeom != BLOGIC_BIOS_NODISK) {
1069                                         struct blogic_probeinfo saved_probeinfo[BLOGIC_MAX_ADAPTERS];
1070                                         int mmcount = blogic_probeinfo_count - fpcount;
1071
1072                                         memcpy(saved_probeinfo,
1073                                                 blogic_probeinfo_list,
1074                                                 blogic_probeinfo_count * sizeof(struct blogic_probeinfo));
1075                                         memcpy(&blogic_probeinfo_list[0],
1076                                                 &saved_probeinfo[fpcount],
1077                                                 mmcount * sizeof(struct blogic_probeinfo));
1078                                         memcpy(&blogic_probeinfo_list[mmcount],
1079                                                 &saved_probeinfo[0],
1080                                                 fpcount * sizeof(struct blogic_probeinfo));
1081                                 }
1082                         }
1083                 }
1084         } else {
1085                 blogic_init_probeinfo_isa(adapter);
1086         }
1087 }
1088
1089
1090 #else
1091 #define blogic_init_probeinfo_list(adapter) \
1092                 blogic_init_probeinfo_isa(adapter)
1093 #endif                          /* CONFIG_PCI */
1094
1095
1096 /*
1097   blogic_failure prints a standardized error message, and then returns false.
1098 */
1099
1100 static bool blogic_failure(struct blogic_adapter *adapter, char *msg)
1101 {
1102         blogic_announce_drvr(adapter);
1103         if (adapter->adapter_bus_type == BLOGIC_PCI_BUS) {
1104                 blogic_err("While configuring BusLogic PCI Host Adapter at\n",
1105                                 adapter);
1106                 blogic_err("Bus %d Device %d I/O Address 0x%X PCI Address 0x%X:\n", adapter, adapter->bus, adapter->dev, adapter->io_addr, adapter->pci_addr);
1107         } else
1108                 blogic_err("While configuring BusLogic Host Adapter at " "I/O Address 0x%X:\n", adapter, adapter->io_addr);
1109         blogic_err("%s FAILED - DETACHING\n", adapter, msg);
1110         if (blogic_cmd_failure_reason != NULL)
1111                 blogic_err("ADDITIONAL FAILURE INFO - %s\n", adapter,
1112                                 blogic_cmd_failure_reason);
1113         return false;
1114 }
1115
1116
1117 /*
1118   blogic_probe probes for a BusLogic Host Adapter.
1119 */
1120
1121 static bool __init blogic_probe(struct blogic_adapter *adapter)
1122 {
1123         union blogic_stat_reg statusreg;
1124         union blogic_int_reg intreg;
1125         union blogic_geo_reg georeg;
1126         /*
1127            FlashPoint Host Adapters are Probed by the FlashPoint SCCB Manager.
1128          */
1129         if (blogic_flashpoint_type(adapter)) {
1130                 struct fpoint_info *fpinfo = &adapter->fpinfo;
1131                 fpinfo->base_addr = (u32) adapter->io_addr;
1132                 fpinfo->irq_ch = adapter->irq_ch;
1133                 fpinfo->present = false;
1134                 if (!(FlashPoint_ProbeHostAdapter(fpinfo) == 0 &&
1135                                         fpinfo->present)) {
1136                         blogic_err("BusLogic: FlashPoint Host Adapter detected at " "PCI Bus %d Device %d\n", adapter, adapter->bus, adapter->dev);
1137                         blogic_err("BusLogic: I/O Address 0x%X PCI Address 0x%X, " "but FlashPoint\n", adapter, adapter->io_addr, adapter->pci_addr);
1138                         blogic_err("BusLogic: Probe Function failed to validate it.\n", adapter);
1139                         return false;
1140                 }
1141                 if (blogic_global_options.trace_probe)
1142                         blogic_notice("BusLogic_Probe(0x%X): FlashPoint Found\n", adapter, adapter->io_addr);
1143                 /*
1144                    Indicate the Host Adapter Probe completed successfully.
1145                  */
1146                 return true;
1147         }
1148         /*
1149            Read the Status, Interrupt, and Geometry Registers to test if there are I/O
1150            ports that respond, and to check the values to determine if they are from a
1151            BusLogic Host Adapter.  A nonexistent I/O port will return 0xFF, in which
1152            case there is definitely no BusLogic Host Adapter at this base I/O Address.
1153            The test here is a subset of that used by the BusLogic Host Adapter BIOS.
1154          */
1155         statusreg.all = blogic_rdstatus(adapter);
1156         intreg.all = blogic_rdint(adapter);
1157         georeg.all = blogic_rdgeom(adapter);
1158         if (blogic_global_options.trace_probe)
1159                 blogic_notice("BusLogic_Probe(0x%X): Status 0x%02X, Interrupt 0x%02X, " "Geometry 0x%02X\n", adapter, adapter->io_addr, statusreg.all, intreg.all, georeg.all);
1160         if (statusreg.all == 0 || statusreg.sr.diag_active ||
1161                         statusreg.sr.cmd_param_busy || statusreg.sr.rsvd ||
1162                         statusreg.sr.cmd_invalid || intreg.ir.rsvd != 0)
1163                 return false;
1164         /*
1165            Check the undocumented Geometry Register to test if there is
1166            an I/O port that responded.  Adaptec Host Adapters do not
1167            implement the Geometry Register, so this test helps serve to
1168            avoid incorrectly recognizing an Adaptec 1542A or 1542B as a
1169            BusLogic.  Unfortunately, the Adaptec 1542C series does respond
1170            to the Geometry Register I/O port, but it will be rejected
1171            later when the Inquire Extended Setup Information command is
1172            issued in blogic_checkadapter.  The AMI FastDisk Host Adapter
1173            is a BusLogic clone that implements the same interface as
1174            earlier BusLogic Host Adapters, including the undocumented
1175            commands, and is therefore supported by this driver. However,
1176            the AMI FastDisk always returns 0x00 upon reading the Geometry
1177            Register, so the extended translation option should always be
1178            left disabled on the AMI FastDisk.
1179          */
1180         if (georeg.all == 0xFF)
1181                 return false;
1182         /*
1183            Indicate the Host Adapter Probe completed successfully.
1184          */
1185         return true;
1186 }
1187
1188
1189 /*
1190   blogic_hwreset issues a Hardware Reset to the Host Adapter
1191   and waits for Host Adapter Diagnostics to complete.  If hard_reset is true, a
1192   Hard Reset is performed which also initiates a SCSI Bus Reset.  Otherwise, a
1193   Soft Reset is performed which only resets the Host Adapter without forcing a
1194   SCSI Bus Reset.
1195 */
1196
1197 static bool blogic_hwreset(struct blogic_adapter *adapter, bool hard_reset)
1198 {
1199         union blogic_stat_reg statusreg;
1200         int timeout;
1201         /*
1202            FlashPoint Host Adapters are Hard Reset by the FlashPoint
1203            SCCB Manager.
1204          */
1205         if (blogic_flashpoint_type(adapter)) {
1206                 struct fpoint_info *fpinfo = &adapter->fpinfo;
1207                 fpinfo->softreset = !hard_reset;
1208                 fpinfo->report_underrun = true;
1209                 adapter->cardhandle =
1210                         FlashPoint_HardwareResetHostAdapter(fpinfo);
1211                 if (adapter->cardhandle == (void *)FPOINT_BADCARD_HANDLE)
1212                         return false;
1213                 /*
1214                    Indicate the Host Adapter Hard Reset completed successfully.
1215                  */
1216                 return true;
1217         }
1218         /*
1219            Issue a Hard Reset or Soft Reset Command to the Host Adapter.
1220            The Host Adapter should respond by setting Diagnostic Active in
1221            the Status Register.
1222          */
1223         if (hard_reset)
1224                 blogic_hardreset(adapter);
1225         else
1226                 blogic_softreset(adapter);
1227         /*
1228            Wait until Diagnostic Active is set in the Status Register.
1229          */
1230         timeout = 5 * 10000;
1231         while (--timeout >= 0) {
1232                 statusreg.all = blogic_rdstatus(adapter);
1233                 if (statusreg.sr.diag_active)
1234                         break;
1235                 udelay(100);
1236         }
1237         if (blogic_global_options.trace_hw_reset)
1238                 blogic_notice("BusLogic_HardwareReset(0x%X): Diagnostic Active, " "Status 0x%02X\n", adapter, adapter->io_addr, statusreg.all);
1239         if (timeout < 0)
1240                 return false;
1241         /*
1242            Wait 100 microseconds to allow completion of any initial diagnostic
1243            activity which might leave the contents of the Status Register
1244            unpredictable.
1245          */
1246         udelay(100);
1247         /*
1248            Wait until Diagnostic Active is reset in the Status Register.
1249          */
1250         timeout = 10 * 10000;
1251         while (--timeout >= 0) {
1252                 statusreg.all = blogic_rdstatus(adapter);
1253                 if (!statusreg.sr.diag_active)
1254                         break;
1255                 udelay(100);
1256         }
1257         if (blogic_global_options.trace_hw_reset)
1258                 blogic_notice("BusLogic_HardwareReset(0x%X): Diagnostic Completed, " "Status 0x%02X\n", adapter, adapter->io_addr, statusreg.all);
1259         if (timeout < 0)
1260                 return false;
1261         /*
1262            Wait until at least one of the Diagnostic Failure, Host Adapter
1263            Ready, or Data In Register Ready bits is set in the Status Register.
1264          */
1265         timeout = 10000;
1266         while (--timeout >= 0) {
1267                 statusreg.all = blogic_rdstatus(adapter);
1268                 if (statusreg.sr.diag_failed || statusreg.sr.adapter_ready ||
1269                                 statusreg.sr.datain_ready)
1270                         break;
1271                 udelay(100);
1272         }
1273         if (blogic_global_options.trace_hw_reset)
1274                 blogic_notice("BusLogic_HardwareReset(0x%X): Host Adapter Ready, " "Status 0x%02X\n", adapter, adapter->io_addr, statusreg.all);
1275         if (timeout < 0)
1276                 return false;
1277         /*
1278            If Diagnostic Failure is set or Host Adapter Ready is reset,
1279            then an error occurred during the Host Adapter diagnostics.
1280            If Data In Register Ready is set, then there is an Error Code
1281            available.
1282          */
1283         if (statusreg.sr.diag_failed || !statusreg.sr.adapter_ready) {
1284                 blogic_cmd_failure_reason = NULL;
1285                 blogic_failure(adapter, "HARD RESET DIAGNOSTICS");
1286                 blogic_err("HOST ADAPTER STATUS REGISTER = %02X\n", adapter,
1287                                 statusreg.all);
1288                 if (statusreg.sr.datain_ready)
1289                         blogic_err("HOST ADAPTER ERROR CODE = %d\n", adapter,
1290                                         blogic_rddatain(adapter));
1291                 return false;
1292         }
1293         /*
1294            Indicate the Host Adapter Hard Reset completed successfully.
1295          */
1296         return true;
1297 }
1298
1299
1300 /*
1301   blogic_checkadapter checks to be sure this really is a BusLogic
1302   Host Adapter.
1303 */
1304
1305 static bool __init blogic_checkadapter(struct blogic_adapter *adapter)
1306 {
1307         struct blogic_ext_setup ext_setupinfo;
1308         unsigned char req_replylen;
1309         bool result = true;
1310         /*
1311            FlashPoint Host Adapters do not require this protection.
1312          */
1313         if (blogic_flashpoint_type(adapter))
1314                 return true;
1315         /*
1316            Issue the Inquire Extended Setup Information command. Only genuine
1317            BusLogic Host Adapters and true clones support this command.
1318            Adaptec 1542C series Host Adapters that respond to the Geometry
1319            Register I/O port will fail this command.
1320          */
1321         req_replylen = sizeof(ext_setupinfo);
1322         if (blogic_cmd(adapter, BLOGIC_INQ_EXTSETUP, &req_replylen,
1323                                 sizeof(req_replylen), &ext_setupinfo,
1324                                 sizeof(ext_setupinfo)) != sizeof(ext_setupinfo))
1325                 result = false;
1326         /*
1327            Provide tracing information if requested and return.
1328          */
1329         if (blogic_global_options.trace_probe)
1330                 blogic_notice("BusLogic_Check(0x%X): MultiMaster %s\n", adapter,
1331                                 adapter->io_addr,
1332                                 (result ? "Found" : "Not Found"));
1333         return result;
1334 }
1335
1336
1337 /*
1338   blogic_rdconfig reads the Configuration Information
1339   from Host Adapter and initializes the Host Adapter structure.
1340 */
1341
1342 static bool __init blogic_rdconfig(struct blogic_adapter *adapter)
1343 {
1344         struct blogic_board_id id;
1345         struct blogic_config config;
1346         struct blogic_setup_info setupinfo;
1347         struct blogic_ext_setup ext_setupinfo;
1348         unsigned char model[5];
1349         unsigned char fw_ver_digit3;
1350         unsigned char fw_ver_letter;
1351         struct blogic_adapter_info adapter_info;
1352         struct blogic_fetch_localram fetch_localram;
1353         struct blogic_autoscsi autoscsi;
1354         union blogic_geo_reg georeg;
1355         unsigned char req_replylen;
1356         unsigned char *tgt, ch;
1357         int tgt_id, i;
1358         /*
1359            Configuration Information for FlashPoint Host Adapters is
1360            provided in the fpoint_info structure by the FlashPoint
1361            SCCB Manager's Probe Function. Initialize fields in the
1362            Host Adapter structure from the fpoint_info structure.
1363          */
1364         if (blogic_flashpoint_type(adapter)) {
1365                 struct fpoint_info *fpinfo = &adapter->fpinfo;
1366                 tgt = adapter->model;
1367                 *tgt++ = 'B';
1368                 *tgt++ = 'T';
1369                 *tgt++ = '-';
1370                 for (i = 0; i < sizeof(fpinfo->model); i++)
1371                         *tgt++ = fpinfo->model[i];
1372                 *tgt++ = '\0';
1373                 strcpy(adapter->fw_ver, FLASHPOINT_FW_VER);
1374                 adapter->scsi_id = fpinfo->scsi_id;
1375                 adapter->ext_trans_enable = fpinfo->ext_trans_enable;
1376                 adapter->parity = fpinfo->parity;
1377                 adapter->reset_enabled = !fpinfo->softreset;
1378                 adapter->level_int = true;
1379                 adapter->wide = fpinfo->wide;
1380                 adapter->differential = false;
1381                 adapter->scam = true;
1382                 adapter->ultra = true;
1383                 adapter->ext_lun = true;
1384                 adapter->terminfo_valid = true;
1385                 adapter->low_term = fpinfo->low_term;
1386                 adapter->high_term = fpinfo->high_term;
1387                 adapter->scam_enabled = fpinfo->scam_enabled;
1388                 adapter->scam_lev2 = fpinfo->scam_lev2;
1389                 adapter->drvr_sglimit = BLOGIC_SG_LIMIT;
1390                 adapter->maxdev = (adapter->wide ? 16 : 8);
1391                 adapter->maxlun = 32;
1392                 adapter->initccbs = 4 * BLOGIC_CCB_GRP_ALLOCSIZE;
1393                 adapter->inc_ccbs = BLOGIC_CCB_GRP_ALLOCSIZE;
1394                 adapter->drvr_qdepth = 255;
1395                 adapter->adapter_qdepth = adapter->drvr_qdepth;
1396                 adapter->sync_ok = fpinfo->sync_ok;
1397                 adapter->fast_ok = fpinfo->fast_ok;
1398                 adapter->ultra_ok = fpinfo->ultra_ok;
1399                 adapter->wide_ok = fpinfo->wide_ok;
1400                 adapter->discon_ok = fpinfo->discon_ok;
1401                 adapter->tagq_ok = 0xFFFF;
1402                 goto common;
1403         }
1404         /*
1405            Issue the Inquire Board ID command.
1406          */
1407         if (blogic_cmd(adapter, BLOGIC_GET_BOARD_ID, NULL, 0, &id,
1408                                 sizeof(id)) != sizeof(id))
1409                 return blogic_failure(adapter, "INQUIRE BOARD ID");
1410         /*
1411            Issue the Inquire Configuration command.
1412          */
1413         if (blogic_cmd(adapter, BLOGIC_INQ_CONFIG, NULL, 0, &config,
1414                                 sizeof(config))
1415             != sizeof(config))
1416                 return blogic_failure(adapter, "INQUIRE CONFIGURATION");
1417         /*
1418            Issue the Inquire Setup Information command.
1419          */
1420         req_replylen = sizeof(setupinfo);
1421         if (blogic_cmd(adapter, BLOGIC_INQ_SETUPINFO, &req_replylen,
1422                                 sizeof(req_replylen), &setupinfo,
1423                                 sizeof(setupinfo)) != sizeof(setupinfo))
1424                 return blogic_failure(adapter, "INQUIRE SETUP INFORMATION");
1425         /*
1426            Issue the Inquire Extended Setup Information command.
1427          */
1428         req_replylen = sizeof(ext_setupinfo);
1429         if (blogic_cmd(adapter, BLOGIC_INQ_EXTSETUP, &req_replylen,
1430                                 sizeof(req_replylen), &ext_setupinfo,
1431                                 sizeof(ext_setupinfo)) != sizeof(ext_setupinfo))
1432                 return blogic_failure(adapter,
1433                                         "INQUIRE EXTENDED SETUP INFORMATION");
1434         /*
1435            Issue the Inquire Firmware Version 3rd Digit command.
1436          */
1437         fw_ver_digit3 = '\0';
1438         if (id.fw_ver_digit1 > '0')
1439                 if (blogic_cmd(adapter, BLOGIC_INQ_FWVER_D3, NULL, 0,
1440                                 &fw_ver_digit3,
1441                                 sizeof(fw_ver_digit3)) != sizeof(fw_ver_digit3))
1442                         return blogic_failure(adapter,
1443                                                 "INQUIRE FIRMWARE 3RD DIGIT");
1444         /*
1445            Issue the Inquire Host Adapter Model Number command.
1446          */
1447         if (ext_setupinfo.bus_type == 'A' && id.fw_ver_digit1 == '2')
1448                 /* BusLogic BT-542B ISA 2.xx */
1449                 strcpy(model, "542B");
1450         else if (ext_setupinfo.bus_type == 'E' && id.fw_ver_digit1 == '2' &&
1451                         (id.fw_ver_digit2 <= '1' || (id.fw_ver_digit2 == '2' &&
1452                                                      fw_ver_digit3 == '0')))
1453                 /* BusLogic BT-742A EISA 2.1x or 2.20 */
1454                 strcpy(model, "742A");
1455         else if (ext_setupinfo.bus_type == 'E' && id.fw_ver_digit1 == '0')
1456                 /* AMI FastDisk EISA Series 441 0.x */
1457                 strcpy(model, "747A");
1458         else {
1459                 req_replylen = sizeof(model);
1460                 if (blogic_cmd(adapter, BLOGIC_INQ_MODELNO, &req_replylen,
1461                                         sizeof(req_replylen), &model,
1462                                         sizeof(model)) != sizeof(model))
1463                         return blogic_failure(adapter,
1464                                         "INQUIRE HOST ADAPTER MODEL NUMBER");
1465         }
1466         /*
1467            BusLogic MultiMaster Host Adapters can be identified by their
1468            model number and the major version number of their firmware
1469            as follows:
1470
1471            5.xx       BusLogic "W" Series Host Adapters:
1472            BT-948/958/958D
1473            4.xx       BusLogic "C" Series Host Adapters:
1474            BT-946C/956C/956CD/747C/757C/757CD/445C/545C/540CF
1475            3.xx       BusLogic "S" Series Host Adapters:
1476            BT-747S/747D/757S/757D/445S/545S/542D
1477            BT-542B/742A (revision H)
1478            2.xx       BusLogic "A" Series Host Adapters:
1479            BT-542B/742A (revision G and below)
1480            0.xx       AMI FastDisk VLB/EISA BusLogic Clone Host Adapter
1481          */
1482         /*
1483            Save the Model Name and Host Adapter Name in the Host Adapter
1484            structure.
1485          */
1486         tgt = adapter->model;
1487         *tgt++ = 'B';
1488         *tgt++ = 'T';
1489         *tgt++ = '-';
1490         for (i = 0; i < sizeof(model); i++) {
1491                 ch = model[i];
1492                 if (ch == ' ' || ch == '\0')
1493                         break;
1494                 *tgt++ = ch;
1495         }
1496         *tgt++ = '\0';
1497         /*
1498            Save the Firmware Version in the Host Adapter structure.
1499          */
1500         tgt = adapter->fw_ver;
1501         *tgt++ = id.fw_ver_digit1;
1502         *tgt++ = '.';
1503         *tgt++ = id.fw_ver_digit2;
1504         if (fw_ver_digit3 != ' ' && fw_ver_digit3 != '\0')
1505                 *tgt++ = fw_ver_digit3;
1506         *tgt = '\0';
1507         /*
1508            Issue the Inquire Firmware Version Letter command.
1509          */
1510         if (strcmp(adapter->fw_ver, "3.3") >= 0) {
1511                 if (blogic_cmd(adapter, BLOGIC_INQ_FWVER_LETTER, NULL, 0,
1512                                 &fw_ver_letter,
1513                                 sizeof(fw_ver_letter)) != sizeof(fw_ver_letter))
1514                         return blogic_failure(adapter,
1515                                         "INQUIRE FIRMWARE VERSION LETTER");
1516                 if (fw_ver_letter != ' ' && fw_ver_letter != '\0')
1517                         *tgt++ = fw_ver_letter;
1518                 *tgt = '\0';
1519         }
1520         /*
1521            Save the Host Adapter SCSI ID in the Host Adapter structure.
1522          */
1523         adapter->scsi_id = config.id;
1524         /*
1525            Determine the Bus Type and save it in the Host Adapter structure,
1526            determine and save the IRQ Channel if necessary, and determine
1527            and save the DMA Channel for ISA Host Adapters.
1528          */
1529         adapter->adapter_bus_type =
1530                         blogic_adater_bus_types[adapter->model[3] - '4'];
1531         if (adapter->irq_ch == 0) {
1532                 if (config.irq_ch9)
1533                         adapter->irq_ch = 9;
1534                 else if (config.irq_ch10)
1535                         adapter->irq_ch = 10;
1536                 else if (config.irq_ch11)
1537                         adapter->irq_ch = 11;
1538                 else if (config.irq_ch12)
1539                         adapter->irq_ch = 12;
1540                 else if (config.irq_ch14)
1541                         adapter->irq_ch = 14;
1542                 else if (config.irq_ch15)
1543                         adapter->irq_ch = 15;
1544         }
1545         if (adapter->adapter_bus_type == BLOGIC_ISA_BUS) {
1546                 if (config.dma_ch5)
1547                         adapter->dma_ch = 5;
1548                 else if (config.dma_ch6)
1549                         adapter->dma_ch = 6;
1550                 else if (config.dma_ch7)
1551                         adapter->dma_ch = 7;
1552         }
1553         /*
1554            Determine whether Extended Translation is enabled and save it in
1555            the Host Adapter structure.
1556          */
1557         georeg.all = blogic_rdgeom(adapter);
1558         adapter->ext_trans_enable = georeg.gr.ext_trans_enable;
1559         /*
1560            Save the Scatter Gather Limits, Level Sensitive Interrupt flag, Wide
1561            SCSI flag, Differential SCSI flag, SCAM Supported flag, and
1562            Ultra SCSI flag in the Host Adapter structure.
1563          */
1564         adapter->adapter_sglimit = ext_setupinfo.sg_limit;
1565         adapter->drvr_sglimit = adapter->adapter_sglimit;
1566         if (adapter->adapter_sglimit > BLOGIC_SG_LIMIT)
1567                 adapter->drvr_sglimit = BLOGIC_SG_LIMIT;
1568         if (ext_setupinfo.misc.level_int)
1569                 adapter->level_int = true;
1570         adapter->wide = ext_setupinfo.wide;
1571         adapter->differential = ext_setupinfo.differential;
1572         adapter->scam = ext_setupinfo.scam;
1573         adapter->ultra = ext_setupinfo.ultra;
1574         /*
1575            Determine whether Extended LUN Format CCBs are supported and save the
1576            information in the Host Adapter structure.
1577          */
1578         if (adapter->fw_ver[0] == '5' || (adapter->fw_ver[0] == '4' &&
1579                                 adapter->wide))
1580                 adapter->ext_lun = true;
1581         /*
1582            Issue the Inquire PCI Host Adapter Information command to read the
1583            Termination Information from "W" series MultiMaster Host Adapters.
1584          */
1585         if (adapter->fw_ver[0] == '5') {
1586                 if (blogic_cmd(adapter, BLOGIC_INQ_PCI_INFO, NULL, 0,
1587                                 &adapter_info,
1588                                 sizeof(adapter_info)) != sizeof(adapter_info))
1589                         return blogic_failure(adapter,
1590                                         "INQUIRE PCI HOST ADAPTER INFORMATION");
1591                 /*
1592                    Save the Termination Information in the Host Adapter
1593                    structure.
1594                  */
1595                 if (adapter_info.genericinfo_valid) {
1596                         adapter->terminfo_valid = true;
1597                         adapter->low_term = adapter_info.low_term;
1598                         adapter->high_term = adapter_info.high_term;
1599                 }
1600         }
1601         /*
1602            Issue the Fetch Host Adapter Local RAM command to read the
1603            AutoSCSI data from "W" and "C" series MultiMaster Host Adapters.
1604          */
1605         if (adapter->fw_ver[0] >= '4') {
1606                 fetch_localram.offset = BLOGIC_AUTOSCSI_BASE;
1607                 fetch_localram.count = sizeof(autoscsi);
1608                 if (blogic_cmd(adapter, BLOGIC_FETCH_LOCALRAM, &fetch_localram,
1609                                         sizeof(fetch_localram), &autoscsi,
1610                                         sizeof(autoscsi)) != sizeof(autoscsi))
1611                         return blogic_failure(adapter,
1612                                                 "FETCH HOST ADAPTER LOCAL RAM");
1613                 /*
1614                    Save the Parity Checking Enabled, Bus Reset Enabled,
1615                    and Termination Information in the Host Adapter structure.
1616                  */
1617                 adapter->parity = autoscsi.parity;
1618                 adapter->reset_enabled = autoscsi.reset_enabled;
1619                 if (adapter->fw_ver[0] == '4') {
1620                         adapter->terminfo_valid = true;
1621                         adapter->low_term = autoscsi.low_term;
1622                         adapter->high_term = autoscsi.high_term;
1623                 }
1624                 /*
1625                    Save the Wide Permitted, Fast Permitted, Synchronous
1626                    Permitted, Disconnect Permitted, Ultra Permitted, and
1627                    SCAM Information in the Host Adapter structure.
1628                  */
1629                 adapter->wide_ok = autoscsi.wide_ok;
1630                 adapter->fast_ok = autoscsi.fast_ok;
1631                 adapter->sync_ok = autoscsi.sync_ok;
1632                 adapter->discon_ok = autoscsi.discon_ok;
1633                 if (adapter->ultra)
1634                         adapter->ultra_ok = autoscsi.ultra_ok;
1635                 if (adapter->scam) {
1636                         adapter->scam_enabled = autoscsi.scam_enabled;
1637                         adapter->scam_lev2 = autoscsi.scam_lev2;
1638                 }
1639         }
1640         /*
1641            Initialize fields in the Host Adapter structure for "S" and "A"
1642            series MultiMaster Host Adapters.
1643          */
1644         if (adapter->fw_ver[0] < '4') {
1645                 if (setupinfo.sync) {
1646                         adapter->sync_ok = 0xFF;
1647                         if (adapter->adapter_bus_type == BLOGIC_EISA_BUS) {
1648                                 if (ext_setupinfo.misc.fast_on_eisa)
1649                                         adapter->fast_ok = 0xFF;
1650                                 if (strcmp(adapter->model, "BT-757") == 0)
1651                                         adapter->wide_ok = 0xFF;
1652                         }
1653                 }
1654                 adapter->discon_ok = 0xFF;
1655                 adapter->parity = setupinfo.parity;
1656                 adapter->reset_enabled = true;
1657         }
1658         /*
1659            Determine the maximum number of Target IDs and Logical Units
1660            supported by this driver for Wide and Narrow Host Adapters.
1661          */
1662         adapter->maxdev = (adapter->wide ? 16 : 8);
1663         adapter->maxlun = (adapter->ext_lun ? 32 : 8);
1664         /*
1665            Select appropriate values for the Mailbox Count, Driver Queue Depth,
1666            Initial CCBs, and Incremental CCBs variables based on whether
1667            or not Strict Round Robin Mode is supported.  If Strict Round
1668            Robin Mode is supported, then there is no performance degradation
1669            in using the maximum possible number of Outgoing and Incoming
1670            Mailboxes and allowing the Tagged and Untagged Queue Depths to
1671            determine the actual utilization.  If Strict Round Robin Mode is
1672            not supported, then the Host Adapter must scan all the Outgoing
1673            Mailboxes whenever an Outgoing Mailbox entry is made, which can
1674            cause a substantial performance penalty.  The host adapters
1675            actually have room to store the following number of CCBs
1676            internally; that is, they can internally queue and manage this
1677            many active commands on the SCSI bus simultaneously.  Performance
1678            measurements demonstrate that the Driver Queue Depth should be
1679            set to the Mailbox Count, rather than the Host Adapter Queue
1680            Depth (internal CCB capacity), as it is more efficient to have the
1681            queued commands waiting in Outgoing Mailboxes if necessary than
1682            to block the process in the higher levels of the SCSI Subsystem.
1683
1684            192          BT-948/958/958D
1685            100          BT-946C/956C/956CD/747C/757C/757CD/445C
1686            50   BT-545C/540CF
1687            30   BT-747S/747D/757S/757D/445S/545S/542D/542B/742A
1688          */
1689         if (adapter->fw_ver[0] == '5')
1690                 adapter->adapter_qdepth = 192;
1691         else if (adapter->fw_ver[0] == '4')
1692                 adapter->adapter_qdepth = (adapter->adapter_bus_type !=
1693                                                 BLOGIC_ISA_BUS ? 100 : 50);
1694         else
1695                 adapter->adapter_qdepth = 30;
1696         if (strcmp(adapter->fw_ver, "3.31") >= 0) {
1697                 adapter->strict_rr = true;
1698                 adapter->mbox_count = BLOGIC_MAX_MAILBOX;
1699         } else {
1700                 adapter->strict_rr = false;
1701                 adapter->mbox_count = 32;
1702         }
1703         adapter->drvr_qdepth = adapter->mbox_count;
1704         adapter->initccbs = 4 * BLOGIC_CCB_GRP_ALLOCSIZE;
1705         adapter->inc_ccbs = BLOGIC_CCB_GRP_ALLOCSIZE;
1706         /*
1707            Tagged Queuing support is available and operates properly on
1708            all "W" series MultiMaster Host Adapters, on "C" series
1709            MultiMaster Host Adapters with firmware version 4.22 and above,
1710            and on "S" series MultiMaster Host Adapters with firmware version
1711            3.35 and above.
1712          */
1713         adapter->tagq_ok = 0;
1714         switch (adapter->fw_ver[0]) {
1715         case '5':
1716                 adapter->tagq_ok = 0xFFFF;
1717                 break;
1718         case '4':
1719                 if (strcmp(adapter->fw_ver, "4.22") >= 0)
1720                         adapter->tagq_ok = 0xFFFF;
1721                 break;
1722         case '3':
1723                 if (strcmp(adapter->fw_ver, "3.35") >= 0)
1724                         adapter->tagq_ok = 0xFFFF;
1725                 break;
1726         }
1727         /*
1728            Determine the Host Adapter BIOS Address if the BIOS is enabled and
1729            save it in the Host Adapter structure.  The BIOS is disabled if the
1730            bios_addr is 0.
1731          */
1732         adapter->bios_addr = ext_setupinfo.bios_addr << 12;
1733         /*
1734            ISA Host Adapters require Bounce Buffers if there is more than
1735            16MB memory.
1736          */
1737         if (adapter->adapter_bus_type == BLOGIC_ISA_BUS &&
1738                         (void *) high_memory > (void *) MAX_DMA_ADDRESS)
1739                 adapter->need_bouncebuf = true;
1740         /*
1741            BusLogic BT-445S Host Adapters prior to board revision E have a
1742            hardware bug whereby when the BIOS is enabled, transfers to/from
1743            the same address range the BIOS occupies modulo 16MB are handled
1744            incorrectly.  Only properly functioning BT-445S Host Adapters
1745            have firmware version 3.37, so require that ISA Bounce Buffers
1746            be used for the buggy BT-445S models if there is more than 16MB
1747            memory.
1748          */
1749         if (adapter->bios_addr > 0 && strcmp(adapter->model, "BT-445S") == 0 &&
1750                         strcmp(adapter->fw_ver, "3.37") < 0 &&
1751                         (void *) high_memory > (void *) MAX_DMA_ADDRESS)
1752                 adapter->need_bouncebuf = true;
1753         /*
1754            Initialize parameters common to MultiMaster and FlashPoint
1755            Host Adapters.
1756          */
1757 common:
1758         /*
1759            Initialize the Host Adapter Full Model Name from the Model Name.
1760          */
1761         strcpy(adapter->full_model, "BusLogic ");
1762         strcat(adapter->full_model, adapter->model);
1763         /*
1764            Select an appropriate value for the Tagged Queue Depth either from a
1765            BusLogic Driver Options specification, or based on whether this Host
1766            Adapter requires that ISA Bounce Buffers be used.  The Tagged Queue
1767            Depth is left at 0 for automatic determination in
1768            BusLogic_SelectQueueDepths. Initialize the Untagged Queue Depth.
1769          */
1770         for (tgt_id = 0; tgt_id < BLOGIC_MAXDEV; tgt_id++) {
1771                 unsigned char qdepth = 0;
1772                 if (adapter->drvr_opts != NULL &&
1773                                 adapter->drvr_opts->qdepth[tgt_id] > 0)
1774                         qdepth = adapter->drvr_opts->qdepth[tgt_id];
1775                 else if (adapter->need_bouncebuf)
1776                         qdepth = BLOGIC_TAG_DEPTH_BB;
1777                 adapter->qdepth[tgt_id] = qdepth;
1778         }
1779         if (adapter->need_bouncebuf)
1780                 adapter->untag_qdepth = BLOGIC_UNTAG_DEPTH_BB;
1781         else
1782                 adapter->untag_qdepth = BLOGIC_UNTAG_DEPTH;
1783         if (adapter->drvr_opts != NULL)
1784                 adapter->common_qdepth = adapter->drvr_opts->common_qdepth;
1785         if (adapter->common_qdepth > 0 &&
1786                         adapter->common_qdepth < adapter->untag_qdepth)
1787                 adapter->untag_qdepth = adapter->common_qdepth;
1788         /*
1789            Tagged Queuing is only allowed if Disconnect/Reconnect is permitted.
1790            Therefore, mask the Tagged Queuing Permitted Default bits with the
1791            Disconnect/Reconnect Permitted bits.
1792          */
1793         adapter->tagq_ok &= adapter->discon_ok;
1794         /*
1795            Combine the default Tagged Queuing Permitted bits with any
1796            BusLogic Driver Options Tagged Queuing specification.
1797          */
1798         if (adapter->drvr_opts != NULL)
1799                 adapter->tagq_ok = (adapter->drvr_opts->tagq_ok &
1800                                 adapter->drvr_opts->tagq_ok_mask) |
1801                         (adapter->tagq_ok & ~adapter->drvr_opts->tagq_ok_mask);
1802
1803         /*
1804            Select an appropriate value for Bus Settle Time either from a
1805            BusLogic Driver Options specification, or from
1806            BLOGIC_BUS_SETTLE_TIME.
1807          */
1808         if (adapter->drvr_opts != NULL &&
1809                         adapter->drvr_opts->bus_settle_time > 0)
1810                 adapter->bus_settle_time = adapter->drvr_opts->bus_settle_time;
1811         else
1812                 adapter->bus_settle_time = BLOGIC_BUS_SETTLE_TIME;
1813         /*
1814            Indicate reading the Host Adapter Configuration completed
1815            successfully.
1816          */
1817         return true;
1818 }
1819
1820
1821 /*
1822   blogic_reportconfig reports the configuration of Host Adapter.
1823 */
1824
1825 static bool __init blogic_reportconfig(struct blogic_adapter *adapter)
1826 {
1827         unsigned short alltgt_mask = (1 << adapter->maxdev) - 1;
1828         unsigned short sync_ok, fast_ok;
1829         unsigned short ultra_ok, wide_ok;
1830         unsigned short discon_ok, tagq_ok;
1831         bool common_syncneg, common_tagq_depth;
1832         char syncstr[BLOGIC_MAXDEV + 1];
1833         char widestr[BLOGIC_MAXDEV + 1];
1834         char discon_str[BLOGIC_MAXDEV + 1];
1835         char tagq_str[BLOGIC_MAXDEV + 1];
1836         char *syncmsg = syncstr;
1837         char *widemsg = widestr;
1838         char *discon_msg = discon_str;
1839         char *tagq_msg = tagq_str;
1840         int tgt_id;
1841
1842         blogic_info("Configuring BusLogic Model %s %s%s%s%s SCSI Host Adapter\n", adapter, adapter->model, blogic_adapter_busnames[adapter->adapter_bus_type], (adapter->wide ? " Wide" : ""), (adapter->differential ? " Differential" : ""), (adapter->ultra ? " Ultra" : ""));
1843         blogic_info("  Firmware Version: %s, I/O Address: 0x%X, " "IRQ Channel: %d/%s\n", adapter, adapter->fw_ver, adapter->io_addr, adapter->irq_ch, (adapter->level_int ? "Level" : "Edge"));
1844         if (adapter->adapter_bus_type != BLOGIC_PCI_BUS) {
1845                 blogic_info("  DMA Channel: ", adapter);
1846                 if (adapter->dma_ch > 0)
1847                         blogic_info("%d, ", adapter, adapter->dma_ch);
1848                 else
1849                         blogic_info("None, ", adapter);
1850                 if (adapter->bios_addr > 0)
1851                         blogic_info("BIOS Address: 0x%X, ", adapter,
1852                                         adapter->bios_addr);
1853                 else
1854                         blogic_info("BIOS Address: None, ", adapter);
1855         } else {
1856                 blogic_info("  PCI Bus: %d, Device: %d, Address: ", adapter,
1857                                 adapter->bus, adapter->dev);
1858                 if (adapter->pci_addr > 0)
1859                         blogic_info("0x%X, ", adapter, adapter->pci_addr);
1860                 else
1861                         blogic_info("Unassigned, ", adapter);
1862         }
1863         blogic_info("Host Adapter SCSI ID: %d\n", adapter, adapter->scsi_id);
1864         blogic_info("  Parity Checking: %s, Extended Translation: %s\n",
1865                         adapter, (adapter->parity ? "Enabled" : "Disabled"),
1866                         (adapter->ext_trans_enable ? "Enabled" : "Disabled"));
1867         alltgt_mask &= ~(1 << adapter->scsi_id);
1868         sync_ok = adapter->sync_ok & alltgt_mask;
1869         fast_ok = adapter->fast_ok & alltgt_mask;
1870         ultra_ok = adapter->ultra_ok & alltgt_mask;
1871         if ((blogic_multimaster_type(adapter) &&
1872                         (adapter->fw_ver[0] >= '4' ||
1873                          adapter->adapter_bus_type == BLOGIC_EISA_BUS)) ||
1874                         blogic_flashpoint_type(adapter)) {
1875                 common_syncneg = false;
1876                 if (sync_ok == 0) {
1877                         syncmsg = "Disabled";
1878                         common_syncneg = true;
1879                 } else if (sync_ok == alltgt_mask) {
1880                         if (fast_ok == 0) {
1881                                 syncmsg = "Slow";
1882                                 common_syncneg = true;
1883                         } else if (fast_ok == alltgt_mask) {
1884                                 if (ultra_ok == 0) {
1885                                         syncmsg = "Fast";
1886                                         common_syncneg = true;
1887                                 } else if (ultra_ok == alltgt_mask) {
1888                                         syncmsg = "Ultra";
1889                                         common_syncneg = true;
1890                                 }
1891                         }
1892                 }
1893                 if (!common_syncneg) {
1894                         for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
1895                                 syncstr[tgt_id] = ((!(sync_ok & (1 << tgt_id))) ? 'N' : (!(fast_ok & (1 << tgt_id)) ? 'S' : (!(ultra_ok & (1 << tgt_id)) ? 'F' : 'U')));
1896                         syncstr[adapter->scsi_id] = '#';
1897                         syncstr[adapter->maxdev] = '\0';
1898                 }
1899         } else
1900                 syncmsg = (sync_ok == 0 ? "Disabled" : "Enabled");
1901         wide_ok = adapter->wide_ok & alltgt_mask;
1902         if (wide_ok == 0)
1903                 widemsg = "Disabled";
1904         else if (wide_ok == alltgt_mask)
1905                 widemsg = "Enabled";
1906         else {
1907                 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
1908                         widestr[tgt_id] = ((wide_ok & (1 << tgt_id)) ? 'Y' : 'N');
1909                 widestr[adapter->scsi_id] = '#';
1910                 widestr[adapter->maxdev] = '\0';
1911         }
1912         discon_ok = adapter->discon_ok & alltgt_mask;
1913         if (discon_ok == 0)
1914                 discon_msg = "Disabled";
1915         else if (discon_ok == alltgt_mask)
1916                 discon_msg = "Enabled";
1917         else {
1918                 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
1919                         discon_str[tgt_id] = ((discon_ok & (1 << tgt_id)) ? 'Y' : 'N');
1920                 discon_str[adapter->scsi_id] = '#';
1921                 discon_str[adapter->maxdev] = '\0';
1922         }
1923         tagq_ok = adapter->tagq_ok & alltgt_mask;
1924         if (tagq_ok == 0)
1925                 tagq_msg = "Disabled";
1926         else if (tagq_ok == alltgt_mask)
1927                 tagq_msg = "Enabled";
1928         else {
1929                 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
1930                         tagq_str[tgt_id] = ((tagq_ok & (1 << tgt_id)) ? 'Y' : 'N');
1931                 tagq_str[adapter->scsi_id] = '#';
1932                 tagq_str[adapter->maxdev] = '\0';
1933         }
1934         blogic_info("  Synchronous Negotiation: %s, Wide Negotiation: %s\n",
1935                         adapter, syncmsg, widemsg);
1936         blogic_info("  Disconnect/Reconnect: %s, Tagged Queuing: %s\n", adapter,
1937                         discon_msg, tagq_msg);
1938         if (blogic_multimaster_type(adapter)) {
1939                 blogic_info("  Scatter/Gather Limit: %d of %d segments, " "Mailboxes: %d\n", adapter, adapter->drvr_sglimit, adapter->adapter_sglimit, adapter->mbox_count);
1940                 blogic_info("  Driver Queue Depth: %d, " "Host Adapter Queue Depth: %d\n", adapter, adapter->drvr_qdepth, adapter->adapter_qdepth);
1941         } else
1942                 blogic_info("  Driver Queue Depth: %d, " "Scatter/Gather Limit: %d segments\n", adapter, adapter->drvr_qdepth, adapter->drvr_sglimit);
1943         blogic_info("  Tagged Queue Depth: ", adapter);
1944         common_tagq_depth = true;
1945         for (tgt_id = 1; tgt_id < adapter->maxdev; tgt_id++)
1946                 if (adapter->qdepth[tgt_id] != adapter->qdepth[0]) {
1947                         common_tagq_depth = false;
1948                         break;
1949                 }
1950         if (common_tagq_depth) {
1951                 if (adapter->qdepth[0] > 0)
1952                         blogic_info("%d", adapter, adapter->qdepth[0]);
1953                 else
1954                         blogic_info("Automatic", adapter);
1955         } else
1956                 blogic_info("Individual", adapter);
1957         blogic_info(", Untagged Queue Depth: %d\n", adapter,
1958                         adapter->untag_qdepth);
1959         if (adapter->terminfo_valid) {
1960                 if (adapter->wide)
1961                         blogic_info("  SCSI Bus Termination: %s", adapter,
1962                                 (adapter->low_term ? (adapter->high_term ? "Both Enabled" : "Low Enabled") : (adapter->high_term ? "High Enabled" : "Both Disabled")));
1963                 else
1964                         blogic_info("  SCSI Bus Termination: %s", adapter,
1965                                 (adapter->low_term ? "Enabled" : "Disabled"));
1966                 if (adapter->scam)
1967                         blogic_info(", SCAM: %s", adapter,
1968                                 (adapter->scam_enabled ? (adapter->scam_lev2 ? "Enabled, Level 2" : "Enabled, Level 1") : "Disabled"));
1969                 blogic_info("\n", adapter);
1970         }
1971         /*
1972            Indicate reporting the Host Adapter configuration completed
1973            successfully.
1974          */
1975         return true;
1976 }
1977
1978
1979 /*
1980   blogic_getres acquires the system resources necessary to use
1981   Host Adapter.
1982 */
1983
1984 static bool __init blogic_getres(struct blogic_adapter *adapter)
1985 {
1986         if (adapter->irq_ch == 0) {
1987                 blogic_err("NO LEGAL INTERRUPT CHANNEL ASSIGNED - DETACHING\n",
1988                                 adapter);
1989                 return false;
1990         }
1991         /*
1992            Acquire shared access to the IRQ Channel.
1993          */
1994         if (request_irq(adapter->irq_ch, blogic_inthandler, IRQF_SHARED,
1995                                 adapter->full_model, adapter) < 0) {
1996                 blogic_err("UNABLE TO ACQUIRE IRQ CHANNEL %d - DETACHING\n",
1997                                 adapter, adapter->irq_ch);
1998                 return false;
1999         }
2000         adapter->irq_acquired = true;
2001         /*
2002            Acquire exclusive access to the DMA Channel.
2003          */
2004         if (adapter->dma_ch > 0) {
2005                 if (request_dma(adapter->dma_ch, adapter->full_model) < 0) {
2006                         blogic_err("UNABLE TO ACQUIRE DMA CHANNEL %d - DETACHING\n", adapter, adapter->dma_ch);
2007                         return false;
2008                 }
2009                 set_dma_mode(adapter->dma_ch, DMA_MODE_CASCADE);
2010                 enable_dma(adapter->dma_ch);
2011                 adapter->dma_chan_acquired = true;
2012         }
2013         /*
2014            Indicate the System Resource Acquisition completed successfully,
2015          */
2016         return true;
2017 }
2018
2019
2020 /*
2021   blogic_relres releases any system resources previously acquired
2022   by blogic_getres.
2023 */
2024
2025 static void blogic_relres(struct blogic_adapter *adapter)
2026 {
2027         /*
2028            Release shared access to the IRQ Channel.
2029          */
2030         if (adapter->irq_acquired)
2031                 free_irq(adapter->irq_ch, adapter);
2032         /*
2033            Release exclusive access to the DMA Channel.
2034          */
2035         if (adapter->dma_chan_acquired)
2036                 free_dma(adapter->dma_ch);
2037         /*
2038            Release any allocated memory structs not released elsewhere
2039          */
2040         if (adapter->mbox_space)
2041                 pci_free_consistent(adapter->pci_device, adapter->mbox_sz,
2042                         adapter->mbox_space, adapter->mbox_space_handle);
2043         pci_dev_put(adapter->pci_device);
2044         adapter->mbox_space = NULL;
2045         adapter->mbox_space_handle = 0;
2046         adapter->mbox_sz = 0;
2047 }
2048
2049
2050 /*
2051   blogic_initadapter initializes Host Adapter.  This is the only
2052   function called during SCSI Host Adapter detection which modifies the state
2053   of the Host Adapter from its initial power on or hard reset state.
2054 */
2055
2056 static bool blogic_initadapter(struct blogic_adapter *adapter)
2057 {
2058         struct blogic_extmbox_req extmbox_req;
2059         enum blogic_rr_req rr_req;
2060         enum blogic_setccb_fmt setccb_fmt;
2061         int tgt_id;
2062
2063         /*
2064            Initialize the pointers to the first and last CCBs that are
2065            queued for completion processing.
2066          */
2067         adapter->firstccb = NULL;
2068         adapter->lastccb = NULL;
2069
2070         /*
2071            Initialize the Bus Device Reset Pending CCB, Tagged Queuing Active,
2072            Command Successful Flag, Active Commands, and Commands Since Reset
2073            for each Target Device.
2074          */
2075         for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) {
2076                 adapter->bdr_pend[tgt_id] = NULL;
2077                 adapter->tgt_flags[tgt_id].tagq_active = false;
2078                 adapter->tgt_flags[tgt_id].cmd_good = false;
2079                 adapter->active_cmds[tgt_id] = 0;
2080                 adapter->cmds_since_rst[tgt_id] = 0;
2081         }
2082
2083         /*
2084            FlashPoint Host Adapters do not use Outgoing and Incoming Mailboxes.
2085          */
2086         if (blogic_flashpoint_type(adapter))
2087                 goto done;
2088
2089         /*
2090            Initialize the Outgoing and Incoming Mailbox pointers.
2091          */
2092         adapter->mbox_sz = adapter->mbox_count * (sizeof(struct blogic_outbox) + sizeof(struct blogic_inbox));
2093         adapter->mbox_space = pci_alloc_consistent(adapter->pci_device,
2094                                 adapter->mbox_sz, &adapter->mbox_space_handle);
2095         if (adapter->mbox_space == NULL)
2096                 return blogic_failure(adapter, "MAILBOX ALLOCATION");
2097         adapter->first_outbox = (struct blogic_outbox *) adapter->mbox_space;
2098         adapter->last_outbox = adapter->first_outbox + adapter->mbox_count - 1;
2099         adapter->next_outbox = adapter->first_outbox;
2100         adapter->first_inbox = (struct blogic_inbox *) (adapter->last_outbox + 1);
2101         adapter->last_inbox = adapter->first_inbox + adapter->mbox_count - 1;
2102         adapter->next_inbox = adapter->first_inbox;
2103
2104         /*
2105            Initialize the Outgoing and Incoming Mailbox structures.
2106          */
2107         memset(adapter->first_outbox, 0,
2108                         adapter->mbox_count * sizeof(struct blogic_outbox));
2109         memset(adapter->first_inbox, 0,
2110                         adapter->mbox_count * sizeof(struct blogic_inbox));
2111
2112         /*
2113            Initialize the Host Adapter's Pointer to the Outgoing/Incoming
2114            Mailboxes.
2115          */
2116         extmbox_req.mbox_count = adapter->mbox_count;
2117         extmbox_req.base_mbox_addr = (u32) adapter->mbox_space_handle;
2118         if (blogic_cmd(adapter, BLOGIC_INIT_EXT_MBOX, &extmbox_req,
2119                                 sizeof(extmbox_req), NULL, 0) < 0)
2120                 return blogic_failure(adapter, "MAILBOX INITIALIZATION");
2121         /*
2122            Enable Strict Round Robin Mode if supported by the Host Adapter. In
2123            Strict Round Robin Mode, the Host Adapter only looks at the next
2124            Outgoing Mailbox for each new command, rather than scanning
2125            through all the Outgoing Mailboxes to find any that have new
2126            commands in them.  Strict Round Robin Mode is significantly more
2127            efficient.
2128          */
2129         if (adapter->strict_rr) {
2130                 rr_req = BLOGIC_STRICT_RR_MODE;
2131                 if (blogic_cmd(adapter, BLOGIC_STRICT_RR, &rr_req,
2132                                         sizeof(rr_req), NULL, 0) < 0)
2133                         return blogic_failure(adapter,
2134                                         "ENABLE STRICT ROUND ROBIN MODE");
2135         }
2136
2137         /*
2138            For Host Adapters that support Extended LUN Format CCBs, issue the
2139            Set CCB Format command to allow 32 Logical Units per Target Device.
2140          */
2141         if (adapter->ext_lun) {
2142                 setccb_fmt = BLOGIC_EXT_LUN_CCB;
2143                 if (blogic_cmd(adapter, BLOGIC_SETCCB_FMT, &setccb_fmt,
2144                                         sizeof(setccb_fmt), NULL, 0) < 0)
2145                         return blogic_failure(adapter, "SET CCB FORMAT");
2146         }
2147
2148         /*
2149            Announce Successful Initialization.
2150          */
2151 done:
2152         if (!adapter->adapter_initd) {
2153                 blogic_info("*** %s Initialized Successfully ***\n", adapter,
2154                                 adapter->full_model);
2155                 blogic_info("\n", adapter);
2156         } else
2157                 blogic_warn("*** %s Initialized Successfully ***\n", adapter,
2158                                 adapter->full_model);
2159         adapter->adapter_initd = true;
2160
2161         /*
2162            Indicate the Host Adapter Initialization completed successfully.
2163          */
2164         return true;
2165 }
2166
2167
2168 /*
2169   blogic_inquiry inquires about the Target Devices accessible
2170   through Host Adapter.
2171 */
2172
2173 static bool __init blogic_inquiry(struct blogic_adapter *adapter)
2174 {
2175         u16 installed_devs;
2176         u8 installed_devs0to7[8];
2177         struct blogic_setup_info setupinfo;
2178         u8 sync_period[BLOGIC_MAXDEV];
2179         unsigned char req_replylen;
2180         int tgt_id;
2181
2182         /*
2183            Wait a few seconds between the Host Adapter Hard Reset which
2184            initiates a SCSI Bus Reset and issuing any SCSI Commands. Some
2185            SCSI devices get confused if they receive SCSI Commands too soon
2186            after a SCSI Bus Reset.
2187          */
2188         blogic_delay(adapter->bus_settle_time);
2189         /*
2190            FlashPoint Host Adapters do not provide for Target Device Inquiry.
2191          */
2192         if (blogic_flashpoint_type(adapter))
2193                 return true;
2194         /*
2195            Inhibit the Target Device Inquiry if requested.
2196          */
2197         if (adapter->drvr_opts != NULL && adapter->drvr_opts->stop_tgt_inquiry)
2198                 return true;
2199         /*
2200            Issue the Inquire Target Devices command for host adapters with
2201            firmware version 4.25 or later, or the Inquire Installed Devices
2202            ID 0 to 7 command for older host adapters.  This is necessary to
2203            force Synchronous Transfer Negotiation so that the Inquire Setup
2204            Information and Inquire Synchronous Period commands will return
2205            valid data.  The Inquire Target Devices command is preferable to
2206            Inquire Installed Devices ID 0 to 7 since it only probes Logical
2207            Unit 0 of each Target Device.
2208          */
2209         if (strcmp(adapter->fw_ver, "4.25") >= 0) {
2210
2211                 /*
2212                    Issue a Inquire Target Devices command. Inquire Target
2213                    Devices only tests Logical Unit 0 of each Target Device
2214                    unlike the Inquire Installed Devices commands which test
2215                    Logical Units 0 - 7.  Two bytes are returned, where byte
2216                    0 bit 0 set indicates that Target Device 0 exists, and so on.
2217                  */
2218
2219                 if (blogic_cmd(adapter, BLOGIC_INQ_DEV, NULL, 0,
2220                                         &installed_devs, sizeof(installed_devs))
2221                     != sizeof(installed_devs))
2222                         return blogic_failure(adapter, "INQUIRE TARGET DEVICES");
2223                 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2224                         adapter->tgt_flags[tgt_id].tgt_exists =
2225                                 (installed_devs & (1 << tgt_id) ? true : false);
2226         } else {
2227
2228                 /*
2229                    Issue an Inquire Installed Devices command. For each
2230                    Target Device, a byte is returned where bit 0 set
2231                    indicates that Logical Unit 0 * exists, bit 1 set
2232                    indicates that Logical Unit 1 exists, and so on.
2233                  */
2234
2235                 if (blogic_cmd(adapter, BLOGIC_INQ_DEV0TO7, NULL, 0,
2236                                 &installed_devs0to7, sizeof(installed_devs0to7))
2237                     != sizeof(installed_devs0to7))
2238                         return blogic_failure(adapter,
2239                                         "INQUIRE INSTALLED DEVICES ID 0 TO 7");
2240                 for (tgt_id = 0; tgt_id < 8; tgt_id++)
2241                         adapter->tgt_flags[tgt_id].tgt_exists =
2242                                 (installed_devs0to7[tgt_id] != 0 ? true : false);
2243         }
2244         /*
2245            Issue the Inquire Setup Information command.
2246          */
2247         req_replylen = sizeof(setupinfo);
2248         if (blogic_cmd(adapter, BLOGIC_INQ_SETUPINFO, &req_replylen,
2249                         sizeof(req_replylen), &setupinfo, sizeof(setupinfo))
2250             != sizeof(setupinfo))
2251                 return blogic_failure(adapter, "INQUIRE SETUP INFORMATION");
2252         for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2253                 adapter->sync_offset[tgt_id] = (tgt_id < 8 ? setupinfo.sync0to7[tgt_id].offset : setupinfo.sync8to15[tgt_id - 8].offset);
2254         if (strcmp(adapter->fw_ver, "5.06L") >= 0)
2255                 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2256                         adapter->tgt_flags[tgt_id].wide_active = (tgt_id < 8 ? (setupinfo.wide_tx_active0to7 & (1 << tgt_id) ? true : false) : (setupinfo.wide_tx_active8to15 & (1 << (tgt_id - 8)) ? true : false));
2257         /*
2258            Issue the Inquire Synchronous Period command.
2259          */
2260         if (adapter->fw_ver[0] >= '3') {
2261
2262                 /* Issue a Inquire Synchronous Period command. For each
2263                    Target Device, a byte is returned which represents the
2264                    Synchronous Transfer Period in units of 10 nanoseconds.
2265                  */
2266
2267                 req_replylen = sizeof(sync_period);
2268                 if (blogic_cmd(adapter, BLOGIC_INQ_SYNC_PERIOD, &req_replylen,
2269                                 sizeof(req_replylen), &sync_period,
2270                                 sizeof(sync_period)) != sizeof(sync_period))
2271                         return blogic_failure(adapter,
2272                                         "INQUIRE SYNCHRONOUS PERIOD");
2273                 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2274                         adapter->sync_period[tgt_id] = sync_period[tgt_id];
2275         } else
2276                 for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2277                         if (setupinfo.sync0to7[tgt_id].offset > 0)
2278                                 adapter->sync_period[tgt_id] = 20 + 5 * setupinfo.sync0to7[tgt_id].tx_period;
2279         /*
2280            Indicate the Target Device Inquiry completed successfully.
2281          */
2282         return true;
2283 }
2284
2285 /*
2286   blogic_inithoststruct initializes the fields in the SCSI Host
2287   structure.  The base, io_port, n_io_ports, irq, and dma_channel fields in the
2288   SCSI Host structure are intentionally left uninitialized, as this driver
2289   handles acquisition and release of these resources explicitly, as well as
2290   ensuring exclusive access to the Host Adapter hardware and data structures
2291   through explicit acquisition and release of the Host Adapter's Lock.
2292 */
2293
2294 static void __init blogic_inithoststruct(struct blogic_adapter *adapter,
2295                 struct Scsi_Host *host)
2296 {
2297         host->max_id = adapter->maxdev;
2298         host->max_lun = adapter->maxlun;
2299         host->max_channel = 0;
2300         host->unique_id = adapter->io_addr;
2301         host->this_id = adapter->scsi_id;
2302         host->can_queue = adapter->drvr_qdepth;
2303         host->sg_tablesize = adapter->drvr_sglimit;
2304         host->unchecked_isa_dma = adapter->need_bouncebuf;
2305         host->cmd_per_lun = adapter->untag_qdepth;
2306 }
2307
2308 /*
2309   blogic_slaveconfig will actually set the queue depth on individual
2310   scsi devices as they are permanently added to the device chain.  We
2311   shamelessly rip off the SelectQueueDepths code to make this work mostly
2312   like it used to.  Since we don't get called once at the end of the scan
2313   but instead get called for each device, we have to do things a bit
2314   differently.
2315 */
2316 static int blogic_slaveconfig(struct scsi_device *dev)
2317 {
2318         struct blogic_adapter *adapter =
2319                 (struct blogic_adapter *) dev->host->hostdata;
2320         int tgt_id = dev->id;
2321         int qdepth = adapter->qdepth[tgt_id];
2322
2323         if (adapter->tgt_flags[tgt_id].tagq_ok &&
2324                         (adapter->tagq_ok & (1 << tgt_id))) {
2325                 if (qdepth == 0)
2326                         qdepth = BLOGIC_MAX_AUTO_TAG_DEPTH;
2327                 adapter->qdepth[tgt_id] = qdepth;
2328                 scsi_adjust_queue_depth(dev, MSG_SIMPLE_TAG, qdepth);
2329         } else {
2330                 adapter->tagq_ok &= ~(1 << tgt_id);
2331                 qdepth = adapter->untag_qdepth;
2332                 adapter->qdepth[tgt_id] = qdepth;
2333                 scsi_adjust_queue_depth(dev, 0, qdepth);
2334         }
2335         qdepth = 0;
2336         for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++)
2337                 if (adapter->tgt_flags[tgt_id].tgt_exists)
2338                         qdepth += adapter->qdepth[tgt_id];
2339         if (qdepth > adapter->alloc_ccbs)
2340                 blogic_create_addlccbs(adapter, qdepth - adapter->alloc_ccbs,
2341                                 false);
2342         return 0;
2343 }
2344
2345 /*
2346   blogic_init probes for BusLogic Host Adapters at the standard
2347   I/O Addresses where they may be located, initializing, registering, and
2348   reporting the configuration of each BusLogic Host Adapter it finds.  It
2349   returns the number of BusLogic Host Adapters successfully initialized and
2350   registered.
2351 */
2352
2353 static int __init blogic_init(void)
2354 {
2355         int adapter_count = 0, drvr_optindex = 0, probeindex;
2356         struct blogic_adapter *adapter;
2357         int ret = 0;
2358
2359 #ifdef MODULE
2360         if (BusLogic)
2361                 blogic_setup(BusLogic);
2362 #endif
2363
2364         if (blogic_probe_options.noprobe)
2365                 return -ENODEV;
2366         blogic_probeinfo_list =
2367             kzalloc(BLOGIC_MAX_ADAPTERS * sizeof(struct blogic_probeinfo),
2368                             GFP_KERNEL);
2369         if (blogic_probeinfo_list == NULL) {
2370                 blogic_err("BusLogic: Unable to allocate Probe Info List\n",
2371                                 NULL);
2372                 return -ENOMEM;
2373         }
2374
2375         adapter = kzalloc(sizeof(struct blogic_adapter), GFP_KERNEL);
2376         if (adapter == NULL) {
2377                 kfree(blogic_probeinfo_list);
2378                 blogic_err("BusLogic: Unable to allocate Prototype Host Adapter\n", NULL);
2379                 return -ENOMEM;
2380         }
2381
2382 #ifdef MODULE
2383         if (BusLogic != NULL)
2384                 blogic_setup(BusLogic);
2385 #endif
2386         blogic_init_probeinfo_list(adapter);
2387         for (probeindex = 0; probeindex < blogic_probeinfo_count; probeindex++) {
2388                 struct blogic_probeinfo *probeinfo =
2389                         &blogic_probeinfo_list[probeindex];
2390                 struct blogic_adapter *myadapter = adapter;
2391                 struct Scsi_Host *host;
2392
2393                 if (probeinfo->io_addr == 0)
2394                         continue;
2395                 memset(myadapter, 0, sizeof(struct blogic_adapter));
2396                 myadapter->adapter_type = probeinfo->adapter_type;
2397                 myadapter->adapter_bus_type = probeinfo->adapter_bus_type;
2398                 myadapter->io_addr = probeinfo->io_addr;
2399                 myadapter->pci_addr = probeinfo->pci_addr;
2400                 myadapter->bus = probeinfo->bus;
2401                 myadapter->dev = probeinfo->dev;
2402                 myadapter->pci_device = probeinfo->pci_device;
2403                 myadapter->irq_ch = probeinfo->irq_ch;
2404                 myadapter->addr_count =
2405                         blogic_adapter_addr_count[myadapter->adapter_type];
2406
2407                 /*
2408                    Make sure region is free prior to probing.
2409                  */
2410                 if (!request_region(myadapter->io_addr, myadapter->addr_count,
2411                                         "BusLogic"))
2412                         continue;
2413                 /*
2414                    Probe the Host Adapter. If unsuccessful, abort further
2415                    initialization.
2416                  */
2417                 if (!blogic_probe(myadapter)) {
2418                         release_region(myadapter->io_addr,
2419                                         myadapter->addr_count);
2420                         continue;
2421                 }
2422                 /*
2423                    Hard Reset the Host Adapter.  If unsuccessful, abort further
2424                    initialization.
2425                  */
2426                 if (!blogic_hwreset(myadapter, true)) {
2427                         release_region(myadapter->io_addr,
2428                                         myadapter->addr_count);
2429                         continue;
2430                 }
2431                 /*
2432                    Check the Host Adapter.  If unsuccessful, abort further
2433                    initialization.
2434                  */
2435                 if (!blogic_checkadapter(myadapter)) {
2436                         release_region(myadapter->io_addr,
2437                                         myadapter->addr_count);
2438                         continue;
2439                 }
2440                 /*
2441                    Initialize the Driver Options field if provided.
2442                  */
2443                 if (drvr_optindex < blogic_drvr_options_count)
2444                         myadapter->drvr_opts =
2445                                 &blogic_drvr_options[drvr_optindex++];
2446                 /*
2447                    Announce the Driver Version and Date, Author's Name,
2448                    Copyright Notice, and Electronic Mail Address.
2449                  */
2450                 blogic_announce_drvr(myadapter);
2451                 /*
2452                    Register the SCSI Host structure.
2453                  */
2454
2455                 host = scsi_host_alloc(&blogic_template,
2456                                 sizeof(struct blogic_adapter));
2457                 if (host == NULL) {
2458                         release_region(myadapter->io_addr,
2459                                         myadapter->addr_count);
2460                         continue;
2461                 }
2462                 myadapter = (struct blogic_adapter *) host->hostdata;
2463                 memcpy(myadapter, adapter, sizeof(struct blogic_adapter));
2464                 myadapter->scsi_host = host;
2465                 myadapter->host_no = host->host_no;
2466                 /*
2467                    Add Host Adapter to the end of the list of registered
2468                    BusLogic Host Adapters.
2469                  */
2470                 list_add_tail(&myadapter->host_list, &blogic_host_list);
2471
2472                 /*
2473                    Read the Host Adapter Configuration, Configure the Host
2474                    Adapter, Acquire the System Resources necessary to use
2475                    the Host Adapter, then Create the Initial CCBs, Initialize
2476                    the Host Adapter, and finally perform Target Device
2477                    Inquiry. From this point onward, any failure will be
2478                    assumed to be due to a problem with the Host Adapter,
2479                    rather than due to having mistakenly identified this port
2480                    as belonging to a BusLogic Host Adapter. The I/O Address
2481                    range will not be released, thereby preventing it from
2482                    being incorrectly identified as any other type of Host
2483                    Adapter.
2484                  */
2485                 if (blogic_rdconfig(myadapter) &&
2486                     blogic_reportconfig(myadapter) &&
2487                     blogic_getres(myadapter) &&
2488                     blogic_create_initccbs(myadapter) &&
2489                     blogic_initadapter(myadapter) &&
2490                     blogic_inquiry(myadapter)) {
2491                         /*
2492                            Initialization has been completed successfully.
2493                            Release and re-register usage of the I/O Address
2494                            range so that the Model Name of the Host Adapter
2495                            will appear, and initialize the SCSI Host structure.
2496                          */
2497                         release_region(myadapter->io_addr,
2498                                        myadapter->addr_count);
2499                         if (!request_region(myadapter->io_addr,
2500                                             myadapter->addr_count,
2501                                             myadapter->full_model)) {
2502                                 printk(KERN_WARNING
2503                                         "BusLogic: Release and re-register of "
2504                                         "port 0x%04lx failed \n",
2505                                         (unsigned long)myadapter->io_addr);
2506                                 blogic_destroy_ccbs(myadapter);
2507                                 blogic_relres(myadapter);
2508                                 list_del(&myadapter->host_list);
2509                                 scsi_host_put(host);
2510                                 ret = -ENOMEM;
2511                         } else {
2512                                 blogic_inithoststruct(myadapter,
2513                                                                  host);
2514                                 if (scsi_add_host(host, myadapter->pci_device
2515                                                 ? &myadapter->pci_device->dev
2516                                                   : NULL)) {
2517                                         printk(KERN_WARNING
2518                                                "BusLogic: scsi_add_host()"
2519                                                "failed!\n");
2520                                         blogic_destroy_ccbs(myadapter);
2521                                         blogic_relres(myadapter);
2522                                         list_del(&myadapter->host_list);
2523                                         scsi_host_put(host);
2524                                         ret = -ENODEV;
2525                                 } else {
2526                                         scsi_scan_host(host);
2527                                         adapter_count++;
2528                                 }
2529                         }
2530                 } else {
2531                         /*
2532                            An error occurred during Host Adapter Configuration
2533                            Querying, Host Adapter Configuration, Resource
2534                            Acquisition, CCB Creation, Host Adapter
2535                            Initialization, or Target Device Inquiry, so
2536                            remove Host Adapter from the list of registered
2537                            BusLogic Host Adapters, destroy the CCBs, Release
2538                            the System Resources, and Unregister the SCSI
2539                            Host.
2540                          */
2541                         blogic_destroy_ccbs(myadapter);
2542                         blogic_relres(myadapter);
2543                         list_del(&myadapter->host_list);
2544                         scsi_host_put(host);
2545                         ret = -ENODEV;
2546                 }
2547         }
2548         kfree(adapter);
2549         kfree(blogic_probeinfo_list);
2550         blogic_probeinfo_list = NULL;
2551         return ret;
2552 }
2553
2554
2555 /*
2556   blogic_deladapter releases all resources previously acquired to
2557   support a specific Host Adapter, including the I/O Address range, and
2558   unregisters the BusLogic Host Adapter.
2559 */
2560
2561 static int __exit blogic_deladapter(struct blogic_adapter *adapter)
2562 {
2563         struct Scsi_Host *host = adapter->scsi_host;
2564
2565         scsi_remove_host(host);
2566
2567         /*
2568            FlashPoint Host Adapters must first be released by the FlashPoint
2569            SCCB Manager.
2570          */
2571         if (blogic_flashpoint_type(adapter))
2572                 FlashPoint_ReleaseHostAdapter(adapter->cardhandle);
2573         /*
2574            Destroy the CCBs and release any system resources acquired to
2575            support Host Adapter.
2576          */
2577         blogic_destroy_ccbs(adapter);
2578         blogic_relres(adapter);
2579         /*
2580            Release usage of the I/O Address range.
2581          */
2582         release_region(adapter->io_addr, adapter->addr_count);
2583         /*
2584            Remove Host Adapter from the list of registered BusLogic
2585            Host Adapters.
2586          */
2587         list_del(&adapter->host_list);
2588
2589         scsi_host_put(host);
2590         return 0;
2591 }
2592
2593
2594 /*
2595   blogic_qcompleted_ccb queues CCB for completion processing.
2596 */
2597
2598 static void blogic_qcompleted_ccb(struct blogic_ccb *ccb)
2599 {
2600         struct blogic_adapter *adapter = ccb->adapter;
2601
2602         ccb->status = BLOGIC_CCB_COMPLETE;
2603         ccb->next = NULL;
2604         if (adapter->firstccb == NULL) {
2605                 adapter->firstccb = ccb;
2606                 adapter->lastccb = ccb;
2607         } else {
2608                 adapter->lastccb->next = ccb;
2609                 adapter->lastccb = ccb;
2610         }
2611         adapter->active_cmds[ccb->tgt_id]--;
2612 }
2613
2614
2615 /*
2616   blogic_resultcode computes a SCSI Subsystem Result Code from
2617   the Host Adapter Status and Target Device Status.
2618 */
2619
2620 static int blogic_resultcode(struct blogic_adapter *adapter,
2621                 enum blogic_adapter_status adapter_status,
2622                 enum blogic_tgt_status tgt_status)
2623 {
2624         int hoststatus;
2625
2626         switch (adapter_status) {
2627         case BLOGIC_CMD_CMPLT_NORMAL:
2628         case BLOGIC_LINK_CMD_CMPLT:
2629         case BLOGIC_LINK_CMD_CMPLT_FLAG:
2630                 hoststatus = DID_OK;
2631                 break;
2632         case BLOGIC_SELECT_TIMEOUT:
2633                 hoststatus = DID_TIME_OUT;
2634                 break;
2635         case BLOGIC_INVALID_OUTBOX_CODE:
2636         case BLOGIC_INVALID_CMD_CODE:
2637         case BLOGIC_BAD_CMD_PARAM:
2638                 blogic_warn("BusLogic Driver Protocol Error 0x%02X\n",
2639                                 adapter, adapter_status);
2640         case BLOGIC_DATA_UNDERRUN:
2641         case BLOGIC_DATA_OVERRUN:
2642         case BLOGIC_NOEXPECT_BUSFREE:
2643         case BLOGIC_LINKCCB_BADLUN:
2644         case BLOGIC_AUTOREQSENSE_FAIL:
2645         case BLOGIC_TAGQUEUE_REJECT:
2646         case BLOGIC_BAD_MSG_RCVD:
2647         case BLOGIC_HW_FAIL:
2648         case BLOGIC_BAD_RECONNECT:
2649         case BLOGIC_ABRT_QUEUE:
2650         case BLOGIC_ADAPTER_SW_ERROR:
2651         case BLOGIC_HW_TIMEOUT:
2652         case BLOGIC_PARITY_ERR:
2653                 hoststatus = DID_ERROR;
2654                 break;
2655         case BLOGIC_INVALID_BUSPHASE:
2656         case BLOGIC_NORESPONSE_TO_ATN:
2657         case BLOGIC_HW_RESET:
2658         case BLOGIC_RST_FROM_OTHERDEV:
2659         case BLOGIC_HW_BDR:
2660                 hoststatus = DID_RESET;
2661                 break;
2662         default:
2663                 blogic_warn("Unknown Host Adapter Status 0x%02X\n", adapter,
2664                                 adapter_status);
2665                 hoststatus = DID_ERROR;
2666                 break;
2667         }
2668         return (hoststatus << 16) | tgt_status;
2669 }
2670
2671
2672 /*
2673   blogic_scan_inbox scans the Incoming Mailboxes saving any
2674   Incoming Mailbox entries for completion processing.
2675 */
2676
2677 static void blogic_scan_inbox(struct blogic_adapter *adapter)
2678 {
2679         /*
2680            Scan through the Incoming Mailboxes in Strict Round Robin
2681            fashion, saving any completed CCBs for further processing. It
2682            is essential that for each CCB and SCSI Command issued, command
2683            completion processing is performed exactly once.  Therefore,
2684            only Incoming Mailboxes with completion code Command Completed
2685            Without Error, Command Completed With Error, or Command Aborted
2686            At Host Request are saved for completion processing. When an
2687            Incoming Mailbox has a completion code of Aborted Command Not
2688            Found, the CCB had already completed or been aborted before the
2689            current Abort request was processed, and so completion processing
2690            has already occurred and no further action should be taken.
2691          */
2692         struct blogic_inbox *next_inbox = adapter->next_inbox;
2693         enum blogic_cmplt_code comp_code;
2694
2695         while ((comp_code = next_inbox->comp_code) != BLOGIC_INBOX_FREE) {
2696                 /*
2697                    We are only allowed to do this because we limit our
2698                    architectures we run on to machines where bus_to_virt(
2699                    actually works.  There *needs* to be a dma_addr_to_virt()
2700                    in the new PCI DMA mapping interface to replace
2701                    bus_to_virt() or else this code is going to become very
2702                    innefficient.
2703                  */
2704                 struct blogic_ccb *ccb =
2705                         (struct blogic_ccb *) bus_to_virt(next_inbox->ccb);
2706                 if (comp_code != BLOGIC_CMD_NOTFOUND) {
2707                         if (ccb->status == BLOGIC_CCB_ACTIVE ||
2708                                         ccb->status == BLOGIC_CCB_RESET) {
2709                                 /*
2710                                    Save the Completion Code for this CCB and
2711                                    queue the CCB for completion processing.
2712                                  */
2713                                 ccb->comp_code = comp_code;
2714                                 blogic_qcompleted_ccb(ccb);
2715                         } else {
2716                                 /*
2717                                    If a CCB ever appears in an Incoming Mailbox
2718                                    and is not marked as status Active or Reset,
2719                                    then there is most likely a bug in
2720                                    the Host Adapter firmware.
2721                                  */
2722                                 blogic_warn("Illegal CCB #%ld status %d in " "Incoming Mailbox\n", adapter, ccb->serial, ccb->status);
2723                         }
2724                 }
2725                 next_inbox->comp_code = BLOGIC_INBOX_FREE;
2726                 if (++next_inbox > adapter->last_inbox)
2727                         next_inbox = adapter->first_inbox;
2728         }
2729         adapter->next_inbox = next_inbox;
2730 }
2731
2732
2733 /*
2734   blogic_process_ccbs iterates over the completed CCBs for Host
2735   Adapter setting the SCSI Command Result Codes, deallocating the CCBs, and
2736   calling the SCSI Subsystem Completion Routines.  The Host Adapter's Lock
2737   should already have been acquired by the caller.
2738 */
2739
2740 static void blogic_process_ccbs(struct blogic_adapter *adapter)
2741 {
2742         if (adapter->processing_ccbs)
2743                 return;
2744         adapter->processing_ccbs = true;
2745         while (adapter->firstccb != NULL) {
2746                 struct blogic_ccb *ccb = adapter->firstccb;
2747                 struct scsi_cmnd *command = ccb->command;
2748                 adapter->firstccb = ccb->next;
2749                 if (adapter->firstccb == NULL)
2750                         adapter->lastccb = NULL;
2751                 /*
2752                    Process the Completed CCB.
2753                  */
2754                 if (ccb->opcode == BLOGIC_BDR) {
2755                         int tgt_id = ccb->tgt_id;
2756
2757                         blogic_warn("Bus Device Reset CCB #%ld to Target " "%d Completed\n", adapter, ccb->serial, tgt_id);
2758                         blogic_inc_count(&adapter->tgt_stats[tgt_id].bdr_done);
2759                         adapter->tgt_flags[tgt_id].tagq_active = false;
2760                         adapter->cmds_since_rst[tgt_id] = 0;
2761                         adapter->last_resetdone[tgt_id] = jiffies;
2762                         /*
2763                            Place CCB back on the Host Adapter's free list.
2764                          */
2765                         blogic_dealloc_ccb(ccb);
2766 #if 0                           /* this needs to be redone different for new EH */
2767                         /*
2768                            Bus Device Reset CCBs have the command field
2769                            non-NULL only when a Bus Device Reset was requested
2770                            for a command that did not have a currently active
2771                            CCB in the Host Adapter (i.e., a Synchronous Bus
2772                            Device Reset), and hence would not have its
2773                            Completion Routine called otherwise.
2774                          */
2775                         while (command != NULL) {
2776                                 struct scsi_cmnd *nxt_cmd =
2777                                         command->reset_chain;
2778                                 command->reset_chain = NULL;
2779                                 command->result = DID_RESET << 16;
2780                                 command->scsi_done(command);
2781                                 command = nxt_cmd;
2782                         }
2783 #endif
2784                         /*
2785                            Iterate over the CCBs for this Host Adapter
2786                            performing completion processing for any CCBs
2787                            marked as Reset for this Target.
2788                          */
2789                         for (ccb = adapter->all_ccbs; ccb != NULL;
2790                                         ccb = ccb->next_all)
2791                                 if (ccb->status == BLOGIC_CCB_RESET &&
2792                                                 ccb->tgt_id == tgt_id) {
2793                                         command = ccb->command;
2794                                         blogic_dealloc_ccb(ccb);
2795                                         adapter->active_cmds[tgt_id]--;
2796                                         command->result = DID_RESET << 16;
2797                                         command->scsi_done(command);
2798                                 }
2799                         adapter->bdr_pend[tgt_id] = NULL;
2800                 } else {
2801                         /*
2802                            Translate the Completion Code, Host Adapter Status,
2803                            and Target Device Status into a SCSI Subsystem
2804                            Result Code.
2805                          */
2806                         switch (ccb->comp_code) {
2807                         case BLOGIC_INBOX_FREE:
2808                         case BLOGIC_CMD_NOTFOUND:
2809                         case BLOGIC_INVALID_CCB:
2810                                 blogic_warn("CCB #%ld to Target %d Impossible State\n", adapter, ccb->serial, ccb->tgt_id);
2811                                 break;
2812                         case BLOGIC_CMD_COMPLETE_GOOD:
2813                                 adapter->tgt_stats[ccb->tgt_id]
2814                                     .cmds_complete++;
2815                                 adapter->tgt_flags[ccb->tgt_id]
2816                                     .cmd_good = true;
2817                                 command->result = DID_OK << 16;
2818                                 break;
2819                         case BLOGIC_CMD_ABORT_BY_HOST:
2820                                 blogic_warn("CCB #%ld to Target %d Aborted\n",
2821                                         adapter, ccb->serial, ccb->tgt_id);
2822                                 blogic_inc_count(&adapter->tgt_stats[ccb->tgt_id].aborts_done);
2823                                 command->result = DID_ABORT << 16;
2824                                 break;
2825                         case BLOGIC_CMD_COMPLETE_ERROR:
2826                                 command->result = blogic_resultcode(adapter,
2827                                         ccb->adapter_status, ccb->tgt_status);
2828                                 if (ccb->adapter_status != BLOGIC_SELECT_TIMEOUT) {
2829                                         adapter->tgt_stats[ccb->tgt_id]
2830                                             .cmds_complete++;
2831                                         if (blogic_global_options.trace_err) {
2832                                                 int i;
2833                                                 blogic_notice("CCB #%ld Target %d: Result %X Host "
2834                                                                 "Adapter Status %02X " "Target Status %02X\n", adapter, ccb->serial, ccb->tgt_id, command->result, ccb->adapter_status, ccb->tgt_status);
2835                                                 blogic_notice("CDB   ", adapter);
2836                                                 for (i = 0; i < ccb->cdblen; i++)
2837                                                         blogic_notice(" %02X", adapter, ccb->cdb[i]);
2838                                                 blogic_notice("\n", adapter);
2839                                                 blogic_notice("Sense ", adapter);
2840                                                 for (i = 0; i < ccb->sense_datalen; i++)
2841                                                         blogic_notice(" %02X", adapter, command->sense_buffer[i]);
2842                                                 blogic_notice("\n", adapter);
2843                                         }
2844                                 }
2845                                 break;
2846                         }
2847                         /*
2848                            When an INQUIRY command completes normally, save the
2849                            CmdQue (Tagged Queuing Supported) and WBus16 (16 Bit
2850                            Wide Data Transfers Supported) bits.
2851                          */
2852                         if (ccb->cdb[0] == INQUIRY && ccb->cdb[1] == 0 &&
2853                                 ccb->adapter_status == BLOGIC_CMD_CMPLT_NORMAL) {
2854                                 struct blogic_tgt_flags *tgt_flags =
2855                                         &adapter->tgt_flags[ccb->tgt_id];
2856                                 struct scsi_inquiry *inquiry =
2857                                         (struct scsi_inquiry *) scsi_sglist(command);
2858                                 tgt_flags->tgt_exists = true;
2859                                 tgt_flags->tagq_ok = inquiry->CmdQue;
2860                                 tgt_flags->wide_ok = inquiry->WBus16;
2861                         }
2862                         /*
2863                            Place CCB back on the Host Adapter's free list.
2864                          */
2865                         blogic_dealloc_ccb(ccb);
2866                         /*
2867                            Call the SCSI Command Completion Routine.
2868                          */
2869                         command->scsi_done(command);
2870                 }
2871         }
2872         adapter->processing_ccbs = false;
2873 }
2874
2875
2876 /*
2877   blogic_inthandler handles hardware interrupts from BusLogic Host
2878   Adapters.
2879 */
2880
2881 static irqreturn_t blogic_inthandler(int irq_ch, void *devid)
2882 {
2883         struct blogic_adapter *adapter = (struct blogic_adapter *) devid;
2884         unsigned long processor_flag;
2885         /*
2886            Acquire exclusive access to Host Adapter.
2887          */
2888         spin_lock_irqsave(adapter->scsi_host->host_lock, processor_flag);
2889         /*
2890            Handle Interrupts appropriately for each Host Adapter type.
2891          */
2892         if (blogic_multimaster_type(adapter)) {
2893                 union blogic_int_reg intreg;
2894                 /*
2895                    Read the Host Adapter Interrupt Register.
2896                  */
2897                 intreg.all = blogic_rdint(adapter);
2898                 if (intreg.ir.int_valid) {
2899                         /*
2900                            Acknowledge the interrupt and reset the Host Adapter
2901                            Interrupt Register.
2902                          */
2903                         blogic_intreset(adapter);
2904                         /*
2905                            Process valid External SCSI Bus Reset and Incoming
2906                            Mailbox Loaded Interrupts. Command Complete
2907                            Interrupts are noted, and Outgoing Mailbox Available
2908                            Interrupts are ignored, as they are never enabled.
2909                          */
2910                         if (intreg.ir.ext_busreset)
2911                                 adapter->adapter_extreset = true;
2912                         else if (intreg.ir.mailin_loaded)
2913                                 blogic_scan_inbox(adapter);
2914                         else if (intreg.ir.cmd_complete)
2915                                 adapter->adapter_cmd_complete = true;
2916                 }
2917         } else {
2918                 /*
2919                    Check if there is a pending interrupt for this Host Adapter.
2920                  */
2921                 if (FlashPoint_InterruptPending(adapter->cardhandle))
2922                         switch (FlashPoint_HandleInterrupt(adapter->cardhandle)) {
2923                         case FPOINT_NORMAL_INT:
2924                                 break;
2925                         case FPOINT_EXT_RESET:
2926                                 adapter->adapter_extreset = true;
2927                                 break;
2928                         case FPOINT_INTERN_ERR:
2929                                 blogic_warn("Internal FlashPoint Error detected - Resetting Host Adapter\n", adapter);
2930                                 adapter->adapter_intern_err = true;
2931                                 break;
2932                         }
2933         }
2934         /*
2935            Process any completed CCBs.
2936          */
2937         if (adapter->firstccb != NULL)
2938                 blogic_process_ccbs(adapter);
2939         /*
2940            Reset the Host Adapter if requested.
2941          */
2942         if (adapter->adapter_extreset) {
2943                 blogic_warn("Resetting %s due to External SCSI Bus Reset\n", adapter, adapter->full_model);
2944                 blogic_inc_count(&adapter->ext_resets);
2945                 blogic_resetadapter(adapter, false);
2946                 adapter->adapter_extreset = false;
2947         } else if (adapter->adapter_intern_err) {
2948                 blogic_warn("Resetting %s due to Host Adapter Internal Error\n", adapter, adapter->full_model);
2949                 blogic_inc_count(&adapter->adapter_intern_errors);
2950                 blogic_resetadapter(adapter, true);
2951                 adapter->adapter_intern_err = false;
2952         }
2953         /*
2954            Release exclusive access to Host Adapter.
2955          */
2956         spin_unlock_irqrestore(adapter->scsi_host->host_lock, processor_flag);
2957         return IRQ_HANDLED;
2958 }
2959
2960
2961 /*
2962   blogic_write_outbox places CCB and Action Code into an Outgoing
2963   Mailbox for execution by Host Adapter.  The Host Adapter's Lock should
2964   already have been acquired by the caller.
2965 */
2966
2967 static bool blogic_write_outbox(struct blogic_adapter *adapter,
2968                 enum blogic_action action, struct blogic_ccb *ccb)
2969 {
2970         struct blogic_outbox *next_outbox;
2971
2972         next_outbox = adapter->next_outbox;
2973         if (next_outbox->action == BLOGIC_OUTBOX_FREE) {
2974                 ccb->status = BLOGIC_CCB_ACTIVE;
2975                 /*
2976                    The CCB field must be written before the Action Code field
2977                    since the Host Adapter is operating asynchronously and the
2978                    locking code does not protect against simultaneous access
2979                    by the Host Adapter.
2980                  */
2981                 next_outbox->ccb = ccb->dma_handle;
2982                 next_outbox->action = action;
2983                 blogic_execmbox(adapter);
2984                 if (++next_outbox > adapter->last_outbox)
2985                         next_outbox = adapter->first_outbox;
2986                 adapter->next_outbox = next_outbox;
2987                 if (action == BLOGIC_MBOX_START) {
2988                         adapter->active_cmds[ccb->tgt_id]++;
2989                         if (ccb->opcode != BLOGIC_BDR)
2990                                 adapter->tgt_stats[ccb->tgt_id].cmds_tried++;
2991                 }
2992                 return true;
2993         }
2994         return false;
2995 }
2996
2997 /* Error Handling (EH) support */
2998
2999 static int blogic_hostreset(struct scsi_cmnd *SCpnt)
3000 {
3001         struct blogic_adapter *adapter =
3002                 (struct blogic_adapter *) SCpnt->device->host->hostdata;
3003
3004         unsigned int id = SCpnt->device->id;
3005         struct blogic_tgt_stats *stats = &adapter->tgt_stats[id];
3006         int rc;
3007
3008         spin_lock_irq(SCpnt->device->host->host_lock);
3009
3010         blogic_inc_count(&stats->adatper_reset_req);
3011
3012         rc = blogic_resetadapter(adapter, false);
3013         spin_unlock_irq(SCpnt->device->host->host_lock);
3014         return rc;
3015 }
3016
3017 /*
3018   blogic_qcmd creates a CCB for Command and places it into an
3019   Outgoing Mailbox for execution by the associated Host Adapter.
3020 */
3021
3022 static int blogic_qcmd_lck(struct scsi_cmnd *command,
3023                 void (*comp_cb) (struct scsi_cmnd *))
3024 {
3025         struct blogic_adapter *adapter =
3026                 (struct blogic_adapter *) command->device->host->hostdata;
3027         struct blogic_tgt_flags *tgt_flags =
3028                 &adapter->tgt_flags[command->device->id];
3029         struct blogic_tgt_stats *tgt_stats = adapter->tgt_stats;
3030         unsigned char *cdb = command->cmnd;
3031         int cdblen = command->cmd_len;
3032         int tgt_id = command->device->id;
3033         int lun = command->device->lun;
3034         int buflen = scsi_bufflen(command);
3035         int count;
3036         struct blogic_ccb *ccb;
3037
3038         /*
3039            SCSI REQUEST_SENSE commands will be executed automatically by the
3040            Host Adapter for any errors, so they should not be executed
3041            explicitly unless the Sense Data is zero indicating that no error
3042            occurred.
3043          */
3044         if (cdb[0] == REQUEST_SENSE && command->sense_buffer[0] != 0) {
3045                 command->result = DID_OK << 16;
3046                 comp_cb(command);
3047                 return 0;
3048         }
3049         /*
3050            Allocate a CCB from the Host Adapter's free list. In the unlikely
3051            event that there are none available and memory allocation fails,
3052            wait 1 second and try again. If that fails, the Host Adapter is
3053            probably hung so signal an error as a Host Adapter Hard Reset
3054            should be initiated soon.
3055          */
3056         ccb = blogic_alloc_ccb(adapter);
3057         if (ccb == NULL) {
3058                 spin_unlock_irq(adapter->scsi_host->host_lock);
3059                 blogic_delay(1);
3060                 spin_lock_irq(adapter->scsi_host->host_lock);
3061                 ccb = blogic_alloc_ccb(adapter);
3062                 if (ccb == NULL) {
3063                         command->result = DID_ERROR << 16;
3064                         comp_cb(command);
3065                         return 0;
3066                 }
3067         }
3068
3069         /*
3070            Initialize the fields in the BusLogic Command Control Block (CCB).
3071          */
3072         count = scsi_dma_map(command);
3073         BUG_ON(count < 0);
3074         if (count) {
3075                 struct scatterlist *sg;
3076                 int i;
3077
3078                 ccb->opcode = BLOGIC_INITIATOR_CCB_SG;
3079                 ccb->datalen = count * sizeof(struct blogic_sg_seg);
3080                 if (blogic_multimaster_type(adapter))
3081                         ccb->data = (void *)((unsigned int) ccb->dma_handle +
3082                                         ((unsigned long) &ccb->sglist -
3083                                         (unsigned long) ccb));
3084                 else
3085                         ccb->data = ccb->sglist;
3086
3087                 scsi_for_each_sg(command, sg, count, i) {
3088                         ccb->sglist[i].segbytes = sg_dma_len(sg);
3089                         ccb->sglist[i].segdata = sg_dma_address(sg);
3090                 }
3091         } else if (!count) {
3092                 ccb->opcode = BLOGIC_INITIATOR_CCB;
3093                 ccb->datalen = buflen;
3094                 ccb->data = 0;
3095         }
3096
3097         switch (cdb[0]) {
3098         case READ_6:
3099         case READ_10:
3100                 ccb->datadir = BLOGIC_DATAIN_CHECKED;
3101                 tgt_stats[tgt_id].read_cmds++;
3102                 blogic_addcount(&tgt_stats[tgt_id].bytesread, buflen);
3103                 blogic_incszbucket(tgt_stats[tgt_id].read_sz_buckets, buflen);
3104                 break;
3105         case WRITE_6:
3106         case WRITE_10:
3107                 ccb->datadir = BLOGIC_DATAOUT_CHECKED;
3108                 tgt_stats[tgt_id].write_cmds++;
3109                 blogic_addcount(&tgt_stats[tgt_id].byteswritten, buflen);
3110                 blogic_incszbucket(tgt_stats[tgt_id].write_sz_buckets, buflen);
3111                 break;
3112         default:
3113                 ccb->datadir = BLOGIC_UNCHECKED_TX;
3114                 break;
3115         }
3116         ccb->cdblen = cdblen;
3117         ccb->adapter_status = 0;
3118         ccb->tgt_status = 0;
3119         ccb->tgt_id = tgt_id;
3120         ccb->lun = lun;
3121         ccb->tag_enable = false;
3122         ccb->legacytag_enable = false;
3123         /*
3124            BusLogic recommends that after a Reset the first couple of
3125            commands that are sent to a Target Device be sent in a non
3126            Tagged Queue fashion so that the Host Adapter and Target Device
3127            can establish Synchronous and Wide Transfer before Queue Tag
3128            messages can interfere with the Synchronous and Wide Negotiation
3129            messages.  By waiting to enable Tagged Queuing until after the
3130            first BLOGIC_MAX_TAG_DEPTH commands have been queued, it is
3131            assured that after a Reset any pending commands are requeued
3132            before Tagged Queuing is enabled and that the Tagged Queuing
3133            message will not occur while the partition table is being printed.
3134            In addition, some devices do not properly handle the transition
3135            from non-tagged to tagged commands, so it is necessary to wait
3136            until there are no pending commands for a target device
3137            before queuing tagged commands.
3138          */
3139         if (adapter->cmds_since_rst[tgt_id]++ >= BLOGIC_MAX_TAG_DEPTH &&
3140                         !tgt_flags->tagq_active &&
3141                         adapter->active_cmds[tgt_id] == 0
3142                         && tgt_flags->tagq_ok &&
3143                         (adapter->tagq_ok & (1 << tgt_id))) {
3144                 tgt_flags->tagq_active = true;
3145                 blogic_notice("Tagged Queuing now active for Target %d\n",
3146                                         adapter, tgt_id);
3147         }
3148         if (tgt_flags->tagq_active) {
3149                 enum blogic_queuetag queuetag = BLOGIC_SIMPLETAG;
3150                 /*
3151                    When using Tagged Queuing with Simple Queue Tags, it
3152                    appears that disk drive controllers do not guarantee that
3153                    a queued command will not remain in a disconnected state
3154                    indefinitely if commands that read or write nearer the
3155                    head position continue to arrive without interruption.
3156                    Therefore, for each Target Device this driver keeps track
3157                    of the last time either the queue was empty or an Ordered
3158                    Queue Tag was issued. If more than 4 seconds (one fifth
3159                    of the 20 second disk timeout) have elapsed since this
3160                    last sequence point, this command will be issued with an
3161                    Ordered Queue Tag rather than a Simple Queue Tag, which
3162                    forces the Target Device to complete all previously
3163                    queued commands before this command may be executed.
3164                  */
3165                 if (adapter->active_cmds[tgt_id] == 0)
3166                         adapter->last_seqpoint[tgt_id] = jiffies;
3167                 else if (time_after(jiffies,
3168                                 adapter->last_seqpoint[tgt_id] + 4 * HZ)) {
3169                         adapter->last_seqpoint[tgt_id] = jiffies;
3170                         queuetag = BLOGIC_ORDEREDTAG;
3171                 }
3172                 if (adapter->ext_lun) {
3173                         ccb->tag_enable = true;
3174                         ccb->queuetag = queuetag;
3175                 } else {
3176                         ccb->legacytag_enable = true;
3177                         ccb->legacy_tag = queuetag;
3178                 }
3179         }
3180         memcpy(ccb->cdb, cdb, cdblen);
3181         ccb->sense_datalen = SCSI_SENSE_BUFFERSIZE;
3182         ccb->sensedata = pci_map_single(adapter->pci_device,
3183                                 command->sense_buffer, ccb->sense_datalen,
3184                                 PCI_DMA_FROMDEVICE);
3185         ccb->command = command;
3186         command->scsi_done = comp_cb;
3187         if (blogic_multimaster_type(adapter)) {
3188                 /*
3189                    Place the CCB in an Outgoing Mailbox. The higher levels
3190                    of the SCSI Subsystem should not attempt to queue more
3191                    commands than can be placed in Outgoing Mailboxes, so
3192                    there should always be one free.  In the unlikely event
3193                    that there are none available, wait 1 second and try
3194                    again. If that fails, the Host Adapter is probably hung
3195                    so signal an error as a Host Adapter Hard Reset should
3196                    be initiated soon.
3197                  */
3198                 if (!blogic_write_outbox(adapter, BLOGIC_MBOX_START, ccb)) {
3199                         spin_unlock_irq(adapter->scsi_host->host_lock);
3200                         blogic_warn("Unable to write Outgoing Mailbox - " "Pausing for 1 second\n", adapter);
3201                         blogic_delay(1);
3202                         spin_lock_irq(adapter->scsi_host->host_lock);
3203                         if (!blogic_write_outbox(adapter, BLOGIC_MBOX_START,
3204                                                 ccb)) {
3205                                 blogic_warn("Still unable to write Outgoing Mailbox - " "Host Adapter Dead?\n", adapter);
3206                                 blogic_dealloc_ccb(ccb);
3207                                 command->result = DID_ERROR << 16;
3208                                 command->scsi_done(command);
3209                         }
3210                 }
3211         } else {
3212                 /*
3213                    Call the FlashPoint SCCB Manager to start execution of
3214                    the CCB.
3215                  */
3216                 ccb->status = BLOGIC_CCB_ACTIVE;
3217                 adapter->active_cmds[tgt_id]++;
3218                 tgt_stats[tgt_id].cmds_tried++;
3219                 FlashPoint_StartCCB(adapter->cardhandle, ccb);
3220                 /*
3221                    The Command may have already completed and
3222                    blogic_qcompleted_ccb been called, or it may still be
3223                    pending.
3224                  */
3225                 if (ccb->status == BLOGIC_CCB_COMPLETE)
3226                         blogic_process_ccbs(adapter);
3227         }
3228         return 0;
3229 }
3230
3231 static DEF_SCSI_QCMD(blogic_qcmd)
3232
3233 #if 0
3234 /*
3235   blogic_abort aborts Command if possible.
3236 */
3237
3238 static int blogic_abort(struct scsi_cmnd *command)
3239 {
3240         struct blogic_adapter *adapter =
3241                 (struct blogic_adapter *) command->device->host->hostdata;
3242
3243         int tgt_id = command->device->id;
3244         struct blogic_ccb *ccb;
3245         blogic_inc_count(&adapter->tgt_stats[tgt_id].aborts_request);
3246
3247         /*
3248            Attempt to find an Active CCB for this Command. If no Active
3249            CCB for this Command is found, then no Abort is necessary.
3250          */
3251         for (ccb = adapter->all_ccbs; ccb != NULL; ccb = ccb->next_all)
3252                 if (ccb->command == command)
3253                         break;
3254         if (ccb == NULL) {
3255                 blogic_warn("Unable to Abort Command to Target %d - No CCB Found\n", adapter, tgt_id);
3256                 return SUCCESS;
3257         } else if (ccb->status == BLOGIC_CCB_COMPLETE) {
3258                 blogic_warn("Unable to Abort Command to Target %d - CCB Completed\n", adapter, tgt_id);
3259                 return SUCCESS;
3260         } else if (ccb->status == BLOGIC_CCB_RESET) {
3261                 blogic_warn("Unable to Abort Command to Target %d - CCB Reset\n", adapter, tgt_id);
3262                 return SUCCESS;
3263         }
3264         if (blogic_multimaster_type(adapter)) {
3265                 /*
3266                    Attempt to Abort this CCB.  MultiMaster Firmware versions
3267                    prior to 5.xx do not generate Abort Tag messages, but only
3268                    generate the non-tagged Abort message.  Since non-tagged
3269                    commands are not sent by the Host Adapter until the queue
3270                    of outstanding tagged commands has completed, and the
3271                    Abort message is treated as a non-tagged command, it is
3272                    effectively impossible to abort commands when Tagged
3273                    Queuing is active. Firmware version 5.xx does generate
3274                    Abort Tag messages, so it is possible to abort commands
3275                    when Tagged Queuing is active.
3276                  */
3277                 if (adapter->tgt_flags[tgt_id].tagq_active &&
3278                                 adapter->fw_ver[0] < '5') {
3279                         blogic_warn("Unable to Abort CCB #%ld to Target %d - Abort Tag Not Supported\n", adapter, ccb->serial, tgt_id);
3280                         return FAILURE;
3281                 } else if (blogic_write_outbox(adapter, BLOGIC_MBOX_ABORT,
3282                                         ccb)) {
3283                         blogic_warn("Aborting CCB #%ld to Target %d\n",
3284                                         adapter, ccb->serial, tgt_id);
3285                         blogic_inc_count(&adapter->tgt_stats[tgt_id].aborts_tried);
3286                         return SUCCESS;
3287                 } else {
3288                         blogic_warn("Unable to Abort CCB #%ld to Target %d - No Outgoing Mailboxes\n", adapter, ccb->serial, tgt_id);
3289                         return FAILURE;
3290                 }
3291         } else {
3292                 /*
3293                    Call the FlashPoint SCCB Manager to abort execution of
3294                    the CCB.
3295                  */
3296                 blogic_warn("Aborting CCB #%ld to Target %d\n", adapter,
3297                                 ccb->serial, tgt_id);
3298                 blogic_inc_count(&adapter->tgt_stats[tgt_id].aborts_tried);
3299                 FlashPoint_AbortCCB(adapter->cardhandle, ccb);
3300                 /*
3301                    The Abort may have already been completed and
3302                    blogic_qcompleted_ccb been called, or it
3303                    may still be pending.
3304                  */
3305                 if (ccb->status == BLOGIC_CCB_COMPLETE)
3306                         blogic_process_ccbs(adapter);
3307                 return SUCCESS;
3308         }
3309         return SUCCESS;
3310 }
3311
3312 #endif
3313 /*
3314   blogic_resetadapter resets Host Adapter if possible, marking all
3315   currently executing SCSI Commands as having been Reset.
3316 */
3317
3318 static int blogic_resetadapter(struct blogic_adapter *adapter, bool hard_reset)
3319 {
3320         struct blogic_ccb *ccb;
3321         int tgt_id;
3322
3323         /*
3324          * Attempt to Reset and Reinitialize the Host Adapter.
3325          */
3326
3327         if (!(blogic_hwreset(adapter, hard_reset) &&
3328                                 blogic_initadapter(adapter))) {
3329                 blogic_err("Resetting %s Failed\n", adapter,
3330                                                 adapter->full_model);
3331                 return FAILURE;
3332         }
3333
3334         /*
3335          * Deallocate all currently executing CCBs.
3336          */
3337
3338         for (ccb = adapter->all_ccbs; ccb != NULL; ccb = ccb->next_all)
3339                 if (ccb->status == BLOGIC_CCB_ACTIVE)
3340                         blogic_dealloc_ccb(ccb);
3341         /*
3342          * Wait a few seconds between the Host Adapter Hard Reset which
3343          * initiates a SCSI Bus Reset and issuing any SCSI Commands.  Some
3344          * SCSI devices get confused if they receive SCSI Commands too soon
3345          * after a SCSI Bus Reset.
3346          */
3347
3348         if (hard_reset) {
3349                 spin_unlock_irq(adapter->scsi_host->host_lock);
3350                 blogic_delay(adapter->bus_settle_time);
3351                 spin_lock_irq(adapter->scsi_host->host_lock);
3352         }
3353
3354         for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) {
3355                 adapter->last_resettried[tgt_id] = jiffies;
3356                 adapter->last_resetdone[tgt_id] = jiffies;
3357         }
3358         return SUCCESS;
3359 }
3360
3361 /*
3362   blogic_diskparam returns the Heads/Sectors/Cylinders BIOS Disk
3363   Parameters for Disk.  The default disk geometry is 64 heads, 32 sectors, and
3364   the appropriate number of cylinders so as not to exceed drive capacity.  In
3365   order for disks equal to or larger than 1 GB to be addressable by the BIOS
3366   without exceeding the BIOS limitation of 1024 cylinders, Extended Translation
3367   may be enabled in AutoSCSI on FlashPoint Host Adapters and on "W" and "C"
3368   series MultiMaster Host Adapters, or by a dip switch setting on "S" and "A"
3369   series MultiMaster Host Adapters.  With Extended Translation enabled, drives
3370   between 1 GB inclusive and 2 GB exclusive are given a disk geometry of 128
3371   heads and 32 sectors, and drives above 2 GB inclusive are given a disk
3372   geometry of 255 heads and 63 sectors.  However, if the BIOS detects that the
3373   Extended Translation setting does not match the geometry in the partition
3374   table, then the translation inferred from the partition table will be used by
3375   the BIOS, and a warning may be displayed.
3376 */
3377
3378 static int blogic_diskparam(struct scsi_device *sdev, struct block_device *dev,
3379                 sector_t capacity, int *params)
3380 {
3381         struct blogic_adapter *adapter =
3382                                 (struct blogic_adapter *) sdev->host->hostdata;
3383         struct bios_diskparam *diskparam = (struct bios_diskparam *) params;
3384         unsigned char *buf;
3385
3386         if (adapter->ext_trans_enable && capacity >= 2 * 1024 * 1024 /* 1 GB in 512 byte sectors */) {
3387                 if (capacity >= 4 * 1024 * 1024 /* 2 GB in 512 byte sectors */) {
3388                         diskparam->heads = 255;
3389                         diskparam->sectors = 63;
3390                 } else {
3391                         diskparam->heads = 128;
3392                         diskparam->sectors = 32;
3393                 }
3394         } else {
3395                 diskparam->heads = 64;
3396                 diskparam->sectors = 32;
3397         }
3398         diskparam->cylinders = (unsigned long) capacity / (diskparam->heads * diskparam->sectors);
3399         buf = scsi_bios_ptable(dev);
3400         if (buf == NULL)
3401                 return 0;
3402         /*
3403            If the boot sector partition table flag is valid, search for
3404            a partition table entry whose end_head matches one of the
3405            standard BusLogic geometry translations (64/32, 128/32, or 255/63).
3406          */
3407         if (*(unsigned short *) (buf + 64) == 0xAA55) {
3408                 struct partition *part1_entry = (struct partition *) buf;
3409                 struct partition *part_entry = part1_entry;
3410                 int saved_cyl = diskparam->cylinders, part_no;
3411                 unsigned char part_end_head = 0, part_end_sector = 0;
3412
3413                 for (part_no = 0; part_no < 4; part_no++) {
3414                         part_end_head = part_entry->end_head;
3415                         part_end_sector = part_entry->end_sector & 0x3F;
3416                         if (part_end_head == 64 - 1) {
3417                                 diskparam->heads = 64;
3418                                 diskparam->sectors = 32;
3419                                 break;
3420                         } else if (part_end_head == 128 - 1) {
3421                                 diskparam->heads = 128;
3422                                 diskparam->sectors = 32;
3423                                 break;
3424                         } else if (part_end_head == 255 - 1) {
3425                                 diskparam->heads = 255;
3426                                 diskparam->sectors = 63;
3427                                 break;
3428                         }
3429                         part_entry++;
3430                 }
3431                 if (part_no == 4) {
3432                         part_end_head = part1_entry->end_head;
3433                         part_end_sector = part1_entry->end_sector & 0x3F;
3434                 }
3435                 diskparam->cylinders = (unsigned long) capacity / (diskparam->heads * diskparam->sectors);
3436                 if (part_no < 4 && part_end_sector == diskparam->sectors) {
3437                         if (diskparam->cylinders != saved_cyl)
3438                                 blogic_warn("Adopting Geometry %d/%d from Partition Table\n", adapter, diskparam->heads, diskparam->sectors);
3439                 } else if (part_end_head > 0 || part_end_sector > 0) {
3440                         blogic_warn("Warning: Partition Table appears to " "have Geometry %d/%d which is\n", adapter, part_end_head + 1, part_end_sector);
3441                         blogic_warn("not compatible with current BusLogic " "Host Adapter Geometry %d/%d\n", adapter, diskparam->heads, diskparam->sectors);
3442                 }
3443         }
3444         kfree(buf);
3445         return 0;
3446 }
3447
3448
3449 /*
3450   BugLogic_ProcDirectoryInfo implements /proc/scsi/BusLogic/<N>.
3451 */
3452
3453 static int blogic_write_info(struct Scsi_Host *shost, char *procbuf,
3454                                 int bytes_avail)
3455 {
3456         struct blogic_adapter *adapter =
3457                                 (struct blogic_adapter *) shost->hostdata;
3458         struct blogic_tgt_stats *tgt_stats;
3459
3460         tgt_stats = adapter->tgt_stats;
3461         adapter->ext_resets = 0;
3462         adapter->adapter_intern_errors = 0;
3463         memset(tgt_stats, 0, BLOGIC_MAXDEV * sizeof(struct blogic_tgt_stats));
3464         return 0;
3465 }
3466
3467 static int blogic_show_info(struct seq_file *m, struct Scsi_Host *shost)
3468 {
3469         struct blogic_adapter *adapter = (struct blogic_adapter *) shost->hostdata;
3470         struct blogic_tgt_stats *tgt_stats;
3471         int tgt;
3472
3473         tgt_stats = adapter->tgt_stats;
3474         seq_write(m, adapter->msgbuf, adapter->msgbuflen);
3475         seq_printf(m, "\n\
3476 Current Driver Queue Depth:     %d\n\
3477 Currently Allocated CCBs:       %d\n", adapter->drvr_qdepth, adapter->alloc_ccbs);
3478         seq_printf(m, "\n\n\
3479                            DATA TRANSFER STATISTICS\n\
3480 \n\
3481 Target  Tagged Queuing  Queue Depth  Active  Attempted  Completed\n\
3482 ======  ==============  ===========  ======  =========  =========\n");
3483         for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3484                 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3485                 if (!tgt_flags->tgt_exists)
3486                         continue;
3487                 seq_printf(m, "  %2d    %s", tgt, (tgt_flags->tagq_ok ? (tgt_flags->tagq_active ? "    Active" : (adapter->tagq_ok & (1 << tgt)
3488                                                                                                                                                                     ? "  Permitted" : "   Disabled"))
3489                                                                           : "Not Supported"));
3490                 seq_printf(m,
3491                                   "         %3d       %3u    %9u        %9u\n", adapter->qdepth[tgt], adapter->active_cmds[tgt], tgt_stats[tgt].cmds_tried, tgt_stats[tgt].cmds_complete);
3492         }
3493         seq_printf(m, "\n\
3494 Target  Read Commands  Write Commands   Total Bytes Read    Total Bytes Written\n\
3495 ======  =============  ==============  ===================  ===================\n");
3496         for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3497                 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3498                 if (!tgt_flags->tgt_exists)
3499                         continue;
3500                 seq_printf(m, "  %2d      %9u    %9u", tgt, tgt_stats[tgt].read_cmds, tgt_stats[tgt].write_cmds);
3501                 if (tgt_stats[tgt].bytesread.billions > 0)
3502                         seq_printf(m, "     %9u%09u", tgt_stats[tgt].bytesread.billions, tgt_stats[tgt].bytesread.units);
3503                 else
3504                         seq_printf(m, "         %9u", tgt_stats[tgt].bytesread.units);
3505                 if (tgt_stats[tgt].byteswritten.billions > 0)
3506                         seq_printf(m, "   %9u%09u\n", tgt_stats[tgt].byteswritten.billions, tgt_stats[tgt].byteswritten.units);
3507                 else
3508                         seq_printf(m, "      %9u\n", tgt_stats[tgt].byteswritten.units);
3509         }
3510         seq_printf(m, "\n\
3511 Target  Command    0-1KB      1-2KB      2-4KB      4-8KB     8-16KB\n\
3512 ======  =======  =========  =========  =========  =========  =========\n");
3513         for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3514                 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3515                 if (!tgt_flags->tgt_exists)
3516                         continue;
3517                 seq_printf(m,
3518                             "  %2d       Read    %9u  %9u  %9u  %9u  %9u\n", tgt,
3519                             tgt_stats[tgt].read_sz_buckets[0],
3520                             tgt_stats[tgt].read_sz_buckets[1], tgt_stats[tgt].read_sz_buckets[2], tgt_stats[tgt].read_sz_buckets[3], tgt_stats[tgt].read_sz_buckets[4]);
3521                 seq_printf(m,
3522                             "  %2d       Write   %9u  %9u  %9u  %9u  %9u\n", tgt,
3523                             tgt_stats[tgt].write_sz_buckets[0],
3524                             tgt_stats[tgt].write_sz_buckets[1], tgt_stats[tgt].write_sz_buckets[2], tgt_stats[tgt].write_sz_buckets[3], tgt_stats[tgt].write_sz_buckets[4]);
3525         }
3526         seq_printf(m, "\n\
3527 Target  Command   16-32KB    32-64KB   64-128KB   128-256KB   256KB+\n\
3528 ======  =======  =========  =========  =========  =========  =========\n");
3529         for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3530                 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3531                 if (!tgt_flags->tgt_exists)
3532                         continue;
3533                 seq_printf(m,
3534                             "  %2d       Read    %9u  %9u  %9u  %9u  %9u\n", tgt,
3535                             tgt_stats[tgt].read_sz_buckets[5],
3536                             tgt_stats[tgt].read_sz_buckets[6], tgt_stats[tgt].read_sz_buckets[7], tgt_stats[tgt].read_sz_buckets[8], tgt_stats[tgt].read_sz_buckets[9]);
3537                 seq_printf(m,
3538                             "  %2d       Write   %9u  %9u  %9u  %9u  %9u\n", tgt,
3539                             tgt_stats[tgt].write_sz_buckets[5],
3540                             tgt_stats[tgt].write_sz_buckets[6], tgt_stats[tgt].write_sz_buckets[7], tgt_stats[tgt].write_sz_buckets[8], tgt_stats[tgt].write_sz_buckets[9]);
3541         }
3542         seq_printf(m, "\n\n\
3543                            ERROR RECOVERY STATISTICS\n\
3544 \n\
3545           Command Aborts      Bus Device Resets   Host Adapter Resets\n\
3546 Target  Requested Completed  Requested Completed  Requested Completed\n\
3547   ID    \\\\\\\\ Attempted ////  \\\\\\\\ Attempted ////  \\\\\\\\ Attempted ////\n\
3548 ======   ===== ===== =====    ===== ===== =====    ===== ===== =====\n");
3549         for (tgt = 0; tgt < adapter->maxdev; tgt++) {
3550                 struct blogic_tgt_flags *tgt_flags = &adapter->tgt_flags[tgt];
3551                 if (!tgt_flags->tgt_exists)
3552                         continue;
3553                 seq_printf(m, "\
3554   %2d    %5d %5d %5d    %5d %5d %5d        %5d %5d %5d\n", tgt, tgt_stats[tgt].aborts_request, tgt_stats[tgt].aborts_tried, tgt_stats[tgt].aborts_done, tgt_stats[tgt].bdr_request, tgt_stats[tgt].bdr_tried, tgt_stats[tgt].bdr_done, tgt_stats[tgt].adatper_reset_req, tgt_stats[tgt].adapter_reset_attempt, tgt_stats[tgt].adapter_reset_done);
3555         }
3556         seq_printf(m, "\nExternal Host Adapter Resets: %d\n", adapter->ext_resets);
3557         seq_printf(m, "Host Adapter Internal Errors: %d\n", adapter->adapter_intern_errors);
3558         return 0;
3559 }
3560
3561
3562 /*
3563   blogic_msg prints Driver Messages.
3564 */
3565
3566 static void blogic_msg(enum blogic_msglevel msglevel, char *fmt,
3567                         struct blogic_adapter *adapter, ...)
3568 {
3569         static char buf[BLOGIC_LINEBUF_SIZE];
3570         static bool begin = true;
3571         va_list args;
3572         int len = 0;
3573
3574         va_start(args, adapter);
3575         len = vsprintf(buf, fmt, args);
3576         va_end(args);
3577         if (msglevel == BLOGIC_ANNOUNCE_LEVEL) {
3578                 static int msglines = 0;
3579                 strcpy(&adapter->msgbuf[adapter->msgbuflen], buf);
3580                 adapter->msgbuflen += len;
3581                 if (++msglines <= 2)
3582                         printk("%sscsi: %s", blogic_msglevelmap[msglevel], buf);
3583         } else if (msglevel == BLOGIC_INFO_LEVEL) {
3584                 strcpy(&adapter->msgbuf[adapter->msgbuflen], buf);
3585                 adapter->msgbuflen += len;
3586                 if (begin) {
3587                         if (buf[0] != '\n' || len > 1)
3588                                 printk("%sscsi%d: %s", blogic_msglevelmap[msglevel], adapter->host_no, buf);
3589                 } else
3590                         printk("%s", buf);
3591         } else {
3592                 if (begin) {
3593                         if (adapter != NULL && adapter->adapter_initd)
3594                                 printk("%sscsi%d: %s", blogic_msglevelmap[msglevel], adapter->host_no, buf);
3595                         else
3596                                 printk("%s%s", blogic_msglevelmap[msglevel], buf);
3597                 } else
3598                         printk("%s", buf);
3599         }
3600         begin = (buf[len - 1] == '\n');
3601 }
3602
3603
3604 /*
3605   blogic_parse parses an individual option keyword.  It returns true
3606   and updates the pointer if the keyword is recognized and false otherwise.
3607 */
3608
3609 static bool __init blogic_parse(char **str, char *keyword)
3610 {
3611         char *pointer = *str;
3612         while (*keyword != '\0') {
3613                 char strch = *pointer++;
3614                 char keywordch = *keyword++;
3615                 if (strch >= 'A' && strch <= 'Z')
3616                         strch += 'a' - 'Z';
3617                 if (keywordch >= 'A' && keywordch <= 'Z')
3618                         keywordch += 'a' - 'Z';
3619                 if (strch != keywordch)
3620                         return false;
3621         }
3622         *str = pointer;
3623         return true;
3624 }
3625
3626
3627 /*
3628   blogic_parseopts handles processing of BusLogic Driver Options
3629   specifications.
3630
3631   BusLogic Driver Options may be specified either via the Linux Kernel Command
3632   Line or via the Loadable Kernel Module Installation Facility.  Driver Options
3633   for multiple host adapters may be specified either by separating the option
3634   strings by a semicolon, or by specifying multiple "BusLogic=" strings on the
3635   command line.  Individual option specifications for a single host adapter are
3636   separated by commas.  The Probing and Debugging Options apply to all host
3637   adapters whereas the remaining options apply individually only to the
3638   selected host adapter.
3639
3640   The BusLogic Driver Probing Options are described in
3641   <file:Documentation/scsi/BusLogic.txt>.
3642 */
3643
3644 static int __init blogic_parseopts(char *options)
3645 {
3646         while (true) {
3647                 struct blogic_drvr_options *drvr_opts =
3648                         &blogic_drvr_options[blogic_drvr_options_count++];
3649                 int tgt_id;
3650
3651                 memset(drvr_opts, 0, sizeof(struct blogic_drvr_options));
3652                 while (*options != '\0' && *options != ';') {
3653                         /* Probing Options. */
3654                         if (blogic_parse(&options, "IO:")) {
3655                                 unsigned long io_addr = simple_strtoul(options,
3656                                                                 &options, 0);
3657                                 blogic_probe_options.limited_isa = true;
3658                                 switch (io_addr) {
3659                                 case 0x330:
3660                                         blogic_probe_options.probe330 = true;
3661                                         break;
3662                                 case 0x334:
3663                                         blogic_probe_options.probe334 = true;
3664                                         break;
3665                                 case 0x230:
3666                                         blogic_probe_options.probe230 = true;
3667                                         break;
3668                                 case 0x234:
3669                                         blogic_probe_options.probe234 = true;
3670                                         break;
3671                                 case 0x130:
3672                                         blogic_probe_options.probe130 = true;
3673                                         break;
3674                                 case 0x134:
3675                                         blogic_probe_options.probe134 = true;
3676                                         break;
3677                                 default:
3678                                         blogic_err("BusLogic: Invalid Driver Options " "(invalid I/O Address 0x%X)\n", NULL, io_addr);
3679                                         return 0;
3680                                 }
3681                         } else if (blogic_parse(&options, "NoProbeISA"))
3682                                 blogic_probe_options.noprobe_isa = true;
3683                         else if (blogic_parse(&options, "NoProbePCI"))
3684                                 blogic_probe_options.noprobe_pci = true;
3685                         else if (blogic_parse(&options, "NoProbe"))
3686                                 blogic_probe_options.noprobe = true;
3687                         else if (blogic_parse(&options, "NoSortPCI"))
3688                                 blogic_probe_options.nosort_pci = true;
3689                         else if (blogic_parse(&options, "MultiMasterFirst"))
3690                                 blogic_probe_options.multimaster_first = true;
3691                         else if (blogic_parse(&options, "FlashPointFirst"))
3692                                 blogic_probe_options.flashpoint_first = true;
3693                         /* Tagged Queuing Options. */
3694                         else if (blogic_parse(&options, "QueueDepth:[") ||
3695                                         blogic_parse(&options, "QD:[")) {
3696                                 for (tgt_id = 0; tgt_id < BLOGIC_MAXDEV; tgt_id++) {
3697                                         unsigned short qdepth = simple_strtoul(options, &options, 0);
3698                                         if (qdepth > BLOGIC_MAX_TAG_DEPTH) {
3699                                                 blogic_err("BusLogic: Invalid Driver Options " "(invalid Queue Depth %d)\n", NULL, qdepth);
3700                                                 return 0;
3701                                         }
3702                                         drvr_opts->qdepth[tgt_id] = qdepth;
3703                                         if (*options == ',')
3704                                                 options++;
3705                                         else if (*options == ']')
3706                                                 break;
3707                                         else {
3708                                                 blogic_err("BusLogic: Invalid Driver Options " "(',' or ']' expected at '%s')\n", NULL, options);
3709                                                 return 0;
3710                                         }
3711                                 }
3712                                 if (*options != ']') {
3713                                         blogic_err("BusLogic: Invalid Driver Options " "(']' expected at '%s')\n", NULL, options);
3714                                         return 0;
3715                                 } else
3716                                         options++;
3717                         } else if (blogic_parse(&options, "QueueDepth:") || blogic_parse(&options, "QD:")) {
3718                                 unsigned short qdepth = simple_strtoul(options, &options, 0);
3719                                 if (qdepth == 0 ||
3720                                                 qdepth > BLOGIC_MAX_TAG_DEPTH) {
3721                                         blogic_err("BusLogic: Invalid Driver Options " "(invalid Queue Depth %d)\n", NULL, qdepth);
3722                                         return 0;
3723                                 }
3724                                 drvr_opts->common_qdepth = qdepth;
3725                                 for (tgt_id = 0; tgt_id < BLOGIC_MAXDEV; tgt_id++)
3726                                         drvr_opts->qdepth[tgt_id] = qdepth;
3727                         } else if (blogic_parse(&options, "TaggedQueuing:") ||
3728                                         blogic_parse(&options, "TQ:")) {
3729                                 if (blogic_parse(&options, "Default")) {
3730                                         drvr_opts->tagq_ok = 0x0000;
3731                                         drvr_opts->tagq_ok_mask = 0x0000;
3732                                 } else if (blogic_parse(&options, "Enable")) {
3733                                         drvr_opts->tagq_ok = 0xFFFF;
3734                                         drvr_opts->tagq_ok_mask = 0xFFFF;
3735                                 } else if (blogic_parse(&options, "Disable")) {
3736                                         drvr_opts->tagq_ok = 0x0000;
3737                                         drvr_opts->tagq_ok_mask = 0xFFFF;
3738                                 } else {
3739                                         unsigned short tgt_bit;
3740                                         for (tgt_id = 0, tgt_bit = 1;
3741                                                 tgt_id < BLOGIC_MAXDEV;
3742                                                 tgt_id++, tgt_bit <<= 1)
3743                                                 switch (*options++) {
3744                                                 case 'Y':
3745                                                         drvr_opts->tagq_ok |= tgt_bit;
3746                                                         drvr_opts->tagq_ok_mask |= tgt_bit;
3747                                                         break;
3748                                                 case 'N':
3749                                                         drvr_opts->tagq_ok &= ~tgt_bit;
3750                                                         drvr_opts->tagq_ok_mask |= tgt_bit;
3751                                                         break;
3752                                                 case 'X':
3753                                                         break;
3754                                                 default:
3755                                                         options--;
3756                                                         tgt_id = BLOGIC_MAXDEV;
3757                                                         break;
3758                                                 }
3759                                 }
3760                         }
3761                         /* Miscellaneous Options. */
3762                         else if (blogic_parse(&options, "BusSettleTime:") ||
3763                                         blogic_parse(&options, "BST:")) {
3764                                 unsigned short bus_settle_time =
3765                                         simple_strtoul(options, &options, 0);
3766                                 if (bus_settle_time > 5 * 60) {
3767                                         blogic_err("BusLogic: Invalid Driver Options " "(invalid Bus Settle Time %d)\n", NULL, bus_settle_time);
3768                                         return 0;
3769                                 }
3770                                 drvr_opts->bus_settle_time = bus_settle_time;
3771                         } else if (blogic_parse(&options,
3772                                                 "InhibitTargetInquiry"))
3773                                 drvr_opts->stop_tgt_inquiry = true;
3774                         /* Debugging Options. */
3775                         else if (blogic_parse(&options, "TraceProbe"))
3776                                 blogic_global_options.trace_probe = true;
3777                         else if (blogic_parse(&options, "TraceHardwareReset"))
3778                                 blogic_global_options.trace_hw_reset = true;
3779                         else if (blogic_parse(&options, "TraceConfiguration"))
3780                                 blogic_global_options.trace_config = true;
3781                         else if (blogic_parse(&options, "TraceErrors"))
3782                                 blogic_global_options.trace_err = true;
3783                         else if (blogic_parse(&options, "Debug")) {
3784                                 blogic_global_options.trace_probe = true;
3785                                 blogic_global_options.trace_hw_reset = true;
3786                                 blogic_global_options.trace_config = true;
3787                                 blogic_global_options.trace_err = true;
3788                         }
3789                         if (*options == ',')
3790                                 options++;
3791                         else if (*options != ';' && *options != '\0') {
3792                                 blogic_err("BusLogic: Unexpected Driver Option '%s' " "ignored\n", NULL, options);
3793                                 *options = '\0';
3794                         }
3795                 }
3796                 if (!(blogic_drvr_options_count == 0 ||
3797                         blogic_probeinfo_count == 0 ||
3798                         blogic_drvr_options_count == blogic_probeinfo_count)) {
3799                         blogic_err("BusLogic: Invalid Driver Options " "(all or no I/O Addresses must be specified)\n", NULL);
3800                         return 0;
3801                 }
3802                 /*
3803                    Tagged Queuing is disabled when the Queue Depth is 1 since queuing
3804                    multiple commands is not possible.
3805                  */
3806                 for (tgt_id = 0; tgt_id < BLOGIC_MAXDEV; tgt_id++)
3807                         if (drvr_opts->qdepth[tgt_id] == 1) {
3808                                 unsigned short tgt_bit = 1 << tgt_id;
3809                                 drvr_opts->tagq_ok &= ~tgt_bit;
3810                                 drvr_opts->tagq_ok_mask |= tgt_bit;
3811                         }
3812                 if (*options == ';')
3813                         options++;
3814                 if (*options == '\0')
3815                         return 0;
3816         }
3817         return 1;
3818 }
3819
3820 /*
3821   Get it all started
3822 */
3823
3824 static struct scsi_host_template blogic_template = {
3825         .module = THIS_MODULE,
3826         .proc_name = "BusLogic",
3827         .write_info = blogic_write_info,
3828         .show_info = blogic_show_info,
3829         .name = "BusLogic",
3830         .info = blogic_drvr_info,
3831         .queuecommand = blogic_qcmd,
3832         .slave_configure = blogic_slaveconfig,
3833         .bios_param = blogic_diskparam,
3834         .eh_host_reset_handler = blogic_hostreset,
3835 #if 0
3836         .eh_abort_handler = blogic_abort,
3837 #endif
3838         .unchecked_isa_dma = 1,
3839         .max_sectors = 128,
3840         .use_clustering = ENABLE_CLUSTERING,
3841 };
3842
3843 /*
3844   blogic_setup handles processing of Kernel Command Line Arguments.
3845 */
3846
3847 static int __init blogic_setup(char *str)
3848 {
3849         int ints[3];
3850
3851         (void) get_options(str, ARRAY_SIZE(ints), ints);
3852
3853         if (ints[0] != 0) {
3854                 blogic_err("BusLogic: Obsolete Command Line Entry " "Format Ignored\n", NULL);
3855                 return 0;
3856         }
3857         if (str == NULL || *str == '\0')
3858                 return 0;
3859         return blogic_parseopts(str);
3860 }
3861
3862 /*
3863  * Exit function.  Deletes all hosts associated with this driver.
3864  */
3865
3866 static void __exit blogic_exit(void)
3867 {
3868         struct blogic_adapter *ha, *next;
3869
3870         list_for_each_entry_safe(ha, next, &blogic_host_list, host_list)
3871                 blogic_deladapter(ha);
3872 }
3873
3874 __setup("BusLogic=", blogic_setup);
3875
3876 #ifdef MODULE
3877 /*static struct pci_device_id blogic_pci_tbl[] = {
3878         { PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER,
3879           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
3880         { PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC,
3881           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
3882         { PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_FLASHPOINT,
3883           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
3884         { }
3885 };*/
3886 static DEFINE_PCI_DEVICE_TABLE(blogic_pci_tbl) = {
3887         {PCI_DEVICE(PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER)},
3888         {PCI_DEVICE(PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC)},
3889         {PCI_DEVICE(PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_FLASHPOINT)},
3890         {0, },
3891 };
3892 #endif
3893 MODULE_DEVICE_TABLE(pci, blogic_pci_tbl);
3894
3895 module_init(blogic_init);
3896 module_exit(blogic_exit);