|
|
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: * i82557.h ! 26: * ! 27: * HISTORY ! 28: * ! 29: * 4-Mar-96 Dieter Siegmund (dieter) at NeXT ! 30: * Created. ! 31: */ ! 32: ! 33: #ifndef _I82557_H ! 34: #define _I82557_H ! 35: ! 36: #include <IOKit/pci/IOPCIDevice.h> ! 37: #include <IOKit/network/IOEthernetController.h> ! 38: #include <IOKit/network/IOEthernetInterface.h> ! 39: #include <IOKit/network/IOOQGateFIFOQueue.h> ! 40: #include <IOKit/network/IOMBufMemoryCursor.h> ! 41: #include <IOKit/network/IOPacketQueue.h> ! 42: #include <IOKit/IOTimerEventSource.h> ! 43: #include <IOKit/IODeviceMemory.h> ! 44: #include <IOKit/IOInterruptEventSource.h> ! 45: #include <IOKit/IOFilterInterruptEventSource.h> ! 46: ! 47: #include "i82557Inline.h" ! 48: #include "i82557eeprom.h" ! 49: #include "i82557PHY.h" ! 50: #include <IOKit/assert.h> ! 51: ! 52: #ifndef __ppc__ ! 53: // ! 54: // Intel interrupt hack. This prevents a hang when the driver ! 55: // services the interrupt. ! 56: // ! 57: #define USE_FILTER_INTERRUPT_EVENT_SRC 1 ! 58: #endif ! 59: ! 60: /* ! 61: * Macro: VPRINT ! 62: * ! 63: * Purpose: ! 64: * Dump stuff to console log if the "Verbose" key is present in ! 65: * the device description. ! 66: */ ! 67: #define VPRINT(fmt, args...) \ ! 68: if (verbose) \ ! 69: IOLog(fmt, ## args); ! 70: ! 71: #define NUM_RECEIVE_FRAMES 32 ! 72: #define NUM_TRANSMIT_FRAMES 32 ! 73: ! 74: #define TRANSMIT_INT_DELAY 8 ! 75: #define TRANSMIT_QUEUE_SIZE 256 ! 76: ! 77: #define MAX_BUF_SIZE (ETHERMAXPACKET + ETHERCRC) ! 78: ! 79: #define SPIN_TIMEOUT 50000 ! 80: #define SPIN_COUNT 1 ! 81: ! 82: /* ! 83: * Type: tcbQ_t ! 84: * ! 85: * Purpose: ! 86: * Hold transmit hardware queue variables. ! 87: */ ! 88: typedef struct { ! 89: int numTcbs; ! 90: tcb_t * activeHead_p; ! 91: tcb_t * activeTail_p; ! 92: tcb_t * freeHead_p; ! 93: int numFree; ! 94: } tcbQ_t; ! 95: ! 96: /* ! 97: * Type: overlay_t ! 98: * ! 99: * Purpose: ! 100: * Overlayable memory used during start-up. ! 101: */ ! 102: typedef union { ! 103: cbHeader_t nop; ! 104: cb_configure_t configure; ! 105: cb_iasetup_t iasetup; ! 106: port_selftest_t selftest; ! 107: } overlay_t; ! 108: ! 109: /* ! 110: * Type: pageBlock_t ! 111: * ! 112: * Purpose: ! 113: * Track a page sized memory block. ! 114: */ ! 115: typedef struct { ! 116: void * memPtr; ! 117: UInt memSize; ! 118: void * memAllocPtr; ! 119: UInt memAvail; ! 120: } pageBlock_t; ! 121: ! 122: /* ! 123: * Adapter activation levels. ! 124: */ ! 125: enum { ! 126: kAdapterLevel0 = 0, ! 127: kAdapterLevel1, ! 128: kAdapterLevel2 ! 129: }; ! 130: ! 131: class Intel82557 : public IOEthernetController ! 132: { ! 133: OSDeclareDefaultStructors(Intel82557) ! 134: ! 135: public: ! 136: IOPhysicalAddress memBasePhysical; ! 137: int irq; ! 138: enet_addr_t myAddress; ! 139: IOEthernetInterface * netif; ! 140: IOKernelDebugger * debugger; ! 141: ! 142: #if USE_FILTER_INTERRUPT_EVENT_SRC ! 143: IOFilterInterruptEventSource * interruptSrc; ! 144: #else ! 145: IOInterruptEventSource * interruptSrc; ! 146: #endif ! 147: ! 148: IOOQGateFIFOQueue * transmitQueue; ! 149: IOTimerEventSource * timerSrc; ! 150: IONetworkStats * netStats; ! 151: IOEthernetStats * etherStats; ! 152: IOMemoryMap * csrMap; ! 153: OSDictionary * mediumDict; ! 154: IONetworkMedium * mediumTable[MEDIUM_TYPE_INVALID]; ! 155: ! 156: IOMBufLittleMemoryCursor * rxMbufCursor; ! 157: IOMBufLittleMemoryCursor * txMbufCursor; ! 158: ! 159: int txCount; ! 160: UInt32 currentLevel; ! 161: bool enabledForNetif; ! 162: bool enabledForDebugger; ! 163: bool promiscuousEnabled; ! 164: bool multicastEnabled; ! 165: bool allMulticastEnabled; ! 166: bool interruptEnabled; ! 167: bool packetsReceived; ! 168: bool packetsTransmitted; ! 169: bool verbose; ! 170: bool flowControl; ! 171: mediumType_t currentMediumType; ! 172: UInt8 phyAddr; ! 173: UInt32 phyID; ! 174: ! 175: /* descriptor and control block data structures */ ! 176: pageBlock_t shared; ! 177: pageBlock_t rxRing; ! 178: pageBlock_t txRing; ! 179: ! 180: CSR_t * CSR_p; ! 181: overlay_t * overlay_p; ! 182: IOPhysicalAddress overlay_paddr; ! 183: errorCounters_t * errorCounters_p; ! 184: IOPhysicalAddress errorCounters_paddr; ! 185: i82557eeprom * eeprom; ! 186: ! 187: /* transmit-related */ ! 188: tcbQ_t tcbQ; ! 189: tcb_t * tcbList_p; ! 190: int prevCUCommand; ! 191: ! 192: /* kernel debugger */ ! 193: tcb_t * KDB_tcb_p; ! 194: void * KDB_buf_p; ! 195: IOPhysicalAddress KDB_buf_paddr; ! 196: ! 197: /* receive-related */ ! 198: rfd_t * rfdList_p; ! 199: rfd_t * headRfd; ! 200: rfd_t * tailRfd; ! 201: ! 202: // -------------------------------------------------- ! 203: // IOService (or its superclass) methods. ! 204: // -------------------------------------------------- ! 205: ! 206: virtual bool init(OSDictionary * properties); ! 207: ! 208: virtual IOService * Intel82557::probe(IOService * provider, ! 209: SInt32 * score); ! 210: ! 211: virtual bool start(IOService * provider); ! 212: virtual void stop(IOService * provider); ! 213: ! 214: virtual void free(); ! 215: ! 216: // -------------------------------------------------- ! 217: // IONetworkController methods. ! 218: // -------------------------------------------------- ! 219: ! 220: virtual IOReturn enable(IONetworkInterface * netif); ! 221: virtual IOReturn disable(IONetworkInterface * netif); ! 222: ! 223: virtual IOReturn enable(IOKernelDebugger * debugger); ! 224: virtual IOReturn disable(IOKernelDebugger * debugger); ! 225: ! 226: virtual void sendPacket(void * pkt, UInt pkt_len); ! 227: virtual void receivePacket(void * pkt, UInt * pkt_len, UInt timeout); ! 228: ! 229: virtual UInt32 outputPacket(struct mbuf * m); ! 230: ! 231: virtual void getPacketBufferConstraints( ! 232: IOPacketBufferConstraints * constraints) const; ! 233: ! 234: virtual IOOutputQueue * createOutputQueue(); ! 235: ! 236: virtual const char * getVendorString() const; ! 237: virtual const char * getModelString() const; ! 238: virtual const char * getRevisionString() const; ! 239: ! 240: virtual IOReturn setMedium(const IONetworkMedium * medium); ! 241: ! 242: virtual bool configureInterface(IONetworkInterface * interface); ! 243: ! 244: // -------------------------------------------------- ! 245: // IOEthernetController methods. ! 246: // -------------------------------------------------- ! 247: ! 248: virtual IOReturn getHardwareAddress(enet_addr_t * addr); ! 249: virtual IOReturn setPromiscuousMode(IOEnetPromiscuousMode mode); ! 250: virtual IOReturn setMulticastMode(IOEnetMulticastMode mode); ! 251: virtual IOReturn setMulticastList(enet_addr_t *addrs, UInt count); ! 252: ! 253: // -------------------------------------------------- ! 254: // Intel82557 driver specific methods. ! 255: // -------------------------------------------------- ! 256: ! 257: bool pciConfigInit(IOPCIDevice * provider); ! 258: bool initDriver(IOService * provider); ! 259: bool coldInit(); ! 260: bool enableAdapter(UInt32 level); ! 261: bool disableAdapter(UInt32 level); ! 262: bool setAdapterLevel(UInt32 newLevel); ! 263: bool config(); ! 264: void disableAdapterInterrupts(); ! 265: void enableAdapterInterrupts(); ! 266: bool hwInit(); ! 267: bool iaSetup(); ! 268: bool mcSetup(enet_addr_t * addrs, UInt count, bool fromData = false); ! 269: bool nop(); ! 270: void sendPortCommand(port_command_t command, UInt arg); ! 271: bool getDefaultSettings(); ! 272: void issueReset(); ! 273: void updateLinkStatus(); ! 274: ! 275: bool _selfTest(); ! 276: bool _allocateMemPage(pageBlock_t * p); ! 277: void _freeMemPage(pageBlock_t * p); ! 278: void _updateStatistics(); ! 279: bool _dumpStatistics(); ! 280: bool _mdiWritePHY(UInt8 phyAddress, UInt8 regAddress, UInt16 data); ! 281: bool _mdiReadPHY(UInt8 phyAddress, UInt8 regAddress, UInt16 * data_p); ! 282: void * _memAllocFrom(pageBlock_t * p, UInt allocSize, UInt align); ! 283: bool _polledCommand(cbHeader_t * hdr_p, IOPhysicalAddress paddr); ! 284: bool _abortReceive(); ! 285: bool _startReceive(); ! 286: void _resetChip(); ! 287: ! 288: bool _initTcbQ(bool enable = false); ! 289: bool _initRfdList(bool enable = false); ! 290: bool _resetRfdList(); ! 291: bool _initRingBuffers() { ! 292: return (_initTcbQ(true) && _initRfdList(true)); } ! 293: bool _clearRingBuffers() { ! 294: return (_initTcbQ(false) && _initRfdList(false)); } ! 295: ! 296: bool _sendPacket(void * pkt, UInt len); ! 297: bool _receivePacket(void * pkt, UInt * len, UInt timeout); ! 298: ! 299: bool updateRFDFromMbuf(rfd_t * rfd_p, struct mbuf * m); ! 300: struct mbuf * updateTCBForMbuf(tcb_t * tcb_p, struct mbuf * m); ! 301: ! 302: #ifdef USE_FILTER_INTERRUPT_EVENT_SRC ! 303: bool checkForInterrupt(IOFilterInterruptEventSource * src); ! 304: #endif ! 305: void interruptOccurred(IOInterruptEventSource * src, int count); ! 306: bool receiveInterruptOccurred(); ! 307: void transmitInterruptOccurred(); ! 308: void timeoutOccurred(IOTimerEventSource * timer); ! 309: ! 310: // -------------------------------------------------- ! 311: // PHY methods. ! 312: // -------------------------------------------------- ! 313: ! 314: bool _phyReset(); ! 315: bool _phyWaitAutoNegotiation(); ! 316: UInt32 _phyGetID(); ! 317: bool _phySetMedium(mediumType_t medium); ! 318: bool _phyProbe(); ! 319: void _phyPublishMedia(); ! 320: bool _phyAddMediumType(UInt32 type, UInt32 speed, UInt32 code); ! 321: ! 322: mediumType_t _phyGetMediumTypeFromBits(bool rate100, ! 323: bool fullDuplex, ! 324: bool t4); ! 325: ! 326: bool _phyGetLinkStatus(bool * linkActive, ! 327: mediumType_t * activeMedium, ! 328: mediumType_t selectedMedium); ! 329: ! 330: IONetworkMedium * _phyGetMediumWithCode(UInt32 code); ! 331: }; ! 332: ! 333: #endif /* !_I82557_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.