Source to iokit/Drivers/network/drvPPCBMac/BMacEnet.h


Enter a symbol's name here to quickly find it.

/*
 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * The contents of this file constitute Original Code as defined in and
 * are subject to the Apple Public Source License Version 1.1 (the
 * "License").  You may not use this file except in compliance with the
 * License.  Please obtain a copy of the License at
 * http://www.apple.com/publicsource and read it before using this file.
 * 
 * This Original Code and all software distributed under the License are
 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
 * License for the specific language governing rights and limitations
 * under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */
/*
 * Copyright (c) 1998-1999 by Apple Computer, Inc., All rights reserved.
 *
 * Interface definition for the BMac Ethernet Controller 
 *
 * HISTORY
 *
 * Dec 10, 1998		jliu
 *  Converted to IOKit/C++.
 */

#ifndef _BMACENET_H
#define _BMACENET_H

#include <IOKit/network/IOEthernetController.h>
#include <IOKit/network/IOEthernetInterface.h>
#include <IOKit/network/IOOQGateFIFOQueue.h>
#include <IOKit/IOInterruptEventSource.h>
#include <IOKit/IOTimerEventSource.h>
#include <IOKit/network/IOMBufMemoryCursor.h>
#include <IOKit/IODeviceMemory.h>
#include <IOKit/ppc/IODBDMA.h>
#include <string.h>			/* bcopy */
#include "BMacEnetRegisters.h"

extern "C" {
#include <sys/param.h>
#include <sys/mbuf.h>
}

// No kernel tracing support at this time.
//
#define KERNEL_DEBUG(x,a,b,c,d,e)

// #define IOLog kprintf

typedef void  *		IOPPCAddress;

typedef struct enet_dma_cmd_t
{
    IODBDMADescriptor	desc_seg[2];
} enet_dma_cmd_t;

typedef struct enet_txdma_cmd_t
{
	IODBDMADescriptor	desc_seg[3];
} enet_txdma_cmd_t;

class BMacEnet : public IOEthernetController
{
	OSDeclareDefaultStructors(BMacEnet)

private:
	volatile IOPPCAddress				ioBaseEnet;
    volatile IOPPCAddress       		ioBaseHeathrow;
    volatile IODBDMAChannelRegisters 	*ioBaseEnetRxDMA;	
    volatile IODBDMAChannelRegisters 	*ioBaseEnetTxDMA;
	
    enet_addr_t				myAddress;
    IOEthernetInterface *	networkInterface;
	IOOQGateFIFOQueue *     transmitQueue;
	IOPacketQueue *			debugQueue;
	IOKernelDebugger *      debugger;
    bool					isPromiscuous;
    bool					multicastEnabled;
	bool					isFullDuplex;	
	
	IOInterruptEventSource *rxIntSrc;
	IOMemoryMap *			maps[MEMORY_MAP_COUNT];
	IONetworkStats *        netStats;
	IOTimerEventSource *	timerSrc;
	IOMBufBigMemoryCursor *	mbufCursor;

	bool					ready;
	bool					netifClient;
	bool					debugClient;
	bool					debugTxPoll;
	bool                    useUnicastFilter;
    unsigned int			enetAddressOffset;

    unsigned long			chipId;

    unsigned long			phyType;
    unsigned long			phyMIIDelay;

    unsigned char			phyId;
    unsigned char			sromAddressBits;

    unsigned short			phyStatusPrev;

    struct mbuf *			txMbuf[TX_RING_LENGTH];
    struct mbuf *			rxMbuf[RX_RING_LENGTH];
	struct mbuf *			txDebuggerPkt;
    
    unsigned int			txCommandHead;	// Transmit ring descriptor index
    unsigned int			txCommandTail;
    unsigned int			txMaxCommand;		
    unsigned int			rxCommandHead;	// Receive ring descriptor index
    unsigned int			rxCommandTail;
    unsigned int        	rxMaxCommand;		

	struct {
		void	*ptr;
		u_int	size;
		void	*ptrReal;
		u_int	sizeReal;
	} dmaMemory;

    unsigned char *			dmaCommands;
    enet_txdma_cmd_t *		txDMACommands;		// TX descriptor ring ptr
    unsigned int			txDMACommandsPhys;

    enet_dma_cmd_t *		rxDMACommands;		// RX descriptor ring ptr
    unsigned int			rxDMACommandsPhys;

    u_int32_t				txWDInterrupts;
    u_int32_t				txWDCount;

    void *					debuggerPkt;
    u_int32_t				debuggerPktSize;

    u_int16_t				statReg;		// Current STAT register contents
   
    u_int16_t				hashTableUseCount[64];
    u_int16_t				hashTableMask[4];

	bool _allocateMemory();
	bool _initTxRing();
	bool _initRxRing();
	bool _initChip();
	void _resetChip();
	void _disableAdapterInterrupts();
	void _enableAdapterInterrupts();
	void _setDuplexMode(bool duplexMode);
	void _startChip();
	bool _updateDescriptorFromMbuf(struct mbuf * m,  enet_dma_cmd_t *desc,
			bool isReceive);
	void _restartTransmitter();
	void _stopTransmitDMA();
	bool _transmitPacket(struct mbuf * packet);
	bool _transmitInterruptOccurred();
	bool _debugTransmitInterruptOccurred();
	bool _receiveInterruptOccurred();
	bool _rejectBadUnicastPacket(ether_header_t * etherHeader);
	bool _receivePackets(bool fDebugger);
	void _packetToDebugger(struct mbuf * packet, u_int size);
	void _restartReceiver();
	void _stopReceiveDMA();
	bool _resetAndEnable(bool enable);
	void _sendDummyPacket();
	void _resetHashTableMask();
	void _addToHashTableMask(u_int8_t *addr);
	void _removeFromHashTableMask(u_int8_t *addr);
	void _updateBMacHashTableMask();

#ifdef DEBUG
	void _dumpRegisters();
	void _dumpDesc(void * addr, u_int32_t size);
	void _dump_srom();
#endif DEBUG

	void _sendPacket(void *pkt, unsigned int pkt_len);
	void _receivePacket(void *pkt, unsigned int *pkt_len, unsigned int 
		timeout);

	void sendPacket(void *pkt, unsigned int pkt_len);
	void receivePacket(void *pkt, unsigned int *pkt_len, unsigned int timeout);

	bool miiReadWord(unsigned short *dataPtr, unsigned short reg,
		 unsigned char phy);
	bool miiWriteWord(unsigned short data, unsigned short reg,
		 unsigned char phy);
	void miiWrite(unsigned int miiData, unsigned int dataSize);
	int  miiReadBit();
	bool miiCheckZeroBit();
	void miiOutThreeState();
	bool miiResetPHY(unsigned char phy);
	bool miiWaitForLink(unsigned char phy);
	bool miiWaitForAutoNegotiation(unsigned char phy);
	void miiRestartAutoNegotiation(unsigned char phy);
	bool miiFindPHY(unsigned char *phy_num);
	bool miiInitializePHY(unsigned char phy);

	UInt32 outputPacket(struct mbuf *m);

	void interruptOccurredForSource(IOInterruptEventSource *src, int count);

	void timeoutOccurred(IOTimerEventSource *timer);

public:
	virtual bool init(OSDictionary * properties = 0);
	virtual bool start(IOService * provider);
	virtual void free();
	
	virtual IOReturn enable(IONetworkInterface * netif);
	virtual IOReturn disable(IONetworkInterface * netif);
	
	virtual IOReturn getHardwareAddress(enet_addr_t *addr);

	virtual IOReturn setMulticastMode(IOEnetMulticastMode mode);
	virtual IOReturn setMulticastList(enet_addr_t *addrs, UInt count);

	virtual IOReturn setPromiscuousMode(IOEnetPromiscuousMode mode);
	
	virtual IOOutputQueue * allocateOutputQueue();
	
	virtual const char * getVendorString() const;
	virtual const char * getModelString() const;
	virtual const char * getRevisionString() const;

	virtual IOReturn handleDebuggerOpen(IOKernelDebugger * debugger);
	virtual IOReturn handleDebuggerClose(IOKernelDebugger * debugger);
};

/*
 * Performance tracepoints
 *
 * DBG_BMAC_RXIRQ     	- Receive  ISR run time
 * DBG_BMAC_TXIRQ     	- Transmit ISR run time
 * DBG_BMAC_TXQUEUE     - Transmit packet passed from network stack
 * DBG_BMAC_TXCOMPLETE  - Transmit packet sent
 * DBG_BMAC_RXCOMPLETE  - Receive packet passed to network stack
 */
#define DBG_BMAC_ENET		0x0900
#define DBG_BMAC_RXIRQ 		DRVDBG_CODE(DBG_DRVNETWORK,(DBG_BMAC_ENET+1)) 	
#define DBG_BMAC_TXIRQ	 	DRVDBG_CODE(DBG_DRVNETWORK,(DBG_BMAC_ENET+2))	
#define DBG_BMAC_TXQUEUE 	DRVDBG_CODE(DBG_DRVNETWORK,(DBG_BMAC_ENET+3))	
#define DBG_BMAC_TXCOMPLETE	DRVDBG_CODE(DBG_DRVNETWORK,(DBG_BMAC_ENET+4))	
#define DBG_BMAC_RXCOMPLETE	DRVDBG_CODE(DBG_DRVNETWORK,(DBG_BMAC_ENET+5))	

#endif /* !_BMACENET_H */