|
|
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) 1998-1999 by Apple Computer, Inc., All rights reserved. ! 24: * ! 25: * Interface definition for the BMac Ethernet Controller ! 26: * ! 27: * HISTORY ! 28: * ! 29: * Dec 10, 1998 jliu ! 30: * Converted to IOKit/C++. ! 31: */ ! 32: ! 33: #ifndef _BMACENET_H ! 34: #define _BMACENET_H ! 35: ! 36: #include <IOKit/network/IOEthernetController.h> ! 37: #include <IOKit/network/IOEthernetInterface.h> ! 38: #include <IOKit/network/IOOQGateFIFOQueue.h> ! 39: #include <IOKit/IOInterruptEventSource.h> ! 40: #include <IOKit/IOTimerEventSource.h> ! 41: #include <IOKit/network/IOMBufMemoryCursor.h> ! 42: #include <IOKit/IODeviceMemory.h> ! 43: #include <IOKit/ppc/IODBDMA.h> ! 44: #include <string.h> /* bcopy */ ! 45: #include "BMacEnetRegisters.h" ! 46: ! 47: extern "C" { ! 48: #include <sys/param.h> ! 49: #include <sys/mbuf.h> ! 50: } ! 51: ! 52: // No kernel tracing support at this time. ! 53: // ! 54: #define KERNEL_DEBUG(x,a,b,c,d,e) ! 55: ! 56: // #define IOLog kprintf ! 57: ! 58: typedef void * IOPPCAddress; ! 59: ! 60: typedef struct enet_dma_cmd_t ! 61: { ! 62: IODBDMADescriptor desc_seg[2]; ! 63: } enet_dma_cmd_t; ! 64: ! 65: typedef struct enet_txdma_cmd_t ! 66: { ! 67: IODBDMADescriptor desc_seg[3]; ! 68: } enet_txdma_cmd_t; ! 69: ! 70: class BMacEnet : public IOEthernetController ! 71: { ! 72: OSDeclareDefaultStructors(BMacEnet) ! 73: ! 74: private: ! 75: volatile IOPPCAddress ioBaseEnet; ! 76: volatile IOPPCAddress ioBaseHeathrow; ! 77: volatile IODBDMAChannelRegisters *ioBaseEnetRxDMA; ! 78: volatile IODBDMAChannelRegisters *ioBaseEnetTxDMA; ! 79: ! 80: enet_addr_t myAddress; ! 81: IOEthernetInterface * networkInterface; ! 82: IOOQGateFIFOQueue * transmitQueue; ! 83: IOPacketQueue * debugQueue; ! 84: IOKernelDebugger * debugger; ! 85: bool isPromiscuous; ! 86: bool multicastEnabled; ! 87: bool isFullDuplex; ! 88: ! 89: IOInterruptEventSource *rxIntSrc; ! 90: IOMemoryMap * maps[MEMORY_MAP_COUNT]; ! 91: IONetworkStats * netStats; ! 92: IOTimerEventSource * timerSrc; ! 93: IOMBufBigMemoryCursor * mbufCursor; ! 94: ! 95: bool ready; ! 96: bool netifClient; ! 97: bool debugClient; ! 98: bool debugTxPoll; ! 99: bool useUnicastFilter; ! 100: unsigned int enetAddressOffset; ! 101: ! 102: unsigned long chipId; ! 103: ! 104: unsigned long phyType; ! 105: unsigned long phyMIIDelay; ! 106: ! 107: unsigned char phyId; ! 108: unsigned char sromAddressBits; ! 109: ! 110: unsigned short phyStatusPrev; ! 111: ! 112: struct mbuf * txMbuf[TX_RING_LENGTH]; ! 113: struct mbuf * rxMbuf[RX_RING_LENGTH]; ! 114: struct mbuf * txDebuggerPkt; ! 115: ! 116: unsigned int txCommandHead; // Transmit ring descriptor index ! 117: unsigned int txCommandTail; ! 118: unsigned int txMaxCommand; ! 119: unsigned int rxCommandHead; // Receive ring descriptor index ! 120: unsigned int rxCommandTail; ! 121: unsigned int rxMaxCommand; ! 122: ! 123: struct { ! 124: void *ptr; ! 125: u_int size; ! 126: void *ptrReal; ! 127: u_int sizeReal; ! 128: } dmaMemory; ! 129: ! 130: unsigned char * dmaCommands; ! 131: enet_txdma_cmd_t * txDMACommands; // TX descriptor ring ptr ! 132: unsigned int txDMACommandsPhys; ! 133: ! 134: enet_dma_cmd_t * rxDMACommands; // RX descriptor ring ptr ! 135: unsigned int rxDMACommandsPhys; ! 136: ! 137: u_int32_t txWDInterrupts; ! 138: u_int32_t txWDCount; ! 139: ! 140: void * debuggerPkt; ! 141: u_int32_t debuggerPktSize; ! 142: ! 143: u_int16_t statReg; // Current STAT register contents ! 144: ! 145: u_int16_t hashTableUseCount[64]; ! 146: u_int16_t hashTableMask[4]; ! 147: ! 148: bool _allocateMemory(); ! 149: bool _initTxRing(); ! 150: bool _initRxRing(); ! 151: bool _initChip(); ! 152: void _resetChip(); ! 153: void _disableAdapterInterrupts(); ! 154: void _enableAdapterInterrupts(); ! 155: void _setDuplexMode(bool duplexMode); ! 156: void _startChip(); ! 157: bool _updateDescriptorFromMbuf(struct mbuf * m, enet_dma_cmd_t *desc, ! 158: bool isReceive); ! 159: void _restartTransmitter(); ! 160: void _stopTransmitDMA(); ! 161: bool _transmitPacket(struct mbuf * packet); ! 162: bool _transmitInterruptOccurred(); ! 163: bool _debugTransmitInterruptOccurred(); ! 164: bool _receiveInterruptOccurred(); ! 165: bool _rejectBadUnicastPacket(ether_header_t * etherHeader); ! 166: bool _receivePackets(bool fDebugger); ! 167: void _packetToDebugger(struct mbuf * packet, u_int size); ! 168: void _restartReceiver(); ! 169: void _stopReceiveDMA(); ! 170: bool _resetAndEnable(bool enable); ! 171: void _sendDummyPacket(); ! 172: void _resetHashTableMask(); ! 173: void _addToHashTableMask(u_int8_t *addr); ! 174: void _removeFromHashTableMask(u_int8_t *addr); ! 175: void _updateBMacHashTableMask(); ! 176: ! 177: #ifdef DEBUG ! 178: void _dumpRegisters(); ! 179: void _dumpDesc(void * addr, u_int32_t size); ! 180: void _dump_srom(); ! 181: #endif DEBUG ! 182: ! 183: void _sendPacket(void *pkt, unsigned int pkt_len); ! 184: void _receivePacket(void *pkt, unsigned int *pkt_len, unsigned int ! 185: timeout); ! 186: ! 187: void sendPacket(void *pkt, unsigned int pkt_len); ! 188: void receivePacket(void *pkt, unsigned int *pkt_len, unsigned int timeout); ! 189: ! 190: bool miiReadWord(unsigned short *dataPtr, unsigned short reg, ! 191: unsigned char phy); ! 192: bool miiWriteWord(unsigned short data, unsigned short reg, ! 193: unsigned char phy); ! 194: void miiWrite(unsigned int miiData, unsigned int dataSize); ! 195: int miiReadBit(); ! 196: bool miiCheckZeroBit(); ! 197: void miiOutThreeState(); ! 198: bool miiResetPHY(unsigned char phy); ! 199: bool miiWaitForLink(unsigned char phy); ! 200: bool miiWaitForAutoNegotiation(unsigned char phy); ! 201: void miiRestartAutoNegotiation(unsigned char phy); ! 202: bool miiFindPHY(unsigned char *phy_num); ! 203: bool miiInitializePHY(unsigned char phy); ! 204: ! 205: UInt32 outputPacket(struct mbuf *m); ! 206: ! 207: void interruptOccurredForSource(IOInterruptEventSource *src, int count); ! 208: ! 209: void timeoutOccurred(IOTimerEventSource *timer); ! 210: ! 211: public: ! 212: virtual bool init(OSDictionary * properties = 0); ! 213: virtual bool start(IOService * provider); ! 214: virtual void free(); ! 215: ! 216: virtual IOReturn enable(IONetworkInterface * netif); ! 217: virtual IOReturn disable(IONetworkInterface * netif); ! 218: ! 219: virtual IOReturn getHardwareAddress(enet_addr_t *addr); ! 220: ! 221: virtual IOReturn setMulticastMode(IOEnetMulticastMode mode); ! 222: virtual IOReturn setMulticastList(enet_addr_t *addrs, UInt count); ! 223: ! 224: virtual IOReturn setPromiscuousMode(IOEnetPromiscuousMode mode); ! 225: ! 226: virtual IOOutputQueue * allocateOutputQueue(); ! 227: ! 228: virtual const char * getVendorString() const; ! 229: virtual const char * getModelString() const; ! 230: virtual const char * getRevisionString() const; ! 231: ! 232: virtual IOReturn handleDebuggerOpen(IOKernelDebugger * debugger); ! 233: virtual IOReturn handleDebuggerClose(IOKernelDebugger * debugger); ! 234: }; ! 235: ! 236: /* ! 237: * Performance tracepoints ! 238: * ! 239: * DBG_BMAC_RXIRQ - Receive ISR run time ! 240: * DBG_BMAC_TXIRQ - Transmit ISR run time ! 241: * DBG_BMAC_TXQUEUE - Transmit packet passed from network stack ! 242: * DBG_BMAC_TXCOMPLETE - Transmit packet sent ! 243: * DBG_BMAC_RXCOMPLETE - Receive packet passed to network stack ! 244: */ ! 245: #define DBG_BMAC_ENET 0x0900 ! 246: #define DBG_BMAC_RXIRQ DRVDBG_CODE(DBG_DRVNETWORK,(DBG_BMAC_ENET+1)) ! 247: #define DBG_BMAC_TXIRQ DRVDBG_CODE(DBG_DRVNETWORK,(DBG_BMAC_ENET+2)) ! 248: #define DBG_BMAC_TXQUEUE DRVDBG_CODE(DBG_DRVNETWORK,(DBG_BMAC_ENET+3)) ! 249: #define DBG_BMAC_TXCOMPLETE DRVDBG_CODE(DBG_DRVNETWORK,(DBG_BMAC_ENET+4)) ! 250: #define DBG_BMAC_RXCOMPLETE DRVDBG_CODE(DBG_DRVNETWORK,(DBG_BMAC_ENET+5)) ! 251: ! 252: #endif /* !_BMACENET_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.