buslogic958.c
来自「一个类似windows」· C语言 代码 · 共 1,684 行 · 第 1/5 页
C
1,684 行
/*
* 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
STDCALL
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
STDCALL
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.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?