VMware BusLogic SCSI driver vendor drop Added: vendor/VMware/ Added: vendor/VMware/buslogic/ Added: vendor/VMware/buslogic/current/ Added: vendor/VMware/buslogic/current/BT958.bmf Added: vendor/VMware/buslogic/current/BT958.mof Added: vendor/VMware/buslogic/current/BT958dt.h Added: vendor/VMware/buslogic/current/BusLogic958.c Added: vendor/VMware/buslogic/current/BusLogic958.h Added: vendor/VMware/buslogic/current/BusLogic958.rc Added: vendor/VMware/buslogic/current/Log.c Added: vendor/VMware/buslogic/current/Log.h Added: vendor/VMware/buslogic/current/makefile Added: vendor/VMware/buslogic/current/makefile.inc Added: vendor/VMware/buslogic/current/resource.h Added: vendor/VMware/buslogic/current/sources Added: vendor/VMware/buslogic/current/wmi.c _____
Added: vendor/VMware/buslogic/current/BT958.bmf (Binary files differ) Property changes on: vendor/VMware/buslogic/current/BT958.bmf ___________________________________________________________________ Name: svn:mime-type + application/octet-stream _____
Added: vendor/VMware/buslogic/current/BT958.mof --- vendor/VMware/buslogic/current/BT958.mof 2005-08-18 21:25:04 UTC (rev 17431) +++ vendor/VMware/buslogic/current/BT958.mof 2005-08-18 21:36:35 UTC (rev 17432) @@ -0,0 +1,30 @@
+[ + Dynamic, Provider("WMIProv"), + WMI, + Description ("BT958 Extended Setup Information (Operation Code 8Dh)"), + guid ("{CBD60D59-CE49-4cf4-AB7A-DEC6F4988D1A}"), + HeaderName("BT958ExtendedSetupInfo"), + GuidName1("BT958Wmi_ExtendedSetupInfo_Guid"), + WmiExpense(0) +] +class BT958ExtendedSetupInfoGuid +{ + [read,key] String InstanceName; + [read] boolean Active; + + [read, WmiDataId(1), WmiVersion(1)] uint8 BusType; + [read, WmiDataId(2), WmiVersion(1)] uint8 BIOS_Address; + [read, WmiDataId(3), WmiVersion(1)] uint16 ScatterGatherLimit; + [read, WmiDataId(4), WmiVersion(1)] uint8 MailboxCount; + [read, WmiDataId(5), WmiVersion(1)] uint32 BaseMailboxAddress; + [read, WmiDataId(6), WmiVersion(1)] boolean FastOnEISA:1; + [read, WmiDataId(7), WmiVersion(1)] boolean LevelSensitiveInterrupt:1; + [read, WmiDataId(8), WmiVersion(1), max(3)] uint8 FirmwareRevision[]; + [read, WmiDataId(9), WmiVersion(1)] boolean HostWideSCSI:1; + [read, WmiDataId(10), WmiVersion(1)] boolean HostDifferentialSCSI:1; + [read, WmiDataId(11), WmiVersion(1)] boolean HostSupportsSCAM:1; + [read, WmiDataId(12), WmiVersion(1)] boolean HostUltraSCSI:1; + [read, WmiDataId(13), WmiVersion(1)] boolean HostSmartTermination:1; +}; + + Property changes on: vendor/VMware/buslogic/current/BT958.mof ___________________________________________________________________ Name: svn:eol-style + native _____
Added: vendor/VMware/buslogic/current/BT958dt.h --- vendor/VMware/buslogic/current/BT958dt.h 2005-08-18 21:25:04 UTC (rev 17431) +++ vendor/VMware/buslogic/current/BT958dt.h 2005-08-18 21:36:35 UTC (rev 17432) @@ -0,0 +1,105 @@
+/* + * vmscsi-- Miniport driver for the Buslogic BT 958 SCSI Controller + * under Windows 2000/XP/Server 2003 + * + * Based in parts on the buslogic driver for the same device + * available with the GNU Linux Operating System. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + +#ifndef _BT958dt_h_ +#define _BT958dt_h_ + +// BT958ExtendedSetupInfoGuid - BT958ExtendedSetupInfo +// BT958 Extended Setup Information (Operation Code 8Dh) +#define BT958Wmi_ExtendedSetupInfo_Guid \ + { 0xcbd60d59,0xce49,0x4cf4, { 0xab,0x7a,0xde,0xc6,0xf4,0x98,0x8d,0x1a } } + +DEFINE_GUID(BT958ExtendedSetupInfoGuid_GUID, \ + 0xcbd60d59,0xce49,0x4cf4,0xab,0x7a,0xde,0xc6,0xf4,0x98,0x8d,0x1a); + + +typedef struct _BT958ExtendedSetupInfo +{ + // + UCHAR BusType; + #define BT958ExtendedSetupInfo_BusType_SIZE sizeof(UCHAR) + #define BT958ExtendedSetupInfo_BusType_ID 1 + + // + UCHAR BIOS_Address; + #define BT958ExtendedSetupInfo_BIOS_Address_SIZE sizeof(UCHAR) + #define BT958ExtendedSetupInfo_BIOS_Address_ID 2 + + // + USHORT ScatterGatherLimit; + #define BT958ExtendedSetupInfo_ScatterGatherLimit_SIZE sizeof(USHORT) + #define BT958ExtendedSetupInfo_ScatterGatherLimit_ID 3 + + // + UCHAR MailboxCount; + #define BT958ExtendedSetupInfo_MailboxCount_SIZE sizeof(UCHAR) + #define BT958ExtendedSetupInfo_MailboxCount_ID 4 + + // + ULONG BaseMailboxAddress; + #define BT958ExtendedSetupInfo_BaseMailboxAddress_SIZE sizeof(ULONG) + #define BT958ExtendedSetupInfo_BaseMailboxAddress_ID 5 + + // + BOOLEAN FastOnEISA; + #define BT958ExtendedSetupInfo_FastOnEISA_SIZE sizeof(BOOLEAN) + #define BT958ExtendedSetupInfo_FastOnEISA_ID 6 + + // + BOOLEAN LevelSensitiveInterrupt; + #define BT958ExtendedSetupInfo_LevelSensitiveInterrupt_SIZE sizeof(BOOLEAN) + #define BT958ExtendedSetupInfo_LevelSensitiveInterrupt_ID 7 + + // + UCHAR FirmwareRevision[3]; + #define BT958ExtendedSetupInfo_FirmwareRevision_SIZE sizeof(UCHAR[3]) + #define BT958ExtendedSetupInfo_FirmwareRevision_ID 8 + + // + BOOLEAN HostWideSCSI; + #define BT958ExtendedSetupInfo_HostWideSCSI_SIZE sizeof(BOOLEAN) + #define BT958ExtendedSetupInfo_HostWideSCSI_ID 9 + + // + BOOLEAN HostDifferentialSCSI; + #define BT958ExtendedSetupInfo_HostDifferentialSCSI_SIZE sizeof(BOOLEAN) + #define BT958ExtendedSetupInfo_HostDifferentialSCSI_ID 10 + + // + BOOLEAN HostSupportsSCAM; + #define BT958ExtendedSetupInfo_HostSupportsSCAM_SIZE sizeof(BOOLEAN) + #define BT958ExtendedSetupInfo_HostSupportsSCAM_ID 11 + + // + BOOLEAN HostUltraSCSI; + #define BT958ExtendedSetupInfo_HostUltraSCSI_SIZE sizeof(BOOLEAN) + #define BT958ExtendedSetupInfo_HostUltraSCSI_ID 12 + + // + BOOLEAN HostSmartTermination; + #define BT958ExtendedSetupInfo_HostSmartTermination_SIZE sizeof(BOOLEAN) + #define BT958ExtendedSetupInfo_HostSmartTermination_ID 13 + +} BT958ExtendedSetupInfo, *PBT958ExtendedSetupInfo; + +#endif Property changes on: vendor/VMware/buslogic/current/BT958dt.h ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Added: vendor/VMware/buslogic/current/BusLogic958.c --- vendor/VMware/buslogic/current/BusLogic958.c 2005-08-18 21:25:04 UTC (rev 17431) +++ vendor/VMware/buslogic/current/BusLogic958.c 2005-08-18 21:36:35 UTC (rev 17432) @@ -0,0 +1,2743 @@
+/* + * vmscsi-- Miniport driver for the Buslogic BT 958 SCSI Controller + * under Windows 2000/XP/Server 2003 + * + * Based in parts on the buslogic driver for the same device + * available with the GNU Linux Operating System. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +//_____________________________________________________________________ _______________ +// +// File description :The driver for BusLogic-BT958 SCSI Host adapter card. +// This driver assumes that the host adapter(HA from now on) is a PCI device. +// This is an effort to build a driver for this card for the windows XP ennvironment +// since the native XP installation doesnt provide this driver. +// +// The technical refernece for this device is at : +// +// Author: Namita Lal, Sirish Raghuram Calsoft Pvt Ltd +// Date: 5th Feb 2003 +// Status: Driver version 1.2.0.0 +// Performance tuned +// Correctness tested for +// 1. Installation at OS install time +// 2. Installation in an installed OS +// 3. Installation by upgrading a previous version +// on all flavours of WinXP and Win Server 2003 +// For Win2k however, please refer PR 22812 +/* +Revision History: +v1.0.0.4 // Pre final release to VMware in Sep 2001, without WMI + | + | + v +v1.0.0.5 // Sep 2001 release to VMware, with WMI + | + | + v +v1.0.0.6 // Fix for bug with Nero Burning ROM in XP + | // where SCSI_AUTO_SENSE is turned off at times + | + | + |---------> v1.1.0.0 // Performance optimizations: + | | // A. WMI disabled, B. Queueing depth increased + | | // C. Control flow changed (bug) + | | + | v + | v1.1.0.1 // Fix for .NET restart freeze with 1.1.0.0 + | // Breaks on XP + | + v +v1.2.0.0 // A. WMI disabled, B. Queueing depth increased + // CURRENT VERSION +*/ +//_____________________________________________________________________ _______________ + +#include "BusLogic958.h" + +ULONG +DriverEntry(IN PVOID DriverObject, + IN PVOID Argument2 + ) +//_____________________________________________________________________ ____ +// Routine Description: +// Installable driver initialization entry point for system. +// Arguments: +// Driver Object +// Return Value: +// Status from ScsiPortInitialize() +//_____________________________________________________________________ ____ +{ + HW_INITIALIZATION_DATA hwInitializationData; + ULONG Status; + ULONG i; + ULONG HwContext; + static int cardNo = 0; + + UCHAR VendorId[4] = { '1', '0', '4', 'b' }; + UCHAR DeviceId[4] = { '1', '0', '4', '0' }; + + DebugPrint((0,"\n BusLogic - Inside the DriverEntry function \n")); + + // Zero out structure. + for (i = 0; i < sizeof(HW_INITIALIZATION_DATA); i++) + { + ((PUCHAR) & hwInitializationData)[i] = 0; + } + + // Set size of hwInitializationData. + hwInitializationData.HwInitializationDataSize = sizeof(HW_INITIALIZATION_DATA); + + // Set entry points. + hwInitializationData.HwInitialize = BT958HwInitialize; + hwInitializationData.HwResetBus = BT958HwResetBus; + hwInitializationData.HwStartIo = BT958HwStartIO; + hwInitializationData.HwInterrupt = BT958HwInterrupt; + hwInitializationData.HwAdapterControl = BT958HwAdapterControl; + hwInitializationData.HwFindAdapter = BT958HwFindAdapter; + + // Inidicate no buffer mapping but will need physical addresses + hwInitializationData.NeedPhysicalAddresses = TRUE; + + // Indicate Auto request sense is supported + hwInitializationData.AutoRequestSense = TRUE; + hwInitializationData.MultipleRequestPerLu = TRUE; + +#if TAG_QUEUING + hwInitializationData.TaggedQueuing = TRUE; +#else + hwInitializationData.TaggedQueuing = FALSE; +#endif + + hwInitializationData.AdapterInterfaceType = PCIBus; + + // Fill in the vendor id and the device id + hwInitializationData.VendorId = &VendorId; + hwInitializationData.VendorIdLength = 4; + hwInitializationData.DeviceId = &DeviceId; + hwInitializationData.DeviceIdLength = 4; + + + hwInitializationData.NumberOfAccessRanges = 2; + + + // Specify size of extensions. + hwInitializationData.DeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION); + + // logical unit extension + hwInitializationData.SrbExtensionSize = sizeof(BusLogic_CCB_T); + + HwContext = 0; + + DebugPrint((0,"\n BusLogic - Calling the ScsiPortInitialize Routine\n")); + + Status = ScsiPortInitialize(DriverObject, + Argument2, + &hwInitializationData, + &HwContext); + + DebugPrint((0,"\n BusLogic - Exiting the DriverEntry function \n")); + DebugPrint((0,"\n BusLogic - Status = %ul \n", Status)); + return( Status ); + +} // end DriverEntry() + + +ULONG +BT958HwFindAdapter(IN PVOID HwDeviceExtension, + IN PVOID Context, + IN PVOID BusInformation, + IN PCHAR ArgumentString, + IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, + OUT PBOOLEAN Again + ) +//_____________________________________________________________________ ____________________________ +// Routine Description: +// This function is called by the OS-specific port driver after the necessary storage +// has been allocated, to gather information about the adapter's configuration. +// +// Arguments: +// HwDeviceExtension - HBA miniport driver's adapter data storage +// Context - Register base address +// ConfigInfo - Configuration information structure describing HBA +// This structure is defined in PORT.H. +// +// Return Value: +// HwScsiFindAdapter must return one of the following status values: +// SP_RETURN_FOUND: Indicates a supported HBA was found and that the HBA-relevant +// configuration information was successfully determined and set in +// the PORT_CONFIGURATION_INFORMATION structure. +// SP_RETURN_ERROR: Indicates an HBA was found but there was error obtaining the +// configuration information. If possible, such an error should be +// logged with ScsiPortLogError. +// SP_RETURN_BAD_CONFIG: Indicates the supplied configuration information was invalid +// for the adapter. +// SP_RETURN_NOT_FOUND: Indicates no supported HBA was found for the supplied +// configuration information. +//_____________________________________________________________________ ___________________________ +{ + PHW_DEVICE_EXTENSION deviceExtension = HwDeviceExtension; + BusLogic_HostAdapter_T *hcsp = &(deviceExtension->hcs); + static UCHAR k = 0; + PACCESS_RANGE accessRange; + PCI_COMMON_CONFIG PCICommonConfig; + PUCHAR pciAddress, portFound; + char NumPort = 0; + + DebugPrint((0,"\n BusLogic - Inside the Find Adapter Routine\n")); + + *Again = FALSE; + + accessRange = &((*(ConfigInfo->AccessRanges))[0]); + + // Inform SCSIPORT that we are NOT a WMI data provider + // Sirish, 10th June 2002 + ConfigInfo->WmiDataProvider = FALSE; + /*Sirish, 10th June 2002 BT958WmiInitialize(deviceExtension);*/ + + // Check for configuration information passed in form the system + if ((*ConfigInfo->AccessRanges)[0].RangeLength != 0) + { + // check if the system supplied bus-relative address is valid and has not been + // claimed by anyother device + if ( ScsiPortValidateRange(deviceExtension, + ConfigInfo->AdapterInterfaceType, + ConfigInfo->SystemIoBusNumber, + accessRange->RangeStart, + accessRange->RangeLength, + TRUE) ) // TRUE: iniospace + { + DebugPrint((0,"\n BusLogic - BusLogic - Validate Range function suceeded \n")); + + // Map the Bus-relative range addresses to system-space logical range addresses + // so that these mapped logical addresses can be called with SciPortRead/Writexxx + // to determine whether the adapter is an HBA that the driver supports + + pciAddress = (PUCHAR) ScsiPortGetDeviceBase(deviceExtension, + ConfigInfo->AdapterInterfaceType, + ConfigInfo->SystemIoBusNumber, + accessRange->RangeStart, + accessRange->RangeLength, + TRUE); // TRUE: iniospace + + if(pciAddress) + { + DebugPrint((0,"\n BusLogic - Get Device Base function suceeded \n")); + + memset(hcsp, 0, sizeof(BusLogic_HostAdapter_T)); + + // points to structure of type BT958_HA which has device specific information. This needs + // to be either changed or modified with our specific info. + hcsp->IO_Address = pciAddress; + hcsp->IRQ_Channel = (UCHAR)ConfigInfo->BusInterruptLevel; + NumPort++; + } + } + } + + if (NumPort == 0) + { + return(SP_RETURN_NOT_FOUND); + } + + // Hardware found, let's find out hardware configuration + // and fill out ConfigInfo table for WinNT + ConfigInfo->NumberOfBuses = 1; + ConfigInfo->MaximumTransferLength = MAX_TRANSFER_SIZE; + +#if SG_SUPPORT + ConfigInfo->ScatterGather = TRUE; +#else + ConfigInfo->ScatterGather = FALSE; +#endif + + ConfigInfo->Master = TRUE; + ConfigInfo->NeedPhysicalAddresses = TRUE; + ConfigInfo->Dma32BitAddresses = TRUE; + ConfigInfo->InterruptMode = LevelSensitive; + +#if TAG_QUEUING + ConfigInfo->TaggedQueuing = TRUE; +#else + ConfigInfo->TaggedQueuing = FALSE; +#endif + + // Should we change this to double-word aligned to increase performance + ConfigInfo->AlignmentMask = 0x0; + + portFound = hcsp->IO_Address; + + if (!Buslogic_InitBT958(deviceExtension,ConfigInfo)) // harware specific initializations. Find what's for our card + { + ScsiPortLogError(deviceExtension, + NULL, + 0, + 0, + 0, + SP_INTERNAL_ADAPTER_ERROR, + 7 << 8); + + return(SP_RETURN_ERROR); + } + + if (NumPort != 0) + *Again = TRUE; + + return(SP_RETURN_FOUND); + +} // end BT958FindAdapter() + + +BOOLEAN +Buslogic_InitBT958(PHW_DEVICE_EXTENSION deviceExtension, + PPORT_CONFIGURATION_INFORMATION ConfigInfo) +//_____________________________________________________________________ ____ +// Routine Description: +// This routine is called from the driver's FindAdapter routine +// On invocation this routine probes the host adapter to check +// if its hardware registers are responding correctly, and +// initializes the device and makes it ready for IO +// Arguments: +// 1. deviceExtension +// 2. Port Configuration info +// Return Value: +// TRUE : Device initialized properly +// FALSE : Device failed to initialize +//_____________________________________________________________________ ____ +{ + + BusLogic_HostAdapter_T *HostAdapter = &(deviceExtension->hcs); + + // Probe the Host Adapter. + // If unsuccessful, abort further initialization. + if (!BusLogic_ProbeHostAdapter(HostAdapter)) + return FALSE; + + // Hard Reset the Host Adapter. + // If unsuccessful, abort further initialization. + if (!BusLogic_HardwareResetHostAdapter(HostAdapter, TRUE)) + return FALSE; + + // Check the Host Adapter. + // If unsuccessful, abort further initialization. + if (!BusLogic_CheckHostAdapter(HostAdapter)) + return FALSE; + + // Allocate a Noncached Extension to use for mail boxes. + deviceExtension->NoncachedExtension = ScsiPortGetUncachedExtension(deviceExtension, + ConfigInfo, + sizeof(NONCACHED_EXTENSION)); + + if (deviceExtension->NoncachedExtension == NULL) + { + // Log error. + ScsiPortLogError(deviceExtension, + NULL, + 0, + 0, + 0, + SP_INTERNAL_ADAPTER_ERROR, + 7 << 8); + + // abort further initialization + return FALSE; + } + + // Read the Host Adapter Configuration, Configure the Host Adapter, + // Acquire the System Resources necessary to use the Host Adapter, then + // Create the Initial CCBs, Initialize the Host Adapter, and finally + // perform Target Device Inquiry. + if (BusLogic_ReadHostAdapterConfiguration(HostAdapter) && + //BusLogic_ReportHostAdapterConfiguration(HostAdapter) && + BusLogic_InitializeHostAdapter(deviceExtension, ConfigInfo) && + BusLogic_TargetDeviceInquiry(HostAdapter)) + { + // Fill in the: + // 1.Maximum number of scsi target devices that are supported by our adapter + ConfigInfo->MaximumNumberOfTargets = HostAdapter->MaxTargetDevices; + // 2. Maximum number of logical units per target the HBA can control. + ConfigInfo->MaximumNumberOfLogicalUnits = HostAdapter->MaxLogicalUnits; + ConfigInfo->InitiatorBusId[0] = HostAdapter->SCSI_ID; + // Maximum number of breaks between address ranges that a data buffer can + // have if the HBA supports scatter/gather. In other words, the number of + // scatter/gather lists minus one. + ConfigInfo->NumberOfPhysicalBreaks = HostAdapter->DriverScatterGatherLimit; + } + else + { + // An error occurred during Host Adapter Configuration Querying, Host + // Adapter Configuration, Host Adapter Initialization, or Target Device Inquiry, + // so return FALSE + + return FALSE; + } + // Initialization completed successfully + return TRUE; +} // end Buslogic_InitBT958 + + +BOOLEAN +BusLogic_ProbeHostAdapter(BusLogic_HostAdapter_T *HostAdapter) +//_____________________________________________________________________ _______________ +// Routine Description: BusLogic_ProbeHostAdapter probes for a BusLogic Host Adapter. +// The routine reads the status, interrupt and geometry regiter and +// checks if their contents are valid +// Arguments: +// 1. Host Adapter structure +// +// Return Value: +// TRUE: Probe completed successfully +// FALSE: Probe failed +//_____________________________________________________________________ _______________ +{ + BusLogic_StatusRegister_T StatusRegister; + BusLogic_InterruptRegister_T InterruptRegister; + BusLogic_GeometryRegister_T GeometryRegister; + + DebugPrint((0,"\n BusLogic - Inside ProbeHostaAdapter funtion \n")); + // Read the Status, Interrupt, and Geometry Registers to test if there are I/O + // ports that respond, and to check the values to determine if they are from a + // BusLogic Host Adapter. A nonexistent I/O port will return 0xFF, in which + // case there is definitely no BusLogic Host Adapter at this base I/O Address. + // The test here is a subset of that used by the BusLogic Host Adapter BIOS. + + InterruptRegister.All = BusLogic_ReadInterruptRegister(HostAdapter); + GeometryRegister.All = BusLogic_ReadGeometryRegister(HostAdapter); + StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); + + if (StatusRegister.All == 0 || + StatusRegister.Bits.DiagnosticActive || + StatusRegister.Bits.CommandParameterRegisterBusy || + StatusRegister.Bits.Reserved || + StatusRegister.Bits.CommandInvalid || + InterruptRegister.Bits.Reserved != 0) + return FALSE; + + // Check the undocumented Geometry Register to test if there is an I/O port + // that responded. Adaptec Host Adapters do not implement the Geometry + // Register, so this test helps serve to avoid incorrectly recognizing an + // Adaptec 1542A or 1542B as a BusLogic. Unfortunately, the Adaptec 1542C + // series does respond to the Geometry Register I/O port, but it will be + // rejected later when the Inquire Extended Setup Information command is + // issued in BusLogic_CheckHostAdapter. The AMI FastDisk Host Adapter is a + // BusLogic clone that implements the same interface as earlier BusLogic + // Host Adapters, including the undocumented commands, and is therefore + // supported by this driver. However, the AMI FastDisk always returns 0x00 + // upon reading the Geometry Register, so the extended translation option + // should always be left disabled on the AMI FastDisk. + + if (GeometryRegister.All == 0xFF) return FALSE; + return TRUE; +}// end BusLogic_ProbeHostAdapter + +BOOLEAN +BusLogic_HardwareResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter, + BOOLEAN HardReset) +//_____________________________________________________________________ ____ +// Routine Description: BusLogic_HardwareResetHostAdapter issues a Hardware +// Reset to the Host Adapter and waits for Host Adapter +// Diagnostics to complete. If HardReset is TRUE, a +// Hard Reset is performed which also initiates a SCSI +// Bus Reset. Otherwise, a Soft Reset is performed which +// only resets the Host Adapter without forcing a SCSI +// Bus Reset. +// Arguments: +// 1. Host Adapter structure +// 2. Boolean HardReset - True: Do hard reset +// Return Value: +// TRUE : Reset completed successfully +// FALSE : Reset failed +//_____________________________________________________________________ ____ +{ + BusLogic_StatusRegister_T StatusRegister; + int TimeoutCounter; + + // Issue a Hard Reset or Soft Reset Command to the Host Adapter. The Host + // Adapter should respond by setting Diagnostic Active in the Status Register. + if (HardReset) + BusLogic_HardReset(HostAdapter); + else + BusLogic_SoftReset(HostAdapter); + + // Wait until Diagnostic Active is set in the Status Register. + TimeoutCounter = 5*10000; + while (--TimeoutCounter >= 0) + { + StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); + if (StatusRegister.Bits.DiagnosticActive) + break; + ScsiPortStallExecution(100); + } + + // if inspite of waiting for time out period , if it didn't et set, then something is wrong-- so just return. + if (TimeoutCounter < 0) + return FALSE; + + // + // Wait 100 microseconds to allow completion of any initial diagnostic + // activity which might leave the contents of the Status Register + // unpredictable. + ScsiPortStallExecution(100); + + // Wait until Diagnostic Active is reset in the Status Register. + TimeoutCounter = 10*10000; + while (--TimeoutCounter >= 0) + { + StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); + if (!StatusRegister.Bits.DiagnosticActive) + break; + ScsiPortStallExecution(100); + } + + if (TimeoutCounter < 0) + return FALSE; + + // Wait until at least one of the Diagnostic Failure, Host Adapter Ready, + // or Data In Register Ready bits is set in the Status Register. + TimeoutCounter = 10000; + while (--TimeoutCounter >= 0) + { + StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); + if (StatusRegister.Bits.DiagnosticFailure || + StatusRegister.Bits.HostAdapterReady || + StatusRegister.Bits.DataInRegisterReady) + { + break; + } + ScsiPortStallExecution(100); + } + + //device didn't respond to reset + if (TimeoutCounter < 0) + return FALSE; + + // If Diagnostic Failure is set or Host Adapter Ready is reset, then an + // error occurred during the Host Adapter diagnostics. If Data In Register + // Ready is set, then there is an Error Code available. + if (StatusRegister.Bits.DiagnosticFailure || !StatusRegister.Bits.HostAdapterReady) + { + DebugPrint((0,"Failure - HOST ADAPTER STATUS REGISTER = %02X\n", StatusRegister.All)); + + if (StatusRegister.Bits.DataInRegisterReady) + { + UCHAR ErrorCode = BusLogic_ReadDataInRegister(HostAdapter); + DebugPrint((0,"HOST ADAPTER ERROR CODE = %d\n", ErrorCode)); + } + return FALSE; + } + // Indicate the Host Adapter Hard Reset completed successfully. + return TRUE; +}// end BusLogic_HardwareResetHostAdapter + + +BOOLEAN +BusLogic_CheckHostAdapter(BusLogic_HostAdapter_T *HostAdapter) +//_____________________________________________________________________ ____ +// Routine Description: BusLogic_CheckHostAdapter checks to be sure this +// really is a BusLogic +// Arguments: +// 1. Host Adapter Structure +// Return Value: +// TRUE : Buslogic adapter detected +// FALSE : Card is not a Buslogic adapter +//_____________________________________________________________________ ____ +{ + BusLogic_ExtendedSetupInformation_T ExtendedSetupInformation; + BusLogic_RequestedReplyLength_T RequestedReplyLength; + BOOLEAN Result = TRUE; + + DebugPrint((0,"\n BusLogic - Inside BusLogic_CheckHostAdapter funtion \n")); + + // + // Issue the Inquire Extended Setup Information command. Only genuine + // BusLogic Host Adapters and TRUE clones support this command. Adaptec 1542C + // series Host Adapters that respond to the Geometry Register I/O port will + // fail this command. + RequestedReplyLength = sizeof(ExtendedSetupInformation); + if (BusLogic_Command(HostAdapter, + BusLogic_InquireExtendedSetupInformation, + &RequestedReplyLength, + sizeof(RequestedReplyLength), + &ExtendedSetupInformation, + sizeof(ExtendedSetupInformation)) + != sizeof(ExtendedSetupInformation)) + { + Result = FALSE; + } + return Result; +}// end BusLogic_CheckHostAdapter + +int +BusLogic_Command(BusLogic_HostAdapter_T *HostAdapter, + BusLogic_OperationCode_T OperationCode, + void *ParameterData, + int ParameterLength, + void *ReplyData, + int ReplyLength) +//_____________________________________________________________________ _________________________ +// Routine Description: +// BusLogic_Command sends the command OperationCode to HostAdapter, optionally +// providing ParameterLength bytes of ParameterData and receiving at most +// ReplyLength bytes of ReplyData; any excess reply data is received but +// discarded. +// +// BusLogic_Command is called exclusively during host adapter detection and +// initialization, so performance and latency are not critical, and exclusive +// access to the Host Adapter hardware is assumed. Once the host adapter and +// driver are initialized, the only Host Adapter command that is issued is the +// single byte Execute Mailbox Command operation code, which does not require +// waiting for the Host Adapter Ready bit to be set in the Status Register. +// Arguments: +// 1. HostAdapter - Host Adapter structure +// 2. OperationCode - Operation code for the command +// 3. ParameterData - Buffer containing parameters that needs to be passed as part +// of the command +// 4. ParameterLength - Number of parameters +// 5. ReplyData - Buffer where reply data is copied +// 6. ReplyLength - The length of the reply data +// Return Value: +// On success, this function returns the number of reply bytes read from +// the Host Adapter (including any discarded data); on failure, it returns +// -1 if the command was invalid, or -2 if a timeout occurred. +//_____________________________________________________________________ ____________________________ +{ + UCHAR *ParameterPointer = (UCHAR *) ParameterData; + UCHAR *ReplyPointer = (UCHAR *) ReplyData; + BusLogic_StatusRegister_T StatusRegister; + BusLogic_InterruptRegister_T InterruptRegister; + int ReplyBytes = 0, Result; + long TimeoutCounter; + + // Clear out the Reply Data if provided. + if (ReplyLength > 0) + memset(ReplyData, 0, ReplyLength); + + // If the IRQ Channel has not yet been acquired, then interrupts must be + // disabled while issuing host adapter commands since a Command Complete + // interrupt could occur if the IRQ Channel was previously enabled by another + // BusLogic Host Adapter or another driver sharing the same IRQ Channel. + + // Wait for the Host Adapter Ready bit to be set and the Command/Parameter + // Register Busy bit to be reset in the Status Register. + TimeoutCounter = 10000; + while (--TimeoutCounter >= 0) + { + StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); + if ( StatusRegister.Bits.HostAdapterReady && + !StatusRegister.Bits.CommandParameterRegisterBusy) + { + break; + } + ScsiPortStallExecution(100); + } + if (TimeoutCounter < 0) + { + //BusLogic_CommandFailureReason = "Timeout waiting for Host Adapter Ready"; + Result = -2; + goto Done; + } + + // Write the OperationCode to the Command/Parameter Register. + HostAdapter->HostAdapterCommandCompleted = FALSE; + BusLogic_WriteCommandParameterRegister(HostAdapter, (UCHAR)OperationCode); + + //Write any additional Parameter Bytes. + TimeoutCounter = 10000; + while (ParameterLength > 0 && --TimeoutCounter >= 0) + { + // + // Wait 100 microseconds to give the Host Adapter enough time to determine + // whether the last value written to the Command/Parameter Register was + // valid or not. If the Command Complete bit is set in the Interrupt + // Register, then the Command Invalid bit in the Status Register will be + // reset if the Operation Code or Parameter was valid and the command + // has completed, or set if the Operation Code or Parameter was invalid. + // If the Data In Register Ready bit is set in the Status Register, then + // the Operation Code was valid, and data is waiting to be read back + // from the Host Adapter. Otherwise, wait for the Command/Parameter + // Register Busy bit in the Status Register to be reset. + + ScsiPortStallExecution(100); + InterruptRegister.All = BusLogic_ReadInterruptRegister(HostAdapter); + StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); + if (InterruptRegister.Bits.CommandComplete) + break; + if (HostAdapter->HostAdapterCommandCompleted) + break; + if (StatusRegister.Bits.DataInRegisterReady) + break; + if (StatusRegister.Bits.CommandParameterRegisterBusy) + continue; + BusLogic_WriteCommandParameterRegister(HostAdapter, *ParameterPointer++); + ParameterLength--; + } + if (TimeoutCounter < 0) + { + //BusLogic_CommandFailureReason = "Timeout waiting for Parameter Acceptance"; + Result = -2; + goto Done; + } + + // The Modify I/O Address command does not cause a Command Complete Interrupt. + if (OperationCode == BusLogic_ModifyIOAddress) + { + StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); + if (StatusRegister.Bits.CommandInvalid) + { + //BusLogic_CommandFailureReason = "Modify I/O Address Invalid"; + Result = -1; + goto Done; + } + Result = 0; + goto Done; + } + + // Select an appropriate timeout value for awaiting command completion. + switch (OperationCode) + { + case BusLogic_InquireInstalledDevicesID0to7: + case BusLogic_InquireInstalledDevicesID8to15: + case BusLogic_InquireTargetDevices: + // Approximately 60 seconds. + TimeoutCounter = 60*10000; + break; + default: + // Approximately 1 second. + TimeoutCounter = 10000; + break; + } + + // + // Receive any Reply Bytes, waiting for either the Command Complete bit to + // be set in the Interrupt Register, or for the Interrupt Handler to set the + // Host Adapter Command Completed bit in the Host Adapter structure. + while (--TimeoutCounter >= 0) + { + InterruptRegister.All = BusLogic_ReadInterruptRegister(HostAdapter); + StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); + if (InterruptRegister.Bits.CommandComplete) + break; + if (HostAdapter->HostAdapterCommandCompleted) + break; + if (StatusRegister.Bits.DataInRegisterReady) + { + if (++ReplyBytes <= ReplyLength) + { + *ReplyPointer++ = BusLogic_ReadDataInRegister(HostAdapter); + } + else + { + BusLogic_ReadDataInRegister(HostAdapter); + } + } + if (OperationCode == BusLogic_FetchHostAdapterLocalRAM && + StatusRegister.Bits.HostAdapterReady) + { + break; + } + ScsiPortStallExecution(100); + } + if (TimeoutCounter < 0) + { + //BusLogic_CommandFailureReason = "Timeout waiting for Command Complete"; + Result = -2; + goto Done; + } + + // Clear any pending Command Complete Interrupt. + BusLogic_InterruptReset(HostAdapter); + + // Process Command Invalid conditions. + if (StatusRegister.Bits.CommandInvalid) + { + // + // Some early BusLogic Host Adapters may not recover properly from + // a Command Invalid condition, so if this appears to be the case, + // a Soft Reset is issued to the Host Adapter. Potentially invalid + // commands are never attempted after Mailbox Initialization is + // performed, so there should be no Host Adapter state lost by a + // Soft Reset in response to a Command Invalid condition. + + ScsiPortStallExecution(1000); + StatusRegister.All = BusLogic_ReadStatusRegister(HostAdapter); + if (StatusRegister.Bits.CommandInvalid || + StatusRegister.Bits.Reserved || + StatusRegister.Bits.DataInRegisterReady || + StatusRegister.Bits.CommandParameterRegisterBusy || + !StatusRegister.Bits.HostAdapterReady || + !StatusRegister.Bits.InitializationRequired || + StatusRegister.Bits.DiagnosticActive || + StatusRegister.Bits.DiagnosticFailure) + { + BusLogic_SoftReset(HostAdapter); + ScsiPortStallExecution(1000); + } + //BusLogic_CommandFailureReason = "Command Invalid"; + Result = -1; + goto Done; + } + + // Handle Excess Parameters Supplied conditions. + if (ParameterLength > 0) + { + //BusLogic_CommandFailureReason = "Excess Parameters Supplied"; + Result = -1; + goto Done; + } + + // Indicate the command completed successfully. + Result = ReplyBytes; + + // Restore the interrupt status if necessary and return. +Done: + return Result; +}// end BusLogic_Command + + +BOOLEAN +BusLogic_ReadHostAdapterConfiguration(BusLogic_HostAdapter_T *HostAdapter) +//_____________________________________________________________________ ______________________ +// Routine Description: +// BusLogic_ReadHostAdapterConfiguration reads the Configuration Information +// from Host Adapter and initializes the Host Adapter structure. +// Arguments: +// 1. Host adapter structure +// Return Value: +// TRUE : Configuration read properly +// FALSE : Encounter failure +//_____________________________________________________________________ ______________________ +{ + BusLogic_BoardID_T BoardID; + BusLogic_Configuration_T Configuration; + BusLogic_SetupInformation_T SetupInformation; + BusLogic_ExtendedSetupInformation_T ExtendedSetupInformation; + BusLogic_HostAdapterModelNumber_T HostAdapterModelNumber; + BusLogic_FirmwareVersion3rdDigit_T FirmwareVersion3rdDigit; + BusLogic_FirmwareVersionLetter_T FirmwareVersionLetter; + BusLogic_PCIHostAdapterInformation_T PCIHostAdapterInformation; + BusLogic_FetchHostAdapterLocalRAMRequest_T FetchHostAdapterLocalRAMRequest; + BusLogic_AutoSCSIData_T AutoSCSIData; [truncated at 1000 lines; 3858 more skipped]