Enscript Output

extractedLnx/linux/drivers/scsi/BusLogic.c_BusLogic_ReadHostAdapterConfiguration.c

static boolean BusLogic_ReadHostAdapterConfiguration(BusLogic_HostAdapter_T
						     *HostAdapter)
{
  BusLogic_BoardID_T BoardID;
  BusLogic_Configuration_T Configuration;
  BusLogic_SetupInformation_T SetupInformation;
  BusLogic_ExtendedSetupInformation_T ExtendedSetupInformation;
  BusLogic_ControllerModelNumber_T ControllerModelNumber;
  BusLogic_FirmwareVersion3rdDigit_T FirmwareVersion3rdDigit;
  BusLogic_FirmwareVersionLetter_T FirmwareVersionLetter;
  BusLogic_GenericIOPortInformation_T GenericIOPortInformation;
  BusLogic_FetchHostAdapterLocalRAMRequest_T FetchHostAdapterLocalRAMRequest;
  BusLogic_AutoSCSIByte15_T AutoSCSIByte15;
  BusLogic_RequestedReplyLength_T RequestedReplyLength;
  unsigned char GeometryRegister, *TargetPointer, Character;
  unsigned short AllTargetsMask, DisconnectPermitted;
  unsigned short TaggedQueuingPermitted, TaggedQueuingPermittedDefault;
  boolean CommonErrorRecovery;
  int TargetID, i;
  /*
    Issue the Inquire Board ID command.
  */
  if (BusLogic_Command(HostAdapter, BusLogic_InquireBoardID, NULL, 0,
		       &BoardID, sizeof(BoardID)) != sizeof(BoardID))
    return BusLogic_Failure(HostAdapter, "INQUIRE BOARD ID");
  /*
    Issue the Inquire Configuration command.
  */
  if (BusLogic_Command(HostAdapter, BusLogic_InquireConfiguration, NULL, 0,
		       &Configuration, sizeof(Configuration))
      != sizeof(Configuration))
    return BusLogic_Failure(HostAdapter, "INQUIRE CONFIGURATION");
  /*
    Issue the Inquire Setup Information command.
  */
  RequestedReplyLength = sizeof(SetupInformation);
  if (BusLogic_Command(HostAdapter, BusLogic_InquireSetupInformation,
		       &RequestedReplyLength, sizeof(RequestedReplyLength),
		       &SetupInformation, sizeof(SetupInformation))
      != sizeof(SetupInformation))
    return BusLogic_Failure(HostAdapter, "INQUIRE SETUP INFORMATION");
  /*
    Issue the Inquire Extended Setup Information command.
  */
  RequestedReplyLength = sizeof(ExtendedSetupInformation);
  if (BusLogic_Command(HostAdapter, BusLogic_InquireExtendedSetupInformation,
		       &RequestedReplyLength, sizeof(RequestedReplyLength),
		       &ExtendedSetupInformation,
		       sizeof(ExtendedSetupInformation))
      != sizeof(ExtendedSetupInformation))
    return BusLogic_Failure(HostAdapter, "INQUIRE EXTENDED SETUP INFORMATION");
  /*
    Issue the Inquire Controller Model Number command.
  */
  if (ExtendedSetupInformation.BusType == 'A' &&
      BoardID.FirmwareVersion1stDigit == '2')
    /* BusLogic BT-542B ISA 2.xx */
    strcpy(ControllerModelNumber, "542B");
  else if (ExtendedSetupInformation.BusType == 'E' &&
	   BoardID.FirmwareVersion1stDigit == '0')
    /* AMI FastDisk EISA Series 441 0.x */
    strcpy(ControllerModelNumber, "747A");
  else
    {
      RequestedReplyLength = sizeof(ControllerModelNumber);
      if (BusLogic_Command(HostAdapter, BusLogic_InquireControllerModelNumber,
			   &RequestedReplyLength, sizeof(RequestedReplyLength),
			   &ControllerModelNumber,
			   sizeof(ControllerModelNumber))
	  != sizeof(ControllerModelNumber))
	return BusLogic_Failure(HostAdapter, "INQUIRE CONTROLLER MODEL NUMBER");
    }
  /*
    Issue the Inquire Firmware Version 3rd Digit command.
  */
  FirmwareVersion3rdDigit = '\0';
  if (BoardID.FirmwareVersion1stDigit > '0')
    if (BusLogic_Command(HostAdapter, BusLogic_InquireFirmwareVersion3rdDigit,
			 NULL, 0, &FirmwareVersion3rdDigit,
			 sizeof(FirmwareVersion3rdDigit))
	!= sizeof(FirmwareVersion3rdDigit))
      return BusLogic_Failure(HostAdapter, "INQUIRE FIRMWARE 3RD DIGIT");
  /*
    BusLogic Host Adapters can be identified by their model number and
    the major version number of their firmware as follows:

    5.xx	BusLogic "W" Series Host Adapters:
		  BT-948/958/958D
    4.xx	BusLogic "C" Series Host Adapters:
		  BT-946C/956C/956CD/747C/757C/757CD/445C/545C/540CF
    3.xx	BusLogic "S" Series Host Adapters:
		  BT-747S/747D/757S/757D/445S/545S/542D
		  BT-542B/742A (revision H)
    2.xx	BusLogic "A" Series Host Adapters:
		  BT-542B/742A (revision G and below)
    0.xx	AMI FastDisk VLB/EISA BusLogic Clone Host Adapter
  */
  /*
    Save the Model Name and Controller Name in the Host Adapter structure.
  */
  TargetPointer = HostAdapter->ModelName;
  *TargetPointer++ = 'B';
  *TargetPointer++ = 'T';
  *TargetPointer++ = '-';
  for (i = 0; i < sizeof(ControllerModelNumber); i++)
    {
      Character = ControllerModelNumber[i];
      if (Character == ' ' || Character == '\0') break;
      *TargetPointer++ = Character;
    }
  *TargetPointer++ = '\0';
  strcpy(HostAdapter->ControllerName, "BusLogic ");
  strcat(HostAdapter->ControllerName, HostAdapter->ModelName);
  strcpy(HostAdapter->InterruptLabel, HostAdapter->ControllerName);
  /*
    Save the Firmware Version in the Host Adapter structure.
  */
  TargetPointer = HostAdapter->FirmwareVersion;
  *TargetPointer++ = BoardID.FirmwareVersion1stDigit;
  *TargetPointer++ = '.';
  *TargetPointer++ = BoardID.FirmwareVersion2ndDigit;
  if (FirmwareVersion3rdDigit != ' ' && FirmwareVersion3rdDigit != '\0')
    *TargetPointer++ = FirmwareVersion3rdDigit;
  *TargetPointer = '\0';
  /*
    Issue the Inquire Firmware Version Letter command.
  */
  if (strcmp(HostAdapter->FirmwareVersion, "3.3") >= 0)
    {
      if (BusLogic_Command(HostAdapter, BusLogic_InquireFirmwareVersionLetter,
			   NULL, 0, &FirmwareVersionLetter,
			   sizeof(FirmwareVersionLetter))
	  != sizeof(FirmwareVersionLetter))
	return BusLogic_Failure(HostAdapter, "INQUIRE FIRMWARE VERSION LETTER");
      if (FirmwareVersionLetter != ' ' && FirmwareVersionLetter != '\0')
	*TargetPointer++ = FirmwareVersionLetter;
      *TargetPointer = '\0';
    }
  /*
    Issue the Inquire Generic I/O Port Information command to read the
    IRQ Channel from all PCI Host Adapters, and the Termination Information
    from "W" Series Host Adapters.
  */
  if (HostAdapter->ModelName[3] == '9' &&
      strcmp(HostAdapter->FirmwareVersion, "4.25") >= 0)
    {
      if (BusLogic_Command(HostAdapter,
			   BusLogic_InquireGenericIOPortInformation,
			   NULL, 0, &GenericIOPortInformation,
			   sizeof(GenericIOPortInformation))
	  != sizeof(GenericIOPortInformation))
	return BusLogic_Failure(HostAdapter,
				"INQUIRE GENERIC I/O PORT INFORMATION");
      /*
	Save the IRQ Channel in the Host Adapter structure.
      */
      HostAdapter->IRQ_Channel = GenericIOPortInformation.PCIAssignedIRQChannel;
      /*
	Save the Termination Information in the Host Adapter structure.
      */
      if (HostAdapter->FirmwareVersion[0] == '5' &&
	  GenericIOPortInformation.Valid)
	{
	  HostAdapter->TerminationInfoValid = true;
	  HostAdapter->LowByteTerminated =
	    GenericIOPortInformation.LowByteTerminated;
	  HostAdapter->HighByteTerminated =
	    GenericIOPortInformation.HighByteTerminated;
	}
    }
  /*
    Issue the Fetch Host Adapter Local RAM command to read the Termination
    Information from the AutoSCSI area of "C" Series Host Adapters.
  */
  if (HostAdapter->FirmwareVersion[0] == '4')
    {
      FetchHostAdapterLocalRAMRequest.ByteOffset =
	BusLogic_AutoSCSI_BaseOffset + 15;
      FetchHostAdapterLocalRAMRequest.ByteCount = sizeof(AutoSCSIByte15);
      if (BusLogic_Command(HostAdapter,
			   BusLogic_FetchHostAdapterLocalRAM,
			   &FetchHostAdapterLocalRAMRequest,
			   sizeof(FetchHostAdapterLocalRAMRequest),
			   &AutoSCSIByte15, sizeof(AutoSCSIByte15))
	  != sizeof(AutoSCSIByte15))
	return BusLogic_Failure(HostAdapter, "FETCH HOST ADAPTER LOCAL RAM");
      /*
	Save the Termination Information in the Host Adapter structure.
      */
      HostAdapter->TerminationInfoValid = true;
      HostAdapter->LowByteTerminated = AutoSCSIByte15.LowByteTerminated;
      HostAdapter->HighByteTerminated = AutoSCSIByte15.HighByteTerminated;
    }
  /*
    Determine the IRQ Channel and save it in the Host Adapter structure.
  */
  if (HostAdapter->IRQ_Channel == 0)
    {
      if (Configuration.IRQ_Channel9)
	HostAdapter->IRQ_Channel = 9;
      else if (Configuration.IRQ_Channel10)
	HostAdapter->IRQ_Channel = 10;
      else if (Configuration.IRQ_Channel11)
	HostAdapter->IRQ_Channel = 11;
      else if (Configuration.IRQ_Channel12)
	HostAdapter->IRQ_Channel = 12;
      else if (Configuration.IRQ_Channel14)
	HostAdapter->IRQ_Channel = 14;
      else if (Configuration.IRQ_Channel15)
	HostAdapter->IRQ_Channel = 15;
    }
  /*
    Save the Host Adapter SCSI ID in the Host Adapter structure.
  */
  HostAdapter->SCSI_ID = Configuration.HostAdapterID;
  /*
    Save the Synchronous Initiation flag and SCSI Parity Checking flag
    in the Host Adapter structure.
  */
  HostAdapter->SynchronousInitiation =
    SetupInformation.SynchronousInitiationEnabled;
  HostAdapter->ParityChecking = SetupInformation.ParityCheckEnabled;
  /*
    Determine the Bus Type and save it in the Host Adapter structure,
    and determine and save the DMA Channel for ISA Host Adapters.
  */
  switch (HostAdapter->ModelName[3])
    {
    case '4':
      HostAdapter->BusType = BusLogic_VESA_Bus;
      break;
    case '5':
      HostAdapter->BusType = BusLogic_ISA_Bus;
      if (Configuration.DMA_Channel5)
	HostAdapter->DMA_Channel = 5;
      else if (Configuration.DMA_Channel6)
	HostAdapter->DMA_Channel = 6;
      else if (Configuration.DMA_Channel7)
	HostAdapter->DMA_Channel = 7;
      break;
    case '6':
      HostAdapter->BusType = BusLogic_MCA_Bus;
      break;
    case '7':
      HostAdapter->BusType = BusLogic_EISA_Bus;
      break;
    case '9':
      HostAdapter->BusType = BusLogic_PCI_Bus;
      break;
    }
  /*
    Determine whether Extended Translation is enabled and save it in
    the Host Adapter structure.
  */
  GeometryRegister = BusLogic_ReadGeometryRegister(HostAdapter);
  if (GeometryRegister & BusLogic_ExtendedTranslationEnabled)
    HostAdapter->ExtendedTranslation = true;
  /*
    Save the Disconnect/Reconnect Permitted flag bits in the Host Adapter
    structure.  The Disconnect Permitted information is only valid on "W" and
    "C" Series controllers, but Disconnect/Reconnect is always permitted on "S"
    and "A" Series controllers.
  */
  if (HostAdapter->FirmwareVersion[0] >= '4')
    HostAdapter->DisconnectPermitted =
      (SetupInformation.DisconnectPermittedID8to15 << 8)
      | SetupInformation.DisconnectPermittedID0to7;
  else HostAdapter->DisconnectPermitted = 0xFF;
  /*
    Save the Scatter Gather Limits, Level Sensitive Interrupts flag, Wide
    SCSI flag, Differential SCSI flag, Automatic Configuration flag, and
    Ultra SCSI flag in the Host Adapter structure.
  */
  HostAdapter->HostAdapterScatterGatherLimit =
    ExtendedSetupInformation.ScatterGatherLimit;
  HostAdapter->DriverScatterGatherLimit =
    HostAdapter->HostAdapterScatterGatherLimit;
  if (HostAdapter->HostAdapterScatterGatherLimit > BusLogic_ScatterGatherLimit)
    HostAdapter->DriverScatterGatherLimit = BusLogic_ScatterGatherLimit;
  if (ExtendedSetupInformation.Misc.LevelSensitiveInterrupts)
    HostAdapter->LevelSensitiveInterrupts = true;
  HostAdapter->HostWideSCSI = ExtendedSetupInformation.HostWideSCSI;
  HostAdapter->HostDifferentialSCSI =
    ExtendedSetupInformation.HostDifferentialSCSI;
  HostAdapter->HostAutomaticConfiguration =
    ExtendedSetupInformation.HostAutomaticConfiguration;
  HostAdapter->HostUltraSCSI = ExtendedSetupInformation.HostUltraSCSI;
  /*
    Determine whether 64 LUN Format CCBs are supported and save the information
    in the Host Adapter structure.
  */
  if (HostAdapter->FirmwareVersion[0] == '5' ||
      (HostAdapter->FirmwareVersion[0] == '4' && HostAdapter->HostWideSCSI))
    HostAdapter->Host64LUNSupport = true;
  /*
    Determine the Host Adapter BIOS Address if the BIOS is enabled and
    save it in the Host Adapter structure.  The BIOS is disabled if the
    BIOS_Address is 0.
  */
  HostAdapter->BIOS_Address = ExtendedSetupInformation.BIOS_Address << 12;
  /*
    ISA Host Adapters require Bounce Buffers if there is more than 16MB memory.
  */
  if (HostAdapter->BusType == BusLogic_ISA_Bus && high_memory > MAX_DMA_ADDRESS)
    HostAdapter->BounceBuffersRequired = true;
  /*
    BusLogic BT-445S Host Adapters prior to controller revision E have a
    hardware bug whereby when the BIOS is enabled, transfers to/from the same
    address range the BIOS occupies modulo 16MB are handled incorrectly.  Only
    properly functioning BT-445S controllers have firmware version 3.37, so we
    require that ISA Bounce Buffers be used for the buggy BT-445S models if
    there is more than 16MB memory.
  */
  if (HostAdapter->BIOS_Address > 0 &&
      strcmp(HostAdapter->ModelName, "BT-445S") == 0 &&
      strcmp(HostAdapter->FirmwareVersion, "3.37") < 0 &&
      high_memory > MAX_DMA_ADDRESS)
    HostAdapter->BounceBuffersRequired = true;
  /*
    Determine the maximum number of Target IDs and Logical Units supported by
    this driver for Wide and Narrow Host Adapters.
  */
  HostAdapter->MaxTargetDevices = (HostAdapter->HostWideSCSI ? 16 : 8);
  HostAdapter->MaxLogicalUnits = (HostAdapter->Host64LUNSupport ? 64 : 8);
  /*
    Select appropriate values for the Mailbox Count, Initial CCBs, and
    Incremental CCBs variables based on whether or not Strict Round Robin Mode
    is supported.  If Strict Round Robin Mode is supported, then there is no
    performance degradation in using the maximum possible number of Outgoing
    and Incoming Mailboxes and allowing the Tagged and Untagged Queue Depths to
    determine the actual utilization.  If Strict Round Robin Mode is not
    supported, then the Host Adapter must scan all the Outgoing Mailboxes
    whenever an Outgoing Mailbox entry is made, which can cause a substantial
    performance penalty.  The Host Adapters actually have room to store the
    following number of CCBs internally; that is, they can internally queue and
    manage this many active commands on the SCSI bus simultaneously.
    Performance measurements demonstrate that the Mailbox Count should be set
    to the maximum possible, rather than the internal CCB capacity, as it is
    more efficient to have the queued commands waiting in Outgoing Mailboxes if
    necessary than to block the process in the higher levels of the SCSI
    Subsystem.

	192	  BT-948/958/958D
	100	  BT-946C/956C/956CD/747C/757C/757CD/445C
	 50	  BT-545C/540CF
	 30	  BT-747S/747D/757S/757D/445S/545S/542D/542B/742A
  */
  if (strcmp(HostAdapter->FirmwareVersion, "3.31") >= 0)
    {
      HostAdapter->StrictRoundRobinModeSupport = true;
      HostAdapter->MailboxCount = 255;
      HostAdapter->InitialCCBs = 64;
      HostAdapter->IncrementalCCBs = 32;
    }
  else
    {
      HostAdapter->StrictRoundRobinModeSupport = false;
      HostAdapter->MailboxCount = 32;
      HostAdapter->InitialCCBs = 32;
      HostAdapter->IncrementalCCBs = 4;
    }
  if (HostAdapter->FirmwareVersion[0] == '5')
    HostAdapter->TotalQueueDepth = 192;
  else if (HostAdapter->FirmwareVersion[0] == '4')
    HostAdapter->TotalQueueDepth =
      (HostAdapter->BusType != BusLogic_ISA_Bus ? 100 : 50);
  else HostAdapter->TotalQueueDepth = 30;
  /*
    Select an appropriate value for the Tagged Queue Depth either from a
    Command Line Entry, or based on whether this Host Adapter requires that
    ISA Bounce Buffers be used.  The Tagged Queue Depth is left at 0 for
    automatic determination in BusLogic_SelectQueueDepths.  Initialize the
    Untagged Queue Depth.
  */
  if (HostAdapter->CommandLineEntry != NULL &&
      HostAdapter->CommandLineEntry->TaggedQueueDepth > 0)
    HostAdapter->TaggedQueueDepth =
      HostAdapter->CommandLineEntry->TaggedQueueDepth;
  else if (HostAdapter->BounceBuffersRequired)
    HostAdapter->TaggedQueueDepth = BusLogic_TaggedQueueDepth_BB;
  else HostAdapter->TaggedQueueDepth = 0;
  HostAdapter->UntaggedQueueDepth = BusLogic_UntaggedQueueDepth;
  if (HostAdapter->UntaggedQueueDepth > HostAdapter->TaggedQueueDepth &&
      HostAdapter->TaggedQueueDepth > 0)
    HostAdapter->UntaggedQueueDepth = HostAdapter->TaggedQueueDepth;
  /*
    Select an appropriate value for Bus Settle Time either from a Command
    Line Entry, or from BusLogic_DefaultBusSettleTime.
  */
  if (HostAdapter->CommandLineEntry != NULL &&
      HostAdapter->CommandLineEntry->BusSettleTime > 0)
    HostAdapter->BusSettleTime = HostAdapter->CommandLineEntry->BusSettleTime;
  else HostAdapter->BusSettleTime = BusLogic_DefaultBusSettleTime;
  /*
    Select an appropriate value for Local Options from a Command Line Entry.
  */
  if (HostAdapter->CommandLineEntry != NULL)
    HostAdapter->LocalOptions = HostAdapter->CommandLineEntry->LocalOptions;
  /*
    Select appropriate values for the Error Recovery Strategy array either from
    a Command Line Entry, or using BusLogic_ErrorRecovery_Default.
  */
  if (HostAdapter->CommandLineEntry != NULL)
    memcpy(HostAdapter->ErrorRecoveryStrategy,
	   HostAdapter->CommandLineEntry->ErrorRecoveryStrategy,
	   sizeof(HostAdapter->ErrorRecoveryStrategy));
  else memset(HostAdapter->ErrorRecoveryStrategy,
	      BusLogic_ErrorRecovery_Default,
	      sizeof(HostAdapter->ErrorRecoveryStrategy));
  /*
    Tagged Queuing support is available and operates properly on all "W" Series
    controllers, on "C" Series controllers with firmware version 4.22 and
    above, and on "S" Series controllers with firmware version 3.35 and above.
    Tagged Queuing is disabled by default when the Tagged Queue Depth is 1
    since queuing multiple commands is not possible.
  */
  TaggedQueuingPermittedDefault = 0;
  if (HostAdapter->TaggedQueueDepth != 1)
    switch (HostAdapter->FirmwareVersion[0])
      {
      case '5':
	TaggedQueuingPermittedDefault = 0xFFFF;
	break;
      case '4':
	if (strcmp(HostAdapter->FirmwareVersion, "4.22") >= 0)
	  TaggedQueuingPermittedDefault = 0xFFFF;
	break;
      case '3':
	if (strcmp(HostAdapter->FirmwareVersion, "3.35") >= 0)
	  TaggedQueuingPermittedDefault = 0xFFFF;
	break;
      }
  /*
    Tagged Queuing is only useful if Disconnect/Reconnect is permitted.
    Therefore, mask the Tagged Queuing Permitted Default bits with the
    Disconnect/Reconnect Permitted bits.
  */
  TaggedQueuingPermittedDefault &= HostAdapter->DisconnectPermitted;
  /*
    Combine the default Tagged Queuing Permitted bits with any Command
    Line Entry Tagged Queuing specification.
  */
  if (HostAdapter->CommandLineEntry != NULL)
    HostAdapter->TaggedQueuingPermitted =
      (HostAdapter->CommandLineEntry->TaggedQueuingPermitted &
       HostAdapter->CommandLineEntry->TaggedQueuingPermittedMask) |
      (TaggedQueuingPermittedDefault &
       ~HostAdapter->CommandLineEntry->TaggedQueuingPermittedMask);
  else HostAdapter->TaggedQueuingPermitted = TaggedQueuingPermittedDefault;
  /*
    Announce the Host Adapter Configuration.
  */
  printk("scsi%d: Configuring BusLogic Model %s %s%s%s%s SCSI Host Adapter\n",
	 HostAdapter->HostNumber, HostAdapter->ModelName,
	 BusLogic_BusNames[HostAdapter->BusType],
	 (HostAdapter->HostWideSCSI ? " Wide" : ""),
	 (HostAdapter->HostDifferentialSCSI ? " Differential" : ""),
	 (HostAdapter->HostUltraSCSI ? " Ultra" : ""));
  printk("scsi%d:   Firmware Version: %s, I/O Address: 0x%X, "
	 "IRQ Channel: %d/%s\n",
	 HostAdapter->HostNumber, HostAdapter->FirmwareVersion,
	 HostAdapter->IO_Address, HostAdapter->IRQ_Channel,
	 (HostAdapter->LevelSensitiveInterrupts ? "Level" : "Edge"));
  printk("scsi%d:   DMA Channel: ", HostAdapter->HostNumber);
  if (HostAdapter->DMA_Channel > 0)
    printk("%d, ", HostAdapter->DMA_Channel);
  else printk("None, ");
  if (HostAdapter->BIOS_Address > 0)
    printk("BIOS Address: 0x%X, ", HostAdapter->BIOS_Address);
  else printk("BIOS Address: None, ");
  printk("Host Adapter SCSI ID: %d\n", HostAdapter->SCSI_ID);
  printk("scsi%d:   Scatter/Gather Limit: %d of %d segments, "
	 "Parity Checking: %s\n", HostAdapter->HostNumber,
	 HostAdapter->DriverScatterGatherLimit,
	 HostAdapter->HostAdapterScatterGatherLimit,
	 (HostAdapter->ParityChecking ? "Enabled" : "Disabled"));
  printk("scsi%d:   Synchronous Initiation: %s, "
	 "Extended Disk Translation: %s\n", HostAdapter->HostNumber,
	 (HostAdapter->SynchronousInitiation ? "Enabled" : "Disabled"),
	 (HostAdapter->ExtendedTranslation ? "Enabled" : "Disabled"));
  AllTargetsMask = (1 << HostAdapter->MaxTargetDevices) - 1;
  DisconnectPermitted = HostAdapter->DisconnectPermitted & AllTargetsMask;
  printk("scsi%d:   Disconnect/Reconnect: ", HostAdapter->HostNumber);
  if (DisconnectPermitted == 0)
    printk("Disabled");
  else if (DisconnectPermitted == AllTargetsMask)
    printk("Enabled");
  else
    for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
      printk("%c", (DisconnectPermitted & (1 << TargetID)) ? 'Y' : 'N');
  printk(", Tagged Queuing: ");
  TaggedQueuingPermitted =
    HostAdapter->TaggedQueuingPermitted & AllTargetsMask;
  if (TaggedQueuingPermitted == 0)
    printk("Disabled");
  else if (TaggedQueuingPermitted == AllTargetsMask)
    printk("Enabled");
  else
    for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
      printk("%c", (TaggedQueuingPermitted & (1 << TargetID)) ? 'Y' : 'N');
  printk("\n");
  printk("scsi%d:   Total Queue Depth: %d, Mailboxes: %d, Initial CCBs: %d\n",
	 HostAdapter->HostNumber, HostAdapter->TotalQueueDepth,
	 HostAdapter->MailboxCount, HostAdapter->InitialCCBs);
  printk("scsi%d:   Tagged Queue Depth: ", HostAdapter->HostNumber);
  if (HostAdapter->TaggedQueueDepth > 0)
    printk("%d", HostAdapter->TaggedQueueDepth);
  else printk("Automatic");
  printk(", Untagged Queue Depth: %d\n", HostAdapter->UntaggedQueueDepth);
  if (HostAdapter->TerminationInfoValid)
    if (HostAdapter->HostWideSCSI)
      printk("scsi%d:   Host Adapter SCSI Bus Termination (Low/High): %s/%s\n",
	     HostAdapter->HostNumber,
	     (HostAdapter->LowByteTerminated ? "Enabled" : "Disabled"),
	     (HostAdapter->HighByteTerminated ? "Enabled" : "Disabled"));
    else printk("scsi%d:   Host Adapter SCSI Bus Termination: %s\n",
		HostAdapter->HostNumber,
		(HostAdapter->LowByteTerminated ? "Enabled" : "Disabled"));
  CommonErrorRecovery = true;
  for (TargetID = 1; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
    if (HostAdapter->ErrorRecoveryStrategy[TargetID] !=
	HostAdapter->ErrorRecoveryStrategy[0])
      {
	CommonErrorRecovery = false;
	break;
      }
  printk("scsi%d:   Error Recovery Strategy: ", HostAdapter->HostNumber);
  if (CommonErrorRecovery)
    printk("%s", BusLogic_ErrorRecoveryStrategyNames[
		   HostAdapter->ErrorRecoveryStrategy[0]]);
  else
    for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
      printk("%s", BusLogic_ErrorRecoveryStrategyLetters[
		     HostAdapter->ErrorRecoveryStrategy[TargetID]]);
  printk("\n");
  /*
    Indicate reading the Host Adapter Configuration completed successfully.
  */
  return true;
}

Generated by GNU enscript 1.6.4.