|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1993 - Colorado Memory Systems, Inc.
4: All Rights Reserved
5:
6: Module Name:
7:
8: drv1nt.c
9:
10: Abstract:
11:
12: Error translation, and NT interface routines for needed driver functions.
13:
14: Revision History:
15:
16:
17:
18:
19: --*/
20:
21: //
22: // include files
23: //
24:
25: #include <ntddk.h> // various NT definitions
26: #include <ntdddisk.h> // disk device driver I/O control codes
27: #include <ntiologc.h>
28: #include "common.h"
29: #include "drvtask.h" // this driver's data declarations
30: #include "mt1defs.h" // this driver's data declarations
31: #include "mt1strc.h" // this driver's data declarations
32: #include "q117data.h" // this driver's data declarations
33: #include "q117log.h"
34:
35:
36: NTSTATUS
37: Q117iTranslateError(
38: IN PDEVICE_OBJECT DeviceObject,
39: IN STATUS ReturnValue
40: )
41: /*++
42:
43:
44: Routine Description:
45:
46:
47:
48: Arguments:
49:
50: ReturnValue -
51:
52: Return Value:
53:
54:
55:
56: --*/
57:
58: {
59: NTSTATUS ntStatus;
60: PTAPE_EXTENSION tapeExtension;
61:
62: tapeExtension = DeviceObject->DeviceExtension;
63:
64: if (tapeExtension->PersistentNewCart &&
65: (ReturnValue == NoErr)) {
66:
67: ReturnValue = NewCart;
68:
69: }
70:
71: if (ReturnValue) {
72:
73: ntStatus = (NTSTATUS)(STATUS_SEVERITY_WARNING << 30);
74: ntStatus |= (FILE_DEVICE_TAPE << 16) & 0x3fff0000;
75: ntStatus |= ReturnValue & 0x0000ffff;
76:
77: if (!tapeExtension->Found) {
78: NTSTATUS logStatus = q117MapStatus(ReturnValue);
79:
80: if (logStatus != QIC117_NOTAPE) {
81: q117LogError(
82: DeviceObject,
83: tapeExtension->ErrorSequence++,
84: 0,
85: 0,
86: ReturnValue,
87: ntStatus,
88: logStatus
89: );
90: }
91: }
92:
93: } else {
94:
95: ntStatus = STATUS_SUCCESS;
96:
97: }
98:
99: return(ntStatus);
100: }
101:
102:
103: STATUS
104: Q117iSleep(
105: IN PTAPE_EXTENSION TapeExtension,
106: IN QIC_TIME WaitTime,
107: IN BOOLEAN InterruptSleep
108: )
109:
110: /*++
111:
112: Routine Description:
113:
114:
115:
116: Arguments:
117:
118: TapeExtension -
119:
120: WaitTime -
121:
122: InterruptSleep -
123:
124: Return Value:
125:
126:
127:
128: --*/
129:
130: {
131: NTSTATUS ntStatus;
132: LARGE_INTEGER timeout;
133:
134: timeout = RtlLargeIntegerNegate(
135: RtlEnlargedIntegerMultiply (
136: (LONG)(10 * 1000),
137: (LONG)WaitTime)
138: );
139:
140: if (InterruptSleep) {
141:
142: ntStatus = KeWaitForSingleObject(
143: &TapeExtension->QControllerData->InterruptEvent,
144: Executive,
145: KernelMode,
146: FALSE,
147: &timeout );
148:
149: if (ntStatus == STATUS_TIMEOUT) {
150:
151: return TimeOut;
152:
153: } else {
154:
155: return NoErr;
156:
157: }
158:
159: } else {
160:
161: (VOID) KeDelayExecutionThread(
162: KernelMode,
163: FALSE,
164: &timeout );
165:
166: return TimeOut;
167:
168: }
169:
170: return NoErr;
171: }
172:
173:
174: VOID
175: Q117iShortTimer(
176: IN QIC_TIME StallTime
177: )
178:
179: /*++
180:
181: Routine Description:
182:
183:
184:
185: Arguments:
186:
187: StallTime -
188:
189: Return Value:
190:
191: None
192:
193: --*/
194:
195: {
196: KeStallExecutionProcessor( StallTime );
197:
198: return;
199: }
200:
201:
202: VOID
203: Q117iResetInterruptEvent(
204: IN PTAPE_EXTENSION TapeExtension
205: )
206:
207: /*++
208:
209: Routine Description:
210:
211:
212:
213: Arguments:
214:
215: TapeExtension -
216:
217: Return Value:
218:
219: None
220:
221: --*/
222:
223: {
224: TapeExtension->QControllerData->CurrentDeviceObject =
225: TapeExtension->QDeviceObject;
226: (VOID) KeResetEvent( &TapeExtension->QControllerData->InterruptEvent );
227:
228: return;
229: }
230:
231:
232: VOID
233: Q117iDLockUnlockDMA(
234: IN PTAPE_EXTENSION TapeExtension,
235: IN BOOLEAN Lock
236: )
237:
238: /*++
239:
240: Routine Description:
241:
242:
243:
244: Arguments:
245:
246: TapeExtension -
247:
248: AdapterInfo -
249:
250: Lock -
251:
252: Return Value:
253:
254: None
255:
256: --*/
257:
258: {
259: KIRQL oldIrql;
260:
261: if (TapeExtension->QControllerData->AdapterObject) {
262:
263: if (Lock) {
264:
265: if (!TapeExtension->QControllerData->AdapterLocked) {
266:
267: //
268: // Allocate an adapter channel for the I/O.
269: //
270:
271: (VOID) KeResetEvent(
272: &TapeExtension->QControllerData->AllocateAdapterChannelEvent );
273:
274: KeRaiseIrql( DISPATCH_LEVEL, &oldIrql );
275:
276:
277: IoAllocateAdapterChannel(
278: TapeExtension->QControllerData->AdapterObject,
279: TapeExtension->QDeviceObject,
280: TapeExtension->QControllerData->NumberOfMapRegisters,
281: Q117iTapeAllocateAdapterChannel,
282: TapeExtension->QControllerData );
283:
284: KeLowerIrql( oldIrql );
285:
286: //
287: // Wait for the adapter to be allocated. No
288: // timeout; we trust the system to do it
289: // properly - so KeWaitForSingleObject can't
290: // return an error.
291: //
292:
293: (VOID) KeWaitForSingleObject(
294: &TapeExtension->QControllerData->AllocateAdapterChannelEvent,
295: Executive,
296: KernelMode,
297: FALSE,
298: (PLARGE_INTEGER) NULL );
299:
300: TapeExtension->QControllerData->AdapterLocked = TRUE;
301: }
302:
303: } else {
304:
305: if (TapeExtension->QControllerData->AdapterLocked) {
306:
307: //
308: // Free the adapter channel that we just used.
309: //
310:
311: KeRaiseIrql( DISPATCH_LEVEL, &oldIrql );
312:
313: IoFreeAdapterChannel( TapeExtension->QControllerData->AdapterObject );
314:
315: KeLowerIrql( oldIrql );
316:
317: TapeExtension->QControllerData->AdapterLocked = FALSE;
318: #if DBG
319: if (QIC117DebugLevel & QIC117SHOWQD) {
320: while (TapeExtension->DbgHead != TapeExtension->DbgTail) {
321:
322: switch(TapeExtension->DbgCommand[TapeExtension->DbgHead]) {
323: case 0x12345678:
324: DbgPrint("\nPgmFdc: ");
325: break;
326: case 0x12345679:
327: DbgPrint("\nReadFdc: ");
328: break;
329: case 0x1234567a:
330: DbgPrint("\nPgmDMA: ");
331: break;
332: case 0x1234567b:
333: DbgPrint("\nSendByte: ");
334: break;
335: case 0x1234567c:
336: DbgPrint(" ReceiveByte: ");
337: break;
338: case 0x1234567d:
339: DbgPrint("\nI/O Status: ");
340: break;
341: default:
342: // Dump command history
343: DbgPrint("%02x ", TapeExtension->DbgCommand[TapeExtension->DbgHead]);
344:
345: }
346:
347: TapeExtension->DbgHead++;
348: if (TapeExtension->DbgHead >= DBG_SIZE) {
349: TapeExtension->DbgHead = 0;
350: }
351:
352:
353: }
354: DbgPrint("\n");
355: }
356:
357: #endif
358:
359:
360: }
361: }
362: }
363:
364:
365: return;
366: }
367:
368:
369: VOID
370: hio_ProgramDMA(
371: IN PTAPE_EXTENSION TapeExtension,
372: IN PIRP Irp,
373: IN BOOLEAN WriteOperation
374: )
375:
376: /*++
377:
378: Routine Description:
379:
380:
381: Arguments:
382:
383: TapeExtension -
384:
385: Irp -
386:
387: WriteOperation -
388:
389: Return Value:
390:
391: None
392:
393: --*/
394:
395: {
396:
397: PHYSICAL_ADDRESS val;
398:
399: Q117iDLockUnlockDMA(TapeExtension, TRUE);
400:
401: //
402: // Map the transfer through the DMA hardware.
403: //
404:
405: KeFlushIoBuffers( Irp->MdlAddress, !WriteOperation, TRUE );
406:
407: DbgAddEntry(0x1234567a);
408: DbgAddEntry((ULONG)TapeExtension->QControllerData->AdapterObject);
409: DbgAddEntry((ULONG)Irp->MdlAddress);
410: DbgAddEntry((ULONG)TapeExtension->QControllerData->MapRegisterBase);
411: DbgAddEntry((ULONG) MmGetMdlVirtualAddress(Irp->MdlAddress)
412: + TapeExtension->RdWrOp.BytesTransferredSoFar );
413: DbgAddEntry(TapeExtension->RdWrOp.TotalBytesOfTransfer);
414: DbgAddEntry(WriteOperation);
415:
416: val = IoMapTransfer(
417: TapeExtension->QControllerData->AdapterObject,
418: Irp->MdlAddress,
419: TapeExtension->QControllerData->MapRegisterBase,
420: (PVOID)( (ULONG) MmGetMdlVirtualAddress(Irp->MdlAddress)
421: + TapeExtension->RdWrOp.BytesTransferredSoFar ),
422: &TapeExtension->RdWrOp.TotalBytesOfTransfer,
423: WriteOperation );
424:
425: DbgAddEntry(val.HighPart);
426: DbgAddEntry(val.LowPart);
427: DbgAddEntry(TapeExtension->RdWrOp.TotalBytesOfTransfer);
428: }
429:
430:
431: VOID
432: hio_FlushDMA(
433: IN PTAPE_EXTENSION TapeExtension,
434: IN PIRP Irp,
435: IN BOOLEAN WriteOperation
436: )
437:
438: /*++
439:
440: Routine Description:
441:
442:
443:
444: Arguments:
445:
446: TapeExtension -
447:
448: Irp -
449:
450: WriteOperation -
451:
452: Return Value:
453:
454: None
455:
456: --*/
457:
458: {
459: IoFlushAdapterBuffers(
460: TapeExtension->QControllerData->AdapterObject,
461: Irp->MdlAddress,
462: TapeExtension->QControllerData->MapRegisterBase,
463: (PVOID)( (ULONG) MmGetMdlVirtualAddress( Irp->MdlAddress )
464: + TapeExtension->RdWrOp.BytesTransferredSoFar ),
465: TapeExtension->RdWrOp.TotalBytesOfTransfer,
466: WriteOperation );
467: }
468:
469:
470: STATUS
471: Q117iDDeselect(
472: IN PTAPE_EXTENSION TapeExtension
473: )
474:
475: /*++
476:
477: Routine Description:
478:
479:
480:
481: Arguments:
482:
483: TapeExtension -
484:
485: Return Value:
486:
487:
488:
489: --*/
490:
491: {
492: STATUS retval = NoErr; // return value
493:
494: if (TapeExtension->QControllerData->AdapterLocked) {
495:
496: Q117iDLockUnlockDMA(TapeExtension, FALSE);
497:
498: }
499:
500: (VOID) Q117iResetFDC(TapeExtension);
501: (VOID) Q117iSelectDrive(TapeExtension);
502: (VOID) Q117iStopTape(TapeExtension);
503: (VOID) Q117iDeselectDrive(TapeExtension);
504:
505: TapeExtension->NoPause = TRUE;
506: TapeExtension->NewCart = FALSE;
507: TapeExtension->QControllerData->CurrentInterrupt = FALSE;
508:
509: CheckedDump(QIC117INFO,( "Q117iDDeselect: Setting Controller Event\n"));
510:
511: (VOID) KeSetEvent(
512: TapeExtension->QControllerData->ControllerEvent,
513: (KPRIORITY) 0,
514: FALSE );
515:
516: return retval;
517: }
518:
519:
520: NTSTATUS
521: Q117iClearIO(
522: IN OUT PIRP Irp
523: )
524:
525: /*++
526:
527: Routine Description:
528:
529:
530:
531: Arguments:
532:
533: Irp -
534:
535: Return Value:
536:
537:
538:
539: --*/
540:
541: {
542: PTAPE_EXTENSION tapeExtension;
543: PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
544:
545:
546: tapeExtension = irpStack->DeviceObject->DeviceExtension;
547: tapeExtension->QDeviceObject = irpStack->DeviceObject;
548:
549: tapeExtension->QControllerData->AbortRequested = FALSE;
550:
551: if (Q117iGetDriveError(tapeExtension) == NotRdy) {
552:
553: Q117iPauseTape(tapeExtension);
554:
555: }
556:
557: if (tapeExtension->NewCart) {
558:
559: Q117iNewTape(tapeExtension);
560:
561: }
562:
563: return STATUS_SUCCESS;
564: }
565:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.