|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1993 - Colorado Memory Systems, Inc.
4: All Rights Reserved
5:
6: Module Name:
7:
8: newtrkrc.c
9:
10: Abstract:
11:
12: These routines handle streaming during reads.
13:
14: Revision History:
15:
16:
17:
18:
19: --*/
20:
21: #include <ntddk.h>
22: #include <ntddtape.h>
23: #include "common.h"
24: #include "q117.h"
25: #include "protos.h"
26:
27:
28: STATUS
29: q117NewTrkRC(
30: IN OUT PQ117_CONTEXT Context
31: )
32:
33: /*++
34:
35: Routine Description:
36:
37: This routine queues up all segment buffers for reading and waits
38: on the first to be complete. Then it calles ReconstructSegment to reconstruct
39: the segment with Reed-Solomon and heroic retries.
40:
41: Arguments:
42:
43: Context -
44:
45: Return Value:
46:
47: Error
48:
49:
50: --*/
51:
52: {
53: STATUS ret; // Return value from other routines called.
54: PIO_REQUEST ioreq; // iorequest struct just finished.
55:
56: //
57: // if we processed the last block then try to link
58: //
59: if (Context->CurrentOperation.LastSegmentRead ==
60: Context->CurrentOperation.LastSegment &&
61: q117QueueEmpty(Context)) {
62: ret = EndTapeErr;
63: }
64:
65: //
66: // make sure the queue is full
67: //
68: while ( Context->CurrentOperation.CurrentSegment <=
69: Context->CurrentOperation.LastSegment &&
70: !q117QueueFull(Context) ) {
71:
72: //
73: // We need to skip segments with less than
74: // ECC_BLOCKS_PER_SEGMENT+1 sectors (QIC40 spec)
75: //
76: if ( q117GoodDataBytes(Context->CurrentOperation.CurrentSegment,
77: Context) ) {
78:
79: if ( ret = q117IssIOReq(
80: (PVOID)NULL,
81: DRead,
82: (LONG)Context->CurrentOperation.CurrentSegment *
83: BLOCKS_PER_SEGMENT,
84: NULL,
85: Context)) {
86: return(ret);
87: }
88: }
89: ++Context->CurrentOperation.CurrentSegment;
90: }
91:
92: //
93: // now get current request
94: //
95: ioreq = q117Dequeue(WaitForItem,Context);
96:
97: Context->CurrentOperation.LastSegmentRead =
98: (SEGMENT)(ioreq->Block/BLOCKS_PER_SEGMENT);
99:
100: if (ioreq->Status != BadBlk && ioreq->Status) {
101: return(ioreq->Status);
102: }
103:
104: //
105: // correct data segment with Reed-Solomon and Heroic retries
106: //
107: ret = q117ReconstructSegment(ioreq,Context);
108:
109: //
110: // setup current segment information (used in ReadTape,
111: // SkipBlock and ReqRB)
112: //
113: Context->CurrentOperation.SegmentBytesRemaining =
114: q117GoodDataBytes(Context->CurrentOperation.LastSegmentRead,
115: Context);
116:
117: Context->CurrentOperation.SegmentPointer = ioreq->Data;
118:
119: Context->CurrentOperation.SegmentStatus = ret;
120:
121: return(ret);
122: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.