xref: /linux/drivers/scsi/BusLogic.c (revision d8327c784b51b57dac2c26cfad87dce0d68dfd98)
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 BusLogic_DriverVersion		"2.1.16"
30 #define BusLogic_DriverDate		"18 July 2002"
31 
32 #include <linux/config.h>
33 #include <linux/module.h>
34 #include <linux/init.h>
35 #include <linux/interrupt.h>
36 #include <linux/types.h>
37 #include <linux/blkdev.h>
38 #include <linux/delay.h>
39 #include <linux/ioport.h>
40 #include <linux/mm.h>
41 #include <linux/stat.h>
42 #include <linux/pci.h>
43 #include <linux/spinlock.h>
44 #include <scsi/scsicam.h>
45 
46 #include <asm/dma.h>
47 #include <asm/io.h>
48 #include <asm/system.h>
49 
50 #include <scsi/scsi.h>
51 #include <scsi/scsi_cmnd.h>
52 #include <scsi/scsi_device.h>
53 #include <scsi/scsi_host.h>
54 #include <scsi/scsi_tcq.h>
55 #include "BusLogic.h"
56 #include "FlashPoint.c"
57 
58 #ifndef FAILURE
59 #define FAILURE (-1)
60 #endif
61 
62 static struct scsi_host_template Bus_Logic_template;
63 
64 /*
65   BusLogic_DriverOptionsCount is a count of the number of BusLogic Driver
66   Options specifications provided via the Linux Kernel Command Line or via
67   the Loadable Kernel Module Installation Facility.
68 */
69 
70 static int BusLogic_DriverOptionsCount;
71 
72 
73 /*
74   BusLogic_DriverOptions is an array of Driver Options structures representing
75   BusLogic Driver Options specifications provided via the Linux Kernel Command
76   Line or via the Loadable Kernel Module Installation Facility.
77 */
78 
79 static struct BusLogic_DriverOptions BusLogic_DriverOptions[BusLogic_MaxHostAdapters];
80 
81 
82 /*
83   BusLogic can be assigned a string by insmod.
84 */
85 
86 MODULE_LICENSE("GPL");
87 #ifdef MODULE
88 static char *BusLogic;
89 module_param(BusLogic, charp, 0);
90 #endif
91 
92 
93 /*
94   BusLogic_ProbeOptions is a set of Probe Options to be applied across
95   all BusLogic Host Adapters.
96 */
97 
98 static struct BusLogic_ProbeOptions BusLogic_ProbeOptions;
99 
100 
101 /*
102   BusLogic_GlobalOptions is a set of Global Options to be applied across
103   all BusLogic Host Adapters.
104 */
105 
106 static struct BusLogic_GlobalOptions BusLogic_GlobalOptions;
107 
108 static LIST_HEAD(BusLogic_host_list);
109 
110 /*
111   BusLogic_ProbeInfoCount is the number of entries in BusLogic_ProbeInfoList.
112 */
113 
114 static int BusLogic_ProbeInfoCount;
115 
116 
117 /*
118   BusLogic_ProbeInfoList is the list of I/O Addresses and Bus Probe Information
119   to be checked for potential BusLogic Host Adapters.  It is initialized by
120   interrogating the PCI Configuration Space on PCI machines as well as from the
121   list of standard BusLogic I/O Addresses.
122 */
123 
124 static struct BusLogic_ProbeInfo *BusLogic_ProbeInfoList;
125 
126 
127 /*
128   BusLogic_CommandFailureReason holds a string identifying the reason why a
129   call to BusLogic_Command failed.  It is only non-NULL when BusLogic_Command
130   returns a failure code.
131 */
132 
133 static char *BusLogic_CommandFailureReason;
134 
135 /*
136   BusLogic_AnnounceDriver announces the Driver Version and Date, Author's
137   Name, Copyright Notice, and Electronic Mail Address.
138 */
139 
140 static void BusLogic_AnnounceDriver(struct BusLogic_HostAdapter *HostAdapter)
141 {
142 	BusLogic_Announce("***** BusLogic SCSI Driver Version " BusLogic_DriverVersion " of " BusLogic_DriverDate " *****\n", HostAdapter);
143 	BusLogic_Announce("Copyright 1995-1998 by Leonard N. Zubkoff " "<lnz@dandelion.com>\n", HostAdapter);
144 }
145 
146 
147 /*
148   BusLogic_DriverInfo returns the Host Adapter Name to identify this SCSI
149   Driver and Host Adapter.
150 */
151 
152 static const char *BusLogic_DriverInfo(struct Scsi_Host *Host)
153 {
154 	struct BusLogic_HostAdapter *HostAdapter = (struct BusLogic_HostAdapter *) Host->hostdata;
155 	return HostAdapter->FullModelName;
156 }
157 
158 /*
159   BusLogic_InitializeCCBs initializes a group of Command Control Blocks (CCBs)
160   for Host Adapter from the BlockSize bytes located at BlockPointer.  The newly
161   created CCBs are added to Host Adapter's free list.
162 */
163 
164 static void BusLogic_InitializeCCBs(struct BusLogic_HostAdapter *HostAdapter, void *BlockPointer, int BlockSize, dma_addr_t BlockPointerHandle)
165 {
166 	struct BusLogic_CCB *CCB = (struct BusLogic_CCB *) BlockPointer;
167 	unsigned int offset = 0;
168 	memset(BlockPointer, 0, BlockSize);
169 	CCB->AllocationGroupHead = BlockPointerHandle;
170 	CCB->AllocationGroupSize = BlockSize;
171 	while ((BlockSize -= sizeof(struct BusLogic_CCB)) >= 0) {
172 		CCB->Status = BusLogic_CCB_Free;
173 		CCB->HostAdapter = HostAdapter;
174 		CCB->DMA_Handle = (u32) BlockPointerHandle + offset;
175 		if (BusLogic_FlashPointHostAdapterP(HostAdapter)) {
176 			CCB->CallbackFunction = BusLogic_QueueCompletedCCB;
177 			CCB->BaseAddress = HostAdapter->FlashPointInfo.BaseAddress;
178 		}
179 		CCB->Next = HostAdapter->Free_CCBs;
180 		CCB->NextAll = HostAdapter->All_CCBs;
181 		HostAdapter->Free_CCBs = CCB;
182 		HostAdapter->All_CCBs = CCB;
183 		HostAdapter->AllocatedCCBs++;
184 		CCB++;
185 		offset += sizeof(struct BusLogic_CCB);
186 	}
187 }
188 
189 
190 /*
191   BusLogic_CreateInitialCCBs allocates the initial CCBs for Host Adapter.
192 */
193 
194 static boolean __init BusLogic_CreateInitialCCBs(struct BusLogic_HostAdapter *HostAdapter)
195 {
196 	int BlockSize = BusLogic_CCB_AllocationGroupSize * sizeof(struct BusLogic_CCB);
197 	void *BlockPointer;
198 	dma_addr_t BlockPointerHandle;
199 	while (HostAdapter->AllocatedCCBs < HostAdapter->InitialCCBs) {
200 		BlockPointer = pci_alloc_consistent(HostAdapter->PCI_Device, BlockSize, &BlockPointerHandle);
201 		if (BlockPointer == NULL) {
202 			BusLogic_Error("UNABLE TO ALLOCATE CCB GROUP - DETACHING\n", HostAdapter);
203 			return false;
204 		}
205 		BusLogic_InitializeCCBs(HostAdapter, BlockPointer, BlockSize, BlockPointerHandle);
206 	}
207 	return true;
208 }
209 
210 
211 /*
212   BusLogic_DestroyCCBs deallocates the CCBs for Host Adapter.
213 */
214 
215 static void BusLogic_DestroyCCBs(struct BusLogic_HostAdapter *HostAdapter)
216 {
217 	struct BusLogic_CCB *NextCCB = HostAdapter->All_CCBs, *CCB, *Last_CCB = NULL;
218 	HostAdapter->All_CCBs = NULL;
219 	HostAdapter->Free_CCBs = NULL;
220 	while ((CCB = NextCCB) != NULL) {
221 		NextCCB = CCB->NextAll;
222 		if (CCB->AllocationGroupHead) {
223 			if (Last_CCB)
224 				pci_free_consistent(HostAdapter->PCI_Device, Last_CCB->AllocationGroupSize, Last_CCB, Last_CCB->AllocationGroupHead);
225 			Last_CCB = CCB;
226 		}
227 	}
228 	if (Last_CCB)
229 		pci_free_consistent(HostAdapter->PCI_Device, Last_CCB->AllocationGroupSize, Last_CCB, Last_CCB->AllocationGroupHead);
230 }
231 
232 
233 /*
234   BusLogic_CreateAdditionalCCBs allocates Additional CCBs for Host Adapter.  If
235   allocation fails and there are no remaining CCBs available, the Driver Queue
236   Depth is decreased to a known safe value to avoid potential deadlocks when
237   multiple host adapters share the same IRQ Channel.
238 */
239 
240 static void BusLogic_CreateAdditionalCCBs(struct BusLogic_HostAdapter *HostAdapter, int AdditionalCCBs, boolean SuccessMessageP)
241 {
242 	int BlockSize = BusLogic_CCB_AllocationGroupSize * sizeof(struct BusLogic_CCB);
243 	int PreviouslyAllocated = HostAdapter->AllocatedCCBs;
244 	void *BlockPointer;
245 	dma_addr_t BlockPointerHandle;
246 	if (AdditionalCCBs <= 0)
247 		return;
248 	while (HostAdapter->AllocatedCCBs - PreviouslyAllocated < AdditionalCCBs) {
249 		BlockPointer = pci_alloc_consistent(HostAdapter->PCI_Device, BlockSize, &BlockPointerHandle);
250 		if (BlockPointer == NULL)
251 			break;
252 		BusLogic_InitializeCCBs(HostAdapter, BlockPointer, BlockSize, BlockPointerHandle);
253 	}
254 	if (HostAdapter->AllocatedCCBs > PreviouslyAllocated) {
255 		if (SuccessMessageP)
256 			BusLogic_Notice("Allocated %d additional CCBs (total now %d)\n", HostAdapter, HostAdapter->AllocatedCCBs - PreviouslyAllocated, HostAdapter->AllocatedCCBs);
257 		return;
258 	}
259 	BusLogic_Notice("Failed to allocate additional CCBs\n", HostAdapter);
260 	if (HostAdapter->DriverQueueDepth > HostAdapter->AllocatedCCBs - HostAdapter->TargetDeviceCount) {
261 		HostAdapter->DriverQueueDepth = HostAdapter->AllocatedCCBs - HostAdapter->TargetDeviceCount;
262 		HostAdapter->SCSI_Host->can_queue = HostAdapter->DriverQueueDepth;
263 	}
264 }
265 
266 /*
267   BusLogic_AllocateCCB allocates a CCB from Host Adapter's free list,
268   allocating more memory from the Kernel if necessary.  The Host Adapter's
269   Lock should already have been acquired by the caller.
270 */
271 
272 static struct BusLogic_CCB *BusLogic_AllocateCCB(struct BusLogic_HostAdapter
273 						 *HostAdapter)
274 {
275 	static unsigned long SerialNumber = 0;
276 	struct BusLogic_CCB *CCB;
277 	CCB = HostAdapter->Free_CCBs;
278 	if (CCB != NULL) {
279 		CCB->SerialNumber = ++SerialNumber;
280 		HostAdapter->Free_CCBs = CCB->Next;
281 		CCB->Next = NULL;
282 		if (HostAdapter->Free_CCBs == NULL)
283 			BusLogic_CreateAdditionalCCBs(HostAdapter, HostAdapter->IncrementalCCBs, true);
284 		return CCB;
285 	}
286 	BusLogic_CreateAdditionalCCBs(HostAdapter, HostAdapter->IncrementalCCBs, true);
287 	CCB = HostAdapter->Free_CCBs;
288 	if (CCB == NULL)
289 		return NULL;
290 	CCB->SerialNumber = ++SerialNumber;
291 	HostAdapter->Free_CCBs = CCB->Next;
292 	CCB->Next = NULL;
293 	return CCB;
294 }
295 
296 
297 /*
298   BusLogic_DeallocateCCB deallocates a CCB, returning it to the Host Adapter's
299   free list.  The Host Adapter's Lock should already have been acquired by the
300   caller.
301 */
302 
303 static void BusLogic_DeallocateCCB(struct BusLogic_CCB *CCB)
304 {
305 	struct BusLogic_HostAdapter *HostAdapter = CCB->HostAdapter;
306 	struct scsi_cmnd *cmd = CCB->Command;
307 
308 	if (cmd->use_sg != 0) {
309 		pci_unmap_sg(HostAdapter->PCI_Device,
310 				(struct scatterlist *)cmd->request_buffer,
311 				cmd->use_sg, cmd->sc_data_direction);
312 	} else if (cmd->request_bufflen != 0) {
313 		pci_unmap_single(HostAdapter->PCI_Device, CCB->DataPointer,
314 				CCB->DataLength, cmd->sc_data_direction);
315 	}
316 	pci_unmap_single(HostAdapter->PCI_Device, CCB->SenseDataPointer,
317 			CCB->SenseDataLength, PCI_DMA_FROMDEVICE);
318 
319 	CCB->Command = NULL;
320 	CCB->Status = BusLogic_CCB_Free;
321 	CCB->Next = HostAdapter->Free_CCBs;
322 	HostAdapter->Free_CCBs = CCB;
323 }
324 
325 
326 /*
327   BusLogic_Command sends the command OperationCode to HostAdapter, optionally
328   providing ParameterLength bytes of ParameterData and receiving at most
329   ReplyLength bytes of ReplyData; any excess reply data is received but
330   discarded.
331 
332   On success, this function returns the number of reply bytes read from
333   the Host Adapter (including any discarded data); on failure, it returns
334   -1 if the command was invalid, or -2 if a timeout occurred.
335 
336   BusLogic_Command is called exclusively during host adapter detection and
337   initialization, so performance and latency are not critical, and exclusive
338   access to the Host Adapter hardware is assumed.  Once the host adapter and
339   driver are initialized, the only Host Adapter command that is issued is the
340   single byte Execute Mailbox Command operation code, which does not require
341   waiting for the Host Adapter Ready bit to be set in the Status Register.
342 */
343 
344 static int BusLogic_Command(struct BusLogic_HostAdapter *HostAdapter, enum BusLogic_OperationCode OperationCode, void *ParameterData, int ParameterLength, void *ReplyData, int ReplyLength)
345 {
346 	unsigned char *ParameterPointer = (unsigned char *) ParameterData;
347 	unsigned char *ReplyPointer = (unsigned char *) ReplyData;
348 	union BusLogic_StatusRegister StatusRegister;
349 	union BusLogic_InterruptRegister InterruptRegister;
350 	unsigned long ProcessorFlags = 0;
351 	int ReplyBytes = 0, Result;
352 	long TimeoutCounter;
353 	/*
354 	   Clear out the Reply Data if provided.
355 	 */
356 	if (ReplyLength > 0)
357 		memset(ReplyData, 0, ReplyLength);
358 	/*
359 	   If the IRQ Channel has not yet been acquired, then interrupts must be
360 	   disabled while issuing host adapter commands since a Command Complete
361 	   interrupt could occur if the IRQ Channel was previously enabled by another
362 	   BusLogic Host Adapter or another driver sharing the same IRQ Channel.
363 	 */
364 	if (!HostAdapter->IRQ_ChannelAcquired) {
365 		local_irq_save(ProcessorFlags);
366 		local_irq_disable();
367 	}
368 	/*
369 	   Wait for the Host Adapter Ready bit to be set and the Command/Parameter
370 	   Register Busy bit to be reset in the Status Register.
371 	 */
372 	TimeoutCounter = 10000;
373 	while (--TimeoutCounter >= 0) {
374 		StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter);
375 		if (StatusRegister.sr.HostAdapterReady && !StatusRegister.sr.CommandParameterRegisterBusy)
376 			break;
377 		udelay(100);
378 	}
379 	if (TimeoutCounter < 0) {
380 		BusLogic_CommandFailureReason = "Timeout waiting for Host Adapter Ready";
381 		Result = -2;
382 		goto Done;
383 	}
384 	/*
385 	   Write the OperationCode to the Command/Parameter Register.
386 	 */
387 	HostAdapter->HostAdapterCommandCompleted = false;
388 	BusLogic_WriteCommandParameterRegister(HostAdapter, OperationCode);
389 	/*
390 	   Write any additional Parameter Bytes.
391 	 */
392 	TimeoutCounter = 10000;
393 	while (ParameterLength > 0 && --TimeoutCounter >= 0) {
394 		/*
395 		   Wait 100 microseconds to give the Host Adapter enough time to determine
396 		   whether the last value written to the Command/Parameter Register was
397 		   valid or not.  If the Command Complete bit is set in the Interrupt
398 		   Register, then the Command Invalid bit in the Status Register will be
399 		   reset if the Operation Code or Parameter was valid and the command
400 		   has completed, or set if the Operation Code or Parameter was invalid.
401 		   If the Data In Register Ready bit is set in the Status Register, then
402 		   the Operation Code was valid, and data is waiting to be read back
403 		   from the Host Adapter.  Otherwise, wait for the Command/Parameter
404 		   Register Busy bit in the Status Register to be reset.
405 		 */
406 		udelay(100);
407 		InterruptRegister.All = BusLogic_ReadInterruptRegister(HostAdapter);
408 		StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter);
409 		if (InterruptRegister.ir.CommandComplete)
410 			break;
411 		if (HostAdapter->HostAdapterCommandCompleted)
412 			break;
413 		if (StatusRegister.sr.DataInRegisterReady)
414 			break;
415 		if (StatusRegister.sr.CommandParameterRegisterBusy)
416 			continue;
417 		BusLogic_WriteCommandParameterRegister(HostAdapter, *ParameterPointer++);
418 		ParameterLength--;
419 	}
420 	if (TimeoutCounter < 0) {
421 		BusLogic_CommandFailureReason = "Timeout waiting for Parameter Acceptance";
422 		Result = -2;
423 		goto Done;
424 	}
425 	/*
426 	   The Modify I/O Address command does not cause a Command Complete Interrupt.
427 	 */
428 	if (OperationCode == BusLogic_ModifyIOAddress) {
429 		StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter);
430 		if (StatusRegister.sr.CommandInvalid) {
431 			BusLogic_CommandFailureReason = "Modify I/O Address Invalid";
432 			Result = -1;
433 			goto Done;
434 		}
435 		if (BusLogic_GlobalOptions.TraceConfiguration)
436 			BusLogic_Notice("BusLogic_Command(%02X) Status = %02X: " "(Modify I/O Address)\n", HostAdapter, OperationCode, StatusRegister.All);
437 		Result = 0;
438 		goto Done;
439 	}
440 	/*
441 	   Select an appropriate timeout value for awaiting command completion.
442 	 */
443 	switch (OperationCode) {
444 	case BusLogic_InquireInstalledDevicesID0to7:
445 	case BusLogic_InquireInstalledDevicesID8to15:
446 	case BusLogic_InquireTargetDevices:
447 		/* Approximately 60 seconds. */
448 		TimeoutCounter = 60 * 10000;
449 		break;
450 	default:
451 		/* Approximately 1 second. */
452 		TimeoutCounter = 10000;
453 		break;
454 	}
455 	/*
456 	   Receive any Reply Bytes, waiting for either the Command Complete bit to
457 	   be set in the Interrupt Register, or for the Interrupt Handler to set the
458 	   Host Adapter Command Completed bit in the Host Adapter structure.
459 	 */
460 	while (--TimeoutCounter >= 0) {
461 		InterruptRegister.All = BusLogic_ReadInterruptRegister(HostAdapter);
462 		StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter);
463 		if (InterruptRegister.ir.CommandComplete)
464 			break;
465 		if (HostAdapter->HostAdapterCommandCompleted)
466 			break;
467 		if (StatusRegister.sr.DataInRegisterReady) {
468 			if (++ReplyBytes <= ReplyLength)
469 				*ReplyPointer++ = BusLogic_ReadDataInRegister(HostAdapter);
470 			else
471 				BusLogic_ReadDataInRegister(HostAdapter);
472 		}
473 		if (OperationCode == BusLogic_FetchHostAdapterLocalRAM && StatusRegister.sr.HostAdapterReady)
474 			break;
475 		udelay(100);
476 	}
477 	if (TimeoutCounter < 0) {
478 		BusLogic_CommandFailureReason = "Timeout waiting for Command Complete";
479 		Result = -2;
480 		goto Done;
481 	}
482 	/*
483 	   Clear any pending Command Complete Interrupt.
484 	 */
485 	BusLogic_InterruptReset(HostAdapter);
486 	/*
487 	   Provide tracing information if requested.
488 	 */
489 	if (BusLogic_GlobalOptions.TraceConfiguration) {
490 		int i;
491 		BusLogic_Notice("BusLogic_Command(%02X) Status = %02X: %2d ==> %2d:", HostAdapter, OperationCode, StatusRegister.All, ReplyLength, ReplyBytes);
492 		if (ReplyLength > ReplyBytes)
493 			ReplyLength = ReplyBytes;
494 		for (i = 0; i < ReplyLength; i++)
495 			BusLogic_Notice(" %02X", HostAdapter, ((unsigned char *) ReplyData)[i]);
496 		BusLogic_Notice("\n", HostAdapter);
497 	}
498 	/*
499 	   Process Command Invalid conditions.
500 	 */
501 	if (StatusRegister.sr.CommandInvalid) {
502 		/*
503 		   Some early BusLogic Host Adapters may not recover properly from
504 		   a Command Invalid condition, so if this appears to be the case,
505 		   a Soft Reset is issued to the Host Adapter.  Potentially invalid
506 		   commands are never attempted after Mailbox Initialization is
507 		   performed, so there should be no Host Adapter state lost by a
508 		   Soft Reset in response to a Command Invalid condition.
509 		 */
510 		udelay(1000);
511 		StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter);
512 		if (StatusRegister.sr.CommandInvalid ||
513 		    StatusRegister.sr.Reserved ||
514 		    StatusRegister.sr.DataInRegisterReady ||
515 		    StatusRegister.sr.CommandParameterRegisterBusy || !StatusRegister.sr.HostAdapterReady || !StatusRegister.sr.InitializationRequired || StatusRegister.sr.DiagnosticActive || StatusRegister.sr.DiagnosticFailure) {
516 			BusLogic_SoftReset(HostAdapter);
517 			udelay(1000);
518 		}
519 		BusLogic_CommandFailureReason = "Command Invalid";
520 		Result = -1;
521 		goto Done;
522 	}
523 	/*
524 	   Handle Excess Parameters Supplied conditions.
525 	 */
526 	if (ParameterLength > 0) {
527 		BusLogic_CommandFailureReason = "Excess Parameters Supplied";
528 		Result = -1;
529 		goto Done;
530 	}
531 	/*
532 	   Indicate the command completed successfully.
533 	 */
534 	BusLogic_CommandFailureReason = NULL;
535 	Result = ReplyBytes;
536 	/*
537 	   Restore the interrupt status if necessary and return.
538 	 */
539       Done:
540 	if (!HostAdapter->IRQ_ChannelAcquired)
541 		local_irq_restore(ProcessorFlags);
542 	return Result;
543 }
544 
545 
546 /*
547   BusLogic_AppendProbeAddressISA appends a single ISA I/O Address to the list
548   of I/O Address and Bus Probe Information to be checked for potential BusLogic
549   Host Adapters.
550 */
551 
552 static void __init BusLogic_AppendProbeAddressISA(unsigned long IO_Address)
553 {
554 	struct BusLogic_ProbeInfo *ProbeInfo;
555 	if (BusLogic_ProbeInfoCount >= BusLogic_MaxHostAdapters)
556 		return;
557 	ProbeInfo = &BusLogic_ProbeInfoList[BusLogic_ProbeInfoCount++];
558 	ProbeInfo->HostAdapterType = BusLogic_MultiMaster;
559 	ProbeInfo->HostAdapterBusType = BusLogic_ISA_Bus;
560 	ProbeInfo->IO_Address = IO_Address;
561 	ProbeInfo->PCI_Device = NULL;
562 }
563 
564 
565 /*
566   BusLogic_InitializeProbeInfoListISA initializes the list of I/O Address and
567   Bus Probe Information to be checked for potential BusLogic SCSI Host Adapters
568   only from the list of standard BusLogic MultiMaster ISA I/O Addresses.
569 */
570 
571 static void __init BusLogic_InitializeProbeInfoListISA(struct BusLogic_HostAdapter
572 						       *PrototypeHostAdapter)
573 {
574 	/*
575 	   If BusLogic Driver Options specifications requested that ISA Bus Probes
576 	   be inhibited, do not proceed further.
577 	 */
578 	if (BusLogic_ProbeOptions.NoProbeISA)
579 		return;
580 	/*
581 	   Append the list of standard BusLogic MultiMaster ISA I/O Addresses.
582 	 */
583 	if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe330 : check_region(0x330, BusLogic_MultiMasterAddressCount) == 0)
584 		BusLogic_AppendProbeAddressISA(0x330);
585 	if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe334 : check_region(0x334, BusLogic_MultiMasterAddressCount) == 0)
586 		BusLogic_AppendProbeAddressISA(0x334);
587 	if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe230 : check_region(0x230, BusLogic_MultiMasterAddressCount) == 0)
588 		BusLogic_AppendProbeAddressISA(0x230);
589 	if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe234 : check_region(0x234, BusLogic_MultiMasterAddressCount) == 0)
590 		BusLogic_AppendProbeAddressISA(0x234);
591 	if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe130 : check_region(0x130, BusLogic_MultiMasterAddressCount) == 0)
592 		BusLogic_AppendProbeAddressISA(0x130);
593 	if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe134 : check_region(0x134, BusLogic_MultiMasterAddressCount) == 0)
594 		BusLogic_AppendProbeAddressISA(0x134);
595 }
596 
597 
598 #ifdef CONFIG_PCI
599 
600 
601 /*
602   BusLogic_SortProbeInfo sorts a section of BusLogic_ProbeInfoList in order
603   of increasing PCI Bus and Device Number.
604 */
605 
606 static void __init BusLogic_SortProbeInfo(struct BusLogic_ProbeInfo *ProbeInfoList, int ProbeInfoCount)
607 {
608 	int LastInterchange = ProbeInfoCount - 1, Bound, j;
609 	while (LastInterchange > 0) {
610 		Bound = LastInterchange;
611 		LastInterchange = 0;
612 		for (j = 0; j < Bound; j++) {
613 			struct BusLogic_ProbeInfo *ProbeInfo1 = &ProbeInfoList[j];
614 			struct BusLogic_ProbeInfo *ProbeInfo2 = &ProbeInfoList[j + 1];
615 			if (ProbeInfo1->Bus > ProbeInfo2->Bus || (ProbeInfo1->Bus == ProbeInfo2->Bus && (ProbeInfo1->Device > ProbeInfo2->Device))) {
616 				struct BusLogic_ProbeInfo TempProbeInfo;
617 				memcpy(&TempProbeInfo, ProbeInfo1, sizeof(struct BusLogic_ProbeInfo));
618 				memcpy(ProbeInfo1, ProbeInfo2, sizeof(struct BusLogic_ProbeInfo));
619 				memcpy(ProbeInfo2, &TempProbeInfo, sizeof(struct BusLogic_ProbeInfo));
620 				LastInterchange = j;
621 			}
622 		}
623 	}
624 }
625 
626 
627 /*
628   BusLogic_InitializeMultiMasterProbeInfo initializes the list of I/O Address
629   and Bus Probe Information to be checked for potential BusLogic MultiMaster
630   SCSI Host Adapters by interrogating the PCI Configuration Space on PCI
631   machines as well as from the list of standard BusLogic MultiMaster ISA
632   I/O Addresses.  It returns the number of PCI MultiMaster Host Adapters found.
633 */
634 
635 static int __init BusLogic_InitializeMultiMasterProbeInfo(struct BusLogic_HostAdapter
636 							  *PrototypeHostAdapter)
637 {
638 	struct BusLogic_ProbeInfo *PrimaryProbeInfo = &BusLogic_ProbeInfoList[BusLogic_ProbeInfoCount];
639 	int NonPrimaryPCIMultiMasterIndex = BusLogic_ProbeInfoCount + 1;
640 	int NonPrimaryPCIMultiMasterCount = 0, PCIMultiMasterCount = 0;
641 	boolean ForceBusDeviceScanningOrder = false;
642 	boolean ForceBusDeviceScanningOrderChecked = false;
643 	boolean StandardAddressSeen[6];
644 	struct pci_dev *PCI_Device = NULL;
645 	int i;
646 	if (BusLogic_ProbeInfoCount >= BusLogic_MaxHostAdapters)
647 		return 0;
648 	BusLogic_ProbeInfoCount++;
649 	for (i = 0; i < 6; i++)
650 		StandardAddressSeen[i] = false;
651 	/*
652 	   Iterate over the MultiMaster PCI Host Adapters.  For each enumerated host
653 	   adapter, determine whether its ISA Compatible I/O Port is enabled and if
654 	   so, whether it is assigned the Primary I/O Address.  A host adapter that is
655 	   assigned the Primary I/O Address will always be the preferred boot device.
656 	   The MultiMaster BIOS will first recognize a host adapter at the Primary I/O
657 	   Address, then any other PCI host adapters, and finally any host adapters
658 	   located at the remaining standard ISA I/O Addresses.  When a PCI host
659 	   adapter is found with its ISA Compatible I/O Port enabled, a command is
660 	   issued to disable the ISA Compatible I/O Port, and it is noted that the
661 	   particular standard ISA I/O Address need not be probed.
662 	 */
663 	PrimaryProbeInfo->IO_Address = 0;
664 	while ((PCI_Device = pci_find_device(PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER, PCI_Device)) != NULL) {
665 		struct BusLogic_HostAdapter *HostAdapter = PrototypeHostAdapter;
666 		struct BusLogic_PCIHostAdapterInformation PCIHostAdapterInformation;
667 		enum BusLogic_ISACompatibleIOPort ModifyIOAddressRequest;
668 		unsigned char Bus;
669 		unsigned char Device;
670 		unsigned int IRQ_Channel;
671 		unsigned long BaseAddress0;
672 		unsigned long BaseAddress1;
673 		unsigned long IO_Address;
674 		unsigned long PCI_Address;
675 
676 		if (pci_enable_device(PCI_Device))
677 			continue;
678 
679 		if (pci_set_dma_mask(PCI_Device, (u64) 0xffffffff))
680 			continue;
681 
682 		Bus = PCI_Device->bus->number;
683 		Device = PCI_Device->devfn >> 3;
684 		IRQ_Channel = PCI_Device->irq;
685 		IO_Address = BaseAddress0 = pci_resource_start(PCI_Device, 0);
686 		PCI_Address = BaseAddress1 = pci_resource_start(PCI_Device, 1);
687 
688 		if (pci_resource_flags(PCI_Device, 0) & IORESOURCE_MEM) {
689 			BusLogic_Error("BusLogic: Base Address0 0x%X not I/O for " "MultiMaster Host Adapter\n", NULL, BaseAddress0);
690 			BusLogic_Error("at PCI Bus %d Device %d I/O Address 0x%X\n", NULL, Bus, Device, IO_Address);
691 			continue;
692 		}
693 		if (pci_resource_flags(PCI_Device, 1) & IORESOURCE_IO) {
694 			BusLogic_Error("BusLogic: Base Address1 0x%X not Memory for " "MultiMaster Host Adapter\n", NULL, BaseAddress1);
695 			BusLogic_Error("at PCI Bus %d Device %d PCI Address 0x%X\n", NULL, Bus, Device, PCI_Address);
696 			continue;
697 		}
698 		if (IRQ_Channel == 0) {
699 			BusLogic_Error("BusLogic: IRQ Channel %d invalid for " "MultiMaster Host Adapter\n", NULL, IRQ_Channel);
700 			BusLogic_Error("at PCI Bus %d Device %d I/O Address 0x%X\n", NULL, Bus, Device, IO_Address);
701 			continue;
702 		}
703 		if (BusLogic_GlobalOptions.TraceProbe) {
704 			BusLogic_Notice("BusLogic: PCI MultiMaster Host Adapter " "detected at\n", NULL);
705 			BusLogic_Notice("BusLogic: PCI Bus %d Device %d I/O Address " "0x%X PCI Address 0x%X\n", NULL, Bus, Device, IO_Address, PCI_Address);
706 		}
707 		/*
708 		   Issue the Inquire PCI Host Adapter Information command to determine
709 		   the ISA Compatible I/O Port.  If the ISA Compatible I/O Port is
710 		   known and enabled, note that the particular Standard ISA I/O
711 		   Address should not be probed.
712 		 */
713 		HostAdapter->IO_Address = IO_Address;
714 		BusLogic_InterruptReset(HostAdapter);
715 		if (BusLogic_Command(HostAdapter, BusLogic_InquirePCIHostAdapterInformation, NULL, 0, &PCIHostAdapterInformation, sizeof(PCIHostAdapterInformation))
716 		    == sizeof(PCIHostAdapterInformation)) {
717 			if (PCIHostAdapterInformation.ISACompatibleIOPort < 6)
718 				StandardAddressSeen[PCIHostAdapterInformation.ISACompatibleIOPort] = true;
719 		} else
720 			PCIHostAdapterInformation.ISACompatibleIOPort = BusLogic_IO_Disable;
721 		/*
722 		 * Issue the Modify I/O Address command to disable the ISA Compatible
723 		 * I/O Port.  On PCI Host Adapters, the Modify I/O Address command
724 		 * allows modification of the ISA compatible I/O Address that the Host
725 		 * Adapter responds to; it does not affect the PCI compliant I/O Address
726 		 * assigned at system initialization.
727 		 */
728 		ModifyIOAddressRequest = BusLogic_IO_Disable;
729 		BusLogic_Command(HostAdapter, BusLogic_ModifyIOAddress, &ModifyIOAddressRequest, sizeof(ModifyIOAddressRequest), NULL, 0);
730 		/*
731 		   For the first MultiMaster Host Adapter enumerated, issue the Fetch
732 		   Host Adapter Local RAM command to read byte 45 of the AutoSCSI area,
733 		   for the setting of the "Use Bus And Device # For PCI Scanning Seq."
734 		   option.  Issue the Inquire Board ID command since this option is
735 		   only valid for the BT-948/958/958D.
736 		 */
737 		if (!ForceBusDeviceScanningOrderChecked) {
738 			struct BusLogic_FetchHostAdapterLocalRAMRequest FetchHostAdapterLocalRAMRequest;
739 			struct BusLogic_AutoSCSIByte45 AutoSCSIByte45;
740 			struct BusLogic_BoardID BoardID;
741 			FetchHostAdapterLocalRAMRequest.ByteOffset = BusLogic_AutoSCSI_BaseOffset + 45;
742 			FetchHostAdapterLocalRAMRequest.ByteCount = sizeof(AutoSCSIByte45);
743 			BusLogic_Command(HostAdapter, BusLogic_FetchHostAdapterLocalRAM, &FetchHostAdapterLocalRAMRequest, sizeof(FetchHostAdapterLocalRAMRequest), &AutoSCSIByte45, sizeof(AutoSCSIByte45));
744 			BusLogic_Command(HostAdapter, BusLogic_InquireBoardID, NULL, 0, &BoardID, sizeof(BoardID));
745 			if (BoardID.FirmwareVersion1stDigit == '5')
746 				ForceBusDeviceScanningOrder = AutoSCSIByte45.ForceBusDeviceScanningOrder;
747 			ForceBusDeviceScanningOrderChecked = true;
748 		}
749 		/*
750 		   Determine whether this MultiMaster Host Adapter has its ISA
751 		   Compatible I/O Port enabled and is assigned the Primary I/O Address.
752 		   If it does, then it is the Primary MultiMaster Host Adapter and must
753 		   be recognized first.  If it does not, then it is added to the list
754 		   for probing after any Primary MultiMaster Host Adapter is probed.
755 		 */
756 		if (PCIHostAdapterInformation.ISACompatibleIOPort == BusLogic_IO_330) {
757 			PrimaryProbeInfo->HostAdapterType = BusLogic_MultiMaster;
758 			PrimaryProbeInfo->HostAdapterBusType = BusLogic_PCI_Bus;
759 			PrimaryProbeInfo->IO_Address = IO_Address;
760 			PrimaryProbeInfo->PCI_Address = PCI_Address;
761 			PrimaryProbeInfo->Bus = Bus;
762 			PrimaryProbeInfo->Device = Device;
763 			PrimaryProbeInfo->IRQ_Channel = IRQ_Channel;
764 			PrimaryProbeInfo->PCI_Device = PCI_Device;
765 			PCIMultiMasterCount++;
766 		} else if (BusLogic_ProbeInfoCount < BusLogic_MaxHostAdapters) {
767 			struct BusLogic_ProbeInfo *ProbeInfo = &BusLogic_ProbeInfoList[BusLogic_ProbeInfoCount++];
768 			ProbeInfo->HostAdapterType = BusLogic_MultiMaster;
769 			ProbeInfo->HostAdapterBusType = BusLogic_PCI_Bus;
770 			ProbeInfo->IO_Address = IO_Address;
771 			ProbeInfo->PCI_Address = PCI_Address;
772 			ProbeInfo->Bus = Bus;
773 			ProbeInfo->Device = Device;
774 			ProbeInfo->IRQ_Channel = IRQ_Channel;
775 			ProbeInfo->PCI_Device = PCI_Device;
776 			NonPrimaryPCIMultiMasterCount++;
777 			PCIMultiMasterCount++;
778 		} else
779 			BusLogic_Warning("BusLogic: Too many Host Adapters " "detected\n", NULL);
780 	}
781 	/*
782 	   If the AutoSCSI "Use Bus And Device # For PCI Scanning Seq." option is ON
783 	   for the first enumerated MultiMaster Host Adapter, and if that host adapter
784 	   is a BT-948/958/958D, then the MultiMaster BIOS will recognize MultiMaster
785 	   Host Adapters in the order of increasing PCI Bus and Device Number.  In
786 	   that case, sort the probe information into the same order the BIOS uses.
787 	   If this option is OFF, then the MultiMaster BIOS will recognize MultiMaster
788 	   Host Adapters in the order they are enumerated by the PCI BIOS, and hence
789 	   no sorting is necessary.
790 	 */
791 	if (ForceBusDeviceScanningOrder)
792 		BusLogic_SortProbeInfo(&BusLogic_ProbeInfoList[NonPrimaryPCIMultiMasterIndex], NonPrimaryPCIMultiMasterCount);
793 	/*
794 	   If no PCI MultiMaster Host Adapter is assigned the Primary I/O Address,
795 	   then the Primary I/O Address must be probed explicitly before any PCI
796 	   host adapters are probed.
797 	 */
798 	if (!BusLogic_ProbeOptions.NoProbeISA)
799 		if (PrimaryProbeInfo->IO_Address == 0 && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe330 : check_region(0x330, BusLogic_MultiMasterAddressCount) == 0)) {
800 			PrimaryProbeInfo->HostAdapterType = BusLogic_MultiMaster;
801 			PrimaryProbeInfo->HostAdapterBusType = BusLogic_ISA_Bus;
802 			PrimaryProbeInfo->IO_Address = 0x330;
803 		}
804 	/*
805 	   Append the list of standard BusLogic MultiMaster ISA I/O Addresses,
806 	   omitting the Primary I/O Address which has already been handled.
807 	 */
808 	if (!BusLogic_ProbeOptions.NoProbeISA) {
809 		if (!StandardAddressSeen[1] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe334 : check_region(0x334, BusLogic_MultiMasterAddressCount) == 0))
810 			BusLogic_AppendProbeAddressISA(0x334);
811 		if (!StandardAddressSeen[2] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe230 : check_region(0x230, BusLogic_MultiMasterAddressCount) == 0))
812 			BusLogic_AppendProbeAddressISA(0x230);
813 		if (!StandardAddressSeen[3] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe234 : check_region(0x234, BusLogic_MultiMasterAddressCount) == 0))
814 			BusLogic_AppendProbeAddressISA(0x234);
815 		if (!StandardAddressSeen[4] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe130 : check_region(0x130, BusLogic_MultiMasterAddressCount) == 0))
816 			BusLogic_AppendProbeAddressISA(0x130);
817 		if (!StandardAddressSeen[5] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe134 : check_region(0x134, BusLogic_MultiMasterAddressCount) == 0))
818 			BusLogic_AppendProbeAddressISA(0x134);
819 	}
820 	/*
821 	   Iterate over the older non-compliant MultiMaster PCI Host Adapters,
822 	   noting the PCI bus location and assigned IRQ Channel.
823 	 */
824 	PCI_Device = NULL;
825 	while ((PCI_Device = pci_find_device(PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC, PCI_Device)) != NULL) {
826 		unsigned char Bus;
827 		unsigned char Device;
828 		unsigned int IRQ_Channel;
829 		unsigned long IO_Address;
830 
831 		if (pci_enable_device(PCI_Device))
832 			continue;
833 
834 		if (pci_set_dma_mask(PCI_Device, (u64) 0xffffffff))
835 			continue;
836 
837 		Bus = PCI_Device->bus->number;
838 		Device = PCI_Device->devfn >> 3;
839 		IRQ_Channel = PCI_Device->irq;
840 		IO_Address = pci_resource_start(PCI_Device, 0);
841 
842 		if (IO_Address == 0 || IRQ_Channel == 0)
843 			continue;
844 		for (i = 0; i < BusLogic_ProbeInfoCount; i++) {
845 			struct BusLogic_ProbeInfo *ProbeInfo = &BusLogic_ProbeInfoList[i];
846 			if (ProbeInfo->IO_Address == IO_Address && ProbeInfo->HostAdapterType == BusLogic_MultiMaster) {
847 				ProbeInfo->HostAdapterBusType = BusLogic_PCI_Bus;
848 				ProbeInfo->PCI_Address = 0;
849 				ProbeInfo->Bus = Bus;
850 				ProbeInfo->Device = Device;
851 				ProbeInfo->IRQ_Channel = IRQ_Channel;
852 				ProbeInfo->PCI_Device = PCI_Device;
853 				break;
854 			}
855 		}
856 	}
857 	return PCIMultiMasterCount;
858 }
859 
860 
861 /*
862   BusLogic_InitializeFlashPointProbeInfo initializes the list of I/O Address
863   and Bus Probe Information to be checked for potential BusLogic FlashPoint
864   Host Adapters by interrogating the PCI Configuration Space.  It returns the
865   number of FlashPoint Host Adapters found.
866 */
867 
868 static int __init BusLogic_InitializeFlashPointProbeInfo(struct BusLogic_HostAdapter
869 							 *PrototypeHostAdapter)
870 {
871 	int FlashPointIndex = BusLogic_ProbeInfoCount, FlashPointCount = 0;
872 	struct pci_dev *PCI_Device = NULL;
873 	/*
874 	   Interrogate PCI Configuration Space for any FlashPoint Host Adapters.
875 	 */
876 	while ((PCI_Device = pci_find_device(PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_FLASHPOINT, PCI_Device)) != NULL) {
877 		unsigned char Bus;
878 		unsigned char Device;
879 		unsigned int IRQ_Channel;
880 		unsigned long BaseAddress0;
881 		unsigned long BaseAddress1;
882 		unsigned long IO_Address;
883 		unsigned long PCI_Address;
884 
885 		if (pci_enable_device(PCI_Device))
886 			continue;
887 
888 		if (pci_set_dma_mask(PCI_Device, (u64) 0xffffffff))
889 			continue;
890 
891 		Bus = PCI_Device->bus->number;
892 		Device = PCI_Device->devfn >> 3;
893 		IRQ_Channel = PCI_Device->irq;
894 		IO_Address = BaseAddress0 = pci_resource_start(PCI_Device, 0);
895 		PCI_Address = BaseAddress1 = pci_resource_start(PCI_Device, 1);
896 #ifndef CONFIG_SCSI_OMIT_FLASHPOINT
897 		if (pci_resource_flags(PCI_Device, 0) & IORESOURCE_MEM) {
898 			BusLogic_Error("BusLogic: Base Address0 0x%X not I/O for " "FlashPoint Host Adapter\n", NULL, BaseAddress0);
899 			BusLogic_Error("at PCI Bus %d Device %d I/O Address 0x%X\n", NULL, Bus, Device, IO_Address);
900 			continue;
901 		}
902 		if (pci_resource_flags(PCI_Device, 1) & IORESOURCE_IO) {
903 			BusLogic_Error("BusLogic: Base Address1 0x%X not Memory for " "FlashPoint Host Adapter\n", NULL, BaseAddress1);
904 			BusLogic_Error("at PCI Bus %d Device %d PCI Address 0x%X\n", NULL, Bus, Device, PCI_Address);
905 			continue;
906 		}
907 		if (IRQ_Channel == 0) {
908 			BusLogic_Error("BusLogic: IRQ Channel %d invalid for " "FlashPoint Host Adapter\n", NULL, IRQ_Channel);
909 			BusLogic_Error("at PCI Bus %d Device %d I/O Address 0x%X\n", NULL, Bus, Device, IO_Address);
910 			continue;
911 		}
912 		if (BusLogic_GlobalOptions.TraceProbe) {
913 			BusLogic_Notice("BusLogic: FlashPoint Host Adapter " "detected at\n", NULL);
914 			BusLogic_Notice("BusLogic: PCI Bus %d Device %d I/O Address " "0x%X PCI Address 0x%X\n", NULL, Bus, Device, IO_Address, PCI_Address);
915 		}
916 		if (BusLogic_ProbeInfoCount < BusLogic_MaxHostAdapters) {
917 			struct BusLogic_ProbeInfo *ProbeInfo = &BusLogic_ProbeInfoList[BusLogic_ProbeInfoCount++];
918 			ProbeInfo->HostAdapterType = BusLogic_FlashPoint;
919 			ProbeInfo->HostAdapterBusType = BusLogic_PCI_Bus;
920 			ProbeInfo->IO_Address = IO_Address;
921 			ProbeInfo->PCI_Address = PCI_Address;
922 			ProbeInfo->Bus = Bus;
923 			ProbeInfo->Device = Device;
924 			ProbeInfo->IRQ_Channel = IRQ_Channel;
925 			ProbeInfo->PCI_Device = PCI_Device;
926 			FlashPointCount++;
927 		} else
928 			BusLogic_Warning("BusLogic: Too many Host Adapters " "detected\n", NULL);
929 #else
930 		BusLogic_Error("BusLogic: FlashPoint Host Adapter detected at " "PCI Bus %d Device %d\n", NULL, Bus, Device);
931 		BusLogic_Error("BusLogic: I/O Address 0x%X PCI Address 0x%X, irq %d, " "but FlashPoint\n", NULL, IO_Address, PCI_Address, IRQ_Channel);
932 		BusLogic_Error("BusLogic: support was omitted in this kernel " "configuration.\n", NULL);
933 #endif
934 	}
935 	/*
936 	   The FlashPoint BIOS will scan for FlashPoint Host Adapters in the order of
937 	   increasing PCI Bus and Device Number, so sort the probe information into
938 	   the same order the BIOS uses.
939 	 */
940 	BusLogic_SortProbeInfo(&BusLogic_ProbeInfoList[FlashPointIndex], FlashPointCount);
941 	return FlashPointCount;
942 }
943 
944 
945 /*
946   BusLogic_InitializeProbeInfoList initializes the list of I/O Address and Bus
947   Probe Information to be checked for potential BusLogic SCSI Host Adapters by
948   interrogating the PCI Configuration Space on PCI machines as well as from the
949   list of standard BusLogic MultiMaster ISA I/O Addresses.  By default, if both
950   FlashPoint and PCI MultiMaster Host Adapters are present, this driver will
951   probe for FlashPoint Host Adapters first unless the BIOS primary disk is
952   controlled by the first PCI MultiMaster Host Adapter, in which case
953   MultiMaster Host Adapters will be probed first.  The BusLogic Driver Options
954   specifications "MultiMasterFirst" and "FlashPointFirst" can be used to force
955   a particular probe order.
956 */
957 
958 static void __init BusLogic_InitializeProbeInfoList(struct BusLogic_HostAdapter
959 						    *PrototypeHostAdapter)
960 {
961 	/*
962 	   If a PCI BIOS is present, interrogate it for MultiMaster and FlashPoint
963 	   Host Adapters; otherwise, default to the standard ISA MultiMaster probe.
964 	 */
965 	if (!BusLogic_ProbeOptions.NoProbePCI) {
966 		if (BusLogic_ProbeOptions.MultiMasterFirst) {
967 			BusLogic_InitializeMultiMasterProbeInfo(PrototypeHostAdapter);
968 			BusLogic_InitializeFlashPointProbeInfo(PrototypeHostAdapter);
969 		} else if (BusLogic_ProbeOptions.FlashPointFirst) {
970 			BusLogic_InitializeFlashPointProbeInfo(PrototypeHostAdapter);
971 			BusLogic_InitializeMultiMasterProbeInfo(PrototypeHostAdapter);
972 		} else {
973 			int FlashPointCount = BusLogic_InitializeFlashPointProbeInfo(PrototypeHostAdapter);
974 			int PCIMultiMasterCount = BusLogic_InitializeMultiMasterProbeInfo(PrototypeHostAdapter);
975 			if (FlashPointCount > 0 && PCIMultiMasterCount > 0) {
976 				struct BusLogic_ProbeInfo *ProbeInfo = &BusLogic_ProbeInfoList[FlashPointCount];
977 				struct BusLogic_HostAdapter *HostAdapter = PrototypeHostAdapter;
978 				struct BusLogic_FetchHostAdapterLocalRAMRequest FetchHostAdapterLocalRAMRequest;
979 				struct BusLogic_BIOSDriveMapByte Drive0MapByte;
980 				while (ProbeInfo->HostAdapterBusType != BusLogic_PCI_Bus)
981 					ProbeInfo++;
982 				HostAdapter->IO_Address = ProbeInfo->IO_Address;
983 				FetchHostAdapterLocalRAMRequest.ByteOffset = BusLogic_BIOS_BaseOffset + BusLogic_BIOS_DriveMapOffset + 0;
984 				FetchHostAdapterLocalRAMRequest.ByteCount = sizeof(Drive0MapByte);
985 				BusLogic_Command(HostAdapter, BusLogic_FetchHostAdapterLocalRAM, &FetchHostAdapterLocalRAMRequest, sizeof(FetchHostAdapterLocalRAMRequest), &Drive0MapByte, sizeof(Drive0MapByte));
986 				/*
987 				   If the Map Byte for BIOS Drive 0 indicates that BIOS Drive 0
988 				   is controlled by this PCI MultiMaster Host Adapter, then
989 				   reverse the probe order so that MultiMaster Host Adapters are
990 				   probed before FlashPoint Host Adapters.
991 				 */
992 				if (Drive0MapByte.DiskGeometry != BusLogic_BIOS_Disk_Not_Installed) {
993 					struct BusLogic_ProbeInfo SavedProbeInfo[BusLogic_MaxHostAdapters];
994 					int MultiMasterCount = BusLogic_ProbeInfoCount - FlashPointCount;
995 					memcpy(SavedProbeInfo, BusLogic_ProbeInfoList, BusLogic_ProbeInfoCount * sizeof(struct BusLogic_ProbeInfo));
996 					memcpy(&BusLogic_ProbeInfoList[0], &SavedProbeInfo[FlashPointCount], MultiMasterCount * sizeof(struct BusLogic_ProbeInfo));
997 					memcpy(&BusLogic_ProbeInfoList[MultiMasterCount], &SavedProbeInfo[0], FlashPointCount * sizeof(struct BusLogic_ProbeInfo));
998 				}
999 			}
1000 		}
1001 	} else
1002 		BusLogic_InitializeProbeInfoListISA(PrototypeHostAdapter);
1003 }
1004 
1005 
1006 #endif				/* CONFIG_PCI */
1007 
1008 
1009 /*
1010   BusLogic_Failure prints a standardized error message, and then returns false.
1011 */
1012 
1013 static boolean BusLogic_Failure(struct BusLogic_HostAdapter *HostAdapter, char *ErrorMessage)
1014 {
1015 	BusLogic_AnnounceDriver(HostAdapter);
1016 	if (HostAdapter->HostAdapterBusType == BusLogic_PCI_Bus) {
1017 		BusLogic_Error("While configuring BusLogic PCI Host Adapter at\n", HostAdapter);
1018 		BusLogic_Error("Bus %d Device %d I/O Address 0x%X PCI Address 0x%X:\n", HostAdapter, HostAdapter->Bus, HostAdapter->Device, HostAdapter->IO_Address, HostAdapter->PCI_Address);
1019 	} else
1020 		BusLogic_Error("While configuring BusLogic Host Adapter at " "I/O Address 0x%X:\n", HostAdapter, HostAdapter->IO_Address);
1021 	BusLogic_Error("%s FAILED - DETACHING\n", HostAdapter, ErrorMessage);
1022 	if (BusLogic_CommandFailureReason != NULL)
1023 		BusLogic_Error("ADDITIONAL FAILURE INFO - %s\n", HostAdapter, BusLogic_CommandFailureReason);
1024 	return false;
1025 }
1026 
1027 
1028 /*
1029   BusLogic_ProbeHostAdapter probes for a BusLogic Host Adapter.
1030 */
1031 
1032 static boolean __init BusLogic_ProbeHostAdapter(struct BusLogic_HostAdapter *HostAdapter)
1033 {
1034 	union BusLogic_StatusRegister StatusRegister;
1035 	union BusLogic_InterruptRegister InterruptRegister;
1036 	union BusLogic_GeometryRegister GeometryRegister;
1037 	/*
1038 	   FlashPoint Host Adapters are Probed by the FlashPoint SCCB Manager.
1039 	 */
1040 	if (BusLogic_FlashPointHostAdapterP(HostAdapter)) {
1041 		struct FlashPoint_Info *FlashPointInfo = &HostAdapter->FlashPointInfo;
1042 		FlashPointInfo->BaseAddress = (u32) HostAdapter->IO_Address;
1043 		FlashPointInfo->IRQ_Channel = HostAdapter->IRQ_Channel;
1044 		FlashPointInfo->Present = false;
1045 		if (!(FlashPoint_ProbeHostAdapter(FlashPointInfo) == 0 && FlashPointInfo->Present)) {
1046 			BusLogic_Error("BusLogic: FlashPoint Host Adapter detected at " "PCI Bus %d Device %d\n", HostAdapter, HostAdapter->Bus, HostAdapter->Device);
1047 			BusLogic_Error("BusLogic: I/O Address 0x%X PCI Address 0x%X, " "but FlashPoint\n", HostAdapter, HostAdapter->IO_Address, HostAdapter->PCI_Address);
1048 			BusLogic_Error("BusLogic: Probe Function failed to validate it.\n", HostAdapter);
1049 			return false;
1050 		}
1051 		if (BusLogic_GlobalOptions.TraceProbe)
1052 			BusLogic_Notice("BusLogic_Probe(0x%X): FlashPoint Found\n", HostAdapter, HostAdapter->IO_Address);
1053 		/*
1054 		   Indicate the Host Adapter Probe completed successfully.
1055 		 */
1056 		return true;
1057 	}
1058 	/*
1059 	   Read the Status, Interrupt, and Geometry Registers to test if there are I/O
1060 	   ports that respond, and to check the values to determine if they are from a
1061 	   BusLogic Host Adapter.  A nonexistent I/O port will return 0xFF, in which
1062 	   case there is definitely no BusLogic Host Adapter at this base I/O Address.
1063 	   The test here is a subset of that used by the BusLogic Host Adapter BIOS.
1064 	 */
1065 	StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter);
1066 	InterruptRegister.All = BusLogic_ReadInterruptRegister(HostAdapter);
1067 	GeometryRegister.All = BusLogic_ReadGeometryRegister(HostAdapter);
1068 	if (BusLogic_GlobalOptions.TraceProbe)
1069 		BusLogic_Notice("BusLogic_Probe(0x%X): Status 0x%02X, Interrupt 0x%02X, " "Geometry 0x%02X\n", HostAdapter, HostAdapter->IO_Address, StatusRegister.All, InterruptRegister.All, GeometryRegister.All);
1070 	if (StatusRegister.All == 0 || StatusRegister.sr.DiagnosticActive || StatusRegister.sr.CommandParameterRegisterBusy || StatusRegister.sr.Reserved || StatusRegister.sr.CommandInvalid || InterruptRegister.ir.Reserved != 0)
1071 		return false;
1072 	/*
1073 	   Check the undocumented Geometry Register to test if there is an I/O port
1074 	   that responded.  Adaptec Host Adapters do not implement the Geometry
1075 	   Register, so this test helps serve to avoid incorrectly recognizing an
1076 	   Adaptec 1542A or 1542B as a BusLogic.  Unfortunately, the Adaptec 1542C
1077 	   series does respond to the Geometry Register I/O port, but it will be
1078 	   rejected later when the Inquire Extended Setup Information command is
1079 	   issued in BusLogic_CheckHostAdapter.  The AMI FastDisk Host Adapter is a
1080 	   BusLogic clone that implements the same interface as earlier BusLogic
1081 	   Host Adapters, including the undocumented commands, and is therefore
1082 	   supported by this driver.  However, the AMI FastDisk always returns 0x00
1083 	   upon reading the Geometry Register, so the extended translation option
1084 	   should always be left disabled on the AMI FastDisk.
1085 	 */
1086 	if (GeometryRegister.All == 0xFF)
1087 		return false;
1088 	/*
1089 	   Indicate the Host Adapter Probe completed successfully.
1090 	 */
1091 	return true;
1092 }
1093 
1094 
1095 /*
1096   BusLogic_HardwareResetHostAdapter issues a Hardware Reset to the Host Adapter
1097   and waits for Host Adapter Diagnostics to complete.  If HardReset is true, a
1098   Hard Reset is performed which also initiates a SCSI Bus Reset.  Otherwise, a
1099   Soft Reset is performed which only resets the Host Adapter without forcing a
1100   SCSI Bus Reset.
1101 */
1102 
1103 static boolean BusLogic_HardwareResetHostAdapter(struct BusLogic_HostAdapter
1104 						 *HostAdapter, boolean HardReset)
1105 {
1106 	union BusLogic_StatusRegister StatusRegister;
1107 	int TimeoutCounter;
1108 	/*
1109 	   FlashPoint Host Adapters are Hard Reset by the FlashPoint SCCB Manager.
1110 	 */
1111 	if (BusLogic_FlashPointHostAdapterP(HostAdapter)) {
1112 		struct FlashPoint_Info *FlashPointInfo = &HostAdapter->FlashPointInfo;
1113 		FlashPointInfo->HostSoftReset = !HardReset;
1114 		FlashPointInfo->ReportDataUnderrun = true;
1115 		HostAdapter->CardHandle = FlashPoint_HardwareResetHostAdapter(FlashPointInfo);
1116 		if (HostAdapter->CardHandle == FlashPoint_BadCardHandle)
1117 			return false;
1118 		/*
1119 		   Indicate the Host Adapter Hard Reset completed successfully.
1120 		 */
1121 		return true;
1122 	}
1123 	/*
1124 	   Issue a Hard Reset or Soft Reset Command to the Host Adapter.  The Host
1125 	   Adapter should respond by setting Diagnostic Active in the Status Register.
1126 	 */
1127 	if (HardReset)
1128 		BusLogic_HardReset(HostAdapter);
1129 	else
1130 		BusLogic_SoftReset(HostAdapter);
1131 	/*
1132 	   Wait until Diagnostic Active is set in the Status Register.
1133 	 */
1134 	TimeoutCounter = 5 * 10000;
1135 	while (--TimeoutCounter >= 0) {
1136 		StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter);
1137 		if (StatusRegister.sr.DiagnosticActive)
1138 			break;
1139 		udelay(100);
1140 	}
1141 	if (BusLogic_GlobalOptions.TraceHardwareReset)
1142 		BusLogic_Notice("BusLogic_HardwareReset(0x%X): Diagnostic Active, " "Status 0x%02X\n", HostAdapter, HostAdapter->IO_Address, StatusRegister.All);
1143 	if (TimeoutCounter < 0)
1144 		return false;
1145 	/*
1146 	   Wait 100 microseconds to allow completion of any initial diagnostic
1147 	   activity which might leave the contents of the Status Register
1148 	   unpredictable.
1149 	 */
1150 	udelay(100);
1151 	/*
1152 	   Wait until Diagnostic Active is reset in the Status Register.
1153 	 */
1154 	TimeoutCounter = 10 * 10000;
1155 	while (--TimeoutCounter >= 0) {
1156 		StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter);
1157 		if (!StatusRegister.sr.DiagnosticActive)
1158 			break;
1159 		udelay(100);
1160 	}
1161 	if (BusLogic_GlobalOptions.TraceHardwareReset)
1162 		BusLogic_Notice("BusLogic_HardwareReset(0x%X): Diagnostic Completed, " "Status 0x%02X\n", HostAdapter, HostAdapter->IO_Address, StatusRegister.All);
1163 	if (TimeoutCounter < 0)
1164 		return false;
1165 	/*
1166 	   Wait until at least one of the Diagnostic Failure, Host Adapter Ready,
1167 	   or Data In Register Ready bits is set in the Status Register.
1168 	 */
1169 	TimeoutCounter = 10000;
1170 	while (--TimeoutCounter >= 0) {
1171 		StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter);
1172 		if (StatusRegister.sr.DiagnosticFailure || StatusRegister.sr.HostAdapterReady || StatusRegister.sr.DataInRegisterReady)
1173 			break;
1174 		udelay(100);
1175 	}
1176 	if (BusLogic_GlobalOptions.TraceHardwareReset)
1177 		BusLogic_Notice("BusLogic_HardwareReset(0x%X): Host Adapter Ready, " "Status 0x%02X\n", HostAdapter, HostAdapter->IO_Address, StatusRegister.All);
1178 	if (TimeoutCounter < 0)
1179 		return false;
1180 	/*
1181 	   If Diagnostic Failure is set or Host Adapter Ready is reset, then an
1182 	   error occurred during the Host Adapter diagnostics.  If Data In Register
1183 	   Ready is set, then there is an Error Code available.
1184 	 */
1185 	if (StatusRegister.sr.DiagnosticFailure || !StatusRegister.sr.HostAdapterReady) {
1186 		BusLogic_CommandFailureReason = NULL;
1187 		BusLogic_Failure(HostAdapter, "HARD RESET DIAGNOSTICS");
1188 		BusLogic_Error("HOST ADAPTER STATUS REGISTER = %02X\n", HostAdapter, StatusRegister.All);
1189 		if (StatusRegister.sr.DataInRegisterReady) {
1190 			unsigned char ErrorCode = BusLogic_ReadDataInRegister(HostAdapter);
1191 			BusLogic_Error("HOST ADAPTER ERROR CODE = %d\n", HostAdapter, ErrorCode);
1192 		}
1193 		return false;
1194 	}
1195 	/*
1196 	   Indicate the Host Adapter Hard Reset completed successfully.
1197 	 */
1198 	return true;
1199 }
1200 
1201 
1202 /*
1203   BusLogic_CheckHostAdapter checks to be sure this really is a BusLogic
1204   Host Adapter.
1205 */
1206 
1207 static boolean __init BusLogic_CheckHostAdapter(struct BusLogic_HostAdapter *HostAdapter)
1208 {
1209 	struct BusLogic_ExtendedSetupInformation ExtendedSetupInformation;
1210 	unsigned char RequestedReplyLength;
1211 	boolean Result = true;
1212 	/*
1213 	   FlashPoint Host Adapters do not require this protection.
1214 	 */
1215 	if (BusLogic_FlashPointHostAdapterP(HostAdapter))
1216 		return true;
1217 	/*
1218 	   Issue the Inquire Extended Setup Information command.  Only genuine
1219 	   BusLogic Host Adapters and true clones support this command.  Adaptec 1542C
1220 	   series Host Adapters that respond to the Geometry Register I/O port will
1221 	   fail this command.
1222 	 */
1223 	RequestedReplyLength = sizeof(ExtendedSetupInformation);
1224 	if (BusLogic_Command(HostAdapter, BusLogic_InquireExtendedSetupInformation, &RequestedReplyLength, sizeof(RequestedReplyLength), &ExtendedSetupInformation, sizeof(ExtendedSetupInformation))
1225 	    != sizeof(ExtendedSetupInformation))
1226 		Result = false;
1227 	/*
1228 	   Provide tracing information if requested and return.
1229 	 */
1230 	if (BusLogic_GlobalOptions.TraceProbe)
1231 		BusLogic_Notice("BusLogic_Check(0x%X): MultiMaster %s\n", HostAdapter, HostAdapter->IO_Address, (Result ? "Found" : "Not Found"));
1232 	return Result;
1233 }
1234 
1235 
1236 /*
1237   BusLogic_ReadHostAdapterConfiguration reads the Configuration Information
1238   from Host Adapter and initializes the Host Adapter structure.
1239 */
1240 
1241 static boolean __init BusLogic_ReadHostAdapterConfiguration(struct BusLogic_HostAdapter
1242 							    *HostAdapter)
1243 {
1244 	struct BusLogic_BoardID BoardID;
1245 	struct BusLogic_Configuration Configuration;
1246 	struct BusLogic_SetupInformation SetupInformation;
1247 	struct BusLogic_ExtendedSetupInformation ExtendedSetupInformation;
1248 	unsigned char HostAdapterModelNumber[5];
1249 	unsigned char FirmwareVersion3rdDigit;
1250 	unsigned char FirmwareVersionLetter;
1251 	struct BusLogic_PCIHostAdapterInformation PCIHostAdapterInformation;
1252 	struct BusLogic_FetchHostAdapterLocalRAMRequest FetchHostAdapterLocalRAMRequest;
1253 	struct BusLogic_AutoSCSIData AutoSCSIData;
1254 	union BusLogic_GeometryRegister GeometryRegister;
1255 	unsigned char RequestedReplyLength;
1256 	unsigned char *TargetPointer, Character;
1257 	int TargetID, i;
1258 	/*
1259 	   Configuration Information for FlashPoint Host Adapters is provided in the
1260 	   FlashPoint_Info structure by the FlashPoint SCCB Manager's Probe Function.
1261 	   Initialize fields in the Host Adapter structure from the FlashPoint_Info
1262 	   structure.
1263 	 */
1264 	if (BusLogic_FlashPointHostAdapterP(HostAdapter)) {
1265 		struct FlashPoint_Info *FlashPointInfo = &HostAdapter->FlashPointInfo;
1266 		TargetPointer = HostAdapter->ModelName;
1267 		*TargetPointer++ = 'B';
1268 		*TargetPointer++ = 'T';
1269 		*TargetPointer++ = '-';
1270 		for (i = 0; i < sizeof(FlashPointInfo->ModelNumber); i++)
1271 			*TargetPointer++ = FlashPointInfo->ModelNumber[i];
1272 		*TargetPointer++ = '\0';
1273 		strcpy(HostAdapter->FirmwareVersion, FlashPoint_FirmwareVersion);
1274 		HostAdapter->SCSI_ID = FlashPointInfo->SCSI_ID;
1275 		HostAdapter->ExtendedTranslationEnabled = FlashPointInfo->ExtendedTranslationEnabled;
1276 		HostAdapter->ParityCheckingEnabled = FlashPointInfo->ParityCheckingEnabled;
1277 		HostAdapter->BusResetEnabled = !FlashPointInfo->HostSoftReset;
1278 		HostAdapter->LevelSensitiveInterrupt = true;
1279 		HostAdapter->HostWideSCSI = FlashPointInfo->HostWideSCSI;
1280 		HostAdapter->HostDifferentialSCSI = false;
1281 		HostAdapter->HostSupportsSCAM = true;
1282 		HostAdapter->HostUltraSCSI = true;
1283 		HostAdapter->ExtendedLUNSupport = true;
1284 		HostAdapter->TerminationInfoValid = true;
1285 		HostAdapter->LowByteTerminated = FlashPointInfo->LowByteTerminated;
1286 		HostAdapter->HighByteTerminated = FlashPointInfo->HighByteTerminated;
1287 		HostAdapter->SCAM_Enabled = FlashPointInfo->SCAM_Enabled;
1288 		HostAdapter->SCAM_Level2 = FlashPointInfo->SCAM_Level2;
1289 		HostAdapter->DriverScatterGatherLimit = BusLogic_ScatterGatherLimit;
1290 		HostAdapter->MaxTargetDevices = (HostAdapter->HostWideSCSI ? 16 : 8);
1291 		HostAdapter->MaxLogicalUnits = 32;
1292 		HostAdapter->InitialCCBs = 4 * BusLogic_CCB_AllocationGroupSize;
1293 		HostAdapter->IncrementalCCBs = BusLogic_CCB_AllocationGroupSize;
1294 		HostAdapter->DriverQueueDepth = 255;
1295 		HostAdapter->HostAdapterQueueDepth = HostAdapter->DriverQueueDepth;
1296 		HostAdapter->SynchronousPermitted = FlashPointInfo->SynchronousPermitted;
1297 		HostAdapter->FastPermitted = FlashPointInfo->FastPermitted;
1298 		HostAdapter->UltraPermitted = FlashPointInfo->UltraPermitted;
1299 		HostAdapter->WidePermitted = FlashPointInfo->WidePermitted;
1300 		HostAdapter->DisconnectPermitted = FlashPointInfo->DisconnectPermitted;
1301 		HostAdapter->TaggedQueuingPermitted = 0xFFFF;
1302 		goto Common;
1303 	}
1304 	/*
1305 	   Issue the Inquire Board ID command.
1306 	 */
1307 	if (BusLogic_Command(HostAdapter, BusLogic_InquireBoardID, NULL, 0, &BoardID, sizeof(BoardID)) != sizeof(BoardID))
1308 		return BusLogic_Failure(HostAdapter, "INQUIRE BOARD ID");
1309 	/*
1310 	   Issue the Inquire Configuration command.
1311 	 */
1312 	if (BusLogic_Command(HostAdapter, BusLogic_InquireConfiguration, NULL, 0, &Configuration, sizeof(Configuration))
1313 	    != sizeof(Configuration))
1314 		return BusLogic_Failure(HostAdapter, "INQUIRE CONFIGURATION");
1315 	/*
1316 	   Issue the Inquire Setup Information command.
1317 	 */
1318 	RequestedReplyLength = sizeof(SetupInformation);
1319 	if (BusLogic_Command(HostAdapter, BusLogic_InquireSetupInformation, &RequestedReplyLength, sizeof(RequestedReplyLength), &SetupInformation, sizeof(SetupInformation))
1320 	    != sizeof(SetupInformation))
1321 		return BusLogic_Failure(HostAdapter, "INQUIRE SETUP INFORMATION");
1322 	/*
1323 	   Issue the Inquire Extended Setup Information command.
1324 	 */
1325 	RequestedReplyLength = sizeof(ExtendedSetupInformation);
1326 	if (BusLogic_Command(HostAdapter, BusLogic_InquireExtendedSetupInformation, &RequestedReplyLength, sizeof(RequestedReplyLength), &ExtendedSetupInformation, sizeof(ExtendedSetupInformation))
1327 	    != sizeof(ExtendedSetupInformation))
1328 		return BusLogic_Failure(HostAdapter, "INQUIRE EXTENDED SETUP INFORMATION");
1329 	/*
1330 	   Issue the Inquire Firmware Version 3rd Digit command.
1331 	 */
1332 	FirmwareVersion3rdDigit = '\0';
1333 	if (BoardID.FirmwareVersion1stDigit > '0')
1334 		if (BusLogic_Command(HostAdapter, BusLogic_InquireFirmwareVersion3rdDigit, NULL, 0, &FirmwareVersion3rdDigit, sizeof(FirmwareVersion3rdDigit))
1335 		    != sizeof(FirmwareVersion3rdDigit))
1336 			return BusLogic_Failure(HostAdapter, "INQUIRE FIRMWARE 3RD DIGIT");
1337 	/*
1338 	   Issue the Inquire Host Adapter Model Number command.
1339 	 */
1340 	if (ExtendedSetupInformation.BusType == 'A' && BoardID.FirmwareVersion1stDigit == '2')
1341 		/* BusLogic BT-542B ISA 2.xx */
1342 		strcpy(HostAdapterModelNumber, "542B");
1343 	else if (ExtendedSetupInformation.BusType == 'E' && BoardID.FirmwareVersion1stDigit == '2' && (BoardID.FirmwareVersion2ndDigit <= '1' || (BoardID.FirmwareVersion2ndDigit == '2' && FirmwareVersion3rdDigit == '0')))
1344 		/* BusLogic BT-742A EISA 2.1x or 2.20 */
1345 		strcpy(HostAdapterModelNumber, "742A");
1346 	else if (ExtendedSetupInformation.BusType == 'E' && BoardID.FirmwareVersion1stDigit == '0')
1347 		/* AMI FastDisk EISA Series 441 0.x */
1348 		strcpy(HostAdapterModelNumber, "747A");
1349 	else {
1350 		RequestedReplyLength = sizeof(HostAdapterModelNumber);
1351 		if (BusLogic_Command(HostAdapter, BusLogic_InquireHostAdapterModelNumber, &RequestedReplyLength, sizeof(RequestedReplyLength), &HostAdapterModelNumber, sizeof(HostAdapterModelNumber))
1352 		    != sizeof(HostAdapterModelNumber))
1353 			return BusLogic_Failure(HostAdapter, "INQUIRE HOST ADAPTER MODEL NUMBER");
1354 	}
1355 	/*
1356 	   BusLogic MultiMaster Host Adapters can be identified by their model number
1357 	   and the major version number of their firmware as follows:
1358 
1359 	   5.xx       BusLogic "W" Series Host Adapters:
1360 	   BT-948/958/958D
1361 	   4.xx       BusLogic "C" Series Host Adapters:
1362 	   BT-946C/956C/956CD/747C/757C/757CD/445C/545C/540CF
1363 	   3.xx       BusLogic "S" Series Host Adapters:
1364 	   BT-747S/747D/757S/757D/445S/545S/542D
1365 	   BT-542B/742A (revision H)
1366 	   2.xx       BusLogic "A" Series Host Adapters:
1367 	   BT-542B/742A (revision G and below)
1368 	   0.xx       AMI FastDisk VLB/EISA BusLogic Clone Host Adapter
1369 	 */
1370 	/*
1371 	   Save the Model Name and Host Adapter Name in the Host Adapter structure.
1372 	 */
1373 	TargetPointer = HostAdapter->ModelName;
1374 	*TargetPointer++ = 'B';
1375 	*TargetPointer++ = 'T';
1376 	*TargetPointer++ = '-';
1377 	for (i = 0; i < sizeof(HostAdapterModelNumber); i++) {
1378 		Character = HostAdapterModelNumber[i];
1379 		if (Character == ' ' || Character == '\0')
1380 			break;
1381 		*TargetPointer++ = Character;
1382 	}
1383 	*TargetPointer++ = '\0';
1384 	/*
1385 	   Save the Firmware Version in the Host Adapter structure.
1386 	 */
1387 	TargetPointer = HostAdapter->FirmwareVersion;
1388 	*TargetPointer++ = BoardID.FirmwareVersion1stDigit;
1389 	*TargetPointer++ = '.';
1390 	*TargetPointer++ = BoardID.FirmwareVersion2ndDigit;
1391 	if (FirmwareVersion3rdDigit != ' ' && FirmwareVersion3rdDigit != '\0')
1392 		*TargetPointer++ = FirmwareVersion3rdDigit;
1393 	*TargetPointer = '\0';
1394 	/*
1395 	   Issue the Inquire Firmware Version Letter command.
1396 	 */
1397 	if (strcmp(HostAdapter->FirmwareVersion, "3.3") >= 0) {
1398 		if (BusLogic_Command(HostAdapter, BusLogic_InquireFirmwareVersionLetter, NULL, 0, &FirmwareVersionLetter, sizeof(FirmwareVersionLetter))
1399 		    != sizeof(FirmwareVersionLetter))
1400 			return BusLogic_Failure(HostAdapter, "INQUIRE FIRMWARE VERSION LETTER");
1401 		if (FirmwareVersionLetter != ' ' && FirmwareVersionLetter != '\0')
1402 			*TargetPointer++ = FirmwareVersionLetter;
1403 		*TargetPointer = '\0';
1404 	}
1405 	/*
1406 	   Save the Host Adapter SCSI ID in the Host Adapter structure.
1407 	 */
1408 	HostAdapter->SCSI_ID = Configuration.HostAdapterID;
1409 	/*
1410 	   Determine the Bus Type and save it in the Host Adapter structure, determine
1411 	   and save the IRQ Channel if necessary, and determine and save the DMA
1412 	   Channel for ISA Host Adapters.
1413 	 */
1414 	HostAdapter->HostAdapterBusType = BusLogic_HostAdapterBusTypes[HostAdapter->ModelName[3] - '4'];
1415 	if (HostAdapter->IRQ_Channel == 0) {
1416 		if (Configuration.IRQ_Channel9)
1417 			HostAdapter->IRQ_Channel = 9;
1418 		else if (Configuration.IRQ_Channel10)
1419 			HostAdapter->IRQ_Channel = 10;
1420 		else if (Configuration.IRQ_Channel11)
1421 			HostAdapter->IRQ_Channel = 11;
1422 		else if (Configuration.IRQ_Channel12)
1423 			HostAdapter->IRQ_Channel = 12;
1424 		else if (Configuration.IRQ_Channel14)
1425 			HostAdapter->IRQ_Channel = 14;
1426 		else if (Configuration.IRQ_Channel15)
1427 			HostAdapter->IRQ_Channel = 15;
1428 	}
1429 	if (HostAdapter->HostAdapterBusType == BusLogic_ISA_Bus) {
1430 		if (Configuration.DMA_Channel5)
1431 			HostAdapter->DMA_Channel = 5;
1432 		else if (Configuration.DMA_Channel6)
1433 			HostAdapter->DMA_Channel = 6;
1434 		else if (Configuration.DMA_Channel7)
1435 			HostAdapter->DMA_Channel = 7;
1436 	}
1437 	/*
1438 	   Determine whether Extended Translation is enabled and save it in
1439 	   the Host Adapter structure.
1440 	 */
1441 	GeometryRegister.All = BusLogic_ReadGeometryRegister(HostAdapter);
1442 	HostAdapter->ExtendedTranslationEnabled = GeometryRegister.gr.ExtendedTranslationEnabled;
1443 	/*
1444 	   Save the Scatter Gather Limits, Level Sensitive Interrupt flag, Wide
1445 	   SCSI flag, Differential SCSI flag, SCAM Supported flag, and
1446 	   Ultra SCSI flag in the Host Adapter structure.
1447 	 */
1448 	HostAdapter->HostAdapterScatterGatherLimit = ExtendedSetupInformation.ScatterGatherLimit;
1449 	HostAdapter->DriverScatterGatherLimit = HostAdapter->HostAdapterScatterGatherLimit;
1450 	if (HostAdapter->HostAdapterScatterGatherLimit > BusLogic_ScatterGatherLimit)
1451 		HostAdapter->DriverScatterGatherLimit = BusLogic_ScatterGatherLimit;
1452 	if (ExtendedSetupInformation.Misc.LevelSensitiveInterrupt)
1453 		HostAdapter->LevelSensitiveInterrupt = true;
1454 	HostAdapter->HostWideSCSI = ExtendedSetupInformation.HostWideSCSI;
1455 	HostAdapter->HostDifferentialSCSI = ExtendedSetupInformation.HostDifferentialSCSI;
1456 	HostAdapter->HostSupportsSCAM = ExtendedSetupInformation.HostSupportsSCAM;
1457 	HostAdapter->HostUltraSCSI = ExtendedSetupInformation.HostUltraSCSI;
1458 	/*
1459 	   Determine whether Extended LUN Format CCBs are supported and save the
1460 	   information in the Host Adapter structure.
1461 	 */
1462 	if (HostAdapter->FirmwareVersion[0] == '5' || (HostAdapter->FirmwareVersion[0] == '4' && HostAdapter->HostWideSCSI))
1463 		HostAdapter->ExtendedLUNSupport = true;
1464 	/*
1465 	   Issue the Inquire PCI Host Adapter Information command to read the
1466 	   Termination Information from "W" series MultiMaster Host Adapters.
1467 	 */
1468 	if (HostAdapter->FirmwareVersion[0] == '5') {
1469 		if (BusLogic_Command(HostAdapter, BusLogic_InquirePCIHostAdapterInformation, NULL, 0, &PCIHostAdapterInformation, sizeof(PCIHostAdapterInformation))
1470 		    != sizeof(PCIHostAdapterInformation))
1471 			return BusLogic_Failure(HostAdapter, "INQUIRE PCI HOST ADAPTER INFORMATION");
1472 		/*
1473 		   Save the Termination Information in the Host Adapter structure.
1474 		 */
1475 		if (PCIHostAdapterInformation.GenericInfoValid) {
1476 			HostAdapter->TerminationInfoValid = true;
1477 			HostAdapter->LowByteTerminated = PCIHostAdapterInformation.LowByteTerminated;
1478 			HostAdapter->HighByteTerminated = PCIHostAdapterInformation.HighByteTerminated;
1479 		}
1480 	}
1481 	/*
1482 	   Issue the Fetch Host Adapter Local RAM command to read the AutoSCSI data
1483 	   from "W" and "C" series MultiMaster Host Adapters.
1484 	 */
1485 	if (HostAdapter->FirmwareVersion[0] >= '4') {
1486 		FetchHostAdapterLocalRAMRequest.ByteOffset = BusLogic_AutoSCSI_BaseOffset;
1487 		FetchHostAdapterLocalRAMRequest.ByteCount = sizeof(AutoSCSIData);
1488 		if (BusLogic_Command(HostAdapter, BusLogic_FetchHostAdapterLocalRAM, &FetchHostAdapterLocalRAMRequest, sizeof(FetchHostAdapterLocalRAMRequest), &AutoSCSIData, sizeof(AutoSCSIData))
1489 		    != sizeof(AutoSCSIData))
1490 			return BusLogic_Failure(HostAdapter, "FETCH HOST ADAPTER LOCAL RAM");
1491 		/*
1492 		   Save the Parity Checking Enabled, Bus Reset Enabled, and Termination
1493 		   Information in the Host Adapter structure.
1494 		 */
1495 		HostAdapter->ParityCheckingEnabled = AutoSCSIData.ParityCheckingEnabled;
1496 		HostAdapter->BusResetEnabled = AutoSCSIData.BusResetEnabled;
1497 		if (HostAdapter->FirmwareVersion[0] == '4') {
1498 			HostAdapter->TerminationInfoValid = true;
1499 			HostAdapter->LowByteTerminated = AutoSCSIData.LowByteTerminated;
1500 			HostAdapter->HighByteTerminated = AutoSCSIData.HighByteTerminated;
1501 		}
1502 		/*
1503 		   Save the Wide Permitted, Fast Permitted, Synchronous Permitted,
1504 		   Disconnect Permitted, Ultra Permitted, and SCAM Information in the
1505 		   Host Adapter structure.
1506 		 */
1507 		HostAdapter->WidePermitted = AutoSCSIData.WidePermitted;
1508 		HostAdapter->FastPermitted = AutoSCSIData.FastPermitted;
1509 		HostAdapter->SynchronousPermitted = AutoSCSIData.SynchronousPermitted;
1510 		HostAdapter->DisconnectPermitted = AutoSCSIData.DisconnectPermitted;
1511 		if (HostAdapter->HostUltraSCSI)
1512 			HostAdapter->UltraPermitted = AutoSCSIData.UltraPermitted;
1513 		if (HostAdapter->HostSupportsSCAM) {
1514 			HostAdapter->SCAM_Enabled = AutoSCSIData.SCAM_Enabled;
1515 			HostAdapter->SCAM_Level2 = AutoSCSIData.SCAM_Level2;
1516 		}
1517 	}
1518 	/*
1519 	   Initialize fields in the Host Adapter structure for "S" and "A" series
1520 	   MultiMaster Host Adapters.
1521 	 */
1522 	if (HostAdapter->FirmwareVersion[0] < '4') {
1523 		if (SetupInformation.SynchronousInitiationEnabled) {
1524 			HostAdapter->SynchronousPermitted = 0xFF;
1525 			if (HostAdapter->HostAdapterBusType == BusLogic_EISA_Bus) {
1526 				if (ExtendedSetupInformation.Misc.FastOnEISA)
1527 					HostAdapter->FastPermitted = 0xFF;
1528 				if (strcmp(HostAdapter->ModelName, "BT-757") == 0)
1529 					HostAdapter->WidePermitted = 0xFF;
1530 			}
1531 		}
1532 		HostAdapter->DisconnectPermitted = 0xFF;
1533 		HostAdapter->ParityCheckingEnabled = SetupInformation.ParityCheckingEnabled;
1534 		HostAdapter->BusResetEnabled = true;
1535 	}
1536 	/*
1537 	   Determine the maximum number of Target IDs and Logical Units supported by
1538 	   this driver for Wide and Narrow Host Adapters.
1539 	 */
1540 	HostAdapter->MaxTargetDevices = (HostAdapter->HostWideSCSI ? 16 : 8);
1541 	HostAdapter->MaxLogicalUnits = (HostAdapter->ExtendedLUNSupport ? 32 : 8);
1542 	/*
1543 	   Select appropriate values for the Mailbox Count, Driver Queue Depth,
1544 	   Initial CCBs, and Incremental CCBs variables based on whether or not Strict
1545 	   Round Robin Mode is supported.  If Strict Round Robin Mode is supported,
1546 	   then there is no performance degradation in using the maximum possible
1547 	   number of Outgoing and Incoming Mailboxes and allowing the Tagged and
1548 	   Untagged Queue Depths to determine the actual utilization.  If Strict Round
1549 	   Robin Mode is not supported, then the Host Adapter must scan all the
1550 	   Outgoing Mailboxes whenever an Outgoing Mailbox entry is made, which can
1551 	   cause a substantial performance penalty.  The host adapters actually have
1552 	   room to store the following number of CCBs internally; that is, they can
1553 	   internally queue and manage this many active commands on the SCSI bus
1554 	   simultaneously.  Performance measurements demonstrate that the Driver Queue
1555 	   Depth should be set to the Mailbox Count, rather than the Host Adapter
1556 	   Queue Depth (internal CCB capacity), as it is more efficient to have the
1557 	   queued commands waiting in Outgoing Mailboxes if necessary than to block
1558 	   the process in the higher levels of the SCSI Subsystem.
1559 
1560 	   192          BT-948/958/958D
1561 	   100          BT-946C/956C/956CD/747C/757C/757CD/445C
1562 	   50   BT-545C/540CF
1563 	   30   BT-747S/747D/757S/757D/445S/545S/542D/542B/742A
1564 	 */
1565 	if (HostAdapter->FirmwareVersion[0] == '5')
1566 		HostAdapter->HostAdapterQueueDepth = 192;
1567 	else if (HostAdapter->FirmwareVersion[0] == '4')
1568 		HostAdapter->HostAdapterQueueDepth = (HostAdapter->HostAdapterBusType != BusLogic_ISA_Bus ? 100 : 50);
1569 	else
1570 		HostAdapter->HostAdapterQueueDepth = 30;
1571 	if (strcmp(HostAdapter->FirmwareVersion, "3.31") >= 0) {
1572 		HostAdapter->StrictRoundRobinModeSupport = true;
1573 		HostAdapter->MailboxCount = BusLogic_MaxMailboxes;
1574 	} else {
1575 		HostAdapter->StrictRoundRobinModeSupport = false;
1576 		HostAdapter->MailboxCount = 32;
1577 	}
1578 	HostAdapter->DriverQueueDepth = HostAdapter->MailboxCount;
1579 	HostAdapter->InitialCCBs = 4 * BusLogic_CCB_AllocationGroupSize;
1580 	HostAdapter->IncrementalCCBs = BusLogic_CCB_AllocationGroupSize;
1581 	/*
1582 	   Tagged Queuing support is available and operates properly on all "W" series
1583 	   MultiMaster Host Adapters, on "C" series MultiMaster Host Adapters with
1584 	   firmware version 4.22 and above, and on "S" series MultiMaster Host
1585 	   Adapters with firmware version 3.35 and above.
1586 	 */
1587 	HostAdapter->TaggedQueuingPermitted = 0;
1588 	switch (HostAdapter->FirmwareVersion[0]) {
1589 	case '5':
1590 		HostAdapter->TaggedQueuingPermitted = 0xFFFF;
1591 		break;
1592 	case '4':
1593 		if (strcmp(HostAdapter->FirmwareVersion, "4.22") >= 0)
1594 			HostAdapter->TaggedQueuingPermitted = 0xFFFF;
1595 		break;
1596 	case '3':
1597 		if (strcmp(HostAdapter->FirmwareVersion, "3.35") >= 0)
1598 			HostAdapter->TaggedQueuingPermitted = 0xFFFF;
1599 		break;
1600 	}
1601 	/*
1602 	   Determine the Host Adapter BIOS Address if the BIOS is enabled and
1603 	   save it in the Host Adapter structure.  The BIOS is disabled if the
1604 	   BIOS_Address is 0.
1605 	 */
1606 	HostAdapter->BIOS_Address = ExtendedSetupInformation.BIOS_Address << 12;
1607 	/*
1608 	   ISA Host Adapters require Bounce Buffers if there is more than 16MB memory.
1609 	 */
1610 	if (HostAdapter->HostAdapterBusType == BusLogic_ISA_Bus && (void *) high_memory > (void *) MAX_DMA_ADDRESS)
1611 		HostAdapter->BounceBuffersRequired = true;
1612 	/*
1613 	   BusLogic BT-445S Host Adapters prior to board revision E have a hardware
1614 	   bug whereby when the BIOS is enabled, transfers to/from the same address
1615 	   range the BIOS occupies modulo 16MB are handled incorrectly.  Only properly
1616 	   functioning BT-445S Host Adapters have firmware version 3.37, so require
1617 	   that ISA Bounce Buffers be used for the buggy BT-445S models if there is
1618 	   more than 16MB memory.
1619 	 */
1620 	if (HostAdapter->BIOS_Address > 0 && strcmp(HostAdapter->ModelName, "BT-445S") == 0 && strcmp(HostAdapter->FirmwareVersion, "3.37") < 0 && (void *) high_memory > (void *) MAX_DMA_ADDRESS)
1621 		HostAdapter->BounceBuffersRequired = true;
1622 	/*
1623 	   Initialize parameters common to MultiMaster and FlashPoint Host Adapters.
1624 	 */
1625       Common:
1626 	/*
1627 	   Initialize the Host Adapter Full Model Name from the Model Name.
1628 	 */
1629 	strcpy(HostAdapter->FullModelName, "BusLogic ");
1630 	strcat(HostAdapter->FullModelName, HostAdapter->ModelName);
1631 	/*
1632 	   Select an appropriate value for the Tagged Queue Depth either from a
1633 	   BusLogic Driver Options specification, or based on whether this Host
1634 	   Adapter requires that ISA Bounce Buffers be used.  The Tagged Queue Depth
1635 	   is left at 0 for automatic determination in BusLogic_SelectQueueDepths.
1636 	   Initialize the Untagged Queue Depth.
1637 	 */
1638 	for (TargetID = 0; TargetID < BusLogic_MaxTargetDevices; TargetID++) {
1639 		unsigned char QueueDepth = 0;
1640 		if (HostAdapter->DriverOptions != NULL && HostAdapter->DriverOptions->QueueDepth[TargetID] > 0)
1641 			QueueDepth = HostAdapter->DriverOptions->QueueDepth[TargetID];
1642 		else if (HostAdapter->BounceBuffersRequired)
1643 			QueueDepth = BusLogic_TaggedQueueDepthBB;
1644 		HostAdapter->QueueDepth[TargetID] = QueueDepth;
1645 	}
1646 	if (HostAdapter->BounceBuffersRequired)
1647 		HostAdapter->UntaggedQueueDepth = BusLogic_UntaggedQueueDepthBB;
1648 	else
1649 		HostAdapter->UntaggedQueueDepth = BusLogic_UntaggedQueueDepth;
1650 	if (HostAdapter->DriverOptions != NULL)
1651 		HostAdapter->CommonQueueDepth = HostAdapter->DriverOptions->CommonQueueDepth;
1652 	if (HostAdapter->CommonQueueDepth > 0 && HostAdapter->CommonQueueDepth < HostAdapter->UntaggedQueueDepth)
1653 		HostAdapter->UntaggedQueueDepth = HostAdapter->CommonQueueDepth;
1654 	/*
1655 	   Tagged Queuing is only allowed if Disconnect/Reconnect is permitted.
1656 	   Therefore, mask the Tagged Queuing Permitted Default bits with the
1657 	   Disconnect/Reconnect Permitted bits.
1658 	 */
1659 	HostAdapter->TaggedQueuingPermitted &= HostAdapter->DisconnectPermitted;
1660 	/*
1661 	   Combine the default Tagged Queuing Permitted bits with any BusLogic Driver
1662 	   Options Tagged Queuing specification.
1663 	 */
1664 	if (HostAdapter->DriverOptions != NULL)
1665 		HostAdapter->TaggedQueuingPermitted =
1666 		    (HostAdapter->DriverOptions->TaggedQueuingPermitted & HostAdapter->DriverOptions->TaggedQueuingPermittedMask) | (HostAdapter->TaggedQueuingPermitted & ~HostAdapter->DriverOptions->TaggedQueuingPermittedMask);
1667 
1668 	/*
1669 	   Select an appropriate value for Bus Settle Time either from a BusLogic
1670 	   Driver Options specification, or from BusLogic_DefaultBusSettleTime.
1671 	 */
1672 	if (HostAdapter->DriverOptions != NULL && HostAdapter->DriverOptions->BusSettleTime > 0)
1673 		HostAdapter->BusSettleTime = HostAdapter->DriverOptions->BusSettleTime;
1674 	else
1675 		HostAdapter->BusSettleTime = BusLogic_DefaultBusSettleTime;
1676 	/*
1677 	   Indicate reading the Host Adapter Configuration completed successfully.
1678 	 */
1679 	return true;
1680 }
1681 
1682 
1683 /*
1684   BusLogic_ReportHostAdapterConfiguration reports the configuration of
1685   Host Adapter.
1686 */
1687 
1688 static boolean __init BusLogic_ReportHostAdapterConfiguration(struct BusLogic_HostAdapter
1689 							      *HostAdapter)
1690 {
1691 	unsigned short AllTargetsMask = (1 << HostAdapter->MaxTargetDevices) - 1;
1692 	unsigned short SynchronousPermitted, FastPermitted;
1693 	unsigned short UltraPermitted, WidePermitted;
1694 	unsigned short DisconnectPermitted, TaggedQueuingPermitted;
1695 	boolean CommonSynchronousNegotiation, CommonTaggedQueueDepth;
1696 	char SynchronousString[BusLogic_MaxTargetDevices + 1];
1697 	char WideString[BusLogic_MaxTargetDevices + 1];
1698 	char DisconnectString[BusLogic_MaxTargetDevices + 1];
1699 	char TaggedQueuingString[BusLogic_MaxTargetDevices + 1];
1700 	char *SynchronousMessage = SynchronousString;
1701 	char *WideMessage = WideString;
1702 	char *DisconnectMessage = DisconnectString;
1703 	char *TaggedQueuingMessage = TaggedQueuingString;
1704 	int TargetID;
1705 	BusLogic_Info("Configuring BusLogic Model %s %s%s%s%s SCSI Host Adapter\n",
1706 		      HostAdapter, HostAdapter->ModelName,
1707 		      BusLogic_HostAdapterBusNames[HostAdapter->HostAdapterBusType], (HostAdapter->HostWideSCSI ? " Wide" : ""), (HostAdapter->HostDifferentialSCSI ? " Differential" : ""), (HostAdapter->HostUltraSCSI ? " Ultra" : ""));
1708 	BusLogic_Info("  Firmware Version: %s, I/O Address: 0x%X, " "IRQ Channel: %d/%s\n", HostAdapter, HostAdapter->FirmwareVersion, HostAdapter->IO_Address, HostAdapter->IRQ_Channel, (HostAdapter->LevelSensitiveInterrupt ? "Level" : "Edge"));
1709 	if (HostAdapter->HostAdapterBusType != BusLogic_PCI_Bus) {
1710 		BusLogic_Info("  DMA Channel: ", HostAdapter);
1711 		if (HostAdapter->DMA_Channel > 0)
1712 			BusLogic_Info("%d, ", HostAdapter, HostAdapter->DMA_Channel);
1713 		else
1714 			BusLogic_Info("None, ", HostAdapter);
1715 		if (HostAdapter->BIOS_Address > 0)
1716 			BusLogic_Info("BIOS Address: 0x%X, ", HostAdapter, HostAdapter->BIOS_Address);
1717 		else
1718 			BusLogic_Info("BIOS Address: None, ", HostAdapter);
1719 	} else {
1720 		BusLogic_Info("  PCI Bus: %d, Device: %d, Address: ", HostAdapter, HostAdapter->Bus, HostAdapter->Device);
1721 		if (HostAdapter->PCI_Address > 0)
1722 			BusLogic_Info("0x%X, ", HostAdapter, HostAdapter->PCI_Address);
1723 		else
1724 			BusLogic_Info("Unassigned, ", HostAdapter);
1725 	}
1726 	BusLogic_Info("Host Adapter SCSI ID: %d\n", HostAdapter, HostAdapter->SCSI_ID);
1727 	BusLogic_Info("  Parity Checking: %s, Extended Translation: %s\n", HostAdapter, (HostAdapter->ParityCheckingEnabled ? "Enabled" : "Disabled"), (HostAdapter->ExtendedTranslationEnabled ? "Enabled" : "Disabled"));
1728 	AllTargetsMask &= ~(1 << HostAdapter->SCSI_ID);
1729 	SynchronousPermitted = HostAdapter->SynchronousPermitted & AllTargetsMask;
1730 	FastPermitted = HostAdapter->FastPermitted & AllTargetsMask;
1731 	UltraPermitted = HostAdapter->UltraPermitted & AllTargetsMask;
1732 	if ((BusLogic_MultiMasterHostAdapterP(HostAdapter) && (HostAdapter->FirmwareVersion[0] >= '4' || HostAdapter->HostAdapterBusType == BusLogic_EISA_Bus)) || BusLogic_FlashPointHostAdapterP(HostAdapter)) {
1733 		CommonSynchronousNegotiation = false;
1734 		if (SynchronousPermitted == 0) {
1735 			SynchronousMessage = "Disabled";
1736 			CommonSynchronousNegotiation = true;
1737 		} else if (SynchronousPermitted == AllTargetsMask) {
1738 			if (FastPermitted == 0) {
1739 				SynchronousMessage = "Slow";
1740 				CommonSynchronousNegotiation = true;
1741 			} else if (FastPermitted == AllTargetsMask) {
1742 				if (UltraPermitted == 0) {
1743 					SynchronousMessage = "Fast";
1744 					CommonSynchronousNegotiation = true;
1745 				} else if (UltraPermitted == AllTargetsMask) {
1746 					SynchronousMessage = "Ultra";
1747 					CommonSynchronousNegotiation = true;
1748 				}
1749 			}
1750 		}
1751 		if (!CommonSynchronousNegotiation) {
1752 			for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
1753 				SynchronousString[TargetID] = ((!(SynchronousPermitted & (1 << TargetID))) ? 'N' : (!(FastPermitted & (1 << TargetID)) ? 'S' : (!(UltraPermitted & (1 << TargetID)) ? 'F' : 'U')));
1754 			SynchronousString[HostAdapter->SCSI_ID] = '#';
1755 			SynchronousString[HostAdapter->MaxTargetDevices] = '\0';
1756 		}
1757 	} else
1758 		SynchronousMessage = (SynchronousPermitted == 0 ? "Disabled" : "Enabled");
1759 	WidePermitted = HostAdapter->WidePermitted & AllTargetsMask;
1760 	if (WidePermitted == 0)
1761 		WideMessage = "Disabled";
1762 	else if (WidePermitted == AllTargetsMask)
1763 		WideMessage = "Enabled";
1764 	else {
1765 		for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
1766 			WideString[TargetID] = ((WidePermitted & (1 << TargetID)) ? 'Y' : 'N');
1767 		WideString[HostAdapter->SCSI_ID] = '#';
1768 		WideString[HostAdapter->MaxTargetDevices] = '\0';
1769 	}
1770 	DisconnectPermitted = HostAdapter->DisconnectPermitted & AllTargetsMask;
1771 	if (DisconnectPermitted == 0)
1772 		DisconnectMessage = "Disabled";
1773 	else if (DisconnectPermitted == AllTargetsMask)
1774 		DisconnectMessage = "Enabled";
1775 	else {
1776 		for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
1777 			DisconnectString[TargetID] = ((DisconnectPermitted & (1 << TargetID)) ? 'Y' : 'N');
1778 		DisconnectString[HostAdapter->SCSI_ID] = '#';
1779 		DisconnectString[HostAdapter->MaxTargetDevices] = '\0';
1780 	}
1781 	TaggedQueuingPermitted = HostAdapter->TaggedQueuingPermitted & AllTargetsMask;
1782 	if (TaggedQueuingPermitted == 0)
1783 		TaggedQueuingMessage = "Disabled";
1784 	else if (TaggedQueuingPermitted == AllTargetsMask)
1785 		TaggedQueuingMessage = "Enabled";
1786 	else {
1787 		for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
1788 			TaggedQueuingString[TargetID] = ((TaggedQueuingPermitted & (1 << TargetID)) ? 'Y' : 'N');
1789 		TaggedQueuingString[HostAdapter->SCSI_ID] = '#';
1790 		TaggedQueuingString[HostAdapter->MaxTargetDevices] = '\0';
1791 	}
1792 	BusLogic_Info("  Synchronous Negotiation: %s, Wide Negotiation: %s\n", HostAdapter, SynchronousMessage, WideMessage);
1793 	BusLogic_Info("  Disconnect/Reconnect: %s, Tagged Queuing: %s\n", HostAdapter, DisconnectMessage, TaggedQueuingMessage);
1794 	if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) {
1795 		BusLogic_Info("  Scatter/Gather Limit: %d of %d segments, " "Mailboxes: %d\n", HostAdapter, HostAdapter->DriverScatterGatherLimit, HostAdapter->HostAdapterScatterGatherLimit, HostAdapter->MailboxCount);
1796 		BusLogic_Info("  Driver Queue Depth: %d, " "Host Adapter Queue Depth: %d\n", HostAdapter, HostAdapter->DriverQueueDepth, HostAdapter->HostAdapterQueueDepth);
1797 	} else
1798 		BusLogic_Info("  Driver Queue Depth: %d, " "Scatter/Gather Limit: %d segments\n", HostAdapter, HostAdapter->DriverQueueDepth, HostAdapter->DriverScatterGatherLimit);
1799 	BusLogic_Info("  Tagged Queue Depth: ", HostAdapter);
1800 	CommonTaggedQueueDepth = true;
1801 	for (TargetID = 1; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
1802 		if (HostAdapter->QueueDepth[TargetID] != HostAdapter->QueueDepth[0]) {
1803 			CommonTaggedQueueDepth = false;
1804 			break;
1805 		}
1806 	if (CommonTaggedQueueDepth) {
1807 		if (HostAdapter->QueueDepth[0] > 0)
1808 			BusLogic_Info("%d", HostAdapter, HostAdapter->QueueDepth[0]);
1809 		else
1810 			BusLogic_Info("Automatic", HostAdapter);
1811 	} else
1812 		BusLogic_Info("Individual", HostAdapter);
1813 	BusLogic_Info(", Untagged Queue Depth: %d\n", HostAdapter, HostAdapter->UntaggedQueueDepth);
1814 	if (HostAdapter->TerminationInfoValid) {
1815 		if (HostAdapter->HostWideSCSI)
1816 			BusLogic_Info("  SCSI Bus Termination: %s", HostAdapter, (HostAdapter->LowByteTerminated ? (HostAdapter->HighByteTerminated ? "Both Enabled" : "Low Enabled")
1817 										  : (HostAdapter->HighByteTerminated ? "High Enabled" : "Both Disabled")));
1818 		else
1819 			BusLogic_Info("  SCSI Bus Termination: %s", HostAdapter, (HostAdapter->LowByteTerminated ? "Enabled" : "Disabled"));
1820 		if (HostAdapter->HostSupportsSCAM)
1821 			BusLogic_Info(", SCAM: %s", HostAdapter, (HostAdapter->SCAM_Enabled ? (HostAdapter->SCAM_Level2 ? "Enabled, Level 2" : "Enabled, Level 1")
1822 								  : "Disabled"));
1823 		BusLogic_Info("\n", HostAdapter);
1824 	}
1825 	/*
1826 	   Indicate reporting the Host Adapter configuration completed successfully.
1827 	 */
1828 	return true;
1829 }
1830 
1831 
1832 /*
1833   BusLogic_AcquireResources acquires the system resources necessary to use
1834   Host Adapter.
1835 */
1836 
1837 static boolean __init BusLogic_AcquireResources(struct BusLogic_HostAdapter *HostAdapter)
1838 {
1839 	if (HostAdapter->IRQ_Channel == 0) {
1840 		BusLogic_Error("NO LEGAL INTERRUPT CHANNEL ASSIGNED - DETACHING\n", HostAdapter);
1841 		return false;
1842 	}
1843 	/*
1844 	   Acquire shared access to the IRQ Channel.
1845 	 */
1846 	if (request_irq(HostAdapter->IRQ_Channel, BusLogic_InterruptHandler, SA_SHIRQ, HostAdapter->FullModelName, HostAdapter) < 0) {
1847 		BusLogic_Error("UNABLE TO ACQUIRE IRQ CHANNEL %d - DETACHING\n", HostAdapter, HostAdapter->IRQ_Channel);
1848 		return false;
1849 	}
1850 	HostAdapter->IRQ_ChannelAcquired = true;
1851 	/*
1852 	   Acquire exclusive access to the DMA Channel.
1853 	 */
1854 	if (HostAdapter->DMA_Channel > 0) {
1855 		if (request_dma(HostAdapter->DMA_Channel, HostAdapter->FullModelName) < 0) {
1856 			BusLogic_Error("UNABLE TO ACQUIRE DMA CHANNEL %d - DETACHING\n", HostAdapter, HostAdapter->DMA_Channel);
1857 			return false;
1858 		}
1859 		set_dma_mode(HostAdapter->DMA_Channel, DMA_MODE_CASCADE);
1860 		enable_dma(HostAdapter->DMA_Channel);
1861 		HostAdapter->DMA_ChannelAcquired = true;
1862 	}
1863 	/*
1864 	   Indicate the System Resource Acquisition completed successfully,
1865 	 */
1866 	return true;
1867 }
1868 
1869 
1870 /*
1871   BusLogic_ReleaseResources releases any system resources previously acquired
1872   by BusLogic_AcquireResources.
1873 */
1874 
1875 static void BusLogic_ReleaseResources(struct BusLogic_HostAdapter *HostAdapter)
1876 {
1877 	/*
1878 	   Release shared access to the IRQ Channel.
1879 	 */
1880 	if (HostAdapter->IRQ_ChannelAcquired)
1881 		free_irq(HostAdapter->IRQ_Channel, HostAdapter);
1882 	/*
1883 	   Release exclusive access to the DMA Channel.
1884 	 */
1885 	if (HostAdapter->DMA_ChannelAcquired)
1886 		free_dma(HostAdapter->DMA_Channel);
1887 	/*
1888 	   Release any allocated memory structs not released elsewhere
1889 	 */
1890 	if (HostAdapter->MailboxSpace)
1891 		pci_free_consistent(HostAdapter->PCI_Device, HostAdapter->MailboxSize, HostAdapter->MailboxSpace, HostAdapter->MailboxSpaceHandle);
1892 	HostAdapter->MailboxSpace = NULL;
1893 	HostAdapter->MailboxSpaceHandle = 0;
1894 	HostAdapter->MailboxSize = 0;
1895 }
1896 
1897 
1898 /*
1899   BusLogic_InitializeHostAdapter initializes Host Adapter.  This is the only
1900   function called during SCSI Host Adapter detection which modifies the state
1901   of the Host Adapter from its initial power on or hard reset state.
1902 */
1903 
1904 static boolean BusLogic_InitializeHostAdapter(struct BusLogic_HostAdapter
1905 					      *HostAdapter)
1906 {
1907 	struct BusLogic_ExtendedMailboxRequest ExtendedMailboxRequest;
1908 	enum BusLogic_RoundRobinModeRequest RoundRobinModeRequest;
1909 	enum BusLogic_SetCCBFormatRequest SetCCBFormatRequest;
1910 	int TargetID;
1911 	/*
1912 	   Initialize the pointers to the first and last CCBs that are queued for
1913 	   completion processing.
1914 	 */
1915 	HostAdapter->FirstCompletedCCB = NULL;
1916 	HostAdapter->LastCompletedCCB = NULL;
1917 	/*
1918 	   Initialize the Bus Device Reset Pending CCB, Tagged Queuing Active,
1919 	   Command Successful Flag, Active Commands, and Commands Since Reset
1920 	   for each Target Device.
1921 	 */
1922 	for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) {
1923 		HostAdapter->BusDeviceResetPendingCCB[TargetID] = NULL;
1924 		HostAdapter->TargetFlags[TargetID].TaggedQueuingActive = false;
1925 		HostAdapter->TargetFlags[TargetID].CommandSuccessfulFlag = false;
1926 		HostAdapter->ActiveCommands[TargetID] = 0;
1927 		HostAdapter->CommandsSinceReset[TargetID] = 0;
1928 	}
1929 	/*
1930 	   FlashPoint Host Adapters do not use Outgoing and Incoming Mailboxes.
1931 	 */
1932 	if (BusLogic_FlashPointHostAdapterP(HostAdapter))
1933 		goto Done;
1934 	/*
1935 	   Initialize the Outgoing and Incoming Mailbox pointers.
1936 	 */
1937 	HostAdapter->MailboxSize = HostAdapter->MailboxCount * (sizeof(struct BusLogic_OutgoingMailbox) + sizeof(struct BusLogic_IncomingMailbox));
1938 	HostAdapter->MailboxSpace = pci_alloc_consistent(HostAdapter->PCI_Device, HostAdapter->MailboxSize, &HostAdapter->MailboxSpaceHandle);
1939 	if (HostAdapter->MailboxSpace == NULL)
1940 		return BusLogic_Failure(HostAdapter, "MAILBOX ALLOCATION");
1941 	HostAdapter->FirstOutgoingMailbox = (struct BusLogic_OutgoingMailbox *) HostAdapter->MailboxSpace;
1942 	HostAdapter->LastOutgoingMailbox = HostAdapter->FirstOutgoingMailbox + HostAdapter->MailboxCount - 1;
1943 	HostAdapter->NextOutgoingMailbox = HostAdapter->FirstOutgoingMailbox;
1944 	HostAdapter->FirstIncomingMailbox = (struct BusLogic_IncomingMailbox *) (HostAdapter->LastOutgoingMailbox + 1);
1945 	HostAdapter->LastIncomingMailbox = HostAdapter->FirstIncomingMailbox + HostAdapter->MailboxCount - 1;
1946 	HostAdapter->NextIncomingMailbox = HostAdapter->FirstIncomingMailbox;
1947 
1948 	/*
1949 	   Initialize the Outgoing and Incoming Mailbox structures.
1950 	 */
1951 	memset(HostAdapter->FirstOutgoingMailbox, 0, HostAdapter->MailboxCount * sizeof(struct BusLogic_OutgoingMailbox));
1952 	memset(HostAdapter->FirstIncomingMailbox, 0, HostAdapter->MailboxCount * sizeof(struct BusLogic_IncomingMailbox));
1953 	/*
1954 	   Initialize the Host Adapter's Pointer to the Outgoing/Incoming Mailboxes.
1955 	 */
1956 	ExtendedMailboxRequest.MailboxCount = HostAdapter->MailboxCount;
1957 	ExtendedMailboxRequest.BaseMailboxAddress = (u32) HostAdapter->MailboxSpaceHandle;
1958 	if (BusLogic_Command(HostAdapter, BusLogic_InitializeExtendedMailbox, &ExtendedMailboxRequest, sizeof(ExtendedMailboxRequest), NULL, 0) < 0)
1959 		return BusLogic_Failure(HostAdapter, "MAILBOX INITIALIZATION");
1960 	/*
1961 	   Enable Strict Round Robin Mode if supported by the Host Adapter.  In
1962 	   Strict Round Robin Mode, the Host Adapter only looks at the next Outgoing
1963 	   Mailbox for each new command, rather than scanning through all the
1964 	   Outgoing Mailboxes to find any that have new commands in them.  Strict
1965 	   Round Robin Mode is significantly more efficient.
1966 	 */
1967 	if (HostAdapter->StrictRoundRobinModeSupport) {
1968 		RoundRobinModeRequest = BusLogic_StrictRoundRobinMode;
1969 		if (BusLogic_Command(HostAdapter, BusLogic_EnableStrictRoundRobinMode, &RoundRobinModeRequest, sizeof(RoundRobinModeRequest), NULL, 0) < 0)
1970 			return BusLogic_Failure(HostAdapter, "ENABLE STRICT ROUND ROBIN MODE");
1971 	}
1972 	/*
1973 	   For Host Adapters that support Extended LUN Format CCBs, issue the Set CCB
1974 	   Format command to allow 32 Logical Units per Target Device.
1975 	 */
1976 	if (HostAdapter->ExtendedLUNSupport) {
1977 		SetCCBFormatRequest = BusLogic_ExtendedLUNFormatCCB;
1978 		if (BusLogic_Command(HostAdapter, BusLogic_SetCCBFormat, &SetCCBFormatRequest, sizeof(SetCCBFormatRequest), NULL, 0) < 0)
1979 			return BusLogic_Failure(HostAdapter, "SET CCB FORMAT");
1980 	}
1981 	/*
1982 	   Announce Successful Initialization.
1983 	 */
1984       Done:
1985 	if (!HostAdapter->HostAdapterInitialized) {
1986 		BusLogic_Info("*** %s Initialized Successfully ***\n", HostAdapter, HostAdapter->FullModelName);
1987 		BusLogic_Info("\n", HostAdapter);
1988 	} else
1989 		BusLogic_Warning("*** %s Initialized Successfully ***\n", HostAdapter, HostAdapter->FullModelName);
1990 	HostAdapter->HostAdapterInitialized = true;
1991 	/*
1992 	   Indicate the Host Adapter Initialization completed successfully.
1993 	 */
1994 	return true;
1995 }
1996 
1997 
1998 /*
1999   BusLogic_TargetDeviceInquiry inquires about the Target Devices accessible
2000   through Host Adapter.
2001 */
2002 
2003 static boolean __init BusLogic_TargetDeviceInquiry(struct BusLogic_HostAdapter
2004 						   *HostAdapter)
2005 {
2006 	u16 InstalledDevices;
2007 	u8 InstalledDevicesID0to7[8];
2008 	struct BusLogic_SetupInformation SetupInformation;
2009 	u8 SynchronousPeriod[BusLogic_MaxTargetDevices];
2010 	unsigned char RequestedReplyLength;
2011 	int TargetID;
2012 	/*
2013 	   Wait a few seconds between the Host Adapter Hard Reset which initiates
2014 	   a SCSI Bus Reset and issuing any SCSI Commands.  Some SCSI devices get
2015 	   confused if they receive SCSI Commands too soon after a SCSI Bus Reset.
2016 	 */
2017 	BusLogic_Delay(HostAdapter->BusSettleTime);
2018 	/*
2019 	   FlashPoint Host Adapters do not provide for Target Device Inquiry.
2020 	 */
2021 	if (BusLogic_FlashPointHostAdapterP(HostAdapter))
2022 		return true;
2023 	/*
2024 	   Inhibit the Target Device Inquiry if requested.
2025 	 */
2026 	if (HostAdapter->DriverOptions != NULL && HostAdapter->DriverOptions->LocalOptions.InhibitTargetInquiry)
2027 		return true;
2028 	/*
2029 	   Issue the Inquire Target Devices command for host adapters with firmware
2030 	   version 4.25 or later, or the Inquire Installed Devices ID 0 to 7 command
2031 	   for older host adapters.  This is necessary to force Synchronous Transfer
2032 	   Negotiation so that the Inquire Setup Information and Inquire Synchronous
2033 	   Period commands will return valid data.  The Inquire Target Devices command
2034 	   is preferable to Inquire Installed Devices ID 0 to 7 since it only probes
2035 	   Logical Unit 0 of each Target Device.
2036 	 */
2037 	if (strcmp(HostAdapter->FirmwareVersion, "4.25") >= 0) {
2038 
2039 		/*
2040 		 * Issue a Inquire Target Devices command.  Inquire Target Devices only
2041 		 * tests Logical Unit 0 of each Target Device unlike the Inquire Installed
2042 		 * Devices commands which test Logical Units 0 - 7.  Two bytes are
2043 		 * returned, where byte 0 bit 0 set indicates that Target Device 0 exists,
2044 		 * and so on.
2045 		 */
2046 
2047 		if (BusLogic_Command(HostAdapter, BusLogic_InquireTargetDevices, NULL, 0, &InstalledDevices, sizeof(InstalledDevices))
2048 		    != sizeof(InstalledDevices))
2049 			return BusLogic_Failure(HostAdapter, "INQUIRE TARGET DEVICES");
2050 		for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
2051 			HostAdapter->TargetFlags[TargetID].TargetExists = (InstalledDevices & (1 << TargetID) ? true : false);
2052 	} else {
2053 
2054 		/*
2055 		 * Issue an Inquire Installed Devices command.  For each Target Device,
2056 		 * a byte is returned where bit 0 set indicates that Logical Unit 0
2057 		 * exists, bit 1 set indicates that Logical Unit 1 exists, and so on.
2058 		 */
2059 
2060 		if (BusLogic_Command(HostAdapter, BusLogic_InquireInstalledDevicesID0to7, NULL, 0, &InstalledDevicesID0to7, sizeof(InstalledDevicesID0to7))
2061 		    != sizeof(InstalledDevicesID0to7))
2062 			return BusLogic_Failure(HostAdapter, "INQUIRE INSTALLED DEVICES ID 0 TO 7");
2063 		for (TargetID = 0; TargetID < 8; TargetID++)
2064 			HostAdapter->TargetFlags[TargetID].TargetExists = (InstalledDevicesID0to7[TargetID] != 0 ? true : false);
2065 	}
2066 	/*
2067 	   Issue the Inquire Setup Information command.
2068 	 */
2069 	RequestedReplyLength = sizeof(SetupInformation);
2070 	if (BusLogic_Command(HostAdapter, BusLogic_InquireSetupInformation, &RequestedReplyLength, sizeof(RequestedReplyLength), &SetupInformation, sizeof(SetupInformation))
2071 	    != sizeof(SetupInformation))
2072 		return BusLogic_Failure(HostAdapter, "INQUIRE SETUP INFORMATION");
2073 	for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
2074 		HostAdapter->SynchronousOffset[TargetID] = (TargetID < 8 ? SetupInformation.SynchronousValuesID0to7[TargetID].Offset : SetupInformation.SynchronousValuesID8to15[TargetID - 8].Offset);
2075 	if (strcmp(HostAdapter->FirmwareVersion, "5.06L") >= 0)
2076 		for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
2077 			HostAdapter->TargetFlags[TargetID].WideTransfersActive = (TargetID < 8 ? (SetupInformation.WideTransfersActiveID0to7 & (1 << TargetID)
2078 												  ? true : false)
2079 										  : (SetupInformation.WideTransfersActiveID8to15 & (1 << (TargetID - 8))
2080 										     ? true : false));
2081 	/*
2082 	   Issue the Inquire Synchronous Period command.
2083 	 */
2084 	if (HostAdapter->FirmwareVersion[0] >= '3') {
2085 
2086 		/* Issue a Inquire Synchronous Period command.  For each Target Device,
2087 		 * a byte is returned which represents the Synchronous Transfer Period
2088 		 * in units of 10 nanoseconds.
2089 		 */
2090 
2091 		RequestedReplyLength = sizeof(SynchronousPeriod);
2092 		if (BusLogic_Command(HostAdapter, BusLogic_InquireSynchronousPeriod, &RequestedReplyLength, sizeof(RequestedReplyLength), &SynchronousPeriod, sizeof(SynchronousPeriod))
2093 		    != sizeof(SynchronousPeriod))
2094 			return BusLogic_Failure(HostAdapter, "INQUIRE SYNCHRONOUS PERIOD");
2095 		for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
2096 			HostAdapter->SynchronousPeriod[TargetID] = SynchronousPeriod[TargetID];
2097 	} else
2098 		for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
2099 			if (SetupInformation.SynchronousValuesID0to7[TargetID].Offset > 0)
2100 				HostAdapter->SynchronousPeriod[TargetID] = 20 + 5 * SetupInformation.SynchronousValuesID0to7[TargetID]
2101 				    .TransferPeriod;
2102 	/*
2103 	   Indicate the Target Device Inquiry completed successfully.
2104 	 */
2105 	return true;
2106 }
2107 
2108 /*
2109   BusLogic_InitializeHostStructure initializes the fields in the SCSI Host
2110   structure.  The base, io_port, n_io_ports, irq, and dma_channel fields in the
2111   SCSI Host structure are intentionally left uninitialized, as this driver
2112   handles acquisition and release of these resources explicitly, as well as
2113   ensuring exclusive access to the Host Adapter hardware and data structures
2114   through explicit acquisition and release of the Host Adapter's Lock.
2115 */
2116 
2117 static void __init BusLogic_InitializeHostStructure(struct BusLogic_HostAdapter
2118 						    *HostAdapter, struct Scsi_Host *Host)
2119 {
2120 	Host->max_id = HostAdapter->MaxTargetDevices;
2121 	Host->max_lun = HostAdapter->MaxLogicalUnits;
2122 	Host->max_channel = 0;
2123 	Host->unique_id = HostAdapter->IO_Address;
2124 	Host->this_id = HostAdapter->SCSI_ID;
2125 	Host->can_queue = HostAdapter->DriverQueueDepth;
2126 	Host->sg_tablesize = HostAdapter->DriverScatterGatherLimit;
2127 	Host->unchecked_isa_dma = HostAdapter->BounceBuffersRequired;
2128 	Host->cmd_per_lun = HostAdapter->UntaggedQueueDepth;
2129 }
2130 
2131 /*
2132   BusLogic_SlaveConfigure will actually set the queue depth on individual
2133   scsi devices as they are permanently added to the device chain.  We
2134   shamelessly rip off the SelectQueueDepths code to make this work mostly
2135   like it used to.  Since we don't get called once at the end of the scan
2136   but instead get called for each device, we have to do things a bit
2137   differently.
2138 */
2139 static int BusLogic_SlaveConfigure(struct scsi_device *Device)
2140 {
2141 	struct BusLogic_HostAdapter *HostAdapter = (struct BusLogic_HostAdapter *) Device->host->hostdata;
2142 	int TargetID = Device->id;
2143 	int QueueDepth = HostAdapter->QueueDepth[TargetID];
2144 
2145 	if (HostAdapter->TargetFlags[TargetID].TaggedQueuingSupported && (HostAdapter->TaggedQueuingPermitted & (1 << TargetID))) {
2146 		if (QueueDepth == 0)
2147 			QueueDepth = BusLogic_MaxAutomaticTaggedQueueDepth;
2148 		HostAdapter->QueueDepth[TargetID] = QueueDepth;
2149 		scsi_adjust_queue_depth(Device, MSG_SIMPLE_TAG, QueueDepth);
2150 	} else {
2151 		HostAdapter->TaggedQueuingPermitted &= ~(1 << TargetID);
2152 		QueueDepth = HostAdapter->UntaggedQueueDepth;
2153 		HostAdapter->QueueDepth[TargetID] = QueueDepth;
2154 		scsi_adjust_queue_depth(Device, 0, QueueDepth);
2155 	}
2156 	QueueDepth = 0;
2157 	for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
2158 		if (HostAdapter->TargetFlags[TargetID].TargetExists) {
2159 			QueueDepth += HostAdapter->QueueDepth[TargetID];
2160 		}
2161 	if (QueueDepth > HostAdapter->AllocatedCCBs)
2162 		BusLogic_CreateAdditionalCCBs(HostAdapter, QueueDepth - HostAdapter->AllocatedCCBs, false);
2163 	return 0;
2164 }
2165 
2166 /*
2167   BusLogic_DetectHostAdapter probes for BusLogic Host Adapters at the standard
2168   I/O Addresses where they may be located, initializing, registering, and
2169   reporting the configuration of each BusLogic Host Adapter it finds.  It
2170   returns the number of BusLogic Host Adapters successfully initialized and
2171   registered.
2172 */
2173 
2174 static int __init BusLogic_init(void)
2175 {
2176 	int BusLogicHostAdapterCount = 0, DriverOptionsIndex = 0, ProbeIndex;
2177 	struct BusLogic_HostAdapter *PrototypeHostAdapter;
2178 
2179 #ifdef MODULE
2180 	if (BusLogic)
2181 		BusLogic_Setup(BusLogic);
2182 #endif
2183 
2184 	if (BusLogic_ProbeOptions.NoProbe)
2185 		return -ENODEV;
2186 	BusLogic_ProbeInfoList = (struct BusLogic_ProbeInfo *)
2187 	    kmalloc(BusLogic_MaxHostAdapters * sizeof(struct BusLogic_ProbeInfo), GFP_ATOMIC);
2188 	if (BusLogic_ProbeInfoList == NULL) {
2189 		BusLogic_Error("BusLogic: Unable to allocate Probe Info List\n", NULL);
2190 		return -ENOMEM;
2191 	}
2192 	memset(BusLogic_ProbeInfoList, 0, BusLogic_MaxHostAdapters * sizeof(struct BusLogic_ProbeInfo));
2193 	PrototypeHostAdapter = (struct BusLogic_HostAdapter *)
2194 	    kmalloc(sizeof(struct BusLogic_HostAdapter), GFP_ATOMIC);
2195 	if (PrototypeHostAdapter == NULL) {
2196 		kfree(BusLogic_ProbeInfoList);
2197 		BusLogic_Error("BusLogic: Unable to allocate Prototype " "Host Adapter\n", NULL);
2198 		return -ENOMEM;
2199 	}
2200 	memset(PrototypeHostAdapter, 0, sizeof(struct BusLogic_HostAdapter));
2201 #ifdef MODULE
2202 	if (BusLogic != NULL)
2203 		BusLogic_Setup(BusLogic);
2204 #endif
2205 	BusLogic_InitializeProbeInfoList(PrototypeHostAdapter);
2206 	for (ProbeIndex = 0; ProbeIndex < BusLogic_ProbeInfoCount; ProbeIndex++) {
2207 		struct BusLogic_ProbeInfo *ProbeInfo = &BusLogic_ProbeInfoList[ProbeIndex];
2208 		struct BusLogic_HostAdapter *HostAdapter = PrototypeHostAdapter;
2209 		struct Scsi_Host *Host;
2210 		if (ProbeInfo->IO_Address == 0)
2211 			continue;
2212 		memset(HostAdapter, 0, sizeof(struct BusLogic_HostAdapter));
2213 		HostAdapter->HostAdapterType = ProbeInfo->HostAdapterType;
2214 		HostAdapter->HostAdapterBusType = ProbeInfo->HostAdapterBusType;
2215 		HostAdapter->IO_Address = ProbeInfo->IO_Address;
2216 		HostAdapter->PCI_Address = ProbeInfo->PCI_Address;
2217 		HostAdapter->Bus = ProbeInfo->Bus;
2218 		HostAdapter->Device = ProbeInfo->Device;
2219 		HostAdapter->PCI_Device = ProbeInfo->PCI_Device;
2220 		HostAdapter->IRQ_Channel = ProbeInfo->IRQ_Channel;
2221 		HostAdapter->AddressCount = BusLogic_HostAdapterAddressCount[HostAdapter->HostAdapterType];
2222 		/*
2223 		   Probe the Host Adapter.  If unsuccessful, abort further initialization.
2224 		 */
2225 		if (!BusLogic_ProbeHostAdapter(HostAdapter))
2226 			continue;
2227 		/*
2228 		   Hard Reset the Host Adapter.  If unsuccessful, abort further
2229 		   initialization.
2230 		 */
2231 		if (!BusLogic_HardwareResetHostAdapter(HostAdapter, true))
2232 			continue;
2233 		/*
2234 		   Check the Host Adapter.  If unsuccessful, abort further initialization.
2235 		 */
2236 		if (!BusLogic_CheckHostAdapter(HostAdapter))
2237 			continue;
2238 		/*
2239 		   Initialize the Driver Options field if provided.
2240 		 */
2241 		if (DriverOptionsIndex < BusLogic_DriverOptionsCount)
2242 			HostAdapter->DriverOptions = &BusLogic_DriverOptions[DriverOptionsIndex++];
2243 		/*
2244 		   Announce the Driver Version and Date, Author's Name, Copyright Notice,
2245 		   and Electronic Mail Address.
2246 		 */
2247 		BusLogic_AnnounceDriver(HostAdapter);
2248 		/*
2249 		   Register usage of the I/O Address range.  From this point onward, any
2250 		   failure will be assumed to be due to a problem with the Host Adapter,
2251 		   rather than due to having mistakenly identified this port as belonging
2252 		   to a BusLogic Host Adapter.  The I/O Address range will not be
2253 		   released, thereby preventing it from being incorrectly identified as
2254 		   any other type of Host Adapter.
2255 		 */
2256 		if (!request_region(HostAdapter->IO_Address, HostAdapter->AddressCount, "BusLogic"))
2257 			continue;
2258 		/*
2259 		   Register the SCSI Host structure.
2260 		 */
2261 
2262 		Host = scsi_host_alloc(&Bus_Logic_template, sizeof(struct BusLogic_HostAdapter));
2263 		if (Host == NULL) {
2264 			release_region(HostAdapter->IO_Address, HostAdapter->AddressCount);
2265 			continue;
2266 		}
2267 		HostAdapter = (struct BusLogic_HostAdapter *) Host->hostdata;
2268 		memcpy(HostAdapter, PrototypeHostAdapter, sizeof(struct BusLogic_HostAdapter));
2269 		HostAdapter->SCSI_Host = Host;
2270 		HostAdapter->HostNumber = Host->host_no;
2271 		/*
2272 		   Add Host Adapter to the end of the list of registered BusLogic
2273 		   Host Adapters.
2274 		 */
2275 		list_add_tail(&HostAdapter->host_list, &BusLogic_host_list);
2276 
2277 		/*
2278 		   Read the Host Adapter Configuration, Configure the Host Adapter,
2279 		   Acquire the System Resources necessary to use the Host Adapter, then
2280 		   Create the Initial CCBs, Initialize the Host Adapter, and finally
2281 		   perform Target Device Inquiry.
2282 		 */
2283 		if (BusLogic_ReadHostAdapterConfiguration(HostAdapter) &&
2284 		    BusLogic_ReportHostAdapterConfiguration(HostAdapter) && BusLogic_AcquireResources(HostAdapter) && BusLogic_CreateInitialCCBs(HostAdapter) && BusLogic_InitializeHostAdapter(HostAdapter) && BusLogic_TargetDeviceInquiry(HostAdapter)) {
2285 			/*
2286 			   Initialization has been completed successfully.  Release and
2287 			   re-register usage of the I/O Address range so that the Model
2288 			   Name of the Host Adapter will appear, and initialize the SCSI
2289 			   Host structure.
2290 			 */
2291 			release_region(HostAdapter->IO_Address, HostAdapter->AddressCount);
2292 			if (!request_region(HostAdapter->IO_Address, HostAdapter->AddressCount, HostAdapter->FullModelName)) {
2293 				printk(KERN_WARNING "BusLogic: Release and re-register of " "port 0x%04lx failed \n", (unsigned long) HostAdapter->IO_Address);
2294 				BusLogic_DestroyCCBs(HostAdapter);
2295 				BusLogic_ReleaseResources(HostAdapter);
2296 				list_del(&HostAdapter->host_list);
2297 				scsi_host_put(Host);
2298 			} else {
2299 				BusLogic_InitializeHostStructure(HostAdapter, Host);
2300 				scsi_add_host(Host, HostAdapter->PCI_Device ? &HostAdapter->PCI_Device->dev : NULL);
2301 				scsi_scan_host(Host);
2302 				BusLogicHostAdapterCount++;
2303 			}
2304 		} else {
2305 			/*
2306 			   An error occurred during Host Adapter Configuration Querying, Host
2307 			   Adapter Configuration, Resource Acquisition, CCB Creation, Host
2308 			   Adapter Initialization, or Target Device Inquiry, so remove Host
2309 			   Adapter from the list of registered BusLogic Host Adapters, destroy
2310 			   the CCBs, Release the System Resources, and Unregister the SCSI
2311 			   Host.
2312 			 */
2313 			BusLogic_DestroyCCBs(HostAdapter);
2314 			BusLogic_ReleaseResources(HostAdapter);
2315 			list_del(&HostAdapter->host_list);
2316 			scsi_host_put(Host);
2317 		}
2318 	}
2319 	kfree(PrototypeHostAdapter);
2320 	kfree(BusLogic_ProbeInfoList);
2321 	BusLogic_ProbeInfoList = NULL;
2322 	return 0;
2323 }
2324 
2325 
2326 /*
2327   BusLogic_ReleaseHostAdapter releases all resources previously acquired to
2328   support a specific Host Adapter, including the I/O Address range, and
2329   unregisters the BusLogic Host Adapter.
2330 */
2331 
2332 static int __exit BusLogic_ReleaseHostAdapter(struct BusLogic_HostAdapter *HostAdapter)
2333 {
2334 	struct Scsi_Host *Host = HostAdapter->SCSI_Host;
2335 
2336 	scsi_remove_host(Host);
2337 
2338 	/*
2339 	   FlashPoint Host Adapters must first be released by the FlashPoint
2340 	   SCCB Manager.
2341 	 */
2342 	if (BusLogic_FlashPointHostAdapterP(HostAdapter))
2343 		FlashPoint_ReleaseHostAdapter(HostAdapter->CardHandle);
2344 	/*
2345 	   Destroy the CCBs and release any system resources acquired to
2346 	   support Host Adapter.
2347 	 */
2348 	BusLogic_DestroyCCBs(HostAdapter);
2349 	BusLogic_ReleaseResources(HostAdapter);
2350 	/*
2351 	   Release usage of the I/O Address range.
2352 	 */
2353 	release_region(HostAdapter->IO_Address, HostAdapter->AddressCount);
2354 	/*
2355 	   Remove Host Adapter from the list of registered BusLogic Host Adapters.
2356 	 */
2357 	list_del(&HostAdapter->host_list);
2358 
2359 	scsi_host_put(Host);
2360 	return 0;
2361 }
2362 
2363 
2364 /*
2365   BusLogic_QueueCompletedCCB queues CCB for completion processing.
2366 */
2367 
2368 static void BusLogic_QueueCompletedCCB(struct BusLogic_CCB *CCB)
2369 {
2370 	struct BusLogic_HostAdapter *HostAdapter = CCB->HostAdapter;
2371 	CCB->Status = BusLogic_CCB_Completed;
2372 	CCB->Next = NULL;
2373 	if (HostAdapter->FirstCompletedCCB == NULL) {
2374 		HostAdapter->FirstCompletedCCB = CCB;
2375 		HostAdapter->LastCompletedCCB = CCB;
2376 	} else {
2377 		HostAdapter->LastCompletedCCB->Next = CCB;
2378 		HostAdapter->LastCompletedCCB = CCB;
2379 	}
2380 	HostAdapter->ActiveCommands[CCB->TargetID]--;
2381 }
2382 
2383 
2384 /*
2385   BusLogic_ComputeResultCode computes a SCSI Subsystem Result Code from
2386   the Host Adapter Status and Target Device Status.
2387 */
2388 
2389 static int BusLogic_ComputeResultCode(struct BusLogic_HostAdapter *HostAdapter, enum BusLogic_HostAdapterStatus HostAdapterStatus, enum BusLogic_TargetDeviceStatus TargetDeviceStatus)
2390 {
2391 	int HostStatus;
2392 	switch (HostAdapterStatus) {
2393 	case BusLogic_CommandCompletedNormally:
2394 	case BusLogic_LinkedCommandCompleted:
2395 	case BusLogic_LinkedCommandCompletedWithFlag:
2396 		HostStatus = DID_OK;
2397 		break;
2398 	case BusLogic_SCSISelectionTimeout:
2399 		HostStatus = DID_TIME_OUT;
2400 		break;
2401 	case BusLogic_InvalidOutgoingMailboxActionCode:
2402 	case BusLogic_InvalidCommandOperationCode:
2403 	case BusLogic_InvalidCommandParameter:
2404 		BusLogic_Warning("BusLogic Driver Protocol Error 0x%02X\n", HostAdapter, HostAdapterStatus);
2405 	case BusLogic_DataUnderRun:
2406 	case BusLogic_DataOverRun:
2407 	case BusLogic_UnexpectedBusFree:
2408 	case BusLogic_LinkedCCBhasInvalidLUN:
2409 	case BusLogic_AutoRequestSenseFailed:
2410 	case BusLogic_TaggedQueuingMessageRejected:
2411 	case BusLogic_UnsupportedMessageReceived:
2412 	case BusLogic_HostAdapterHardwareFailed:
2413 	case BusLogic_TargetDeviceReconnectedImproperly:
2414 	case BusLogic_AbortQueueGenerated:
2415 	case BusLogic_HostAdapterSoftwareError:
2416 	case BusLogic_HostAdapterHardwareTimeoutError:
2417 	case BusLogic_SCSIParityErrorDetected:
2418 		HostStatus = DID_ERROR;
2419 		break;
2420 	case BusLogic_InvalidBusPhaseRequested:
2421 	case BusLogic_TargetFailedResponseToATN:
2422 	case BusLogic_HostAdapterAssertedRST:
2423 	case BusLogic_OtherDeviceAssertedRST:
2424 	case BusLogic_HostAdapterAssertedBusDeviceReset:
2425 		HostStatus = DID_RESET;
2426 		break;
2427 	default:
2428 		BusLogic_Warning("Unknown Host Adapter Status 0x%02X\n", HostAdapter, HostAdapterStatus);
2429 		HostStatus = DID_ERROR;
2430 		break;
2431 	}
2432 	return (HostStatus << 16) | TargetDeviceStatus;
2433 }
2434 
2435 
2436 /*
2437   BusLogic_ScanIncomingMailboxes scans the Incoming Mailboxes saving any
2438   Incoming Mailbox entries for completion processing.
2439 */
2440 
2441 static void BusLogic_ScanIncomingMailboxes(struct BusLogic_HostAdapter *HostAdapter)
2442 {
2443 	/*
2444 	   Scan through the Incoming Mailboxes in Strict Round Robin fashion, saving
2445 	   any completed CCBs for further processing.  It is essential that for each
2446 	   CCB and SCSI Command issued, command completion processing is performed
2447 	   exactly once.  Therefore, only Incoming Mailboxes with completion code
2448 	   Command Completed Without Error, Command Completed With Error, or Command
2449 	   Aborted At Host Request are saved for completion processing.  When an
2450 	   Incoming Mailbox has a completion code of Aborted Command Not Found, the
2451 	   CCB had already completed or been aborted before the current Abort request
2452 	   was processed, and so completion processing has already occurred and no
2453 	   further action should be taken.
2454 	 */
2455 	struct BusLogic_IncomingMailbox *NextIncomingMailbox = HostAdapter->NextIncomingMailbox;
2456 	enum BusLogic_CompletionCode CompletionCode;
2457 	while ((CompletionCode = NextIncomingMailbox->CompletionCode) != BusLogic_IncomingMailboxFree) {
2458 		/*
2459 		   We are only allowed to do this because we limit our architectures we
2460 		   run on to machines where bus_to_virt() actually works.  There *needs*
2461 		   to be a dma_addr_to_virt() in the new PCI DMA mapping interface to
2462 		   replace bus_to_virt() or else this code is going to become very
2463 		   innefficient.
2464 		 */
2465 		struct BusLogic_CCB *CCB = (struct BusLogic_CCB *) Bus_to_Virtual(NextIncomingMailbox->CCB);
2466 		if (CompletionCode != BusLogic_AbortedCommandNotFound) {
2467 			if (CCB->Status == BusLogic_CCB_Active || CCB->Status == BusLogic_CCB_Reset) {
2468 				/*
2469 				   Save the Completion Code for this CCB and queue the CCB
2470 				   for completion processing.
2471 				 */
2472 				CCB->CompletionCode = CompletionCode;
2473 				BusLogic_QueueCompletedCCB(CCB);
2474 			} else {
2475 				/*
2476 				   If a CCB ever appears in an Incoming Mailbox and is not marked
2477 				   as status Active or Reset, then there is most likely a bug in
2478 				   the Host Adapter firmware.
2479 				 */
2480 				BusLogic_Warning("Illegal CCB #%ld status %d in " "Incoming Mailbox\n", HostAdapter, CCB->SerialNumber, CCB->Status);
2481 			}
2482 		}
2483 		NextIncomingMailbox->CompletionCode = BusLogic_IncomingMailboxFree;
2484 		if (++NextIncomingMailbox > HostAdapter->LastIncomingMailbox)
2485 			NextIncomingMailbox = HostAdapter->FirstIncomingMailbox;
2486 	}
2487 	HostAdapter->NextIncomingMailbox = NextIncomingMailbox;
2488 }
2489 
2490 
2491 /*
2492   BusLogic_ProcessCompletedCCBs iterates over the completed CCBs for Host
2493   Adapter setting the SCSI Command Result Codes, deallocating the CCBs, and
2494   calling the SCSI Subsystem Completion Routines.  The Host Adapter's Lock
2495   should already have been acquired by the caller.
2496 */
2497 
2498 static void BusLogic_ProcessCompletedCCBs(struct BusLogic_HostAdapter *HostAdapter)
2499 {
2500 	if (HostAdapter->ProcessCompletedCCBsActive)
2501 		return;
2502 	HostAdapter->ProcessCompletedCCBsActive = true;
2503 	while (HostAdapter->FirstCompletedCCB != NULL) {
2504 		struct BusLogic_CCB *CCB = HostAdapter->FirstCompletedCCB;
2505 		struct scsi_cmnd *Command = CCB->Command;
2506 		HostAdapter->FirstCompletedCCB = CCB->Next;
2507 		if (HostAdapter->FirstCompletedCCB == NULL)
2508 			HostAdapter->LastCompletedCCB = NULL;
2509 		/*
2510 		   Process the Completed CCB.
2511 		 */
2512 		if (CCB->Opcode == BusLogic_BusDeviceReset) {
2513 			int TargetID = CCB->TargetID;
2514 			BusLogic_Warning("Bus Device Reset CCB #%ld to Target " "%d Completed\n", HostAdapter, CCB->SerialNumber, TargetID);
2515 			BusLogic_IncrementErrorCounter(&HostAdapter->TargetStatistics[TargetID].BusDeviceResetsCompleted);
2516 			HostAdapter->TargetFlags[TargetID].TaggedQueuingActive = false;
2517 			HostAdapter->CommandsSinceReset[TargetID] = 0;
2518 			HostAdapter->LastResetCompleted[TargetID] = jiffies;
2519 			/*
2520 			   Place CCB back on the Host Adapter's free list.
2521 			 */
2522 			BusLogic_DeallocateCCB(CCB);
2523 #if 0				/* this needs to be redone different for new EH */
2524 			/*
2525 			   Bus Device Reset CCBs have the Command field non-NULL only when a
2526 			   Bus Device Reset was requested for a Command that did not have a
2527 			   currently active CCB in the Host Adapter (i.e., a Synchronous
2528 			   Bus Device Reset), and hence would not have its Completion Routine
2529 			   called otherwise.
2530 			 */
2531 			while (Command != NULL) {
2532 				struct scsi_cmnd *NextCommand = Command->reset_chain;
2533 				Command->reset_chain = NULL;
2534 				Command->result = DID_RESET << 16;
2535 				Command->scsi_done(Command);
2536 				Command = NextCommand;
2537 			}
2538 #endif
2539 			/*
2540 			   Iterate over the CCBs for this Host Adapter performing completion
2541 			   processing for any CCBs marked as Reset for this Target.
2542 			 */
2543 			for (CCB = HostAdapter->All_CCBs; CCB != NULL; CCB = CCB->NextAll)
2544 				if (CCB->Status == BusLogic_CCB_Reset && CCB->TargetID == TargetID) {
2545 					Command = CCB->Command;
2546 					BusLogic_DeallocateCCB(CCB);
2547 					HostAdapter->ActiveCommands[TargetID]--;
2548 					Command->result = DID_RESET << 16;
2549 					Command->scsi_done(Command);
2550 				}
2551 			HostAdapter->BusDeviceResetPendingCCB[TargetID] = NULL;
2552 		} else {
2553 			/*
2554 			   Translate the Completion Code, Host Adapter Status, and Target
2555 			   Device Status into a SCSI Subsystem Result Code.
2556 			 */
2557 			switch (CCB->CompletionCode) {
2558 			case BusLogic_IncomingMailboxFree:
2559 			case BusLogic_AbortedCommandNotFound:
2560 			case BusLogic_InvalidCCB:
2561 				BusLogic_Warning("CCB #%ld to Target %d Impossible State\n", HostAdapter, CCB->SerialNumber, CCB->TargetID);
2562 				break;
2563 			case BusLogic_CommandCompletedWithoutError:
2564 				HostAdapter->TargetStatistics[CCB->TargetID]
2565 				    .CommandsCompleted++;
2566 				HostAdapter->TargetFlags[CCB->TargetID]
2567 				    .CommandSuccessfulFlag = true;
2568 				Command->result = DID_OK << 16;
2569 				break;
2570 			case BusLogic_CommandAbortedAtHostRequest:
2571 				BusLogic_Warning("CCB #%ld to Target %d Aborted\n", HostAdapter, CCB->SerialNumber, CCB->TargetID);
2572 				BusLogic_IncrementErrorCounter(&HostAdapter->TargetStatistics[CCB->TargetID]
2573 							       .CommandAbortsCompleted);
2574 				Command->result = DID_ABORT << 16;
2575 				break;
2576 			case BusLogic_CommandCompletedWithError:
2577 				Command->result = BusLogic_ComputeResultCode(HostAdapter, CCB->HostAdapterStatus, CCB->TargetDeviceStatus);
2578 				if (CCB->HostAdapterStatus != BusLogic_SCSISelectionTimeout) {
2579 					HostAdapter->TargetStatistics[CCB->TargetID]
2580 					    .CommandsCompleted++;
2581 					if (BusLogic_GlobalOptions.TraceErrors) {
2582 						int i;
2583 						BusLogic_Notice("CCB #%ld Target %d: Result %X Host "
2584 								"Adapter Status %02X " "Target Status %02X\n", HostAdapter, CCB->SerialNumber, CCB->TargetID, Command->result, CCB->HostAdapterStatus, CCB->TargetDeviceStatus);
2585 						BusLogic_Notice("CDB   ", HostAdapter);
2586 						for (i = 0; i < CCB->CDB_Length; i++)
2587 							BusLogic_Notice(" %02X", HostAdapter, CCB->CDB[i]);
2588 						BusLogic_Notice("\n", HostAdapter);
2589 						BusLogic_Notice("Sense ", HostAdapter);
2590 						for (i = 0; i < CCB->SenseDataLength; i++)
2591 							BusLogic_Notice(" %02X", HostAdapter, Command->sense_buffer[i]);
2592 						BusLogic_Notice("\n", HostAdapter);
2593 					}
2594 				}
2595 				break;
2596 			}
2597 			/*
2598 			   When an INQUIRY command completes normally, save the
2599 			   CmdQue (Tagged Queuing Supported) and WBus16 (16 Bit
2600 			   Wide Data Transfers Supported) bits.
2601 			 */
2602 			if (CCB->CDB[0] == INQUIRY && CCB->CDB[1] == 0 && CCB->HostAdapterStatus == BusLogic_CommandCompletedNormally) {
2603 				struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[CCB->TargetID];
2604 				struct SCSI_Inquiry *InquiryResult = (struct SCSI_Inquiry *) Command->request_buffer;
2605 				TargetFlags->TargetExists = true;
2606 				TargetFlags->TaggedQueuingSupported = InquiryResult->CmdQue;
2607 				TargetFlags->WideTransfersSupported = InquiryResult->WBus16;
2608 			}
2609 			/*
2610 			   Place CCB back on the Host Adapter's free list.
2611 			 */
2612 			BusLogic_DeallocateCCB(CCB);
2613 			/*
2614 			   Call the SCSI Command Completion Routine.
2615 			 */
2616 			Command->scsi_done(Command);
2617 		}
2618 	}
2619 	HostAdapter->ProcessCompletedCCBsActive = false;
2620 }
2621 
2622 
2623 /*
2624   BusLogic_InterruptHandler handles hardware interrupts from BusLogic Host
2625   Adapters.
2626 */
2627 
2628 static irqreturn_t BusLogic_InterruptHandler(int IRQ_Channel, void *DeviceIdentifier, struct pt_regs *InterruptRegisters)
2629 {
2630 	struct BusLogic_HostAdapter *HostAdapter = (struct BusLogic_HostAdapter *) DeviceIdentifier;
2631 	unsigned long ProcessorFlags;
2632 	/*
2633 	   Acquire exclusive access to Host Adapter.
2634 	 */
2635 	spin_lock_irqsave(HostAdapter->SCSI_Host->host_lock, ProcessorFlags);
2636 	/*
2637 	   Handle Interrupts appropriately for each Host Adapter type.
2638 	 */
2639 	if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) {
2640 		union BusLogic_InterruptRegister InterruptRegister;
2641 		/*
2642 		   Read the Host Adapter Interrupt Register.
2643 		 */
2644 		InterruptRegister.All = BusLogic_ReadInterruptRegister(HostAdapter);
2645 		if (InterruptRegister.ir.InterruptValid) {
2646 			/*
2647 			   Acknowledge the interrupt and reset the Host Adapter
2648 			   Interrupt Register.
2649 			 */
2650 			BusLogic_InterruptReset(HostAdapter);
2651 			/*
2652 			   Process valid External SCSI Bus Reset and Incoming Mailbox
2653 			   Loaded Interrupts.  Command Complete Interrupts are noted,
2654 			   and Outgoing Mailbox Available Interrupts are ignored, as
2655 			   they are never enabled.
2656 			 */
2657 			if (InterruptRegister.ir.ExternalBusReset)
2658 				HostAdapter->HostAdapterExternalReset = true;
2659 			else if (InterruptRegister.ir.IncomingMailboxLoaded)
2660 				BusLogic_ScanIncomingMailboxes(HostAdapter);
2661 			else if (InterruptRegister.ir.CommandComplete)
2662 				HostAdapter->HostAdapterCommandCompleted = true;
2663 		}
2664 	} else {
2665 		/*
2666 		   Check if there is a pending interrupt for this Host Adapter.
2667 		 */
2668 		if (FlashPoint_InterruptPending(HostAdapter->CardHandle))
2669 			switch (FlashPoint_HandleInterrupt(HostAdapter->CardHandle)) {
2670 			case FlashPoint_NormalInterrupt:
2671 				break;
2672 			case FlashPoint_ExternalBusReset:
2673 				HostAdapter->HostAdapterExternalReset = true;
2674 				break;
2675 			case FlashPoint_InternalError:
2676 				BusLogic_Warning("Internal FlashPoint Error detected" " - Resetting Host Adapter\n", HostAdapter);
2677 				HostAdapter->HostAdapterInternalError = true;
2678 				break;
2679 			}
2680 	}
2681 	/*
2682 	   Process any completed CCBs.
2683 	 */
2684 	if (HostAdapter->FirstCompletedCCB != NULL)
2685 		BusLogic_ProcessCompletedCCBs(HostAdapter);
2686 	/*
2687 	   Reset the Host Adapter if requested.
2688 	 */
2689 	if (HostAdapter->HostAdapterExternalReset) {
2690 		BusLogic_Warning("Resetting %s due to External SCSI Bus Reset\n", HostAdapter, HostAdapter->FullModelName);
2691 		BusLogic_IncrementErrorCounter(&HostAdapter->ExternalHostAdapterResets);
2692 		BusLogic_ResetHostAdapter(HostAdapter, false);
2693 		HostAdapter->HostAdapterExternalReset = false;
2694 	} else if (HostAdapter->HostAdapterInternalError) {
2695 		BusLogic_Warning("Resetting %s due to Host Adapter Internal Error\n", HostAdapter, HostAdapter->FullModelName);
2696 		BusLogic_IncrementErrorCounter(&HostAdapter->HostAdapterInternalErrors);
2697 		BusLogic_ResetHostAdapter(HostAdapter, true);
2698 		HostAdapter->HostAdapterInternalError = false;
2699 	}
2700 	/*
2701 	   Release exclusive access to Host Adapter.
2702 	 */
2703 	spin_unlock_irqrestore(HostAdapter->SCSI_Host->host_lock, ProcessorFlags);
2704 	return IRQ_HANDLED;
2705 }
2706 
2707 
2708 /*
2709   BusLogic_WriteOutgoingMailbox places CCB and Action Code into an Outgoing
2710   Mailbox for execution by Host Adapter.  The Host Adapter's Lock should
2711   already have been acquired by the caller.
2712 */
2713 
2714 static boolean BusLogic_WriteOutgoingMailbox(struct BusLogic_HostAdapter
2715 					     *HostAdapter, enum BusLogic_ActionCode ActionCode, struct BusLogic_CCB *CCB)
2716 {
2717 	struct BusLogic_OutgoingMailbox *NextOutgoingMailbox;
2718 	NextOutgoingMailbox = HostAdapter->NextOutgoingMailbox;
2719 	if (NextOutgoingMailbox->ActionCode == BusLogic_OutgoingMailboxFree) {
2720 		CCB->Status = BusLogic_CCB_Active;
2721 		/*
2722 		   The CCB field must be written before the Action Code field since
2723 		   the Host Adapter is operating asynchronously and the locking code
2724 		   does not protect against simultaneous access by the Host Adapter.
2725 		 */
2726 		NextOutgoingMailbox->CCB = CCB->DMA_Handle;
2727 		NextOutgoingMailbox->ActionCode = ActionCode;
2728 		BusLogic_StartMailboxCommand(HostAdapter);
2729 		if (++NextOutgoingMailbox > HostAdapter->LastOutgoingMailbox)
2730 			NextOutgoingMailbox = HostAdapter->FirstOutgoingMailbox;
2731 		HostAdapter->NextOutgoingMailbox = NextOutgoingMailbox;
2732 		if (ActionCode == BusLogic_MailboxStartCommand) {
2733 			HostAdapter->ActiveCommands[CCB->TargetID]++;
2734 			if (CCB->Opcode != BusLogic_BusDeviceReset)
2735 				HostAdapter->TargetStatistics[CCB->TargetID].CommandsAttempted++;
2736 		}
2737 		return true;
2738 	}
2739 	return false;
2740 }
2741 
2742 /* Error Handling (EH) support */
2743 
2744 static int BusLogic_host_reset(struct scsi_cmnd * SCpnt)
2745 {
2746 	struct BusLogic_HostAdapter *HostAdapter = (struct BusLogic_HostAdapter *) SCpnt->device->host->hostdata;
2747 
2748 	unsigned int id = SCpnt->device->id;
2749 	struct BusLogic_TargetStatistics *stats = &HostAdapter->TargetStatistics[id];
2750 	int rc;
2751 
2752 	spin_lock_irq(SCpnt->device->host->host_lock);
2753 
2754 	BusLogic_IncrementErrorCounter(&stats->HostAdapterResetsRequested);
2755 
2756 	rc = BusLogic_ResetHostAdapter(HostAdapter, false);
2757 	spin_unlock_irq(SCpnt->device->host->host_lock);
2758 	return rc;
2759 }
2760 
2761 /*
2762   BusLogic_QueueCommand creates a CCB for Command and places it into an
2763   Outgoing Mailbox for execution by the associated Host Adapter.
2764 */
2765 
2766 static int BusLogic_QueueCommand(struct scsi_cmnd *Command, void (*CompletionRoutine) (struct scsi_cmnd *))
2767 {
2768 	struct BusLogic_HostAdapter *HostAdapter = (struct BusLogic_HostAdapter *) Command->device->host->hostdata;
2769 	struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[Command->device->id];
2770 	struct BusLogic_TargetStatistics *TargetStatistics = HostAdapter->TargetStatistics;
2771 	unsigned char *CDB = Command->cmnd;
2772 	int CDB_Length = Command->cmd_len;
2773 	int TargetID = Command->device->id;
2774 	int LogicalUnit = Command->device->lun;
2775 	void *BufferPointer = Command->request_buffer;
2776 	int BufferLength = Command->request_bufflen;
2777 	int SegmentCount = Command->use_sg;
2778 	struct BusLogic_CCB *CCB;
2779 	/*
2780 	   SCSI REQUEST_SENSE commands will be executed automatically by the Host
2781 	   Adapter for any errors, so they should not be executed explicitly unless
2782 	   the Sense Data is zero indicating that no error occurred.
2783 	 */
2784 	if (CDB[0] == REQUEST_SENSE && Command->sense_buffer[0] != 0) {
2785 		Command->result = DID_OK << 16;
2786 		CompletionRoutine(Command);
2787 		return 0;
2788 	}
2789 	/*
2790 	   Allocate a CCB from the Host Adapter's free list.  In the unlikely event
2791 	   that there are none available and memory allocation fails, wait 1 second
2792 	   and try again.  If that fails, the Host Adapter is probably hung so signal
2793 	   an error as a Host Adapter Hard Reset should be initiated soon.
2794 	 */
2795 	CCB = BusLogic_AllocateCCB(HostAdapter);
2796 	if (CCB == NULL) {
2797 		spin_unlock_irq(HostAdapter->SCSI_Host->host_lock);
2798 		BusLogic_Delay(1);
2799 		spin_lock_irq(HostAdapter->SCSI_Host->host_lock);
2800 		CCB = BusLogic_AllocateCCB(HostAdapter);
2801 		if (CCB == NULL) {
2802 			Command->result = DID_ERROR << 16;
2803 			CompletionRoutine(Command);
2804 			return 0;
2805 		}
2806 	}
2807 	/*
2808 	   Initialize the fields in the BusLogic Command Control Block (CCB).
2809 	 */
2810 	if (SegmentCount == 0 && BufferLength != 0) {
2811 		CCB->Opcode = BusLogic_InitiatorCCB;
2812 		CCB->DataLength = BufferLength;
2813 		CCB->DataPointer = pci_map_single(HostAdapter->PCI_Device,
2814 				BufferPointer, BufferLength,
2815 				Command->sc_data_direction);
2816 	} else if (SegmentCount != 0) {
2817 		struct scatterlist *ScatterList = (struct scatterlist *) BufferPointer;
2818 		int Segment, Count;
2819 
2820 		Count = pci_map_sg(HostAdapter->PCI_Device, ScatterList, SegmentCount,
2821 				Command->sc_data_direction);
2822 		CCB->Opcode = BusLogic_InitiatorCCB_ScatterGather;
2823 		CCB->DataLength = Count * sizeof(struct BusLogic_ScatterGatherSegment);
2824 		if (BusLogic_MultiMasterHostAdapterP(HostAdapter))
2825 			CCB->DataPointer = (unsigned int) CCB->DMA_Handle + ((unsigned long) &CCB->ScatterGatherList - (unsigned long) CCB);
2826 		else
2827 			CCB->DataPointer = Virtual_to_32Bit_Virtual(CCB->ScatterGatherList);
2828 		for (Segment = 0; Segment < Count; Segment++) {
2829 			CCB->ScatterGatherList[Segment].SegmentByteCount = sg_dma_len(ScatterList + Segment);
2830 			CCB->ScatterGatherList[Segment].SegmentDataPointer = sg_dma_address(ScatterList + Segment);
2831 		}
2832 	} else {
2833 		CCB->Opcode = BusLogic_InitiatorCCB;
2834 		CCB->DataLength = BufferLength;
2835 		CCB->DataPointer = 0;
2836 	}
2837 	switch (CDB[0]) {
2838 	case READ_6:
2839 	case READ_10:
2840 		CCB->DataDirection = BusLogic_DataInLengthChecked;
2841 		TargetStatistics[TargetID].ReadCommands++;
2842 		BusLogic_IncrementByteCounter(&TargetStatistics[TargetID].TotalBytesRead, BufferLength);
2843 		BusLogic_IncrementSizeBucket(TargetStatistics[TargetID].ReadCommandSizeBuckets, BufferLength);
2844 		break;
2845 	case WRITE_6:
2846 	case WRITE_10:
2847 		CCB->DataDirection = BusLogic_DataOutLengthChecked;
2848 		TargetStatistics[TargetID].WriteCommands++;
2849 		BusLogic_IncrementByteCounter(&TargetStatistics[TargetID].TotalBytesWritten, BufferLength);
2850 		BusLogic_IncrementSizeBucket(TargetStatistics[TargetID].WriteCommandSizeBuckets, BufferLength);
2851 		break;
2852 	default:
2853 		CCB->DataDirection = BusLogic_UncheckedDataTransfer;
2854 		break;
2855 	}
2856 	CCB->CDB_Length = CDB_Length;
2857 	CCB->HostAdapterStatus = 0;
2858 	CCB->TargetDeviceStatus = 0;
2859 	CCB->TargetID = TargetID;
2860 	CCB->LogicalUnit = LogicalUnit;
2861 	CCB->TagEnable = false;
2862 	CCB->LegacyTagEnable = false;
2863 	/*
2864 	   BusLogic recommends that after a Reset the first couple of commands that
2865 	   are sent to a Target Device be sent in a non Tagged Queue fashion so that
2866 	   the Host Adapter and Target Device can establish Synchronous and Wide
2867 	   Transfer before Queue Tag messages can interfere with the Synchronous and
2868 	   Wide Negotiation messages.  By waiting to enable Tagged Queuing until after
2869 	   the first BusLogic_MaxTaggedQueueDepth commands have been queued, it is
2870 	   assured that after a Reset any pending commands are requeued before Tagged
2871 	   Queuing is enabled and that the Tagged Queuing message will not occur while
2872 	   the partition table is being printed.  In addition, some devices do not
2873 	   properly handle the transition from non-tagged to tagged commands, so it is
2874 	   necessary to wait until there are no pending commands for a target device
2875 	   before queuing tagged commands.
2876 	 */
2877 	if (HostAdapter->CommandsSinceReset[TargetID]++ >=
2878 	    BusLogic_MaxTaggedQueueDepth && !TargetFlags->TaggedQueuingActive && HostAdapter->ActiveCommands[TargetID] == 0 && TargetFlags->TaggedQueuingSupported && (HostAdapter->TaggedQueuingPermitted & (1 << TargetID))) {
2879 		TargetFlags->TaggedQueuingActive = true;
2880 		BusLogic_Notice("Tagged Queuing now active for Target %d\n", HostAdapter, TargetID);
2881 	}
2882 	if (TargetFlags->TaggedQueuingActive) {
2883 		enum BusLogic_QueueTag QueueTag = BusLogic_SimpleQueueTag;
2884 		/*
2885 		   When using Tagged Queuing with Simple Queue Tags, it appears that disk
2886 		   drive controllers do not guarantee that a queued command will not
2887 		   remain in a disconnected state indefinitely if commands that read or
2888 		   write nearer the head position continue to arrive without interruption.
2889 		   Therefore, for each Target Device this driver keeps track of the last
2890 		   time either the queue was empty or an Ordered Queue Tag was issued.  If
2891 		   more than 4 seconds (one fifth of the 20 second disk timeout) have
2892 		   elapsed since this last sequence point, this command will be issued
2893 		   with an Ordered Queue Tag rather than a Simple Queue Tag, which forces
2894 		   the Target Device to complete all previously queued commands before
2895 		   this command may be executed.
2896 		 */
2897 		if (HostAdapter->ActiveCommands[TargetID] == 0)
2898 			HostAdapter->LastSequencePoint[TargetID] = jiffies;
2899 		else if (jiffies - HostAdapter->LastSequencePoint[TargetID] > 4 * HZ) {
2900 			HostAdapter->LastSequencePoint[TargetID] = jiffies;
2901 			QueueTag = BusLogic_OrderedQueueTag;
2902 		}
2903 		if (HostAdapter->ExtendedLUNSupport) {
2904 			CCB->TagEnable = true;
2905 			CCB->QueueTag = QueueTag;
2906 		} else {
2907 			CCB->LegacyTagEnable = true;
2908 			CCB->LegacyQueueTag = QueueTag;
2909 		}
2910 	}
2911 	memcpy(CCB->CDB, CDB, CDB_Length);
2912 	CCB->SenseDataLength = sizeof(Command->sense_buffer);
2913 	CCB->SenseDataPointer = pci_map_single(HostAdapter->PCI_Device, Command->sense_buffer, CCB->SenseDataLength, PCI_DMA_FROMDEVICE);
2914 	CCB->Command = Command;
2915 	Command->scsi_done = CompletionRoutine;
2916 	if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) {
2917 		/*
2918 		   Place the CCB in an Outgoing Mailbox.  The higher levels of the SCSI
2919 		   Subsystem should not attempt to queue more commands than can be placed
2920 		   in Outgoing Mailboxes, so there should always be one free.  In the
2921 		   unlikely event that there are none available, wait 1 second and try
2922 		   again.  If that fails, the Host Adapter is probably hung so signal an
2923 		   error as a Host Adapter Hard Reset should be initiated soon.
2924 		 */
2925 		if (!BusLogic_WriteOutgoingMailbox(HostAdapter, BusLogic_MailboxStartCommand, CCB)) {
2926 			spin_unlock_irq(HostAdapter->SCSI_Host->host_lock);
2927 			BusLogic_Warning("Unable to write Outgoing Mailbox - " "Pausing for 1 second\n", HostAdapter);
2928 			BusLogic_Delay(1);
2929 			spin_lock_irq(HostAdapter->SCSI_Host->host_lock);
2930 			if (!BusLogic_WriteOutgoingMailbox(HostAdapter, BusLogic_MailboxStartCommand, CCB)) {
2931 				BusLogic_Warning("Still unable to write Outgoing Mailbox - " "Host Adapter Dead?\n", HostAdapter);
2932 				BusLogic_DeallocateCCB(CCB);
2933 				Command->result = DID_ERROR << 16;
2934 				Command->scsi_done(Command);
2935 			}
2936 		}
2937 	} else {
2938 		/*
2939 		   Call the FlashPoint SCCB Manager to start execution of the CCB.
2940 		 */
2941 		CCB->Status = BusLogic_CCB_Active;
2942 		HostAdapter->ActiveCommands[TargetID]++;
2943 		TargetStatistics[TargetID].CommandsAttempted++;
2944 		FlashPoint_StartCCB(HostAdapter->CardHandle, CCB);
2945 		/*
2946 		   The Command may have already completed and BusLogic_QueueCompletedCCB
2947 		   been called, or it may still be pending.
2948 		 */
2949 		if (CCB->Status == BusLogic_CCB_Completed)
2950 			BusLogic_ProcessCompletedCCBs(HostAdapter);
2951 	}
2952 	return 0;
2953 }
2954 
2955 
2956 /*
2957   BusLogic_AbortCommand aborts Command if possible.
2958 */
2959 
2960 static int BusLogic_AbortCommand(struct scsi_cmnd *Command)
2961 {
2962 	struct BusLogic_HostAdapter *HostAdapter = (struct BusLogic_HostAdapter *) Command->device->host->hostdata;
2963 
2964 	int TargetID = Command->device->id;
2965 	struct BusLogic_CCB *CCB;
2966 	BusLogic_IncrementErrorCounter(&HostAdapter->TargetStatistics[TargetID].CommandAbortsRequested);
2967 	/*
2968 	   Attempt to find an Active CCB for this Command.  If no Active CCB for this
2969 	   Command is found, then no Abort is necessary.
2970 	 */
2971 	for (CCB = HostAdapter->All_CCBs; CCB != NULL; CCB = CCB->NextAll)
2972 		if (CCB->Command == Command)
2973 			break;
2974 	if (CCB == NULL) {
2975 		BusLogic_Warning("Unable to Abort Command to Target %d - " "No CCB Found\n", HostAdapter, TargetID);
2976 		return SUCCESS;
2977 	} else if (CCB->Status == BusLogic_CCB_Completed) {
2978 		BusLogic_Warning("Unable to Abort Command to Target %d - " "CCB Completed\n", HostAdapter, TargetID);
2979 		return SUCCESS;
2980 	} else if (CCB->Status == BusLogic_CCB_Reset) {
2981 		BusLogic_Warning("Unable to Abort Command to Target %d - " "CCB Reset\n", HostAdapter, TargetID);
2982 		return SUCCESS;
2983 	}
2984 	if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) {
2985 		/*
2986 		   Attempt to Abort this CCB.  MultiMaster Firmware versions prior to 5.xx
2987 		   do not generate Abort Tag messages, but only generate the non-tagged
2988 		   Abort message.  Since non-tagged commands are not sent by the Host
2989 		   Adapter until the queue of outstanding tagged commands has completed,
2990 		   and the Abort message is treated as a non-tagged command, it is
2991 		   effectively impossible to abort commands when Tagged Queuing is active.
2992 		   Firmware version 5.xx does generate Abort Tag messages, so it is
2993 		   possible to abort commands when Tagged Queuing is active.
2994 		 */
2995 		if (HostAdapter->TargetFlags[TargetID].TaggedQueuingActive && HostAdapter->FirmwareVersion[0] < '5') {
2996 			BusLogic_Warning("Unable to Abort CCB #%ld to Target %d - " "Abort Tag Not Supported\n", HostAdapter, CCB->SerialNumber, TargetID);
2997 			return FAILURE;
2998 		} else if (BusLogic_WriteOutgoingMailbox(HostAdapter, BusLogic_MailboxAbortCommand, CCB)) {
2999 			BusLogic_Warning("Aborting CCB #%ld to Target %d\n", HostAdapter, CCB->SerialNumber, TargetID);
3000 			BusLogic_IncrementErrorCounter(&HostAdapter->TargetStatistics[TargetID].CommandAbortsAttempted);
3001 			return SUCCESS;
3002 		} else {
3003 			BusLogic_Warning("Unable to Abort CCB #%ld to Target %d - " "No Outgoing Mailboxes\n", HostAdapter, CCB->SerialNumber, TargetID);
3004 			return FAILURE;
3005 		}
3006 	} else {
3007 		/*
3008 		   Call the FlashPoint SCCB Manager to abort execution of the CCB.
3009 		 */
3010 		BusLogic_Warning("Aborting CCB #%ld to Target %d\n", HostAdapter, CCB->SerialNumber, TargetID);
3011 		BusLogic_IncrementErrorCounter(&HostAdapter->TargetStatistics[TargetID].CommandAbortsAttempted);
3012 		FlashPoint_AbortCCB(HostAdapter->CardHandle, CCB);
3013 		/*
3014 		   The Abort may have already been completed and
3015 		   BusLogic_QueueCompletedCCB been called, or it
3016 		   may still be pending.
3017 		 */
3018 		if (CCB->Status == BusLogic_CCB_Completed) {
3019 			BusLogic_ProcessCompletedCCBs(HostAdapter);
3020 		}
3021 		return SUCCESS;
3022 	}
3023 	return SUCCESS;
3024 }
3025 
3026 /*
3027   BusLogic_ResetHostAdapter resets Host Adapter if possible, marking all
3028   currently executing SCSI Commands as having been Reset.
3029 */
3030 
3031 static int BusLogic_ResetHostAdapter(struct BusLogic_HostAdapter *HostAdapter, boolean HardReset)
3032 {
3033 	struct BusLogic_CCB *CCB;
3034 	int TargetID;
3035 
3036 	/*
3037 	 * Attempt to Reset and Reinitialize the Host Adapter.
3038 	 */
3039 
3040 	if (!(BusLogic_HardwareResetHostAdapter(HostAdapter, HardReset) && BusLogic_InitializeHostAdapter(HostAdapter))) {
3041 		BusLogic_Error("Resetting %s Failed\n", HostAdapter, HostAdapter->FullModelName);
3042 		return FAILURE;
3043 	}
3044 
3045 	/*
3046 	 * Deallocate all currently executing CCBs.
3047 	 */
3048 
3049 	for (CCB = HostAdapter->All_CCBs; CCB != NULL; CCB = CCB->NextAll)
3050 		if (CCB->Status == BusLogic_CCB_Active)
3051 			BusLogic_DeallocateCCB(CCB);
3052 	/*
3053 	 * Wait a few seconds between the Host Adapter Hard Reset which
3054 	 * initiates a SCSI Bus Reset and issuing any SCSI Commands.  Some
3055 	 * SCSI devices get confused if they receive SCSI Commands too soon
3056 	 * after a SCSI Bus Reset.
3057 	 */
3058 
3059 	if (HardReset) {
3060 		spin_unlock_irq(HostAdapter->SCSI_Host->host_lock);
3061 		BusLogic_Delay(HostAdapter->BusSettleTime);
3062 		spin_lock_irq(HostAdapter->SCSI_Host->host_lock);
3063 	}
3064 
3065 	for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) {
3066 		HostAdapter->LastResetAttempted[TargetID] = jiffies;
3067 		HostAdapter->LastResetCompleted[TargetID] = jiffies;
3068 	}
3069 	return SUCCESS;
3070 }
3071 
3072 /*
3073   BusLogic_BIOSDiskParameters returns the Heads/Sectors/Cylinders BIOS Disk
3074   Parameters for Disk.  The default disk geometry is 64 heads, 32 sectors, and
3075   the appropriate number of cylinders so as not to exceed drive capacity.  In
3076   order for disks equal to or larger than 1 GB to be addressable by the BIOS
3077   without exceeding the BIOS limitation of 1024 cylinders, Extended Translation
3078   may be enabled in AutoSCSI on FlashPoint Host Adapters and on "W" and "C"
3079   series MultiMaster Host Adapters, or by a dip switch setting on "S" and "A"
3080   series MultiMaster Host Adapters.  With Extended Translation enabled, drives
3081   between 1 GB inclusive and 2 GB exclusive are given a disk geometry of 128
3082   heads and 32 sectors, and drives above 2 GB inclusive are given a disk
3083   geometry of 255 heads and 63 sectors.  However, if the BIOS detects that the
3084   Extended Translation setting does not match the geometry in the partition
3085   table, then the translation inferred from the partition table will be used by
3086   the BIOS, and a warning may be displayed.
3087 */
3088 
3089 static int BusLogic_BIOSDiskParameters(struct scsi_device *sdev, struct block_device *Device, sector_t capacity, int *Parameters)
3090 {
3091 	struct BusLogic_HostAdapter *HostAdapter = (struct BusLogic_HostAdapter *) sdev->host->hostdata;
3092 	struct BIOS_DiskParameters *DiskParameters = (struct BIOS_DiskParameters *) Parameters;
3093 	unsigned char *buf;
3094 	if (HostAdapter->ExtendedTranslationEnabled && capacity >= 2 * 1024 * 1024 /* 1 GB in 512 byte sectors */ ) {
3095 		if (capacity >= 4 * 1024 * 1024 /* 2 GB in 512 byte sectors */ ) {
3096 			DiskParameters->Heads = 255;
3097 			DiskParameters->Sectors = 63;
3098 		} else {
3099 			DiskParameters->Heads = 128;
3100 			DiskParameters->Sectors = 32;
3101 		}
3102 	} else {
3103 		DiskParameters->Heads = 64;
3104 		DiskParameters->Sectors = 32;
3105 	}
3106 	DiskParameters->Cylinders = (unsigned long) capacity / (DiskParameters->Heads * DiskParameters->Sectors);
3107 	buf = scsi_bios_ptable(Device);
3108 	if (buf == NULL)
3109 		return 0;
3110 	/*
3111 	   If the boot sector partition table flag is valid, search for a partition
3112 	   table entry whose end_head matches one of the standard BusLogic geometry
3113 	   translations (64/32, 128/32, or 255/63).
3114 	 */
3115 	if (*(unsigned short *) (buf + 64) == 0xAA55) {
3116 		struct partition *FirstPartitionEntry = (struct partition *) buf;
3117 		struct partition *PartitionEntry = FirstPartitionEntry;
3118 		int SavedCylinders = DiskParameters->Cylinders, PartitionNumber;
3119 		unsigned char PartitionEntryEndHead = 0, PartitionEntryEndSector = 0;
3120 		for (PartitionNumber = 0; PartitionNumber < 4; PartitionNumber++) {
3121 			PartitionEntryEndHead = PartitionEntry->end_head;
3122 			PartitionEntryEndSector = PartitionEntry->end_sector & 0x3F;
3123 			if (PartitionEntryEndHead == 64 - 1) {
3124 				DiskParameters->Heads = 64;
3125 				DiskParameters->Sectors = 32;
3126 				break;
3127 			} else if (PartitionEntryEndHead == 128 - 1) {
3128 				DiskParameters->Heads = 128;
3129 				DiskParameters->Sectors = 32;
3130 				break;
3131 			} else if (PartitionEntryEndHead == 255 - 1) {
3132 				DiskParameters->Heads = 255;
3133 				DiskParameters->Sectors = 63;
3134 				break;
3135 			}
3136 			PartitionEntry++;
3137 		}
3138 		if (PartitionNumber == 4) {
3139 			PartitionEntryEndHead = FirstPartitionEntry->end_head;
3140 			PartitionEntryEndSector = FirstPartitionEntry->end_sector & 0x3F;
3141 		}
3142 		DiskParameters->Cylinders = (unsigned long) capacity / (DiskParameters->Heads * DiskParameters->Sectors);
3143 		if (PartitionNumber < 4 && PartitionEntryEndSector == DiskParameters->Sectors) {
3144 			if (DiskParameters->Cylinders != SavedCylinders)
3145 				BusLogic_Warning("Adopting Geometry %d/%d from Partition Table\n", HostAdapter, DiskParameters->Heads, DiskParameters->Sectors);
3146 		} else if (PartitionEntryEndHead > 0 || PartitionEntryEndSector > 0) {
3147 			BusLogic_Warning("Warning: Partition Table appears to " "have Geometry %d/%d which is\n", HostAdapter, PartitionEntryEndHead + 1, PartitionEntryEndSector);
3148 			BusLogic_Warning("not compatible with current BusLogic " "Host Adapter Geometry %d/%d\n", HostAdapter, DiskParameters->Heads, DiskParameters->Sectors);
3149 		}
3150 	}
3151 	kfree(buf);
3152 	return 0;
3153 }
3154 
3155 
3156 /*
3157   BugLogic_ProcDirectoryInfo implements /proc/scsi/BusLogic/<N>.
3158 */
3159 
3160 static int BusLogic_ProcDirectoryInfo(struct Scsi_Host *shost, char *ProcBuffer, char **StartPointer, off_t Offset, int BytesAvailable, int WriteFlag)
3161 {
3162 	struct BusLogic_HostAdapter *HostAdapter = (struct BusLogic_HostAdapter *) shost->hostdata;
3163 	struct BusLogic_TargetStatistics *TargetStatistics;
3164 	int TargetID, Length;
3165 	char *Buffer;
3166 
3167 	TargetStatistics = HostAdapter->TargetStatistics;
3168 	if (WriteFlag) {
3169 		HostAdapter->ExternalHostAdapterResets = 0;
3170 		HostAdapter->HostAdapterInternalErrors = 0;
3171 		memset(TargetStatistics, 0, BusLogic_MaxTargetDevices * sizeof(struct BusLogic_TargetStatistics));
3172 		return 0;
3173 	}
3174 	Buffer = HostAdapter->MessageBuffer;
3175 	Length = HostAdapter->MessageBufferLength;
3176 	Length += sprintf(&Buffer[Length], "\n\
3177 Current Driver Queue Depth:	%d\n\
3178 Currently Allocated CCBs:	%d\n", HostAdapter->DriverQueueDepth, HostAdapter->AllocatedCCBs);
3179 	Length += sprintf(&Buffer[Length], "\n\n\
3180 			   DATA TRANSFER STATISTICS\n\
3181 \n\
3182 Target	Tagged Queuing	Queue Depth  Active  Attempted	Completed\n\
3183 ======	==============	===========  ======  =========	=========\n");
3184 	for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) {
3185 		struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];
3186 		if (!TargetFlags->TargetExists)
3187 			continue;
3188 		Length += sprintf(&Buffer[Length], "  %2d	%s", TargetID, (TargetFlags->TaggedQueuingSupported ? (TargetFlags->TaggedQueuingActive ? "    Active" : (HostAdapter->TaggedQueuingPermitted & (1 << TargetID)
3189 																				    ? "  Permitted" : "   Disabled"))
3190 									  : "Not Supported"));
3191 		Length += sprintf(&Buffer[Length],
3192 				  "	    %3d       %3u    %9u	%9u\n", HostAdapter->QueueDepth[TargetID], HostAdapter->ActiveCommands[TargetID], TargetStatistics[TargetID].CommandsAttempted, TargetStatistics[TargetID].CommandsCompleted);
3193 	}
3194 	Length += sprintf(&Buffer[Length], "\n\
3195 Target  Read Commands  Write Commands   Total Bytes Read    Total Bytes Written\n\
3196 ======  =============  ==============  ===================  ===================\n");
3197 	for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) {
3198 		struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];
3199 		if (!TargetFlags->TargetExists)
3200 			continue;
3201 		Length += sprintf(&Buffer[Length], "  %2d	  %9u	 %9u", TargetID, TargetStatistics[TargetID].ReadCommands, TargetStatistics[TargetID].WriteCommands);
3202 		if (TargetStatistics[TargetID].TotalBytesRead.Billions > 0)
3203 			Length += sprintf(&Buffer[Length], "     %9u%09u", TargetStatistics[TargetID].TotalBytesRead.Billions, TargetStatistics[TargetID].TotalBytesRead.Units);
3204 		else
3205 			Length += sprintf(&Buffer[Length], "		%9u", TargetStatistics[TargetID].TotalBytesRead.Units);
3206 		if (TargetStatistics[TargetID].TotalBytesWritten.Billions > 0)
3207 			Length += sprintf(&Buffer[Length], "   %9u%09u\n", TargetStatistics[TargetID].TotalBytesWritten.Billions, TargetStatistics[TargetID].TotalBytesWritten.Units);
3208 		else
3209 			Length += sprintf(&Buffer[Length], "	     %9u\n", TargetStatistics[TargetID].TotalBytesWritten.Units);
3210 	}
3211 	Length += sprintf(&Buffer[Length], "\n\
3212 Target  Command    0-1KB      1-2KB      2-4KB      4-8KB     8-16KB\n\
3213 ======  =======  =========  =========  =========  =========  =========\n");
3214 	for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) {
3215 		struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];
3216 		if (!TargetFlags->TargetExists)
3217 			continue;
3218 		Length +=
3219 		    sprintf(&Buffer[Length],
3220 			    "  %2d	 Read	 %9u  %9u  %9u  %9u  %9u\n", TargetID,
3221 			    TargetStatistics[TargetID].ReadCommandSizeBuckets[0],
3222 			    TargetStatistics[TargetID].ReadCommandSizeBuckets[1], TargetStatistics[TargetID].ReadCommandSizeBuckets[2], TargetStatistics[TargetID].ReadCommandSizeBuckets[3], TargetStatistics[TargetID].ReadCommandSizeBuckets[4]);
3223 		Length +=
3224 		    sprintf(&Buffer[Length],
3225 			    "  %2d	 Write	 %9u  %9u  %9u  %9u  %9u\n", TargetID,
3226 			    TargetStatistics[TargetID].WriteCommandSizeBuckets[0],
3227 			    TargetStatistics[TargetID].WriteCommandSizeBuckets[1], TargetStatistics[TargetID].WriteCommandSizeBuckets[2], TargetStatistics[TargetID].WriteCommandSizeBuckets[3], TargetStatistics[TargetID].WriteCommandSizeBuckets[4]);
3228 	}
3229 	Length += sprintf(&Buffer[Length], "\n\
3230 Target  Command   16-32KB    32-64KB   64-128KB   128-256KB   256KB+\n\
3231 ======  =======  =========  =========  =========  =========  =========\n");
3232 	for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) {
3233 		struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];
3234 		if (!TargetFlags->TargetExists)
3235 			continue;
3236 		Length +=
3237 		    sprintf(&Buffer[Length],
3238 			    "  %2d	 Read	 %9u  %9u  %9u  %9u  %9u\n", TargetID,
3239 			    TargetStatistics[TargetID].ReadCommandSizeBuckets[5],
3240 			    TargetStatistics[TargetID].ReadCommandSizeBuckets[6], TargetStatistics[TargetID].ReadCommandSizeBuckets[7], TargetStatistics[TargetID].ReadCommandSizeBuckets[8], TargetStatistics[TargetID].ReadCommandSizeBuckets[9]);
3241 		Length +=
3242 		    sprintf(&Buffer[Length],
3243 			    "  %2d	 Write	 %9u  %9u  %9u  %9u  %9u\n", TargetID,
3244 			    TargetStatistics[TargetID].WriteCommandSizeBuckets[5],
3245 			    TargetStatistics[TargetID].WriteCommandSizeBuckets[6], TargetStatistics[TargetID].WriteCommandSizeBuckets[7], TargetStatistics[TargetID].WriteCommandSizeBuckets[8], TargetStatistics[TargetID].WriteCommandSizeBuckets[9]);
3246 	}
3247 	Length += sprintf(&Buffer[Length], "\n\n\
3248 			   ERROR RECOVERY STATISTICS\n\
3249 \n\
3250 	  Command Aborts      Bus Device Resets	  Host Adapter Resets\n\
3251 Target	Requested Completed  Requested Completed  Requested Completed\n\
3252   ID	\\\\\\\\ Attempted ////  \\\\\\\\ Attempted ////  \\\\\\\\ Attempted ////\n\
3253 ======	 ===== ===== =====    ===== ===== =====	   ===== ===== =====\n");
3254 	for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) {
3255 		struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];
3256 		if (!TargetFlags->TargetExists)
3257 			continue;
3258 		Length += sprintf(&Buffer[Length], "\
3259   %2d	 %5d %5d %5d    %5d %5d %5d	   %5d %5d %5d\n", TargetID, TargetStatistics[TargetID].CommandAbortsRequested, TargetStatistics[TargetID].CommandAbortsAttempted, TargetStatistics[TargetID].CommandAbortsCompleted, TargetStatistics[TargetID].BusDeviceResetsRequested, TargetStatistics[TargetID].BusDeviceResetsAttempted, TargetStatistics[TargetID].BusDeviceResetsCompleted, TargetStatistics[TargetID].HostAdapterResetsRequested, TargetStatistics[TargetID].HostAdapterResetsAttempted, TargetStatistics[TargetID].HostAdapterResetsCompleted);
3260 	}
3261 	Length += sprintf(&Buffer[Length], "\nExternal Host Adapter Resets: %d\n", HostAdapter->ExternalHostAdapterResets);
3262 	Length += sprintf(&Buffer[Length], "Host Adapter Internal Errors: %d\n", HostAdapter->HostAdapterInternalErrors);
3263 	if (Length >= BusLogic_MessageBufferSize)
3264 		BusLogic_Error("Message Buffer length %d exceeds size %d\n", HostAdapter, Length, BusLogic_MessageBufferSize);
3265 	if ((Length -= Offset) <= 0)
3266 		return 0;
3267 	if (Length >= BytesAvailable)
3268 		Length = BytesAvailable;
3269 	memcpy(ProcBuffer, HostAdapter->MessageBuffer + Offset, Length);
3270 	*StartPointer = ProcBuffer;
3271 	return Length;
3272 }
3273 
3274 
3275 /*
3276   BusLogic_Message prints Driver Messages.
3277 */
3278 
3279 static void BusLogic_Message(enum BusLogic_MessageLevel MessageLevel, char *Format, struct BusLogic_HostAdapter *HostAdapter, ...)
3280 {
3281 	static char Buffer[BusLogic_LineBufferSize];
3282 	static boolean BeginningOfLine = true;
3283 	va_list Arguments;
3284 	int Length = 0;
3285 	va_start(Arguments, HostAdapter);
3286 	Length = vsprintf(Buffer, Format, Arguments);
3287 	va_end(Arguments);
3288 	if (MessageLevel == BusLogic_AnnounceLevel) {
3289 		static int AnnouncementLines = 0;
3290 		strcpy(&HostAdapter->MessageBuffer[HostAdapter->MessageBufferLength], Buffer);
3291 		HostAdapter->MessageBufferLength += Length;
3292 		if (++AnnouncementLines <= 2)
3293 			printk("%sscsi: %s", BusLogic_MessageLevelMap[MessageLevel], Buffer);
3294 	} else if (MessageLevel == BusLogic_InfoLevel) {
3295 		strcpy(&HostAdapter->MessageBuffer[HostAdapter->MessageBufferLength], Buffer);
3296 		HostAdapter->MessageBufferLength += Length;
3297 		if (BeginningOfLine) {
3298 			if (Buffer[0] != '\n' || Length > 1)
3299 				printk("%sscsi%d: %s", BusLogic_MessageLevelMap[MessageLevel], HostAdapter->HostNumber, Buffer);
3300 		} else
3301 			printk("%s", Buffer);
3302 	} else {
3303 		if (BeginningOfLine) {
3304 			if (HostAdapter != NULL && HostAdapter->HostAdapterInitialized)
3305 				printk("%sscsi%d: %s", BusLogic_MessageLevelMap[MessageLevel], HostAdapter->HostNumber, Buffer);
3306 			else
3307 				printk("%s%s", BusLogic_MessageLevelMap[MessageLevel], Buffer);
3308 		} else
3309 			printk("%s", Buffer);
3310 	}
3311 	BeginningOfLine = (Buffer[Length - 1] == '\n');
3312 }
3313 
3314 
3315 /*
3316   BusLogic_ParseKeyword parses an individual option keyword.  It returns true
3317   and updates the pointer if the keyword is recognized and false otherwise.
3318 */
3319 
3320 static boolean __init BusLogic_ParseKeyword(char **StringPointer, char *Keyword)
3321 {
3322 	char *Pointer = *StringPointer;
3323 	while (*Keyword != '\0') {
3324 		char StringChar = *Pointer++;
3325 		char KeywordChar = *Keyword++;
3326 		if (StringChar >= 'A' && StringChar <= 'Z')
3327 			StringChar += 'a' - 'Z';
3328 		if (KeywordChar >= 'A' && KeywordChar <= 'Z')
3329 			KeywordChar += 'a' - 'Z';
3330 		if (StringChar != KeywordChar)
3331 			return false;
3332 	}
3333 	*StringPointer = Pointer;
3334 	return true;
3335 }
3336 
3337 
3338 /*
3339   BusLogic_ParseDriverOptions handles processing of BusLogic Driver Options
3340   specifications.
3341 
3342   BusLogic Driver Options may be specified either via the Linux Kernel Command
3343   Line or via the Loadable Kernel Module Installation Facility.  Driver Options
3344   for multiple host adapters may be specified either by separating the option
3345   strings by a semicolon, or by specifying multiple "BusLogic=" strings on the
3346   command line.  Individual option specifications for a single host adapter are
3347   separated by commas.  The Probing and Debugging Options apply to all host
3348   adapters whereas the remaining options apply individually only to the
3349   selected host adapter.
3350 
3351   The BusLogic Driver Probing Options are described in
3352   <file:Documentation/scsi/BusLogic.txt>.
3353 */
3354 
3355 static int __init BusLogic_ParseDriverOptions(char *OptionsString)
3356 {
3357 	while (true) {
3358 		struct BusLogic_DriverOptions *DriverOptions = &BusLogic_DriverOptions[BusLogic_DriverOptionsCount++];
3359 		int TargetID;
3360 		memset(DriverOptions, 0, sizeof(struct BusLogic_DriverOptions));
3361 		while (*OptionsString != '\0' && *OptionsString != ';') {
3362 			/* Probing Options. */
3363 			if (BusLogic_ParseKeyword(&OptionsString, "IO:")) {
3364 				unsigned long IO_Address = simple_strtoul(OptionsString, &OptionsString, 0);
3365 				BusLogic_ProbeOptions.LimitedProbeISA = true;
3366 				switch (IO_Address) {
3367 				case 0x330:
3368 					BusLogic_ProbeOptions.Probe330 = true;
3369 					break;
3370 				case 0x334:
3371 					BusLogic_ProbeOptions.Probe334 = true;
3372 					break;
3373 				case 0x230:
3374 					BusLogic_ProbeOptions.Probe230 = true;
3375 					break;
3376 				case 0x234:
3377 					BusLogic_ProbeOptions.Probe234 = true;
3378 					break;
3379 				case 0x130:
3380 					BusLogic_ProbeOptions.Probe130 = true;
3381 					break;
3382 				case 0x134:
3383 					BusLogic_ProbeOptions.Probe134 = true;
3384 					break;
3385 				default:
3386 					BusLogic_Error("BusLogic: Invalid Driver Options " "(invalid I/O Address 0x%X)\n", NULL, IO_Address);
3387 					return 0;
3388 				}
3389 			} else if (BusLogic_ParseKeyword(&OptionsString, "NoProbeISA"))
3390 				BusLogic_ProbeOptions.NoProbeISA = true;
3391 			else if (BusLogic_ParseKeyword(&OptionsString, "NoProbePCI"))
3392 				BusLogic_ProbeOptions.NoProbePCI = true;
3393 			else if (BusLogic_ParseKeyword(&OptionsString, "NoProbe"))
3394 				BusLogic_ProbeOptions.NoProbe = true;
3395 			else if (BusLogic_ParseKeyword(&OptionsString, "NoSortPCI"))
3396 				BusLogic_ProbeOptions.NoSortPCI = true;
3397 			else if (BusLogic_ParseKeyword(&OptionsString, "MultiMasterFirst"))
3398 				BusLogic_ProbeOptions.MultiMasterFirst = true;
3399 			else if (BusLogic_ParseKeyword(&OptionsString, "FlashPointFirst"))
3400 				BusLogic_ProbeOptions.FlashPointFirst = true;
3401 			/* Tagged Queuing Options. */
3402 			else if (BusLogic_ParseKeyword(&OptionsString, "QueueDepth:[") || BusLogic_ParseKeyword(&OptionsString, "QD:[")) {
3403 				for (TargetID = 0; TargetID < BusLogic_MaxTargetDevices; TargetID++) {
3404 					unsigned short QueueDepth = simple_strtoul(OptionsString, &OptionsString, 0);
3405 					if (QueueDepth > BusLogic_MaxTaggedQueueDepth) {
3406 						BusLogic_Error("BusLogic: Invalid Driver Options " "(invalid Queue Depth %d)\n", NULL, QueueDepth);
3407 						return 0;
3408 					}
3409 					DriverOptions->QueueDepth[TargetID] = QueueDepth;
3410 					if (*OptionsString == ',')
3411 						OptionsString++;
3412 					else if (*OptionsString == ']')
3413 						break;
3414 					else {
3415 						BusLogic_Error("BusLogic: Invalid Driver Options " "(',' or ']' expected at '%s')\n", NULL, OptionsString);
3416 						return 0;
3417 					}
3418 				}
3419 				if (*OptionsString != ']') {
3420 					BusLogic_Error("BusLogic: Invalid Driver Options " "(']' expected at '%s')\n", NULL, OptionsString);
3421 					return 0;
3422 				} else
3423 					OptionsString++;
3424 			} else if (BusLogic_ParseKeyword(&OptionsString, "QueueDepth:") || BusLogic_ParseKeyword(&OptionsString, "QD:")) {
3425 				unsigned short QueueDepth = simple_strtoul(OptionsString, &OptionsString, 0);
3426 				if (QueueDepth == 0 || QueueDepth > BusLogic_MaxTaggedQueueDepth) {
3427 					BusLogic_Error("BusLogic: Invalid Driver Options " "(invalid Queue Depth %d)\n", NULL, QueueDepth);
3428 					return 0;
3429 				}
3430 				DriverOptions->CommonQueueDepth = QueueDepth;
3431 				for (TargetID = 0; TargetID < BusLogic_MaxTargetDevices; TargetID++)
3432 					DriverOptions->QueueDepth[TargetID] = QueueDepth;
3433 			} else if (BusLogic_ParseKeyword(&OptionsString, "TaggedQueuing:") || BusLogic_ParseKeyword(&OptionsString, "TQ:")) {
3434 				if (BusLogic_ParseKeyword(&OptionsString, "Default")) {
3435 					DriverOptions->TaggedQueuingPermitted = 0x0000;
3436 					DriverOptions->TaggedQueuingPermittedMask = 0x0000;
3437 				} else if (BusLogic_ParseKeyword(&OptionsString, "Enable")) {
3438 					DriverOptions->TaggedQueuingPermitted = 0xFFFF;
3439 					DriverOptions->TaggedQueuingPermittedMask = 0xFFFF;
3440 				} else if (BusLogic_ParseKeyword(&OptionsString, "Disable")) {
3441 					DriverOptions->TaggedQueuingPermitted = 0x0000;
3442 					DriverOptions->TaggedQueuingPermittedMask = 0xFFFF;
3443 				} else {
3444 					unsigned short TargetBit;
3445 					for (TargetID = 0, TargetBit = 1; TargetID < BusLogic_MaxTargetDevices; TargetID++, TargetBit <<= 1)
3446 						switch (*OptionsString++) {
3447 						case 'Y':
3448 							DriverOptions->TaggedQueuingPermitted |= TargetBit;
3449 							DriverOptions->TaggedQueuingPermittedMask |= TargetBit;
3450 							break;
3451 						case 'N':
3452 							DriverOptions->TaggedQueuingPermitted &= ~TargetBit;
3453 							DriverOptions->TaggedQueuingPermittedMask |= TargetBit;
3454 							break;
3455 						case 'X':
3456 							break;
3457 						default:
3458 							OptionsString--;
3459 							TargetID = BusLogic_MaxTargetDevices;
3460 							break;
3461 						}
3462 				}
3463 			}
3464 			/* Miscellaneous Options. */
3465 			else if (BusLogic_ParseKeyword(&OptionsString, "BusSettleTime:") || BusLogic_ParseKeyword(&OptionsString, "BST:")) {
3466 				unsigned short BusSettleTime = simple_strtoul(OptionsString, &OptionsString, 0);
3467 				if (BusSettleTime > 5 * 60) {
3468 					BusLogic_Error("BusLogic: Invalid Driver Options " "(invalid Bus Settle Time %d)\n", NULL, BusSettleTime);
3469 					return 0;
3470 				}
3471 				DriverOptions->BusSettleTime = BusSettleTime;
3472 			} else if (BusLogic_ParseKeyword(&OptionsString, "InhibitTargetInquiry"))
3473 				DriverOptions->LocalOptions.InhibitTargetInquiry = true;
3474 			/* Debugging Options. */
3475 			else if (BusLogic_ParseKeyword(&OptionsString, "TraceProbe"))
3476 				BusLogic_GlobalOptions.TraceProbe = true;
3477 			else if (BusLogic_ParseKeyword(&OptionsString, "TraceHardwareReset"))
3478 				BusLogic_GlobalOptions.TraceHardwareReset = true;
3479 			else if (BusLogic_ParseKeyword(&OptionsString, "TraceConfiguration"))
3480 				BusLogic_GlobalOptions.TraceConfiguration = true;
3481 			else if (BusLogic_ParseKeyword(&OptionsString, "TraceErrors"))
3482 				BusLogic_GlobalOptions.TraceErrors = true;
3483 			else if (BusLogic_ParseKeyword(&OptionsString, "Debug")) {
3484 				BusLogic_GlobalOptions.TraceProbe = true;
3485 				BusLogic_GlobalOptions.TraceHardwareReset = true;
3486 				BusLogic_GlobalOptions.TraceConfiguration = true;
3487 				BusLogic_GlobalOptions.TraceErrors = true;
3488 			}
3489 			if (*OptionsString == ',')
3490 				OptionsString++;
3491 			else if (*OptionsString != ';' && *OptionsString != '\0') {
3492 				BusLogic_Error("BusLogic: Unexpected Driver Option '%s' " "ignored\n", NULL, OptionsString);
3493 				*OptionsString = '\0';
3494 			}
3495 		}
3496 		if (!(BusLogic_DriverOptionsCount == 0 || BusLogic_ProbeInfoCount == 0 || BusLogic_DriverOptionsCount == BusLogic_ProbeInfoCount)) {
3497 			BusLogic_Error("BusLogic: Invalid Driver Options " "(all or no I/O Addresses must be specified)\n", NULL);
3498 			return 0;
3499 		}
3500 		/*
3501 		   Tagged Queuing is disabled when the Queue Depth is 1 since queuing
3502 		   multiple commands is not possible.
3503 		 */
3504 		for (TargetID = 0; TargetID < BusLogic_MaxTargetDevices; TargetID++)
3505 			if (DriverOptions->QueueDepth[TargetID] == 1) {
3506 				unsigned short TargetBit = 1 << TargetID;
3507 				DriverOptions->TaggedQueuingPermitted &= ~TargetBit;
3508 				DriverOptions->TaggedQueuingPermittedMask |= TargetBit;
3509 			}
3510 		if (*OptionsString == ';')
3511 			OptionsString++;
3512 		if (*OptionsString == '\0')
3513 			return 0;
3514 	}
3515 	return 1;
3516 }
3517 
3518 /*
3519   Get it all started
3520 */
3521 
3522 static struct scsi_host_template Bus_Logic_template = {
3523 	.module = THIS_MODULE,
3524 	.proc_name = "BusLogic",
3525 	.proc_info = BusLogic_ProcDirectoryInfo,
3526 	.name = "BusLogic",
3527 	.info = BusLogic_DriverInfo,
3528 	.queuecommand = BusLogic_QueueCommand,
3529 	.slave_configure = BusLogic_SlaveConfigure,
3530 	.bios_param = BusLogic_BIOSDiskParameters,
3531 	.eh_host_reset_handler = BusLogic_host_reset,
3532 #if 0
3533 	.eh_abort_handler = BusLogic_AbortCommand,
3534 #endif
3535 	.unchecked_isa_dma = 1,
3536 	.max_sectors = 128,
3537 	.use_clustering = ENABLE_CLUSTERING,
3538 };
3539 
3540 /*
3541   BusLogic_Setup handles processing of Kernel Command Line Arguments.
3542 */
3543 
3544 static int __init BusLogic_Setup(char *str)
3545 {
3546 	int ints[3];
3547 
3548 	(void) get_options(str, ARRAY_SIZE(ints), ints);
3549 
3550 	if (ints[0] != 0) {
3551 		BusLogic_Error("BusLogic: Obsolete Command Line Entry " "Format Ignored\n", NULL);
3552 		return 0;
3553 	}
3554 	if (str == NULL || *str == '\0')
3555 		return 0;
3556 	return BusLogic_ParseDriverOptions(str);
3557 }
3558 
3559 /*
3560  * Exit function.  Deletes all hosts associated with this driver.
3561  */
3562 
3563 static void __exit BusLogic_exit(void)
3564 {
3565 	struct BusLogic_HostAdapter *ha, *next;
3566 
3567 	list_for_each_entry_safe(ha, next, &BusLogic_host_list, host_list)
3568 		BusLogic_ReleaseHostAdapter(ha);
3569 }
3570 
3571 __setup("BusLogic=", BusLogic_Setup);
3572 
3573 module_init(BusLogic_init);
3574 module_exit(BusLogic_exit);
3575