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