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