|
|
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.