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