Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1057 lines
24 KiB

  1. /*++
  2. Copyright (C) Microsoft Corporation, 1997 - 2001
  3. Module Name:
  4. sbp2port.h
  5. Abstract:
  6. Definitions for SBP2 protocol
  7. Author:
  8. georgioc 22-Jan-97
  9. Environment:
  10. Kernel mode only
  11. Revision History:
  12. --*/
  13. #ifndef _SBP2PORT_
  14. #define _SBP2PORT_
  15. #include "sbp2.h"
  16. #include "debug.h"
  17. #include "ntddsbp2.h"
  18. #include <ntddscsi.h>
  19. #include "portlib.h"
  20. //
  21. // define this if we a re running on a TI controller
  22. //
  23. #if DBG
  24. extern ULONG Sbp2DebugLevel;
  25. #define DEBUGPRINT1(_x_) {if (Sbp2DebugLevel >= 1) \
  26. KdPrint (_x_);}
  27. #define DEBUGPRINT2(_x_) {if (Sbp2DebugLevel >= 2) \
  28. KdPrint (_x_);}
  29. #define DEBUGPRINT3(_x_) {if (Sbp2DebugLevel >= 3) \
  30. KdPrint (_x_);}
  31. #define DEBUGPRINT4(_x_) {if (Sbp2DebugLevel >= 4) \
  32. KdPrint (_x_);}
  33. #else
  34. #define DEBUGPRINT1(_x_)
  35. #define DEBUGPRINT2(_x_)
  36. #define DEBUGPRINT3(_x_)
  37. #define DEBUGPRINT4(_x_)
  38. #endif
  39. //
  40. // Remove lock definitions
  41. //
  42. #define REMLOCK_TIMEOUT 2 // minutes
  43. #define REMLOCK_HIGH_WATERMARK 0x2000 // # irps, devctl.exe test sends *alot*
  44. //
  45. // The following FILE_CHARACTERISTICS_XXX constants are copied from
  46. // NTDDK.H and dup'd here, since we include WDM.H and that doesn't
  47. // support these constants.
  48. //
  49. // The FILE_EXPECT flags will only exist for WinXP. After that they will be
  50. // ignored and an IRP will be sent in their place.
  51. //
  52. #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL 0x00000200
  53. #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL 0x00000300
  54. #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK 0x00000300
  55. //
  56. // pool of preallocate async contexts. Has to be less than
  57. // ((PAGE_SIZE / (SBP2_MIN_ORB_SIZE+sizeof(PASYNC_REQUEST_CONTEXT)))
  58. // The numbers below are chosen so they can work as boundary check masks that are ANDed
  59. // with the current pointer into the continious pool
  60. //
  61. #define MAX_ORB_LIST_DEPTH 8
  62. #define MIN_ORB_LIST_DEPTH 5
  63. typedef struct _IRBIRP {
  64. SLIST_ENTRY ListPointer;
  65. PIRB Irb;
  66. PIRP Irp;
  67. OCTLET Octlet;
  68. } IRBIRP, *PIRBIRP;
  69. typedef struct _ADDRESS_CONTEXT {
  70. PDEVICE_OBJECT DeviceObject;
  71. OCTLET Address;
  72. OCTLET ReservedAddr;
  73. HANDLE AddressHandle;
  74. PMDL RequestMdl;
  75. ULONG TransactionType;
  76. PVOID Reserved;
  77. } ADDRESS_CONTEXT, *PADDRESS_CONTEXT;
  78. typedef struct _PAGE_TABLE_CONTEXT {
  79. ULONG MaxPages;
  80. ULONG NumberOfPages;
  81. POCTLET PageTable;
  82. ADDRESS_CONTEXT AddressContext;
  83. } PAGE_TABLE_CONTEXT, *PPAGE_TABLE_CONTEXT;
  84. #define SBP2_ASYNC_CONTEXT_TAG 0xADEAFFAB
  85. typedef struct _ASYNC_REQUEST_CONTEXT {
  86. LIST_ENTRY OrbList;
  87. SLIST_ENTRY LookasideList;
  88. ULONG Tag;
  89. PDEVICE_OBJECT DeviceObject;
  90. PSCSI_REQUEST_BLOCK Srb;
  91. ULONG Flags;
  92. PORB_NORMAL_CMD CmdOrb;
  93. OCTLET CmdOrbAddress;
  94. PMDL PartialMdl;
  95. PMDL RequestMdl;
  96. PAGE_TABLE_CONTEXT PageTableContext;
  97. HANDLE DataMappingHandle;
  98. KDPC TimerDpc;
  99. KTIMER Timer;
  100. PIRBIRP Packet;
  101. PVOID OriginalSrb;
  102. ULONG OrbListDepth;
  103. } ASYNC_REQUEST_CONTEXT, *PASYNC_REQUEST_CONTEXT;
  104. #define ASYNC_CONTEXT_FLAG_TIMER_STARTED 0x00000001
  105. #define ASYNC_CONTEXT_FLAG_COMPLETED 0x00000002
  106. #define ASYNC_CONTEXT_FLAG_PAGE_ALLOC 0x00000004
  107. #define ASYNC_CONTEXT_FLAG_DATA_ALLOC 0x00000008
  108. #define ASYNC_CONTEXT_FLAG_DATA_ALLOC_FAILED 0x00000010
  109. #define ASYNC_CONTEXT_FLAG_RANG_DOORBELL 0x00000020
  110. #define SBP2_PDO ((ULONG) 'ODPs')
  111. #define SBP2_PDO_DELETED ((ULONG) 'ODPx')
  112. #define SBP2_FDO ((ULONG) 'ODFs')
  113. #define SBP2_MAX_LUNS_PER_NODE 10
  114. #define MAX_GENERIC_NAME_LENGTH 16*sizeof(WCHAR)
  115. // begin new
  116. #define DEVICE_NAME_MAX_CHARS 100*sizeof(WCHAR)
  117. #define UNIQUE_ID_MAX_CHARS 50*sizeof(WCHAR)
  118. #define BASE_SBP2_DEVICE_NAME L"SBP2\\"
  119. // end new
  120. typedef struct _DEVICE_INFORMATION {
  121. PDEVICE_OBJECT DeviceObject;
  122. QUADLET Lun;
  123. QUADLET CmdSetId;
  124. QUADLET CmdSetSpecId;
  125. QUADLET UnitCharacteristics;
  126. PCONFIG_ROM ConfigRom;
  127. OCTLET ManagementAgentBaseReg;
  128. OCTLET CsrRegisterBase;
  129. ULONG MaxClassTransferSize;
  130. UNICODE_STRING uniVendorId; // replaces ModelLeaf
  131. UNICODE_STRING uniModelId; // replaces VendorLeaf
  132. UNICODE_STRING uniGenericName; // replaces GenericName
  133. } DEVICE_INFORMATION, *PDEVICE_INFORMATION;
  134. typedef struct _FDO_DEVICE_EXTENSION {
  135. PDEVICE_OBJECT DeviceObject;
  136. PDEVICE_OBJECT LowerDeviceObject;
  137. ULONG Type;
  138. ULONG DeviceFlags;
  139. ULONG MaxClassTransferSize;
  140. HANDLE Sbp2ObjectDirectory;
  141. PDEVICE_OBJECT Pdo;
  142. PIRP SystemPowerIrp;
  143. DEVICE_POWER_STATE DevicePowerState;
  144. SYSTEM_POWER_STATE SystemPowerState;
  145. ULONG NumPDOsStarted;
  146. KMUTEX EnableBusResetNotificationMutex;
  147. ULONG DeviceListSize;
  148. KSPIN_LOCK DeviceListLock;
  149. DEVICE_INFORMATION DeviceList[SBP2_MAX_LUNS_PER_NODE];
  150. CONFIG_ROM ConfigRom;
  151. FAST_MUTEX ResetMutex;
  152. IO_REMOVE_LOCK RemoveLock;
  153. #if DBG
  154. ULONG ulWorkItemCount;
  155. ULONG ulBusResetMutexCount;
  156. #endif
  157. } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
  158. typedef struct _ARCP_ORB {
  159. PASYNC_REQUEST_CONTEXT AsyncReqCtx;
  160. ORB_NORMAL_CMD Orb;
  161. } ARCP_ORB, *PARCP_ORB;
  162. typedef struct _COMMON_BUFFER_DATA {
  163. ORB_TASK_MNG TaskOrb;
  164. ORB_MNG ManagementOrb;
  165. LOGIN_RESPONSE LoginResponse;
  166. QUERY_LOGIN_RESPONSE QueryLoginResponse;
  167. #if PASSWORD_SUPPORT
  168. ORB_SET_PASSWORD PasswordOrb;
  169. #endif
  170. ARCP_ORB CmdOrbs[MAX_ORB_LIST_DEPTH];
  171. } COMMON_BUFFER_DATA, *PCOMMON_BUFFER_DATA;
  172. typedef struct _DEVICE_EXTENSION {
  173. PDEVICE_OBJECT DeviceObject;
  174. PDEVICE_OBJECT LowerDeviceObject;
  175. ULONG Type;
  176. ULONG DeviceFlags;
  177. PDEVICE_OBJECT BusFdo;
  178. PDEVICE_INFORMATION DeviceInfo;
  179. ULONG MaxOrbListDepth;
  180. KSPIN_LOCK OrbListSpinLock;
  181. LIST_ENTRY PendingOrbList;
  182. ULONG OrbListDepth;
  183. ULONG CurrentKey;
  184. STATUS_FIFO_BLOCK LastStatusBlock;
  185. PASYNC_REQUEST_CONTEXT NextContextToFree;
  186. BOOLEAN AppendToNextContextToFree;
  187. DEVICE_POWER_STATE DevicePowerState;
  188. SYSTEM_POWER_STATE SystemPowerState;
  189. PIRP PowerDeferredIrp;
  190. PIRP DeferredPowerRequest;
  191. ULONG PagingPathCount;
  192. ULONG HibernateCount;
  193. ULONG CrashDumpCount;
  194. ULONG HandleCount;
  195. PULONG IdleCounter;
  196. ULONG Reserved;
  197. NTSTATUS LastTransactionStatus;
  198. LARGE_INTEGER DueTime;
  199. PMDL ReservedMdl; // quadlet only requests
  200. //
  201. // inquiry Data
  202. //
  203. INQUIRYDATA InquiryData;
  204. //
  205. // RBC Device Parameters page
  206. //
  207. MODE_RBC_DEVICE_PARAMETERS_HEADER_AND_PAGE DeviceModeHeaderAndPage;
  208. //
  209. // 1394 addresses to node registers
  210. //
  211. NODE_ADDRESS InitiatorAddressId;
  212. ULONG CurrentGeneration;
  213. //
  214. // node and controller capabilities
  215. //
  216. ULONG MaxControllerPhySpeed;
  217. USHORT OrbReadPayloadMask;
  218. USHORT OrbWritePayloadMask;
  219. GET_LOCAL_HOST_INFO2 HostControllerInformation;
  220. GET_LOCAL_HOST_INFO4 HostRoutineAPI;
  221. //
  222. // Keep a dummy, task and management ORBs around
  223. //
  224. ORB_NORMAL_CMD Dummy;
  225. ADDRESS_CONTEXT DummyContext;
  226. //
  227. //
  228. //
  229. PCOMMON_BUFFER_DATA CommonBuffer;
  230. ADDRESS_CONTEXT CommonBufferContext;
  231. PORB_TASK_MNG TaskOrb;
  232. ADDRESS_CONTEXT TaskOrbContext;
  233. PORB_MNG ManagementOrb;
  234. ADDRESS_CONTEXT ManagementOrbContext;
  235. KEVENT ManagementEvent;
  236. PLOGIN_RESPONSE LoginResponse;
  237. ADDRESS_CONTEXT LoginRespContext;
  238. PQUERY_LOGIN_RESPONSE QueryLoginResponse;
  239. ADDRESS_CONTEXT QueryLoginRespContext;
  240. #if PASSWORD_SUPPORT
  241. PORB_SET_PASSWORD PasswordOrb;
  242. ADDRESS_CONTEXT PasswordOrbContext;
  243. #endif
  244. ADDRESS_CONTEXT OrbPoolContext;
  245. //
  246. //
  247. //
  248. STATUS_FIFO_BLOCK ManagementOrbStatusBlock;
  249. ADDRESS_CONTEXT ManagementOrbStatusContext;
  250. STATUS_FIFO_BLOCK TaskOrbStatusBlock;
  251. ADDRESS_CONTEXT TaskOrbStatusContext;
  252. ADDRESS_CONTEXT GlobalStatusContext;
  253. #if PASSWORD_SUPPORT
  254. STATUS_FIFO_BLOCK PasswordOrbStatusBlock;
  255. ADDRESS_CONTEXT PasswordOrbStatusContext;
  256. KEVENT PasswordEvent;
  257. #endif
  258. //
  259. // single list containing status fifos
  260. //
  261. SLIST_HEADER StatusFifoListHead;
  262. KSPIN_LOCK StatusFifoLock;
  263. //
  264. // pool with the actuall fifo buffer and address_fifo structs
  265. //
  266. PVOID StatusFifoBase;
  267. SLIST_HEADER FreeContextListHead;
  268. //
  269. // look aside for request contexts, and other fixed size requests
  270. //
  271. NPAGED_LOOKASIDE_LIST BusRequestContextPool; // a real lookaside! what a concept...
  272. SLIST_HEADER BusRequestIrpIrbListHead;
  273. KSPIN_LOCK BusRequestLock;
  274. //
  275. // this spin locks are never used on advanced x86s or alphas ( other than 486' than cant do 64 atomic exchange)
  276. //
  277. KSPIN_LOCK FreeContextLock;
  278. //
  279. // The driver keeps a pool of request contexts, and CMD ORBs in its deviceExtension
  280. // We use to lookaside list for the bus driver Irps, Irp request contexts
  281. // and the ORB contexts that have pointers to the SRB, etc
  282. //
  283. PASYNC_REQUEST_CONTEXT AsyncContextBase;
  284. //
  285. // the base va for the pool of orbs is int he reserved field of the address_Context struct
  286. //
  287. KSPIN_LOCK ExtensionDataSpinLock;
  288. //
  289. // used to track time outs in resets, reconnects, etc...
  290. //
  291. KDPC DeviceManagementTimeoutDpc;
  292. KTIMER DeviceManagementTimer;
  293. UNICODE_STRING UniSymLinkName;
  294. //
  295. // Tracks the number of outstanding/deferred calls to
  296. // Sbp2StartNextPacketByKey
  297. //
  298. LONG StartNextPacketCount;
  299. IO_REMOVE_LOCK RemoveLock;
  300. #if DBG
  301. ULONG ulPendingEvents;
  302. ULONG ulInternalEventCount;
  303. #endif
  304. #if PASSWORD_SUPPORT
  305. ULONG Exclusive;
  306. #endif
  307. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
  308. typedef struct _REQUEST_CONTEXT {
  309. PDEVICE_EXTENSION DeviceExtension;
  310. KEVENT Event;
  311. ULONG RequestType;
  312. PIRBIRP Packet;
  313. ULONG Complete;
  314. } REQUEST_CONTEXT, *PREQUEST_CONTEXT;
  315. //
  316. // Useful macros
  317. //
  318. #define octbswap(octlet) {octlet.u.HighQuad.QuadPart = bswap(octlet.u.HighQuad.QuadPart); \
  319. octlet.u.LowQuad.QuadPart = bswap(octlet.u.LowQuad.QuadPart); }
  320. #define min(a,b) (((a) < (b)) ? (a) : (b))
  321. #define max(a,b) (((a) > (b)) ? (a) : (b))
  322. #define RETRIEVE_CONTEXT(pointer,fieldname) \
  323. CONTAINING_RECORD(pointer,ASYNC_REQUEST_CONTEXT,fieldname)
  324. #define SET_FLAG(Flags, Bit) ((Flags) |= (Bit))
  325. #define CLEAR_FLAG(Flags, Bit) ((Flags) &= ~(Bit))
  326. #define TEST_FLAG(Flags, Bit) ((Flags) & (Bit))
  327. //
  328. // One status fifo element for every possible outstanding orb, and a few
  329. // more for unsolicited status
  330. //
  331. #define NUM_PREALLOCATED_STATUS_FIFO_ELEMENTS (2*MAX_ORB_LIST_DEPTH)
  332. #define MIN_PAGE_TABLE_ALLOC_SIZE 64
  333. #define SBP2_ENERGY_IDLE_TIMEOUT 60
  334. #define SBP2_PERF_IDLE_TIMEOUT 60
  335. //
  336. // symbolic link stuff
  337. //
  338. #define SBP2_BASE_DEVICE_NAME L"\\Device\\Sbp2port"
  339. #define SBP2_BASE_SYMBOLIC_LINK_NAME L"\\DosDevices\\Sbp2"
  340. #define SBP2_MAX_SUFFIX_SIZE 5*sizeof(WCHAR)
  341. #define BASE_SBP2_PNP_ID_DEVICE_NAME L"SBP2\\"
  342. #define SBP2_MAX_TEXT_LEAF_LENGTH 0x100
  343. //
  344. // Device state flags
  345. //
  346. #define DEVICE_FLAG_STOPPED 0x00000001
  347. #define DEVICE_FLAG_RESET_IN_PROGRESS 0x00000002
  348. #define DEVICE_FLAG_REMOVED 0x00000004
  349. #define DEVICE_FLAG_LOGIN_IN_PROGRESS 0x00000008
  350. #define DEVICE_FLAG_RECONNECT 0x00000010
  351. #define DEVICE_FLAG_CLAIMED 0x00000020
  352. #define DEVICE_FLAG_INITIALIZING 0x00000040
  353. #define DEVICE_FLAG_QUEUE_LOCKED 0x00000080
  354. #define DEVICE_FLAG_SPC_CMD_SET 0x00000100
  355. #define DEVICE_FLAG_INITIALIZED 0x00000200
  356. #define DEVICE_FLAG_REMOVE_PENDING 0x00000400
  357. #define DEVICE_FLAG_DEVICE_FAILED 0x00000800
  358. #define DEVICE_FLAG_UNSTARTED_AND_REMOVED 0x00001000
  359. #define DEVICE_FLAG_ABSENT_ON_POWER_UP 0x00002000
  360. #define DEVICE_FLAG_SURPRISE_REMOVED 0x00004000
  361. #define DEVICE_FLAG_PNP_STOPPED 0x00008000
  362. #define DEVICE_FLAG_REPORTED_FAILED 0x00010000
  363. //
  364. // timeout values
  365. //
  366. #define SBP2_LOGIN_TIMEOUT 20 // secs
  367. #define SBP2_RELOGIN_DELAY (ULONG)(-1*10*1000*1000) // 1s, 100 ns units
  368. #define SBP2_RECONNECT_TIMEOUT (ULONG)(-2*10*1000*1000) // 2s, 100 ns units
  369. #define SBP2_HARD_RESET_TIMEOUT (ULONG)(-2*10*1000*1000) // 2s, 100 ns units
  370. #define SBP2_RESET_TIMEOUT (ULONG)(-2*10*1000*1000) // 2s, 100 ns units
  371. #define SBP2_MAX_REQUEST_DELAY (ULONG)(-7*10*1000*1000) // 7s, 100 ns units
  372. #if PASSWORD_SUPPORT
  373. #define SBP2_SET_PASSWORD_TIMEOUT (ULONG)(-4*10*1000*1000) // 4s, 100 ns units
  374. #endif
  375. //
  376. // Our pre-allocated page tables must fit in one page of memory (each entry
  377. // is an OCTLET in size). So, the max xfer size equals the number of table
  378. // entries (minus one, in case 1st entry is not a full page of data) times
  379. // the page size
  380. //
  381. #define SBP2_NUM_PAGE_TABLE_ENTRIES (ULONG) (PAGE_SIZE / sizeof (OCTLET))
  382. #define SBP2_MAX_TRANSFER_SIZE (ULONG) \
  383. ((SBP2_NUM_PAGE_TABLE_ENTRIES - 1) * PAGE_SIZE)
  384. #define SBP2_MAX_CDB_SIZE 12
  385. #define SBP2_LOGIN_RETRIES 2
  386. #define SBP2_SYNCHRONOUS_RETRIES 3
  387. #define SBP2_ASYNC_RETRIES 2
  388. //
  389. // Minimum unit directory entries that will make this device a proper SBP-2 device
  390. //
  391. #define SBP2_MIN_UNIT_DIR_ENTRIES 2
  392. //
  393. // Masks used to decode the status block and for setting up the ORB flags
  394. //
  395. #define STATUS_BLOCK_UNSOLICITED_BIT_MASK 0x8000 // bit 15
  396. #define STATUS_BLOCK_ENDOFLIST_BIT_MASK 0x4000 // bit 14
  397. #define STATUS_BLOCK_RESP_MASK 0x3000 // protect bits 12-13 (0-15)
  398. #define STATUS_BLOCK_SBP_STATUS_MASK 0x00FF // protect bits 0-7 (0-15)
  399. #define STATUS_BLOCK_DEAD_BIT_MASK 0x0800 // protect bits 0-7 (0-15)
  400. #define STATUS_BLOCK_LEN_MASK 0x0800 // protect bits 0-7 (0-15)
  401. #define STATUS_BLOCK_SFMT_MASK 0xC0 // protect bits 15,14 of second octlet
  402. #define SBP2_ALIGNMENT_MASK FILE_LONG_ALIGNMENT
  403. //
  404. // status type , if the SFMT field is 0 or 1
  405. //
  406. #define SENSE_DATA_STATUS_BLOCK 0x00
  407. #define SENSE_DATA_DEFF_STATUS_BLOCK 0x01
  408. //
  409. // Status types
  410. //
  411. #define DUMMY_ORB_STATUS_BLOCK 0x01
  412. #define TASK_STATUS_BLOCK 0x02
  413. #define MANAGEMENT_STATUS_BLOCK 0x04
  414. #define CMD_ORB_STATUS_BLOCK 0x08
  415. #define UNSOLICITED_STATUS_BLOCK 0x10
  416. #if PASSWORD_SUPPORT
  417. #define PASSWORD_STATUS_BLOCK 0x20
  418. #endif
  419. #define ORB_PAGE_TABLE_BIT_MASK 0x0008
  420. #define ORB_DIRECTION_BIT_MASK 0x0800
  421. #define ORB_NOTIFY_BIT_MASK 0x8000
  422. #define ORB_DUMMY_RQ_FMT_VALUE 0x6000
  423. #define ORB_MNG_RQ_FMT_VALUE 0x0000
  424. #define ORB_MNG_EXCLUSIVE_BIT_MASK 0x1000
  425. //
  426. // 1394 transaction layer allowed timeouts
  427. //
  428. #define BUSY_TIMEOUT_SETTING 0x0000000F
  429. //
  430. // Values used to indicate what data structure we are swapping (little->Big->little endian)
  431. //
  432. #define SWAP_LOGIN_RESPONSE_BLOCK 0
  433. #define SWAP_LOGIN_ORB 1
  434. #define SWAP_NORMAL_CMD_ORB 2
  435. #define SWAP_STATUS_BLOCK 3
  436. //
  437. // request types for sending small read/writes to the bus driver
  438. //
  439. #define ASYNC_1394_REQUEST 0x01
  440. #define SYNC_1394_REQUEST 0x02
  441. #define ASYNC_SYNC_1394_REQUEST 0x03
  442. //
  443. // different values for exclusive flag
  444. //
  445. #if PASSWORD_SUPPORT
  446. #define EXCLUSIVE_FLAG_CLEAR 0x00000000 // no password
  447. #define EXCLUSIVE_FLAG_SET 0x00000001 // password is set
  448. #define EXCLUSIVE_FLAG_ENABLE 0x00000002 // password needs to be enabled
  449. #endif
  450. //
  451. // Function definitions
  452. //
  453. VOID
  454. AllocateIrpAndIrb(
  455. IN PDEVICE_EXTENSION DeviceExtension,
  456. IN PIRBIRP *Packet
  457. );
  458. NTSTATUS
  459. AllocateAddressForStatus(
  460. IN PDEVICE_OBJECT DeviceObject,
  461. IN PADDRESS_CONTEXT Context,
  462. IN UCHAR StatusType
  463. );
  464. NTSTATUS
  465. AllocateSingle1394Address(
  466. IN PDEVICE_OBJECT DeviceObject,
  467. IN PVOID Buffer,
  468. IN ULONG Length,
  469. IN ULONG AccessType,
  470. IN OUT PADDRESS_CONTEXT Context
  471. );
  472. NTSTATUS
  473. CheckStatusResponseValue(
  474. IN PSTATUS_FIFO_BLOCK Status
  475. );
  476. VOID
  477. CleanupOrbList(
  478. PDEVICE_EXTENSION DeviceExtension,
  479. NTSTATUS CompletionStatus
  480. );
  481. BOOLEAN
  482. ConvertSbp2SenseDataToScsi(
  483. IN PSTATUS_FIFO_BLOCK StatusBlock,
  484. OUT PVOID SenseBuffer,
  485. IN ULONG SenseBufferLength
  486. );
  487. VOID
  488. Create1394TransactionForSrb(
  489. IN PDEVICE_EXTENSION DeviceExtension,
  490. IN PSCSI_REQUEST_BLOCK Srb,
  491. IN OUT PASYNC_REQUEST_CONTEXT *Context
  492. );
  493. VOID
  494. DeAllocateIrpAndIrb(
  495. IN PDEVICE_EXTENSION DeviceExtension,
  496. IN PIRBIRP Packet
  497. );
  498. VOID
  499. Free1394DataMapping(
  500. PDEVICE_EXTENSION DeviceExtension,
  501. PASYNC_REQUEST_CONTEXT Context
  502. );
  503. VOID
  504. FreeAddressRange(
  505. IN PDEVICE_EXTENSION DeviceExtension,
  506. IN PADDRESS_CONTEXT Context
  507. );
  508. ULONG
  509. FreeAsyncRequestContext(
  510. PDEVICE_EXTENSION DeviceExtension,
  511. PASYNC_REQUEST_CONTEXT Context
  512. );
  513. NTSTATUS
  514. Sbp2_SCSI_RBC_Conversion(
  515. IN PASYNC_REQUEST_CONTEXT Context
  516. );
  517. NTSTATUS
  518. Sbp2AccessRegister(
  519. PDEVICE_EXTENSION DeviceExtension,
  520. PVOID Data,
  521. USHORT Register
  522. );
  523. NTSTATUS
  524. Sbp2BusMapTransfer(
  525. PDEVICE_EXTENSION DeviceExtension,
  526. PASYNC_REQUEST_CONTEXT CallbackContext
  527. );
  528. void
  529. Sbp2BusResetNotification(
  530. PFDO_DEVICE_EXTENSION FdoExtension
  531. );
  532. BOOLEAN
  533. Sbp2CleanDeviceExtension(
  534. IN PDEVICE_OBJECT DeviceObject,
  535. BOOLEAN DeviceRemoved
  536. );
  537. VOID
  538. Sbp2ConvertScsiToReducedCommandSet(
  539. IN PDEVICE_EXTENSION DeviceExtension,
  540. IN PSCSI_REQUEST_BLOCK Srb
  541. );
  542. VOID
  543. Sbp2AllocComplete(
  544. IN PASYNC_REQUEST_CONTEXT CallbackContext
  545. );
  546. VOID
  547. Sbp2CreateRequestErrorLog(
  548. IN PDEVICE_OBJECT DeviceObject,
  549. IN PASYNC_REQUEST_CONTEXT Context,
  550. IN NTSTATUS Status
  551. );
  552. VOID
  553. Sbp2DeferPendingRequest(
  554. IN PDEVICE_EXTENSION DeviceExtension,
  555. IN PIRP Irp
  556. );
  557. VOID
  558. Sbp2DeviceManagementTimeoutDpc(
  559. IN PKDPC Dpc,
  560. IN PDEVICE_EXTENSION DeviceExtension,
  561. IN PVOID SystemArgument1,
  562. IN PVOID SystemArgument2
  563. );
  564. NTSTATUS
  565. Sbp2Get1394ConfigInfo(
  566. PFDO_DEVICE_EXTENSION DeviceExtension,
  567. PSBP2_REQUEST Sbp2Req
  568. );
  569. RCODE
  570. Sbp2GlobalStatusCallback(
  571. IN PNOTIFICATION_INFO NotificationInfo
  572. );
  573. NTSTATUS
  574. Sbp2GetControllerInfo(
  575. IN PDEVICE_EXTENSION DeviceExtension
  576. );
  577. NTSTATUS
  578. Sbp2HandleApiRequest(
  579. IN PDEVICE_EXTENSION DeviceExtension,
  580. IN PIRP Irp
  581. );
  582. VOID
  583. Sbp2HandleRemove(
  584. IN PDEVICE_OBJECT DeviceObject
  585. );
  586. VOID
  587. Sbp2HandleUnsolicited(
  588. IN PDEVICE_EXTENSION DeviceExtension,
  589. IN PSTATUS_FIFO_BLOCK StatusFifo
  590. );
  591. NTSTATUS
  592. Sbp2IssueInternalCommand(
  593. IN PDEVICE_EXTENSION DeviceExtension,
  594. IN UCHAR Scsiop
  595. );
  596. NTSTATUS
  597. Sbp2InitializeDeviceExtension(
  598. IN PDEVICE_EXTENSION DeviceExtension
  599. );
  600. VOID
  601. Sbp2InitializeOrb(
  602. IN PDEVICE_EXTENSION DeviceExtendion,
  603. PASYNC_REQUEST_CONTEXT CallbackContext
  604. );
  605. VOID
  606. Sbp2InsertTailList(
  607. IN PDEVICE_EXTENSION DeviceExtension,
  608. IN PASYNC_REQUEST_CONTEXT Context
  609. );
  610. NTSTATUS
  611. Sbp2Issue1394BusReset (
  612. IN PDEVICE_EXTENSION DeviceExtension
  613. );
  614. NTSTATUS
  615. Sbp2ManagementTransaction(
  616. IN PDEVICE_EXTENSION DeviceExtension,
  617. ULONG Type
  618. );
  619. #if PASSWORD_SUPPORT
  620. NTSTATUS
  621. Sbp2SetPasswordTransaction(
  622. IN PDEVICE_EXTENSION DeviceExtension,
  623. IN ULONG Type
  624. );
  625. RCODE
  626. Sbp2SetPasswordOrbStatusCallback(
  627. IN PNOTIFICATION_INFO NotificationInfo
  628. );
  629. #endif
  630. RCODE
  631. Sbp2ManagementOrbStatusCallback(
  632. IN PNOTIFICATION_INFO NotificationInfo
  633. );
  634. VOID
  635. Sbp2ParseTextLeaf(
  636. PFDO_DEVICE_EXTENSION DeviceExtension,
  637. PVOID UnitDepDir,
  638. PIO_ADDRESS ModelLeafLocation,
  639. PVOID *ModelLeaf
  640. );
  641. NTSTATUS
  642. Sbp2PreAllocateLists(
  643. IN PDEVICE_EXTENSION DeviceExtension
  644. );
  645. NTSTATUS
  646. Sbp2QueryProperty(
  647. IN PDEVICE_OBJECT DeviceObject,
  648. IN PIRP QueryIrp
  649. );
  650. VOID
  651. Sbp2RequestTimeoutDpc(
  652. IN PKDPC Dpc,
  653. IN PDEVICE_EXTENSION DeviceExtension,
  654. IN PVOID SystemArgument1,
  655. IN PVOID SystemArgument2
  656. );
  657. VOID
  658. Sbp2Reset(
  659. PDEVICE_OBJECT DeviceObject,
  660. BOOLEAN Cleanup
  661. );
  662. NTSTATUS
  663. Sbp2RequestCompletionRoutine(
  664. IN PDEVICE_OBJECT DeviceObject,
  665. IN PIRP Irp,
  666. IN PREQUEST_CONTEXT Context
  667. );
  668. VOID
  669. Sbp2PdoDIrpCompletion(
  670. IN PDEVICE_OBJECT DeviceObject,
  671. IN UCHAR MinorFunction,
  672. IN POWER_STATE PowerState,
  673. IN PIRP SIrp,
  674. IN PIO_STATUS_BLOCK IoStatus
  675. );
  676. NTSTATUS
  677. Sbp2ScsiRequests
  678. (
  679. IN PDEVICE_OBJECT DeviceObject,
  680. IN PIRP Irp
  681. );
  682. VOID
  683. Sbp2StartIo(
  684. IN PDEVICE_OBJECT DeviceObject,
  685. IN PIRP Irp
  686. );
  687. NTSTATUS
  688. Sbp2SendRequest(
  689. PDEVICE_EXTENSION DeviceExtension,
  690. PIRBIRP Packet,
  691. ULONG TransferMode
  692. );
  693. RCODE
  694. Sbp2TaskOrbStatusCallback(
  695. IN PNOTIFICATION_INFO NotificationInfo
  696. );
  697. NTSTATUS
  698. Sbp2UpdateNodeInformation(
  699. PDEVICE_EXTENSION DeviceExtension
  700. );
  701. NTSTATUS
  702. Sbp2FdoSIrpCompletion(
  703. IN PDEVICE_OBJECT DeviceObject,
  704. IN PIRP Irp,
  705. IN PVOID Unused
  706. );
  707. VOID
  708. Sbp2FdoDIrpCompletion(
  709. IN PDEVICE_OBJECT TargetDeviceObject,
  710. IN UCHAR MinorFunction,
  711. IN POWER_STATE PowerState,
  712. IN PFDO_DEVICE_EXTENSION FdoExtension,
  713. IN PIO_STATUS_BLOCK IoStatus
  714. );
  715. BOOLEAN
  716. Sbp2EnableBusResetNotification(
  717. PDEVICE_EXTENSION DeviceExtension,
  718. BOOLEAN Enable
  719. );
  720. VOID
  721. Sbp2LoginCompletion(
  722. PNOTIFICATION_INFO NotificationInfo,
  723. NTSTATUS Status
  724. );
  725. VOID
  726. Sbp2StartNextPacketByKey(
  727. IN PDEVICE_OBJECT DeviceObject,
  728. IN ULONG Key
  729. );
  730. VOID
  731. Sbp2StartPacket(
  732. IN PDEVICE_OBJECT DeviceObject,
  733. IN PIRP Irp,
  734. IN PULONG Key OPTIONAL
  735. );
  736. PKDEVICE_QUEUE_ENTRY
  737. Sbp2RemoveByKeyDeviceQueueIfBusy (
  738. IN PKDEVICE_QUEUE DeviceQueue,
  739. IN ULONG SortKey
  740. );
  741. BOOLEAN
  742. Sbp2InsertByKeyDeviceQueue(
  743. PKDEVICE_QUEUE DeviceQueue,
  744. PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
  745. ULONG SortKey
  746. );
  747. NTSTATUS
  748. Sbp2GetExclusiveValue(
  749. IN PDEVICE_OBJECT PhysicalDeviceObject,
  750. OUT PULONG Exclusive
  751. );
  752. NTSTATUS
  753. Sbp2SetExclusiveValue(
  754. IN PDEVICE_OBJECT PhysicalDeviceObject,
  755. IN PULONG Exclusive
  756. );
  757. void
  758. Sbp2BusResetNotificationWorker(
  759. PDEVICE_OBJECT DeviceObject,
  760. PIO_WORKITEM WorkItem
  761. );
  762. //
  763. // sbp2scsi.c
  764. //
  765. NTSTATUS
  766. Sbp2_ScsiPassThrough(
  767. IN PDEVICE_OBJECT DeviceObject,
  768. IN PIRP Irp,
  769. IN BOOLEAN Direct
  770. );
  771. #endif