|
|
/*++
Copyright (C) Microsoft Corporation, 1997 - 2001
Module Name:
sbp2port.h
Abstract:
Definitions for SBP2 protocol
Author:
georgioc 22-Jan-97
Environment:
Kernel mode only
Revision History:
--*/
#ifndef _SBP2PORT_
#define _SBP2PORT_
#include "sbp2.h"
#include "debug.h"
#include "ntddsbp2.h"
#include <ntddscsi.h>
#include "portlib.h"
//
// define this if we a re running on a TI controller
//
#if DBG
extern ULONG Sbp2DebugLevel;
#define DEBUGPRINT1(_x_) {if (Sbp2DebugLevel >= 1) \
KdPrint (_x_);}
#define DEBUGPRINT2(_x_) {if (Sbp2DebugLevel >= 2) \
KdPrint (_x_);}
#define DEBUGPRINT3(_x_) {if (Sbp2DebugLevel >= 3) \
KdPrint (_x_);} #define DEBUGPRINT4(_x_) {if (Sbp2DebugLevel >= 4) \
KdPrint (_x_);}
#else
#define DEBUGPRINT1(_x_)
#define DEBUGPRINT2(_x_)
#define DEBUGPRINT3(_x_)
#define DEBUGPRINT4(_x_)
#endif
//
// Remove lock definitions
//
#define REMLOCK_TIMEOUT 2 // minutes
#define REMLOCK_HIGH_WATERMARK 0x2000 // # irps, devctl.exe test sends *alot*
//
// The following FILE_CHARACTERISTICS_XXX constants are copied from
// NTDDK.H and dup'd here, since we include WDM.H and that doesn't
// support these constants.
//
// The FILE_EXPECT flags will only exist for WinXP. After that they will be
// ignored and an IRP will be sent in their place.
//
#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL 0x00000200
#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL 0x00000300
#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK 0x00000300
//
// pool of preallocate async contexts. Has to be less than
// ((PAGE_SIZE / (SBP2_MIN_ORB_SIZE+sizeof(PASYNC_REQUEST_CONTEXT)))
// The numbers below are chosen so they can work as boundary check masks that are ANDed
// with the current pointer into the continious pool
//
#define MAX_ORB_LIST_DEPTH 8
#define MIN_ORB_LIST_DEPTH 5
typedef struct _IRBIRP {
SLIST_ENTRY ListPointer; PIRB Irb; PIRP Irp; OCTLET Octlet;
} IRBIRP, *PIRBIRP;
typedef struct _ADDRESS_CONTEXT {
PDEVICE_OBJECT DeviceObject; OCTLET Address; OCTLET ReservedAddr; HANDLE AddressHandle; PMDL RequestMdl; ULONG TransactionType; PVOID Reserved;
} ADDRESS_CONTEXT, *PADDRESS_CONTEXT;
typedef struct _PAGE_TABLE_CONTEXT {
ULONG MaxPages; ULONG NumberOfPages; POCTLET PageTable; ADDRESS_CONTEXT AddressContext;
} PAGE_TABLE_CONTEXT, *PPAGE_TABLE_CONTEXT;
#define SBP2_ASYNC_CONTEXT_TAG 0xADEAFFAB
typedef struct _ASYNC_REQUEST_CONTEXT {
LIST_ENTRY OrbList; SLIST_ENTRY LookasideList; ULONG Tag;
PDEVICE_OBJECT DeviceObject; PSCSI_REQUEST_BLOCK Srb; ULONG Flags; PORB_NORMAL_CMD CmdOrb;
OCTLET CmdOrbAddress; PMDL PartialMdl; PMDL RequestMdl;
PAGE_TABLE_CONTEXT PageTableContext; HANDLE DataMappingHandle;
KDPC TimerDpc; KTIMER Timer;
PIRBIRP Packet; PVOID OriginalSrb;
ULONG OrbListDepth;
} ASYNC_REQUEST_CONTEXT, *PASYNC_REQUEST_CONTEXT;
#define ASYNC_CONTEXT_FLAG_TIMER_STARTED 0x00000001
#define ASYNC_CONTEXT_FLAG_COMPLETED 0x00000002
#define ASYNC_CONTEXT_FLAG_PAGE_ALLOC 0x00000004
#define ASYNC_CONTEXT_FLAG_DATA_ALLOC 0x00000008
#define ASYNC_CONTEXT_FLAG_DATA_ALLOC_FAILED 0x00000010
#define ASYNC_CONTEXT_FLAG_RANG_DOORBELL 0x00000020
#define SBP2_PDO ((ULONG) 'ODPs')
#define SBP2_PDO_DELETED ((ULONG) 'ODPx')
#define SBP2_FDO ((ULONG) 'ODFs')
#define SBP2_MAX_LUNS_PER_NODE 10
#define MAX_GENERIC_NAME_LENGTH 16*sizeof(WCHAR)
// begin new
#define DEVICE_NAME_MAX_CHARS 100*sizeof(WCHAR)
#define UNIQUE_ID_MAX_CHARS 50*sizeof(WCHAR)
#define BASE_SBP2_DEVICE_NAME L"SBP2\\"
// end new
typedef struct _DEVICE_INFORMATION {
PDEVICE_OBJECT DeviceObject; QUADLET Lun; QUADLET CmdSetId; QUADLET CmdSetSpecId;
QUADLET UnitCharacteristics; PCONFIG_ROM ConfigRom;
OCTLET ManagementAgentBaseReg; OCTLET CsrRegisterBase;
ULONG MaxClassTransferSize;
UNICODE_STRING uniVendorId; // replaces ModelLeaf
UNICODE_STRING uniModelId; // replaces VendorLeaf
UNICODE_STRING uniGenericName; // replaces GenericName
} DEVICE_INFORMATION, *PDEVICE_INFORMATION;
typedef struct _FDO_DEVICE_EXTENSION {
PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT LowerDeviceObject; ULONG Type; ULONG DeviceFlags;
ULONG MaxClassTransferSize; HANDLE Sbp2ObjectDirectory; PDEVICE_OBJECT Pdo; PIRP SystemPowerIrp; DEVICE_POWER_STATE DevicePowerState; SYSTEM_POWER_STATE SystemPowerState; ULONG NumPDOsStarted; KMUTEX EnableBusResetNotificationMutex; ULONG DeviceListSize; KSPIN_LOCK DeviceListLock; DEVICE_INFORMATION DeviceList[SBP2_MAX_LUNS_PER_NODE]; CONFIG_ROM ConfigRom;
FAST_MUTEX ResetMutex; IO_REMOVE_LOCK RemoveLock;
#if DBG
ULONG ulWorkItemCount; ULONG ulBusResetMutexCount; #endif
} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
typedef struct _ARCP_ORB {
PASYNC_REQUEST_CONTEXT AsyncReqCtx; ORB_NORMAL_CMD Orb;
} ARCP_ORB, *PARCP_ORB;
typedef struct _COMMON_BUFFER_DATA {
ORB_TASK_MNG TaskOrb; ORB_MNG ManagementOrb; LOGIN_RESPONSE LoginResponse; QUERY_LOGIN_RESPONSE QueryLoginResponse;
#if PASSWORD_SUPPORT
ORB_SET_PASSWORD PasswordOrb; #endif
ARCP_ORB CmdOrbs[MAX_ORB_LIST_DEPTH];
} COMMON_BUFFER_DATA, *PCOMMON_BUFFER_DATA;
typedef struct _DEVICE_EXTENSION {
PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT LowerDeviceObject; ULONG Type; ULONG DeviceFlags;
PDEVICE_OBJECT BusFdo; PDEVICE_INFORMATION DeviceInfo; ULONG MaxOrbListDepth; KSPIN_LOCK OrbListSpinLock;
LIST_ENTRY PendingOrbList; ULONG OrbListDepth; ULONG CurrentKey;
STATUS_FIFO_BLOCK LastStatusBlock;
PASYNC_REQUEST_CONTEXT NextContextToFree; BOOLEAN AppendToNextContextToFree; DEVICE_POWER_STATE DevicePowerState; SYSTEM_POWER_STATE SystemPowerState;
PIRP PowerDeferredIrp; PIRP DeferredPowerRequest; ULONG PagingPathCount; ULONG HibernateCount;
ULONG CrashDumpCount; ULONG HandleCount; PULONG IdleCounter; ULONG Reserved;
NTSTATUS LastTransactionStatus; LARGE_INTEGER DueTime; PMDL ReservedMdl; // quadlet only requests
//
// inquiry Data
//
INQUIRYDATA InquiryData;
//
// RBC Device Parameters page
//
MODE_RBC_DEVICE_PARAMETERS_HEADER_AND_PAGE DeviceModeHeaderAndPage;
//
// 1394 addresses to node registers
//
NODE_ADDRESS InitiatorAddressId; ULONG CurrentGeneration;
//
// node and controller capabilities
//
ULONG MaxControllerPhySpeed; USHORT OrbReadPayloadMask; USHORT OrbWritePayloadMask;
GET_LOCAL_HOST_INFO2 HostControllerInformation; GET_LOCAL_HOST_INFO4 HostRoutineAPI;
//
// Keep a dummy, task and management ORBs around
//
ORB_NORMAL_CMD Dummy; ADDRESS_CONTEXT DummyContext;
//
//
//
PCOMMON_BUFFER_DATA CommonBuffer; ADDRESS_CONTEXT CommonBufferContext;
PORB_TASK_MNG TaskOrb; ADDRESS_CONTEXT TaskOrbContext;
PORB_MNG ManagementOrb; ADDRESS_CONTEXT ManagementOrbContext; KEVENT ManagementEvent;
PLOGIN_RESPONSE LoginResponse; ADDRESS_CONTEXT LoginRespContext;
PQUERY_LOGIN_RESPONSE QueryLoginResponse; ADDRESS_CONTEXT QueryLoginRespContext;
#if PASSWORD_SUPPORT
PORB_SET_PASSWORD PasswordOrb; ADDRESS_CONTEXT PasswordOrbContext;
#endif
ADDRESS_CONTEXT OrbPoolContext;
//
//
//
STATUS_FIFO_BLOCK ManagementOrbStatusBlock; ADDRESS_CONTEXT ManagementOrbStatusContext;
STATUS_FIFO_BLOCK TaskOrbStatusBlock; ADDRESS_CONTEXT TaskOrbStatusContext;
ADDRESS_CONTEXT GlobalStatusContext;
#if PASSWORD_SUPPORT
STATUS_FIFO_BLOCK PasswordOrbStatusBlock; ADDRESS_CONTEXT PasswordOrbStatusContext; KEVENT PasswordEvent;
#endif
//
// single list containing status fifos
//
SLIST_HEADER StatusFifoListHead; KSPIN_LOCK StatusFifoLock;
//
// pool with the actuall fifo buffer and address_fifo structs
//
PVOID StatusFifoBase;
SLIST_HEADER FreeContextListHead;
//
// look aside for request contexts, and other fixed size requests
//
NPAGED_LOOKASIDE_LIST BusRequestContextPool; // a real lookaside! what a concept...
SLIST_HEADER BusRequestIrpIrbListHead; KSPIN_LOCK BusRequestLock;
//
// this spin locks are never used on advanced x86s or alphas ( other than 486' than cant do 64 atomic exchange)
//
KSPIN_LOCK FreeContextLock;
//
// The driver keeps a pool of request contexts, and CMD ORBs in its deviceExtension
// We use to lookaside list for the bus driver Irps, Irp request contexts
// and the ORB contexts that have pointers to the SRB, etc
//
PASYNC_REQUEST_CONTEXT AsyncContextBase;
//
// the base va for the pool of orbs is int he reserved field of the address_Context struct
//
KSPIN_LOCK ExtensionDataSpinLock;
//
// used to track time outs in resets, reconnects, etc...
//
KDPC DeviceManagementTimeoutDpc; KTIMER DeviceManagementTimer;
UNICODE_STRING UniSymLinkName;
//
// Tracks the number of outstanding/deferred calls to
// Sbp2StartNextPacketByKey
//
LONG StartNextPacketCount;
IO_REMOVE_LOCK RemoveLock;
#if DBG
ULONG ulPendingEvents; ULONG ulInternalEventCount; #endif
#if PASSWORD_SUPPORT
ULONG Exclusive;
#endif
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
typedef struct _REQUEST_CONTEXT {
PDEVICE_EXTENSION DeviceExtension; KEVENT Event; ULONG RequestType; PIRBIRP Packet; ULONG Complete;
} REQUEST_CONTEXT, *PREQUEST_CONTEXT;
//
// Useful macros
//
#define octbswap(octlet) {octlet.u.HighQuad.QuadPart = bswap(octlet.u.HighQuad.QuadPart); \
octlet.u.LowQuad.QuadPart = bswap(octlet.u.LowQuad.QuadPart); }
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define RETRIEVE_CONTEXT(pointer,fieldname) \
CONTAINING_RECORD(pointer,ASYNC_REQUEST_CONTEXT,fieldname)
#define SET_FLAG(Flags, Bit) ((Flags) |= (Bit))
#define CLEAR_FLAG(Flags, Bit) ((Flags) &= ~(Bit))
#define TEST_FLAG(Flags, Bit) ((Flags) & (Bit))
//
// One status fifo element for every possible outstanding orb, and a few
// more for unsolicited status
//
#define NUM_PREALLOCATED_STATUS_FIFO_ELEMENTS (2*MAX_ORB_LIST_DEPTH)
#define MIN_PAGE_TABLE_ALLOC_SIZE 64
#define SBP2_ENERGY_IDLE_TIMEOUT 60
#define SBP2_PERF_IDLE_TIMEOUT 60
//
// symbolic link stuff
//
#define SBP2_BASE_DEVICE_NAME L"\\Device\\Sbp2port"
#define SBP2_BASE_SYMBOLIC_LINK_NAME L"\\DosDevices\\Sbp2"
#define SBP2_MAX_SUFFIX_SIZE 5*sizeof(WCHAR)
#define BASE_SBP2_PNP_ID_DEVICE_NAME L"SBP2\\"
#define SBP2_MAX_TEXT_LEAF_LENGTH 0x100
//
// Device state flags
//
#define DEVICE_FLAG_STOPPED 0x00000001
#define DEVICE_FLAG_RESET_IN_PROGRESS 0x00000002
#define DEVICE_FLAG_REMOVED 0x00000004
#define DEVICE_FLAG_LOGIN_IN_PROGRESS 0x00000008
#define DEVICE_FLAG_RECONNECT 0x00000010
#define DEVICE_FLAG_CLAIMED 0x00000020
#define DEVICE_FLAG_INITIALIZING 0x00000040
#define DEVICE_FLAG_QUEUE_LOCKED 0x00000080
#define DEVICE_FLAG_SPC_CMD_SET 0x00000100
#define DEVICE_FLAG_INITIALIZED 0x00000200
#define DEVICE_FLAG_REMOVE_PENDING 0x00000400
#define DEVICE_FLAG_DEVICE_FAILED 0x00000800
#define DEVICE_FLAG_UNSTARTED_AND_REMOVED 0x00001000
#define DEVICE_FLAG_ABSENT_ON_POWER_UP 0x00002000
#define DEVICE_FLAG_SURPRISE_REMOVED 0x00004000
#define DEVICE_FLAG_PNP_STOPPED 0x00008000
#define DEVICE_FLAG_REPORTED_FAILED 0x00010000
//
// timeout values
//
#define SBP2_LOGIN_TIMEOUT 20 // secs
#define SBP2_RELOGIN_DELAY (ULONG)(-1*10*1000*1000) // 1s, 100 ns units
#define SBP2_RECONNECT_TIMEOUT (ULONG)(-2*10*1000*1000) // 2s, 100 ns units
#define SBP2_HARD_RESET_TIMEOUT (ULONG)(-2*10*1000*1000) // 2s, 100 ns units
#define SBP2_RESET_TIMEOUT (ULONG)(-2*10*1000*1000) // 2s, 100 ns units
#define SBP2_MAX_REQUEST_DELAY (ULONG)(-7*10*1000*1000) // 7s, 100 ns units
#if PASSWORD_SUPPORT
#define SBP2_SET_PASSWORD_TIMEOUT (ULONG)(-4*10*1000*1000) // 4s, 100 ns units
#endif
//
// Our pre-allocated page tables must fit in one page of memory (each entry
// is an OCTLET in size). So, the max xfer size equals the number of table
// entries (minus one, in case 1st entry is not a full page of data) times
// the page size
//
#define SBP2_NUM_PAGE_TABLE_ENTRIES (ULONG) (PAGE_SIZE / sizeof (OCTLET))
#define SBP2_MAX_TRANSFER_SIZE (ULONG) \
((SBP2_NUM_PAGE_TABLE_ENTRIES - 1) * PAGE_SIZE) #define SBP2_MAX_CDB_SIZE 12
#define SBP2_LOGIN_RETRIES 2
#define SBP2_SYNCHRONOUS_RETRIES 3
#define SBP2_ASYNC_RETRIES 2
//
// Minimum unit directory entries that will make this device a proper SBP-2 device
//
#define SBP2_MIN_UNIT_DIR_ENTRIES 2
//
// Masks used to decode the status block and for setting up the ORB flags
//
#define STATUS_BLOCK_UNSOLICITED_BIT_MASK 0x8000 // bit 15
#define STATUS_BLOCK_ENDOFLIST_BIT_MASK 0x4000 // bit 14
#define STATUS_BLOCK_RESP_MASK 0x3000 // protect bits 12-13 (0-15)
#define STATUS_BLOCK_SBP_STATUS_MASK 0x00FF // protect bits 0-7 (0-15)
#define STATUS_BLOCK_DEAD_BIT_MASK 0x0800 // protect bits 0-7 (0-15)
#define STATUS_BLOCK_LEN_MASK 0x0800 // protect bits 0-7 (0-15)
#define STATUS_BLOCK_SFMT_MASK 0xC0 // protect bits 15,14 of second octlet
#define SBP2_ALIGNMENT_MASK FILE_LONG_ALIGNMENT
//
// status type , if the SFMT field is 0 or 1
//
#define SENSE_DATA_STATUS_BLOCK 0x00
#define SENSE_DATA_DEFF_STATUS_BLOCK 0x01
//
// Status types
//
#define DUMMY_ORB_STATUS_BLOCK 0x01
#define TASK_STATUS_BLOCK 0x02
#define MANAGEMENT_STATUS_BLOCK 0x04
#define CMD_ORB_STATUS_BLOCK 0x08
#define UNSOLICITED_STATUS_BLOCK 0x10
#if PASSWORD_SUPPORT
#define PASSWORD_STATUS_BLOCK 0x20
#endif
#define ORB_PAGE_TABLE_BIT_MASK 0x0008
#define ORB_DIRECTION_BIT_MASK 0x0800
#define ORB_NOTIFY_BIT_MASK 0x8000
#define ORB_DUMMY_RQ_FMT_VALUE 0x6000
#define ORB_MNG_RQ_FMT_VALUE 0x0000
#define ORB_MNG_EXCLUSIVE_BIT_MASK 0x1000
//
// 1394 transaction layer allowed timeouts
//
#define BUSY_TIMEOUT_SETTING 0x0000000F
//
// Values used to indicate what data structure we are swapping (little->Big->little endian)
//
#define SWAP_LOGIN_RESPONSE_BLOCK 0
#define SWAP_LOGIN_ORB 1
#define SWAP_NORMAL_CMD_ORB 2
#define SWAP_STATUS_BLOCK 3
//
// request types for sending small read/writes to the bus driver
//
#define ASYNC_1394_REQUEST 0x01
#define SYNC_1394_REQUEST 0x02
#define ASYNC_SYNC_1394_REQUEST 0x03
//
// different values for exclusive flag
//
#if PASSWORD_SUPPORT
#define EXCLUSIVE_FLAG_CLEAR 0x00000000 // no password
#define EXCLUSIVE_FLAG_SET 0x00000001 // password is set
#define EXCLUSIVE_FLAG_ENABLE 0x00000002 // password needs to be enabled
#endif
//
// Function definitions
//
VOID AllocateIrpAndIrb( IN PDEVICE_EXTENSION DeviceExtension, IN PIRBIRP *Packet );
NTSTATUS AllocateAddressForStatus( IN PDEVICE_OBJECT DeviceObject, IN PADDRESS_CONTEXT Context, IN UCHAR StatusType );
NTSTATUS AllocateSingle1394Address( IN PDEVICE_OBJECT DeviceObject, IN PVOID Buffer, IN ULONG Length, IN ULONG AccessType, IN OUT PADDRESS_CONTEXT Context );
NTSTATUS CheckStatusResponseValue( IN PSTATUS_FIFO_BLOCK Status );
VOID CleanupOrbList( PDEVICE_EXTENSION DeviceExtension, NTSTATUS CompletionStatus );
BOOLEAN ConvertSbp2SenseDataToScsi( IN PSTATUS_FIFO_BLOCK StatusBlock, OUT PVOID SenseBuffer, IN ULONG SenseBufferLength );
VOID Create1394TransactionForSrb( IN PDEVICE_EXTENSION DeviceExtension, IN PSCSI_REQUEST_BLOCK Srb, IN OUT PASYNC_REQUEST_CONTEXT *Context );
VOID DeAllocateIrpAndIrb( IN PDEVICE_EXTENSION DeviceExtension, IN PIRBIRP Packet );
VOID Free1394DataMapping( PDEVICE_EXTENSION DeviceExtension, PASYNC_REQUEST_CONTEXT Context );
VOID FreeAddressRange( IN PDEVICE_EXTENSION DeviceExtension, IN PADDRESS_CONTEXT Context );
ULONG FreeAsyncRequestContext( PDEVICE_EXTENSION DeviceExtension, PASYNC_REQUEST_CONTEXT Context );
NTSTATUS Sbp2_SCSI_RBC_Conversion( IN PASYNC_REQUEST_CONTEXT Context );
NTSTATUS Sbp2AccessRegister( PDEVICE_EXTENSION DeviceExtension, PVOID Data, USHORT Register );
NTSTATUS Sbp2BusMapTransfer( PDEVICE_EXTENSION DeviceExtension, PASYNC_REQUEST_CONTEXT CallbackContext );
void Sbp2BusResetNotification( PFDO_DEVICE_EXTENSION FdoExtension );
BOOLEAN Sbp2CleanDeviceExtension( IN PDEVICE_OBJECT DeviceObject, BOOLEAN DeviceRemoved );
VOID Sbp2ConvertScsiToReducedCommandSet( IN PDEVICE_EXTENSION DeviceExtension, IN PSCSI_REQUEST_BLOCK Srb );
VOID Sbp2AllocComplete( IN PASYNC_REQUEST_CONTEXT CallbackContext );
VOID Sbp2CreateRequestErrorLog( IN PDEVICE_OBJECT DeviceObject, IN PASYNC_REQUEST_CONTEXT Context, IN NTSTATUS Status );
VOID Sbp2DeferPendingRequest( IN PDEVICE_EXTENSION DeviceExtension, IN PIRP Irp );
VOID Sbp2DeviceManagementTimeoutDpc( IN PKDPC Dpc, IN PDEVICE_EXTENSION DeviceExtension, IN PVOID SystemArgument1, IN PVOID SystemArgument2 );
NTSTATUS Sbp2Get1394ConfigInfo( PFDO_DEVICE_EXTENSION DeviceExtension, PSBP2_REQUEST Sbp2Req );
RCODE Sbp2GlobalStatusCallback( IN PNOTIFICATION_INFO NotificationInfo );
NTSTATUS Sbp2GetControllerInfo( IN PDEVICE_EXTENSION DeviceExtension );
NTSTATUS Sbp2HandleApiRequest( IN PDEVICE_EXTENSION DeviceExtension, IN PIRP Irp );
VOID Sbp2HandleRemove( IN PDEVICE_OBJECT DeviceObject );
VOID Sbp2HandleUnsolicited( IN PDEVICE_EXTENSION DeviceExtension, IN PSTATUS_FIFO_BLOCK StatusFifo );
NTSTATUS Sbp2IssueInternalCommand( IN PDEVICE_EXTENSION DeviceExtension, IN UCHAR Scsiop );
NTSTATUS Sbp2InitializeDeviceExtension( IN PDEVICE_EXTENSION DeviceExtension );
VOID Sbp2InitializeOrb( IN PDEVICE_EXTENSION DeviceExtendion, PASYNC_REQUEST_CONTEXT CallbackContext );
VOID Sbp2InsertTailList( IN PDEVICE_EXTENSION DeviceExtension, IN PASYNC_REQUEST_CONTEXT Context );
NTSTATUS Sbp2Issue1394BusReset ( IN PDEVICE_EXTENSION DeviceExtension );
NTSTATUS Sbp2ManagementTransaction( IN PDEVICE_EXTENSION DeviceExtension, ULONG Type );
#if PASSWORD_SUPPORT
NTSTATUS Sbp2SetPasswordTransaction( IN PDEVICE_EXTENSION DeviceExtension, IN ULONG Type );
RCODE Sbp2SetPasswordOrbStatusCallback( IN PNOTIFICATION_INFO NotificationInfo );
#endif
RCODE Sbp2ManagementOrbStatusCallback( IN PNOTIFICATION_INFO NotificationInfo );
VOID Sbp2ParseTextLeaf( PFDO_DEVICE_EXTENSION DeviceExtension, PVOID UnitDepDir, PIO_ADDRESS ModelLeafLocation, PVOID *ModelLeaf );
NTSTATUS Sbp2PreAllocateLists( IN PDEVICE_EXTENSION DeviceExtension );
NTSTATUS Sbp2QueryProperty( IN PDEVICE_OBJECT DeviceObject, IN PIRP QueryIrp );
VOID Sbp2RequestTimeoutDpc( IN PKDPC Dpc, IN PDEVICE_EXTENSION DeviceExtension, IN PVOID SystemArgument1, IN PVOID SystemArgument2 );
VOID Sbp2Reset( PDEVICE_OBJECT DeviceObject, BOOLEAN Cleanup );
NTSTATUS Sbp2RequestCompletionRoutine( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PREQUEST_CONTEXT Context );
VOID Sbp2PdoDIrpCompletion( IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PIRP SIrp, IN PIO_STATUS_BLOCK IoStatus );
NTSTATUS Sbp2ScsiRequests ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
VOID Sbp2StartIo( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
NTSTATUS Sbp2SendRequest( PDEVICE_EXTENSION DeviceExtension, PIRBIRP Packet, ULONG TransferMode );
RCODE Sbp2TaskOrbStatusCallback( IN PNOTIFICATION_INFO NotificationInfo );
NTSTATUS Sbp2UpdateNodeInformation( PDEVICE_EXTENSION DeviceExtension );
NTSTATUS Sbp2FdoSIrpCompletion( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Unused );
VOID Sbp2FdoDIrpCompletion( IN PDEVICE_OBJECT TargetDeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PFDO_DEVICE_EXTENSION FdoExtension, IN PIO_STATUS_BLOCK IoStatus );
BOOLEAN Sbp2EnableBusResetNotification( PDEVICE_EXTENSION DeviceExtension, BOOLEAN Enable );
VOID Sbp2LoginCompletion( PNOTIFICATION_INFO NotificationInfo, NTSTATUS Status );
VOID Sbp2StartNextPacketByKey( IN PDEVICE_OBJECT DeviceObject, IN ULONG Key );
VOID Sbp2StartPacket( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PULONG Key OPTIONAL );
PKDEVICE_QUEUE_ENTRY Sbp2RemoveByKeyDeviceQueueIfBusy ( IN PKDEVICE_QUEUE DeviceQueue, IN ULONG SortKey );
BOOLEAN Sbp2InsertByKeyDeviceQueue( PKDEVICE_QUEUE DeviceQueue, PKDEVICE_QUEUE_ENTRY DeviceQueueEntry, ULONG SortKey );
NTSTATUS Sbp2GetExclusiveValue( IN PDEVICE_OBJECT PhysicalDeviceObject, OUT PULONG Exclusive );
NTSTATUS Sbp2SetExclusiveValue( IN PDEVICE_OBJECT PhysicalDeviceObject, IN PULONG Exclusive );
void Sbp2BusResetNotificationWorker( PDEVICE_OBJECT DeviceObject, PIO_WORKITEM WorkItem );
//
// sbp2scsi.c
//
NTSTATUS Sbp2_ScsiPassThrough( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN BOOLEAN Direct );
#endif
|