|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: * Copyright (c) 1995-1996 NeXT Software, Inc.
27: *
28: * HISTORY
29: *
30: * 11-Dec-95 Dieter Siegmund at NeXT ([email protected])
31: * Split out 21040 and 21041 into separate personalities
32: */
33:
34: #import "DECchip21040.h"
35:
36: //#define DEBUG
37:
38: #import "DECchip2104xInline.h"
39:
40: @implementation DECchip21040
41:
42: /*
43: * Public Instance Methods
44: */
45:
46: - initFromDeviceDescription:(IODeviceDescription *)devDesc
47: {
48: IOPCIDevice *deviceDescription = (IOPCIDevice *)devDesc;
49: const char *interface;
50:
51: if ([super initFromDeviceDescription:devDesc] == nil) {
52: return nil;
53: }
54:
55: #ifdef PERF
56: perfQ = perfGetQueue(OUR_PRODUCER_NAME, &ourProducerId, 0);
57: if (!perfQ)
58: IOLog("%s: perfGetQueue failed\n", OUR_PRODUCER_NAME);
59: else {
60: IOLog("%s: perf logging enabled\n", OUR_PRODUCER_NAME);
61: ev_p.len = sizeof(ev_p);
62: ev_p.producerId = ourProducerId;
63: }
64: #endif PERF
65:
66: [self mapMemoryRange:2 to:(vm_address_t *)&ioBase
67: findSpace:YES cache:IO_CacheOff];
68:
69: irq = [deviceDescription interrupt];
70:
71: /* Select network interface */
72: connector = connectorAUTO_e; /* default is auto select */
73: interface = [[deviceDescription configTable]
74: valueForStringKey: NETWORK_INTERFACE];
75: if (interface != NULL) {
76: int i;
77:
78: for (i = 0; i < NUM_CONNECTOR_TYPES; i++) {
79: if (strcmp(interface, connectorType(i)) == 0) {
80: connector = i;
81: break;
82: }
83: }
84: }
85:
86: [self getStationAddress:&myAddress];
87:
88: if ([self _allocateMemory] == NO) {
89: [self free];
90: return nil;
91: }
92:
93: isPromiscuous = NO;
94: multicastEnabled = NO;
95:
96: /* Inform user what we are upto here */
97: IOLog("DECchip21040 based adapter at port 0x%0x irq %d",
98: ioBase, irq);
99:
100: if (connector != connectorAUTO_e) {
101: IOLog(" interface %s", interface);
102: }
103: IOLog("\n");
104:
105: if (![self resetAndEnable:NO]) {
106: [self free];
107: return nil;
108: }
109:
110: networkInterface = [super attachToNetworkWithAddress:myAddress];
111:
112: return self;
113: }
114:
115: - (void)getStationAddress:(enet_addr_t *)ea
116: {
117: getStationAddress(ioBase, ea);
118: }
119:
120: /*
121: * These are the magic values that need to be written to CSR 12, 14 and 15 to
122: * enable appropriate network interfaces. These values are from the
123: * respective hardware docs.
124: */
125: #define DEC_21040_RESET_SIA 0x0
126:
127: #define DEC_21040_SIA0_10BT 0x00008f01
128: #define DEC_21040_SIA1_10BT 0x0000ffff
129: #define DEC_21040_SIA2_10BT 0x00000000
130:
131: #define DEC_21040_SIA0_AUI 0x0000ef09
132: #define DEC_21040_SIA1_AUI 0x00000705
133: #define DEC_21040_SIA2_AUI 0x00000006
134:
135: #define DEC_21040_SIA0_EXT 0x00008f09
136: #define DEC_21040_SIA1_EXT 0x00000705
137: #define DEC_21040_SIA2_EXT 0x00000006
138:
139: - (void)_setInterface:(connector_t)netInterface
140: {
141: writeCsr(ioBase, DEC_21X40_CSR13, DEC_21040_RESET_SIA);
142: IOSleep(1);
143: switch (netInterface) {
144: case connectorTP_e:
145: writeCsr(ioBase, DEC_21X40_CSR15, DEC_21040_SIA2_10BT);
146: writeCsr(ioBase, DEC_21X40_CSR14, DEC_21040_SIA1_10BT);
147: writeCsr(ioBase, DEC_21X40_CSR13, DEC_21040_SIA0_10BT);
148: break;
149: case connectorAUI_e:
150: writeCsr(ioBase, DEC_21X40_CSR15, DEC_21040_SIA2_AUI);
151: writeCsr(ioBase, DEC_21X40_CSR14, DEC_21040_SIA1_AUI);
152: writeCsr(ioBase, DEC_21X40_CSR13, DEC_21040_SIA0_AUI);
153: break;
154: case connectorBNC_e:
155: writeCsr(ioBase, DEC_21X40_CSR15, DEC_21040_SIA2_EXT);
156: writeCsr(ioBase, DEC_21X40_CSR14, DEC_21040_SIA1_EXT);
157: writeCsr(ioBase, DEC_21X40_CSR13, DEC_21040_SIA0_EXT);
158: break;
159: default:
160: break;
161: }
162: IODelay(100);
163: connector = netInterface;
164: }
165:
166: - (void)selectInterface
167: {
168: csrRegUnion reg;
169: unsigned int time;
170:
171: /*
172: * Auto-selection is done only once.
173: */
174: if (connector != connectorAUTO_e) {
175: [self _setInterface:connector];
176: return;
177: }
178:
179: /*
180: * Try 10Base-T
181: */
182: [self _setInterface:connectorTP_e];
183:
184: /*
185: * Check the SIA TP Link status
186: */
187: time = 1000;
188: while (--time) {
189: IODelay(1000);
190: reg.data = readCsr(ioBase, DEC_21X40_CSR12);
191: if (reg.csr12.lkf == 0) {
192: #ifdef DEBUG
193: IOLog("%s: Using RJ-45 connector\n", [self name]);
194: #endif DEBUG
195: return;
196: }
197: }
198:
199: /*
200: * Try AUI now
201: */
202: [self _setInterface:connectorAUI_e];
203:
204: time = 1000;
205: while (--time) {
206: IODelay(1000);
207: reg.data = readCsr(ioBase, DEC_21X40_CSR12);
208: if (reg.csr12.ncr == 1) {
209: #ifdef DEBUG
210: IOLog("%s: Using BNC connector\n", [self name]);
211: #endif DEBUG
212: [self _setInterface:connectorBNC_e];
213: return;
214: }
215: }
216:
217: #ifdef DEBUG
218: IOLog("%s: Using AUI connector\n", [self name]);
219: #endif DEBUG
220: }
221:
222: @end
223:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.