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