|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: * Copyright (c) 1996 NeXT Software, Inc. ! 24: * ! 25: * i82557eeprom.m ! 26: * - Intel 82557 eeprom access object ! 27: * ! 28: * HISTORY ! 29: * ! 30: * 6-Mar-96 Dieter Siegmund (dieter) at NeXT ! 31: * Created. ! 32: */ ! 33: ! 34: #include <IOKit/network/IOEthernetController.h> ! 35: #include "i82557eeprom.h" ! 36: ! 37: #define super OSObject ! 38: OSDefineMetaClassAndStructors( i82557eeprom, OSObject ) ! 39: ! 40: static __inline__ void ! 41: _logAddr(unsigned char * addr) ! 42: { ! 43: int i; ! 44: for (i = 0; i < NUM_EN_ADDR_BYTES; i++) { ! 45: IOLog("%s%02x", i > 0 ? ":" : "", addr[i]); ! 46: } ! 47: return; ! 48: } ! 49: ! 50: void i82557eeprom::dumpContents() ! 51: { ! 52: EEPROM_t * eeprom_p = &image.fields; ! 53: ! 54: IOLog("The EEPROM contains the following information:\n"); ! 55: ! 56: IOLog("ethernet address: "); ! 57: _logAddr((unsigned char *) &eeprom_p->addr); ! 58: IOLog("\n"); ! 59: ! 60: if (eeprom_p->compatibility_0 & EEPROM_C0_MC_10) ! 61: IOLog("compatibility: MCSETUP workaround required for 10 Mbits\n"); ! 62: if (eeprom_p->compatibility_0 & EEPROM_C0_MC_100) ! 63: IOLog("compatibility: MCSETUP workaround required for 100 Mbits\n"); ! 64: ! 65: IOLog("connectors: %s %s %s %s\n", ! 66: eeprom_p->connectors & EEPROM_CON_RJ45 ? "RJ-45" : "", ! 67: eeprom_p->connectors & EEPROM_CON_BNC ? "BNC" : "", ! 68: eeprom_p->connectors & EEPROM_CON_AUI ? "AUI" : "", ! 69: eeprom_p->connectors & EEPROM_CON_MII ? "MII" : ""); ! 70: ! 71: IOLog("controller type: %d\n", eeprom_p->controllerType); ! 72: ! 73: for (int i = 0; i < NUM_PHYS; i++) { ! 74: char * s = (i == PRIMARY_PHY) ? "primary" : "secondary"; ! 75: UInt16 phy = OSReadLE16(&eeprom_p->phys[i]); ! 76: ! 77: IOLog("%s PHY: %s\n", s, ! 78: PHYDeviceNames(CSR_VALUE(EEPROM_PHY_DEVICE, phy))); ! 79: if (CSR_VALUE(EEPROM_PHY_DEVICE, phy) != PHYDevice_None_e) { ! 80: if (phy & EEPROM_PHY_VSCR) ! 81: IOLog("%s PHY: vendor specific code required\n", s); ! 82: if (phy & EEPROM_PHY_10) ! 83: IOLog("%s PHY: 10 Mbits only, requires 503 interface\n", s); ! 84: IOLog("%s PHY address: 0x%x\n", s, ! 85: CSR_VALUE(EEPROM_PHY_ADDRESS, phy)); ! 86: } ! 87: } ! 88: ! 89: IOLog("PWA Number: %d %d %d-0%d\n", eeprom_p->PWANumber[1], ! 90: eeprom_p->PWANumber[0], eeprom_p->PWANumber[3], ! 91: eeprom_p->PWANumber[2]); ! 92: ! 93: IOLog("Checksum: 0x%x\n", OSReadLE16(&eeprom_p->checkSum)); ! 94: #if 0 ! 95: if (eeprom_p->checkSum != image.words[NUM_EEPROM_WORDS - 1]) ! 96: IOLog("the checksum in the struct doesn't match that in the array\n"); ! 97: #endif ! 98: return; ! 99: } ! 100: ! 101: i82557eeprom * i82557eeprom::withAddress(volatile eeprom_control_t * p) ! 102: { ! 103: i82557eeprom * eeprom = new i82557eeprom; ! 104: ! 105: if (eeprom && !eeprom->initWithAddress(p)) { ! 106: eeprom->release(); ! 107: return 0; ! 108: } ! 109: return eeprom; ! 110: } ! 111: ! 112: bool i82557eeprom::initWithAddress(volatile eeprom_control_t * p) ! 113: { ! 114: int i; ! 115: UInt16 sum; ! 116: ! 117: if (!super::init()) ! 118: return false; ! 119: ! 120: ee_p = p; ! 121: ! 122: /* ! 123: * Find out the number of bits in the address by issuing a read to address ! 124: * 0 ie. keep feeding eeprom address bits with value 0, until the eeprom ! 125: * says that the address is complete. It tells us by setting EEDO to 0 ! 126: * after a write cycle. ! 127: */ ! 128: EEPROMEnable(ee_p); ! 129: EEPROMWriteBit(ee_p, 1); /* read */ ! 130: EEPROMWriteBit(ee_p, 1); ! 131: EEPROMWriteBit(ee_p, 0); ! 132: nbits = 1; ! 133: ! 134: do { ! 135: EEPROMWriteBit(ee_p, 0); ! 136: if ((OSReadLE16(ee_p) & EEPROM_CONTROL_EEDO) == 0) ! 137: break; ! 138: nbits++; ! 139: } while (nbits <= 32); ! 140: ! 141: // IOLog("nbits: %d\n", nbits); ! 142: ! 143: EEPROMDisable(ee_p); ! 144: for (sum = 0, i = 0; i < NUM_EEPROM_WORDS; i++) { ! 145: UInt16 w = readWord(i); ! 146: sum += w; ! 147: OSWriteLE16(&image.words[i], w); ! 148: } ! 149: if (sum != EEPROM_CHECKSUM_VALUE) { ! 150: IOLog("i82557eeprom: checksum %x incorrect\n", sum); ! 151: return false; ! 152: } ! 153: ! 154: return true; ! 155: } ! 156: ! 157: /* READ command bit sequence: 1 1 0 a5a4a3a2a1a0 */ ! 158: UInt16 i82557eeprom::readWord(int offset) ! 159: { ! 160: int i; ! 161: UInt16 value; ! 162: ! 163: EEPROMEnable(ee_p); ! 164: EEPROMWriteBit(ee_p, 1); ! 165: EEPROMWriteBit(ee_p, 1); ! 166: EEPROMWriteBit(ee_p, 0); ! 167: for (i = (nbits - 1); i >= 0; i--) { ! 168: EEPROMWriteBit(ee_p, (offset >> i) & 1); ! 169: } ! 170: value = 0; ! 171: for (i = BITS_IN_SHORT - 1; i >= 0; i--) { ! 172: value |= (EEPROMReadBit(ee_p) << i); ! 173: } ! 174: EEPROMDisable(ee_p); ! 175: return (value); ! 176: } ! 177: ! 178: EEPROM_t * i82557eeprom::getContents() ! 179: { ! 180: return (&image.fields); ! 181: } ! 182:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.