1/* 2 * 3 * @APPLE_LICENSE_HEADER_START@ 4 * 5 * Copyright (c) 1998-2003 Apple Computer, Inc. All Rights Reserved. 6 * 7 * This file contains Original Code and/or Modifications of Original Code 8 * as defined in and that are subject to the Apple Public Source License 9 * Version 2.0 (the 'License'). You may not use this file except in 10 * compliance with the License. Please obtain a copy of the License at 11 * http://www.opensource.apple.com/apsl/ and read it before using this 12 * 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, QUIET ENJOYMENT OR NON-INFRINGEMENT. 19 * Please see the License for the specific language governing rights and 20 * limitations under the License. 21 * 22 * @APPLE_LICENSE_HEADER_END@ 23 */ 24 25#ifndef __APPLEUSBCDCECMData__ 26#define __APPLEUSBCDCECMData__ 27 28#include "AppleUSBCDCCommon.h" 29#include "AppleUSBCDC.h" 30#include "AppleUSBCDCECMControl.h" 31 32#define TRANSMIT_QUEUE_SIZE PAGE_SIZE 33#define WATCHDOG_TIMER_MS 1000 34 35#define MAX_BLOCK_SIZE PAGE_SIZE 36#define COMM_BUFF_SIZE 16 37 38#define nameLength 32 // Arbitrary length 39#define defaultName "USB Ethernet" 40 41#define kFiltersSupportedMask 0xefff 42#define kPipeStalled 1 43 44 // Default and Maximum buffer pool values 45 46#define kInBufPool 4 47#define kOutBufPool 8 48 49#define kMaxInBufPool kInBufPool*16 50#define kMaxOutBufPool kOutBufPool*16 51 52#define inputTag "InputBuffers" 53#define outputTag "OutputBuffers" 54 55typedef struct 56{ 57 IOBufferMemoryDescriptor *pipeOutMDP; 58 UInt8 *pipeOutBuffer; 59 mbuf_t m; 60 bool avail; 61 IOUSBCompletion writeCompletionInfo; 62 UInt32 indx; 63} pipeOutBuffers; 64 65typedef struct 66{ 67 IOBufferMemoryDescriptor *pipeInMDP; 68 UInt8 *pipeInBuffer; 69 bool dead; 70 IOUSBCompletion readCompletionInfo; 71 UInt32 indx; 72} pipeInBuffers; 73 74class AppleUSBCDC; 75class AppleUSBCDCECMControl; 76 77class AppleUSBCDCECMData : public IOEthernetController 78{ 79 OSDeclareDefaultStructors(AppleUSBCDCECMData); // Constructor & Destructor stuff 80 81private: 82 bool fTerminate; // Are we being terminated (ie the device was unplugged) 83 UInt16 fVendorID; 84 UInt16 fProductID; 85 86 IOEthernetInterface *fNetworkInterface; 87 IOGatedOutputQueue *fTransmitQueue; 88 89 IOTimerEventSource *fTimerSource; 90 91 OSDictionary *fMediumDict; 92 93 bool fNetifEnabled; 94 bool fWOL; 95 UInt64 fUpSpeed; 96 UInt64 fDownSpeed; 97 bool fSleeping; 98 99 IOUSBPipe *fInPipe; 100 IOUSBPipe *fOutPipe; 101 102 pipeInBuffers fPipeInBuff[kMaxInBufPool]; 103 pipeOutBuffers fPipeOutBuff[kMaxOutBufPool]; 104 UInt16 fOutPoolIndex; 105 106 UInt8 fCommInterfaceNumber; 107 UInt32 fCount; 108 UInt32 fOutPacketSize; 109 110 bool fDeferredClear; 111 112 static void dataReadComplete(void *obj, void *param, IOReturn ior, UInt32 remaining); 113 static void dataWriteComplete(void *obj, void *param, IOReturn ior, UInt32 remaining); 114 115 // CDC Driver instance Methods 116 117 bool configureData(void); 118 bool wakeUp(void); 119 void putToSleep(void); 120 bool createMediumTables(void); 121 bool allocateResources(void); 122 void releaseResources(void); 123 bool createNetworkInterface(void); 124 UInt32 outputPacket(mbuf_t pkt, void *param); 125 bool getOutputBuffer(UInt32 *bufIndx); 126 IOReturn USBTransmitPacket(mbuf_t packet); 127 IOReturn clearPipeStall(IOUSBPipe *thePipe); 128 void receivePacket(UInt8 *packet, UInt32 size); 129 void setLinkStatusUp(void); 130 void setLinkStatusDown(void); 131 static void timerFired(OSObject *owner, IOTimerEventSource *sender); 132 void timeoutOccurred(IOTimerEventSource *timer); 133 134public: 135 136#if LOG_DATA 137 virtual void USBLogData(UInt8 Dir, SInt32 Count, char *buf); 138 virtual void dumpData(char *buf, SInt32 size); 139#endif 140 141 AppleUSBCDCECMControl *fControlDriver; // Our Control driver 142 IOUSBInterface *fDataInterface; 143 IOWorkLoop *fWorkLoop; 144 UInt8 fDataInterfaceNumber; 145 146 UInt16 fInBufPool; 147 UInt16 fOutBufPool; 148 149 UInt8 fConfigAttributes; 150 UInt8 fEthernetaddr[6]; 151 152 UInt8 fLinkStatus; 153 154 bool fReady; 155 UInt8 fResetState; 156 bool fQueueStarted; 157 bool fTxStalled; 158 bool fEnumOnWake; // Do we need to re-enumerate on wake 159 160 IONetworkStats *fpNetStats; 161 IOEthernetStats *fpEtherStats; 162 163 // CDC Driver instance Methods 164 165 virtual void linkStatusChange(UInt8 linkState); 166 virtual void linkSpeedChange(UInt32 upSpeed, UInt32 downSpeed); 167 168 // IOKit methods 169 170 virtual bool init(OSDictionary *properties = 0); 171 virtual IOService *probe(IOService *provider, SInt32 *score); 172 virtual bool start(IOService *provider); 173 virtual void stop(IOService *provider); 174 virtual IOReturn message(UInt32 type, IOService *provider, void *argument = 0); 175 176 // IOEthernetController methods 177 178 virtual IOReturn enable(IONetworkInterface *netif); 179 virtual IOReturn disable(IONetworkInterface *netif); 180 virtual IOReturn setWakeOnMagicPacket(bool active); 181 virtual IOReturn getPacketFilters(const OSSymbol *group, UInt32 *filters ) const; 182 virtual IOReturn selectMedium(const IONetworkMedium *medium); 183 virtual IOReturn getHardwareAddress(IOEthernetAddress *addr); 184 virtual IOReturn getMaxPacketSize(UInt32 *maxSize) const; 185 virtual IOReturn setMulticastMode(IOEnetMulticastMode mode); 186 virtual IOReturn setMulticastList(IOEthernetAddress *addrs, UInt32 count); 187 virtual IOReturn setPromiscuousMode(IOEnetPromiscuousMode mode); 188 virtual IOOutputQueue *createOutputQueue(void); 189 virtual const OSString *newVendorString(void) const; 190 virtual const OSString *newModelString(void) const; 191 virtual const OSString *newRevisionString(void) const; 192 virtual bool configureInterface(IONetworkInterface *netif); 193 virtual IOReturn registerWithPolicyMaker(IOService *policyMaker); 194 195}; /* end class AppleUSBCDCECMData */ 196#endif