xref: /openbmc/linux/drivers/scsi/BusLogic.c (revision 9b93eb47)
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);
3917