Version:  2.0.40 2.2.26 2.4.37 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16

Linux/drivers/scsi/BusLogic.c

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

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us