|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1990 Microsoft Corporation
4:
5: Module Name:
6:
7: transfer.c
8:
9: Abstract:
10:
11: This file implements the routine that does very architecture
12: specific things.
13:
14: Author:
15:
16: Anthony V. Ercolano (Tonye) 02-Oct-1990
17:
18: Environment:
19:
20: Kernel Mode - Or whatever is the equivalent on OS/2 and DOS.
21:
22: Revision History:
23:
24: Sean Selitrennikoff (SeanSe) 10/20/91
25: Added code to deal with a DecstationPC
26:
27: 31-Jul-1992 R.D. Lanser:
28:
29: Moved DEC TurboChannel (PMAD-AA) code to adapter specific routine.
30:
31: --*/
32:
33:
34: #include <ndis.h>
35: #include <efilter.h>
36: #include <lancehrd.h>
37: #include <lancesft.h>
38:
39:
40: extern
41: BOOLEAN
42: LanceHardwareDetails(
43: IN PLANCE_ADAPTER Adapter
44: )
45:
46: /*++
47:
48: Routine Description:
49:
50: This routine gets the network address from the hardware.
51:
52: Arguments:
53:
54: Adapter - Where to store the network address.
55:
56: Return Value:
57:
58: TRUE - if successful.
59:
60: --*/
61:
62: {
63: UCHAR Signature[] = { 0xff, 0x00, 0x55, 0xaa, 0xff, 0x00, 0x55, 0xaa};
64: UCHAR BytesRead[8];
65:
66: UINT ReadCount;
67:
68: UINT Place;
69:
70: //
71: // Reset E-PROM state
72: //
73: // To do this we first read from the E-PROM address until the
74: // specific signature is reached (then the next bytes read from
75: // the E-PROM address will be the ethernet address of the card).
76: //
77:
78:
79:
80: //
81: // Read first part of the signature
82: //
83:
84: for (Place=0; Place < 8; Place++){
85:
86: NdisReadPortUchar(Adapter->NdisAdapterHandle,
87: (ULONG)(Adapter->NetworkHardwareAddress),
88: &(BytesRead[Place]));
89:
90: }
91:
92: ReadCount = 8;
93:
94: //
95: // This advances to the front of the circular buffer.
96: //
97:
98: while (ReadCount < 40) {
99:
100: //
101: // Check if we have read the signature.
102: //
103:
104: for (Place = 0; Place < 8; Place++){
105:
106: if (BytesRead[Place] != Signature[Place]){
107:
108: Place = 10;
109: break;
110:
111: }
112:
113: }
114:
115: //
116: // If we have read the signature, stop.
117: //
118:
119: if (Place != 10){
120:
121: break;
122:
123: }
124:
125: //
126: // else, move all the bytes down one and read then
127: // next byte.
128: //
129:
130: for (Place = 0; Place < 7; Place++){
131:
132: BytesRead[Place] = BytesRead[Place+1];
133:
134: }
135:
136: NdisReadPortUchar(Adapter->NdisAdapterHandle,
137: (ULONG)(Adapter->NetworkHardwareAddress),
138: &(BytesRead[7]));
139:
140: ReadCount++;
141: }
142:
143:
144: if (ReadCount == 40){
145:
146: return(FALSE);
147:
148: }
149:
150:
151: //
152: // Now read the ethernet address of the card.
153: //
154:
155:
156: NdisReadPortUchar(Adapter->NdisAdapterHandle,
157: (ULONG)(Adapter->NetworkHardwareAddress),
158: &(Adapter->NetworkAddress[0])
159: );
160: NdisReadPortUchar(Adapter->NdisAdapterHandle,
161: (ULONG)(Adapter->NetworkHardwareAddress),
162: &(Adapter->NetworkAddress[1])
163: );
164: NdisReadPortUchar(Adapter->NdisAdapterHandle,
165: (ULONG)(Adapter->NetworkHardwareAddress),
166: &(Adapter->NetworkAddress[2])
167: );
168: NdisReadPortUchar(Adapter->NdisAdapterHandle,
169: (ULONG)(Adapter->NetworkHardwareAddress),
170: &(Adapter->NetworkAddress[3])
171: );
172: NdisReadPortUchar(Adapter->NdisAdapterHandle,
173: (ULONG)(Adapter->NetworkHardwareAddress),
174: &(Adapter->NetworkAddress[4])
175: );
176: NdisReadPortUchar(Adapter->NdisAdapterHandle,
177: (ULONG)(Adapter->NetworkHardwareAddress),
178: &(Adapter->NetworkAddress[5])
179: );
180:
181:
182:
183: if (!(Adapter->LanceCard & (LANCE_DE201 | LANCE_DE422))) {
184:
185: if (Adapter->LanceCard == LANCE_DEPCA){
186:
187: //
188: // Reset Lan Interface port.
189: //
190:
191: NdisWritePortUchar(Adapter->NdisAdapterHandle,
192: (ULONG)(LANCE_DEPCA_LAN_CFG_ADDRESS),
193: 0x00);
194:
195: //
196: // Reset Network Interface Control Status Register
197: //
198:
199: NdisWritePortUshort(Adapter->NdisAdapterHandle, (ULONG)(Adapter->Nicsr), 0x00);
200: }
201:
202: return(TRUE);
203:
204: }
205:
206:
207:
208:
209: //
210: // Now do the EPROM Hardware check as outlined in the tech ref.
211: //
212:
213:
214: //
215: // Check for NULL address.
216: //
217:
218: for (Place = 0; Place < 6; Place++) {
219:
220: if (Adapter->NetworkAddress[Place] != 0) {
221:
222: Place = 10;
223: break;
224:
225: }
226:
227: }
228:
229: if (Place != 10) {
230:
231: return(FALSE);
232:
233: }
234:
235:
236:
237: //
238: // Check that bit 0 is not a 1
239: //
240:
241: if (Adapter->NetworkAddress[0] & 0x1) {
242:
243: return(FALSE);
244:
245: }
246:
247:
248:
249:
250:
251: //
252: // Check that octet[0]->octet[7] == octet[15]->octet[8]
253: //
254:
255: NdisReadPortUchar(Adapter->NdisAdapterHandle,
256: (ULONG)(Adapter->NetworkHardwareAddress),
257: &(BytesRead[6])
258: );
259: NdisReadPortUchar(Adapter->NdisAdapterHandle,
260: (ULONG)(Adapter->NetworkHardwareAddress),
261: &(BytesRead[7])
262: );
263:
264: NdisReadPortUchar(Adapter->NdisAdapterHandle,
265: (ULONG)(Adapter->NetworkHardwareAddress),
266: &(BytesRead[0])
267: );
268: NdisReadPortUchar(Adapter->NdisAdapterHandle,
269: (ULONG)(Adapter->NetworkHardwareAddress),
270: &(BytesRead[1])
271: );
272:
273: if ((BytesRead[7] != BytesRead[0]) ||
274: (BytesRead[6] != BytesRead[1])) {
275:
276: return(FALSE);
277:
278: }
279:
280:
281: NdisReadPortUchar(Adapter->NdisAdapterHandle,
282: (ULONG)(Adapter->NetworkHardwareAddress),
283: &(BytesRead[5])
284: );
285: NdisReadPortUchar(Adapter->NdisAdapterHandle,
286: (ULONG)(Adapter->NetworkHardwareAddress),
287: &(BytesRead[4])
288: );
289: NdisReadPortUchar(Adapter->NdisAdapterHandle,
290: (ULONG)(Adapter->NetworkHardwareAddress),
291: &(BytesRead[3])
292: );
293: NdisReadPortUchar(Adapter->NdisAdapterHandle,
294: (ULONG)(Adapter->NetworkHardwareAddress),
295: &(BytesRead[2])
296: );
297: NdisReadPortUchar(Adapter->NdisAdapterHandle,
298: (ULONG)(Adapter->NetworkHardwareAddress),
299: &(BytesRead[1])
300: );
301: NdisReadPortUchar(Adapter->NdisAdapterHandle,
302: (ULONG)(Adapter->NetworkHardwareAddress),
303: &(BytesRead[0])
304: );
305:
306: for (Place = 0; Place < 6; Place++) {
307:
308: if (BytesRead[Place] != (UCHAR)(Adapter->NetworkAddress[Place])) {
309:
310: return(FALSE);
311:
312: }
313:
314: }
315:
316:
317: //
318: // Check that octet[0]->octet[8] == octet[16]->octet[23]
319: //
320:
321: NdisReadPortUchar(Adapter->NdisAdapterHandle,
322: (ULONG)(Adapter->NetworkHardwareAddress),
323: &(BytesRead[0])
324: );
325: NdisReadPortUchar(Adapter->NdisAdapterHandle,
326: (ULONG)(Adapter->NetworkHardwareAddress),
327: &(BytesRead[1])
328: );
329: NdisReadPortUchar(Adapter->NdisAdapterHandle,
330: (ULONG)(Adapter->NetworkHardwareAddress),
331: &(BytesRead[2])
332: );
333: NdisReadPortUchar(Adapter->NdisAdapterHandle,
334: (ULONG)(Adapter->NetworkHardwareAddress),
335: &(BytesRead[3])
336: );
337: NdisReadPortUchar(Adapter->NdisAdapterHandle,
338: (ULONG)(Adapter->NetworkHardwareAddress),
339: &(BytesRead[4])
340: );
341: NdisReadPortUchar(Adapter->NdisAdapterHandle,
342: (ULONG)(Adapter->NetworkHardwareAddress),
343: &(BytesRead[5])
344: );
345:
346: for (Place = 0; Place < 6; Place++) {
347:
348: if (BytesRead[Place] != (UCHAR)(Adapter->NetworkAddress[Place])) {
349:
350: return(FALSE);
351:
352: }
353:
354: }
355:
356:
357: NdisReadPortUchar(Adapter->NdisAdapterHandle,
358: (ULONG)(Adapter->NetworkHardwareAddress),
359: &(BytesRead[0])
360: );
361: NdisReadPortUchar(Adapter->NdisAdapterHandle,
362: (ULONG)(Adapter->NetworkHardwareAddress),
363: &(BytesRead[1])
364: );
365:
366: if ((BytesRead[6] != BytesRead[0]) ||
367: (BytesRead[7] != BytesRead[1])) {
368:
369: return(FALSE);
370:
371: }
372:
373: //
374: // Check that octet[24] -> octet[31] == signature bytes
375: //
376:
377:
378: for (Place = 0; Place < 8; Place++){
379:
380:
381: NdisReadPortUchar(Adapter->NdisAdapterHandle,
382: (ULONG)(Adapter->NetworkHardwareAddress),
383: &(BytesRead[Place])
384: );
385:
386: if (BytesRead[Place] != Signature[Place]){
387:
388: #if DBG
389: DbgPrint("Lance: Hardware failure\n");
390: #endif
391: return(FALSE);
392:
393: }
394:
395: }
396:
397: if (Adapter->LanceCard == LANCE_DEPCA){
398:
399: //
400: // Reset Lan Interface port.
401: //
402:
403: NdisWritePortUchar(Adapter->NdisAdapterHandle,
404: (ULONG)(LANCE_DEPCA_LAN_CFG_ADDRESS),
405: 0x00);
406:
407: //
408: // Reset Network Interface Control Status Register
409: //
410:
411: NdisWritePortUshort(Adapter->NdisAdapterHandle, (ULONG)(Adapter->Nicsr), 0x00);
412: }
413:
414: if (Adapter->LanceCard & (LANCE_DE201 | LANCE_DE422)) {
415:
416: //
417: // Reset Network Interface Control Status Register
418: //
419:
420: NdisWritePortUshort(Adapter->NdisAdapterHandle, (ULONG)(Adapter->Nicsr), 0x00);
421:
422: }
423:
424: return(TRUE);
425:
426: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.