|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1993 - Colorado Memory Systems, Inc.
4: All Rights Reserved
5:
6: Module Name:
7:
8: receive.c
9:
10: Abstract:
11:
12: Recieve qic117 data bytes.
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:
34:
35: STATUS
36: Q117iReceiveByte(
37: IN PTAPE_EXTENSION TapeExtension,
38: IN SHORT ReceiveLength,
39: OUT USHORT *ReceiveData
40: )
41:
42: /*++
43:
44: Routine Description:
45:
46: Read a byte/word of response data from the FDC. Response data can
47: be drive error/status information or drive configuration information.
48:
49: Wait for Track 0 from the tape drive to go active. This indicates
50: that the drive is ready to start sending data.
51:
52: Alternate sending Report Next Bit commands to the tape drive and
53: sampling Track 0 (response data) from the tape drive until the
54: proper number of response data bits have been read.
55:
56: Read one final data bit from the tape drive which is the confirmation
57: bit. This bit must be a 1 to confirm the transmission.
58:
59: Arguments:
60:
61: TapeExtension -
62:
63: ReceiveLength - Type short used to indicate the desired data length
64:
65: RecieveData - Type unsigned short pointer used to return the received
66: data.
67:
68: Return Value:
69:
70:
71:
72: --*/
73:
74: {
75: STATUS retval = 0;
76: CHAR i = 0;
77: UCHAR stat3;
78: USHORT fdcData= 0;
79: #if DBG
80: BOOLEAN save;
81:
82: // Lockout commands used to receive the status
83: save = TapeExtension->DbgLockout;
84: TapeExtension->DbgLockout = TRUE;
85: #endif
86:
87: if((retval = Q117iWaitActive(TapeExtension)) != NoErr) {
88:
89: return(retval);
90:
91: }
92:
93: do {
94:
95: if((retval = Q117iSendByte(TapeExtension, Rpt_Next_Bit)) != NoErr) {
96:
97: return(retval);
98:
99: }
100:
101: Q117iSleep(TapeExtension,
102: mt_wt2ticks,
103: FALSE
104: );
105:
106:
107: if((retval = Q117iGetStatus(TapeExtension, &stat3)) != NoErr) {
108:
109: return(retval);
110:
111: }
112:
113: fdcData >>= 1;
114: if (stat3 & ST3_T0) {
115:
116: fdcData |= 0x8000;
117:
118: }
119:
120: i++;
121:
122: } while (i < ReceiveLength);
123:
124: //
125: // If the received data is only one byte wide, then shift data to the low
126: // byte of fdcData.
127: //
128:
129: if (ReceiveLength == READ_BYTE) {
130:
131: fdcData >>= READ_BYTE;
132:
133: }
134:
135: //
136: // Return the low byte to the caller.
137: //
138:
139: ((UCHAR *)ReceiveData)[LOW_BYTE] =
140: ((UCHAR *)&fdcData)[LOW_BYTE];
141:
142: //
143: // If the FDC data is a word, then return it to the caller.
144: //
145:
146: if (ReceiveLength == READ_WORD) {
147:
148: ((UCHAR *)ReceiveData)[HI_BYTE] =
149: ((UCHAR *)&fdcData)[HI_BYTE];
150:
151: }
152:
153: if((retval = Q117iSendByte(TapeExtension, Rpt_Next_Bit)) != NoErr) {
154:
155: return(retval);
156:
157: }
158:
159: Q117iSleep(TapeExtension, mt_wt2ticks, FALSE);
160:
161: if((retval = Q117iGetStatus(TapeExtension, &stat3)) != NoErr) {
162:
163: return(retval);
164:
165: }
166:
167: if(!(stat3 & (UCHAR)ST3_T0)) {
168:
169: TapeExtension->FirmwareError = Xmit_Overrun;
170: return(TapeFlt);
171:
172: }
173:
174: #if DBG
175: TapeExtension->DbgLockout = save;
176: DbgAddEntry(0x1234567c);
177: DbgAddEntry(fdcData);
178: #endif
179:
180: return(retval);
181: }
182:
183: STATUS
184: Q117iWaitActive(
185: IN PTAPE_EXTENSION TapeExtension
186: )
187:
188: /*++
189:
190: Routine Description:
191:
192: Wait up to 10ms for tape drive's TRK0 line to go active. 10 ms plus
193: the 5 ms at the end of the Report command (in send_byte) is the
194: specified 15 ms delay for this parameter.
195:
196: Arguments:
197:
198: TapeExtension -
199:
200: Return Value:
201:
202:
203:
204: --*/
205:
206:
207: {
208: STATUS retval;
209: UCHAR stat3;
210:
211: Q117iSleep(TapeExtension, mt_wt2ticks , FALSE);
212:
213: if ((retval = Q117iGetStatus(TapeExtension, &stat3)) != NoErr) {
214:
215: return(retval);
216:
217: }
218:
219: if (!(stat3 & ST3_T0)) {
220:
221: CheckedDump(QIC117WARN,( "Wait active drive fault...\n" ));
222: retval = DriveFlt;
223:
224: }
225:
226: return(retval);
227: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.