|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1993 - Colorado Memory Systems, Inc.
4: All Rights Reserved
5:
6: Module Name:
7:
8: ntalloc.c
9:
10: Abstract:
11:
12: routines to provide storage allocation for cached information and
13: queues.
14:
15: Revision History:
16:
17:
18:
19:
20: --*/
21:
22: #include <ntddk.h>
23: #include <ntddtape.h>
24: #include "common.h"
25: #include "q117.h"
26: #include "protos.h"
27:
28:
29: NTSTATUS
30: q117AllocatePermanentMemory(
31: PQ117_CONTEXT Context,
32: PADAPTER_OBJECT AdapterObject,
33: ULONG NumberOfMapRegisters
34: )
35:
36: /*++
37:
38: Routine Description:
39:
40: Allocates track buffers at init time.
41:
42: Arguments:
43:
44: Context - Current context of the driver
45:
46: Return Value:
47:
48: NT Status
49:
50: --*/
51:
52: {
53: ULONG i;
54: ULONG totalBuffs;
55: PHYSICAL_ADDRESS logicalAddress;
56:
57: Context->AdapterInfo = ExAllocatePool(NonPagedPool,
58: sizeof(*Context->AdapterInfo));
59:
60: if (Context->AdapterInfo == NULL) {
61: return STATUS_INSUFFICIENT_RESOURCES;
62: }
63:
64: Context->AdapterInfo->AdapterObject = AdapterObject;
65: Context->AdapterInfo->NumberOfMapRegisters = NumberOfMapRegisters;
66:
67:
68: //
69: // Allocate a DMA buffer in physically contiguous memory.
70: // For now we allocate one page since this MUST be contiguous.
71: // NOTE: HalAllocateCommonBuffer is really for BUS MASTERS ONLY
72: // but this is the only way we can guarantee that IoMapTransfer
73: // doesn't copy our buffer somewhere else for the device which
74: // doesn't work for autoinit DMA (see Bug 12011).
75: //
76:
77: totalBuffs = 0;
78: for (i = 0; i < UNIX_MAXBFS; i++) {
79: if ((Context->SegmentBuffer[i].logical =
80: HalAllocateCommonBuffer(AdapterObject,
81: BLOCKS_PER_SEGMENT * BYTES_PER_SECTOR,
82: &logicalAddress,
83: FALSE)) == NULL) {
84: break;
85: }
86:
87: ++totalBuffs;
88:
89: CheckedDump(QIC117SHOWTD,("q117: buffer %x ",i,Context->SegmentBuffer[i].logical));
90:
91: CheckedDump(QIC117SHOWTD,("Logical: %x%08x Virtual: %x\n",
92: logicalAddress, Context->SegmentBuffer[i].logical));
93: }
94: Context->SegmentBuffersAvailable = totalBuffs;
95:
96: //
97: // We need at least two buffers to stream
98: //
99: if (totalBuffs < 2) {
100:
101: ExFreePool(Context->AdapterInfo);
102:
103: return STATUS_INSUFFICIENT_RESOURCES;
104: }
105:
106: //
107: // Initialize state information
108: //
109: Context->CurrentOperation.Type = NoOperation;
110: Context->CurrentTape.State = NeedInfoLoaded;
111: Context->DriverOpened = FALSE;
112: Context->CurrentTape.TapeHeader = NULL;
113: Context->IoRequest = NULL;
114: Context->CurrentTape.MediaInfo = NULL;
115:
116: return STATUS_SUCCESS;
117: }
118:
119: STATUS
120: q117GetTemporaryMemory (
121: PQ117_CONTEXT Context
122: )
123:
124: /*++
125:
126: Routine Description:
127:
128: Allocates memory for the bad sector map, the IORequest array
129: at driver open time.
130:
131: Arguments:
132:
133: Context - Current context of the driver
134:
135: Return Value:
136:
137: NT Status
138:
139: --*/
140:
141: {
142:
143: //
144: // Allocate I/O Request array for packets sent to q117i
145: //
146: Context->IoRequest = ExAllocatePool(
147: NonPagedPool,
148: UNIX_MAXBFS * sizeof(IO_REQUEST));
149:
150: //
151: // Allocate current header info
152: //
153:
154: Context->CurrentTape.TapeHeader = ExAllocatePool(
155: NonPagedPool,
156: sizeof(TAPE_HEADER));
157:
158: Context->CurrentTape.BadMapPtr = &(Context->CurrentTape.TapeHeader->BadMap);
159: Context->CurrentTape.BadSectorMapSize = sizeof(BAD_MAP);
160:
161:
162: //
163: // Allocate tape info structure
164: //
165: Context->CurrentTape.MediaInfo = ExAllocatePool(
166: NonPagedPool,
167: sizeof(*Context->CurrentTape.MediaInfo));
168:
169: if ( Context->CurrentTape.TapeHeader == NULL ||
170: Context->IoRequest == NULL ||
171: Context->CurrentTape.MediaInfo == NULL ) {
172:
173: //
174: // Free anything that was allocated
175: //
176: q117FreeTemporaryMemory(Context);
177: return(FMemErr);
178:
179: }
180:
181: return(NoErr);
182: }
183:
184: VOID
185: q117FreeTemporaryMemory (
186: PQ117_CONTEXT Context
187: )
188:
189: /*++
190:
191: Routine Description:
192:
193: Frees memory allocated for the bad sector map, the IORequest
194: array driver open time. This
195: routine is called at driver close time or in the event of a
196: drive error.
197:
198: Arguments:
199:
200: Context - Current context of the driver
201:
202: Return Value:
203:
204: NT Status
205:
206: --*/
207:
208: {
209:
210: //
211: // Free I/O request buffer array
212: //
213: if (Context->IoRequest) {
214: ExFreePool(Context->IoRequest);
215: Context->IoRequest = NULL;
216: }
217:
218: //
219: // Free tape header buffer
220: //
221: if (Context->CurrentTape.TapeHeader) {
222: ExFreePool(Context->CurrentTape.TapeHeader);
223: Context->CurrentTape.TapeHeader = NULL;
224: }
225:
226: //
227: // Free tape information buffer
228: //
229: if (Context->CurrentTape.MediaInfo) {
230: ExFreePool(Context->CurrentTape.MediaInfo);
231: Context->CurrentTape.MediaInfo = NULL;
232: }
233: }
234:
235:
236:
237:
238:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.