Annotation of XNU/iokit/IOKit/network/IONetworkController.h, revision 1.1

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) 1999 Apple Computer, Inc.  All rights reserved. 
        !            24:  *
        !            25:  * IONetworkController.h
        !            26:  *
        !            27:  * Network controller driver superclass.
        !            28:  *
        !            29:  * HISTORY
        !            30:  * 9-Dec-1998       Joe Liu (jliu) created.
        !            31:  *
        !            32:  */
        !            33: 
        !            34: #ifndef _IONETWORKCONTROLLER_H
        !            35: #define _IONETWORKCONTROLLER_H
        !            36: 
        !            37: #include <IOKit/IOService.h>
        !            38: #include <IOKit/IOWorkLoop.h>
        !            39: #include <IOKit/network/IONetworkInterface.h>
        !            40: #include <IOKit/network/IOKernelDebugger.h>
        !            41: 
        !            42: struct mbuf;            // forward declarations
        !            43: class  IOCommandGate;
        !            44: class  IOOutputQueue;
        !            45: class  IONetworkMedium;
        !            46: 
        !            47: // Keys for property table entries.
        !            48: //
        !            49: #define kIOVendor                "IOVendor"                // OSString
        !            50: #define kIOModel                 "IOModel"                 // OSString
        !            51: #define kIORevision              "IORevision"              // OSString
        !            52: #define kIOInfo                  "IOInfo"                  // OSString
        !            53: #define kIOControllerIndex       "IOControllerIndex"       // OSNumber:32
        !            54: #define kIOFeatureSet            "IOFeatureSet"            // OSNumber:32
        !            55: #define kIOFamilyFeatureSet      "IOFamilyFeatureSet"      // OSNumber:32
        !            56: #define kIOMediumDictionary      "IOMediumDictionary"      // OSDictionary
        !            57: #define kIODefaultMedium         "IODefaultMedium"         // OSString
        !            58: #define kIOCurrentMedium         "IOCurrentMedium"         // OSSymbol
        !            59: #define kIOActiveMedium          "IOActiveMedium"          // OSSymbol
        !            60: #define kIOEnableDebugger        "IOEnableDebugger"        // OSString (Yes/No)
        !            61: #define kIOLinkSpeed             "IOLinkSpeed"             // OSNumber:64
        !            62: #define kIOLinkStatus            "IOLinkStatus"            // OSNumber:32
        !            63: #define kIOLinkData              "IOLinkData"              // OSData
        !            64: #define kIOPacketFilters         "IOPacketFilters"         // OSNumber:32
        !            65: #define kIOActivePacketFilters   "IOActivePacketFilters"   // OSNumber:32
        !            66: 
        !            67: /*! @typedef IOPacketBufferConstraints
        !            68:     @discussion Constraint parameters used by allocatePacket() to
        !            69:     align the memory buffer associated with a mbuf.
        !            70:     @field alignStart Alignment for the buffer's starting address.
        !            71:     @field alignLength Buffer length alignment.
        !            72:     @field maxLength Maximum buffer size (not implemented).
        !            73:     */
        !            74: 
        !            75: typedef struct {
        !            76:     UInt32 alignStart;
        !            77:     UInt32 alignLength;
        !            78:     UInt32 maxLength;
        !            79: } IOPacketBufferConstraints;
        !            80: 
        !            81: // Some frequently used alignment constants.
        !            82: //
        !            83: enum {
        !            84:     kIOPacketBufferAlign1   = 1,
        !            85:     kIOPacketBufferAlign2   = 2,
        !            86:     kIOPacketBufferAlign4   = 4,
        !            87:     kIOPacketBufferAlign8   = 8,
        !            88:     kIOPacketBufferAlign16  = 16,
        !            89:     kIOPacketBufferAlign32  = 32,
        !            90: };
        !            91: 
        !            92: // Packet filters. Upper 16-bits are family specific.
        !            93: //
        !            94: enum {
        !            95:     kIOPacketFilterUnicast          = 0x1,
        !            96:     kIOPacketFilterBroadcast        = 0x2,
        !            97:     kIOPacketFilterMulticast        = 0x10,
        !            98:     kIOPacketFilterMulticastAll     = 0x20,
        !            99:     kIOPacketFilterPromiscuous      = 0x100,
        !           100:     kIOPacketFilterPromiscuousAll   = 0x200,
        !           101:     kIOPacketFilterFamilyMask       = 0xffff0000,
        !           102: };
        !           103: 
        !           104: // Generic controller features.
        !           105: //
        !           106: enum {
        !           107:     kIONetworkFeatureNoBSDWait = 0x01,  // start() should not wait for BSD.
        !           108: };
        !           109: 
        !           110:     
        !           111: /*! @class IONetworkController
        !           112:     @abstract IONetworkController implements the framework for a generic 
        !           113:     network controller. A subclass of IONetworkController must provide
        !           114:     additional functionality specific for a particular network family.
        !           115:     In addition, the driver must implement (override) a basic set of 
        !           116:     hardware dependent methods to create a working driver.
        !           117:     
        !           118:     IONetworkController attaches itself to the network layer via an
        !           119:     IONetworkInterface object. A controller object without a companion
        !           120:     interface is not known to the networking system. The controller
        !           121:     interacts with the network layer by calling methods defined by
        !           122:     the interface object. And conversely, the network layer issues
        !           123:     command and packets to the controller through its interface object.
        !           124:     
        !           125:     IONetworkController allocates an IOWorkLoop and an IOCommandGate object.
        !           126:     Most commands (requests) sent from the interface object are handled
        !           127:     by instructing the IOCommandGate instance to call one or more methods,
        !           128:     usually implemented by the driver, that may require hardware access.
        !           129:     Thus interface requests are always serialized. Outbound packets sent
        !           130:     from the interface to the controller have no implicit serialization. 
        !           131:     Drivers must implement an output function that is thread safe, or use
        !           132:     an IOOutputQueue object which will provide a serialization model.
        !           133:     */
        !           134: 
        !           135: class IONetworkController : public IOService
        !           136: {
        !           137:     OSDeclareAbstractStructors(IONetworkController)
        !           138: 
        !           139: public:
        !           140: 
        !           141: /*! @typedef RequestAction
        !           142:     @discussion Prototype for an action to be called through syncRequest().
        !           143:     See syncRequest().
        !           144:     @param arg0 Action argument.
        !           145:     @param arg1 Action argument.
        !           146:     @param arg2 Action argument.
        !           147:     @param arg3 Action argument.
        !           148:     */
        !           149: 
        !           150:     typedef UInt32 (OSObject::*RequestAction)(void * arg0,
        !           151:                                               void * arg1,
        !           152:                                               void * arg2,
        !           153:                                               void * arg3);
        !           154: 
        !           155: private:
        !           156: 
        !           157:     IOWorkLoop *             _workLoop;
        !           158:     IOCommandGate *          _cmdGate;
        !           159:     IOOutputQueue *          _outputQueue;
        !           160:     OSSet *                  _clientSet;
        !           161:     OSObject *               _reqClient;
        !           162:     UInt32                   _alignStart;
        !           163:     UInt32                   _alignLength;
        !           164:     UInt32                   _alignPadding;
        !           165:     bool                     _handleReady;
        !           166:     bool                     _requestEnabled;
        !           167:     IOLock *                 _mediumLock;
        !           168:     IODebuggerLockState      _debugLockState;
        !           169:     UInt32                   _linkStatus;
        !           170:     UInt64                   _linkSpeed;
        !           171:     OSData *                 _linkData;
        !           172:     const IONetworkMedium *  _activeMedium;
        !           173:     const IONetworkMedium *  _currentMedium;
        !           174: 
        !           175:     bool     _controllerIsReady();
        !           176:     IOReturn _enable(IOService * client);
        !           177:     IOReturn _disable(IOService * client);
        !           178:     void     commandHandler(void *, void *, void *, void *);
        !           179:     IOReturn selectMediumWithName(const OSSymbol * mediumName);
        !           180: 
        !           181:     bool setMediumProperty(const OSSymbol *         key,
        !           182:                            const IONetworkMedium *  medium,
        !           183:                            const IONetworkMedium ** cache,
        !           184:                            bool                     force = false,
        !           185:                            bool *                   changed = 0);
        !           186: 
        !           187:     bool setLink64Property(const char * key,
        !           188:                            UInt64       value,
        !           189:                            UInt64 *     cache,
        !           190:                            bool         force = false,
        !           191:                            bool *       changed = 0);
        !           192: 
        !           193:     bool setLink32Property(const char * key,
        !           194:                            UInt32       value,
        !           195:                            UInt32 *     cache,
        !           196:                            bool         force = false,
        !           197:                            bool *       changed = 0);
        !           198: 
        !           199:     bool verifyMediumDictionary(const OSDictionary * mediumDict);
        !           200: 
        !           201:     static void _logMbuf(struct mbuf * m);
        !           202: 
        !           203:     static void _enableSyncRequestFilter(IONetworkController *, bool);
        !           204: 
        !           205:     static void debugRxHandler(IOService * handler,
        !           206:                                void *      buffer,
        !           207:                                UInt *      length,
        !           208:                                UInt        timeout);
        !           209: 
        !           210:     static void debugTxHandler(IOService * handler,
        !           211:                                void *      buffer,
        !           212:                                UInt        length);
        !           213: 
        !           214: public:
        !           215: 
        !           216: /*! @function initialize
        !           217:     @abstract IONetworkController class initializer.
        !           218:     @discussion Create often used OSSymbol objects that are used as keys.
        !           219:     This method is called explicitly by a line in IOStartIOKit.cpp and not
        !           220:     by the OSDefineMetaClassAndInit() mechanism, since the OSSymbol class
        !           221:     is not guaranteed to be initialized first, and likewise for the
        !           222:     OSSymbol pool. */
        !           223: 
        !           224:     static void initialize();
        !           225: 
        !           226: /*! @function init
        !           227:     @abstract Initialize the IONetworkController instance.
        !           228:     @discussion Instance variables are initialized to their default values,
        !           229:     then super::init() is called.
        !           230:     @param properties A dictionary object containing a property table.
        !           231:     @result true on success, false otherwise. */ 
        !           232: 
        !           233:     virtual bool init(OSDictionary * properties);
        !           234: 
        !           235: /*! @function start
        !           236:     @abstract Start the controller driver.
        !           237:     @discussion Called when the controller was matched to a provider and
        !           238:     has been selected to start running. IONetworkController will allocate
        !           239:     resources and gather the controller's properties. No I/O will be
        !           240:     triggered until the subclass attaches a client object from its own
        !           241:     start method. Subclasses must override this method and call
        !           242:     super::start() at the beginning of its implementation. They should
        !           243:     also check the return value to make sure their superclass was
        !           244:     started successfully. The resources allocated by IONetworkController
        !           245:     include: An IOWorkLoop object, an IOCommandGate object to handle 
        !           246:     synchronous requests, an OSSet to track our clients, and an optional
        !           247:     IOOutputQueue object for output queueing.
        !           248: 
        !           249:     Tasks that are usually performed by a driver's start method are;
        !           250:     resource allocation, hardware initialization, allocation of 
        !           251:     IOEventSources and attaching them to an IOWorkLoop object,
        !           252:     publishing a medium dictionary, and finally, attaching an
        !           253:     interface object when the driver is ready to handle client
        !           254:     requests.
        !           255:     @param provider The provider that the controller was matched
        !           256:     (and attached) to.
        !           257:     @result true on success, false otherwise. */
        !           258: 
        !           259:     virtual bool start(IOService * provider);
        !           260: 
        !           261: /*! @function stop
        !           262:     @abstract Stop the controller driver.
        !           263:     @discussion The opposite of start(). The controller has been
        !           264:     instructed to stop running. This method is called when the
        !           265:     driver has been terminated. The stop() method should release
        !           266:     resources and undo actions performed by start(). Subclasses
        !           267:     must override this method and call super::stop() at the end
        !           268:     of its implementation.
        !           269:     @param provider The provider that the controller was matched
        !           270:     (and attached) to. */
        !           271: 
        !           272:     void stop(IOService * provider);
        !           273: 
        !           274: /*! @function outputPacket
        !           275:     @abstract Transmit a packet mbuf.
        !           276:     @discussion If an IOOutputQueue was allocated and returned by 
        !           277:     createOutputQueue(), then this method will be called by the queue object.
        !           278:     Otherwise, an interface object will call this method directly upon 
        !           279:     receiving an output packet from the network layer. When a queue object
        !           280:     is not present, this method must be safe from multiple client threads,
        !           281:     each pushing a packet to be sent on the wire.
        !           282:     
        !           283:     There is no upper limit on the number of mbufs, hence the number of
        !           284:     memory fragments, in the mbuf chain provided. Drivers must be able to
        !           285:     handle cases when the chain might exceed the limit supported by their
        !           286:     DMA engines, and perform coalescing to copy the various memory fragments
        !           287:     into a lesser number of fragments. This complexity can be hidden from
        !           288:     a driver when an IOMBufMemoryCursor is used, which is able to convert
        !           289:     a mbuf chain into a physical address scatter-gather list that will not
        !           290:     exceed a specified number of physically contiguous memory segments.
        !           291:     See IOMBufMemoryCursor.
        !           292: 
        !           293:     Packets may also be chained to form a packet chain. Although the
        !           294:     network layer, through the interface object, will currently only
        !           295:     send a single mbuf packet to the controller for each outputPacket()
        !           296:     call, it is possible for this to change. When a queue object is used,
        !           297:     the queue will automatically accept a single packet or a packet chain,
        !           298:     but it will call outputPacket() for each packet removed from the queue.
        !           299: 
        !           300:     The implementation in IONetworkController performs no useful action
        !           301:     and will drop all packets. A driver must always override this method.
        !           302: 
        !           303:     @param m The packet mbuf.
        !           304:     @result A return code defined by the caller. */
        !           305: 
        !           306:     virtual UInt32 outputPacket(struct mbuf * m);
        !           307: 
        !           308: /*! @function getFeatureSet
        !           309:     @discussion Report features supported by the controller.
        !           310:     @result Returns 0. Drivers may override this method and return a mask
        !           311:     containing all supported feature bits. */
        !           312: 
        !           313:     virtual UInt32 getFeatureSet() const;
        !           314: 
        !           315: /*! @function getFamilyFeatureSet
        !           316:     @discussion Report family specific features supported by the controller.
        !           317:     @result Drivers may override this method and return a mask containing
        !           318:     all supported family feature bits. */
        !           319: 
        !           320:     virtual UInt32 getFamilyFeatureSet() const = 0;
        !           321: 
        !           322: /*! @function getVendorString
        !           323:     @result Return a vendor string. i.e. "Apple" */
        !           324: 
        !           325:     virtual const char * getVendorString() const = 0;
        !           326: 
        !           327: /*! @function getModelString
        !           328:     @result Return a string describing the model of the network controller.
        !           329:     i.e. "BMac Ethernet" */
        !           330: 
        !           331:     virtual const char * getModelString() const = 0;
        !           332: 
        !           333: /*! @function getRevisionString
        !           334:     @result Return a string describing the revision level of the 
        !           335:     controller. */
        !           336: 
        !           337:     virtual const char * getRevisionString() const;
        !           338: 
        !           339: /*! @function getInfoString
        !           340:     @result Return a string containing any additional information about
        !           341:     the controller and/or driver. */
        !           342: 
        !           343:     virtual const char * getInfoString() const;
        !           344: 
        !           345: /*! @function getCurrentMedium
        !           346:     @abstract Get the currently selected medium.
        !           347:     @discussion Returns the currently selected medium object. If the driver
        !           348:     has yet to assign an entry in its medium dictionary as the current medium 
        !           349:     using the setCurrentMedium() method, then the driver's property table is 
        !           350:     consulted and a default medium property (can be set by the user), is
        !           351:     looked up and the corresponding entry in the medium dictionary is returned.
        !           352:     Therefore, drivers can always call getCurrentMedium() to either get
        !           353:     the current medium selected by the driver, or the default
        !           354:     medium chosen by the user.
        !           355:     @result The current medium entry from the medium dictionary, or 0
        !           356:     if a matching entry was not found. */
        !           357: 
        !           358:     virtual const IONetworkMedium * getCurrentMedium() const;
        !           359: 
        !           360: /*! @function getMediumDictionary
        !           361:     @abstract Returns the medium dictionary published by the driver.
        !           362:     @discussion Returns the medium dictionary published by the driver
        !           363:     through publishMediumDictionary(). Use copyMediumDictionary() to
        !           364:     get a copy of the medium dictionary.
        !           365:     @result The published medium dictionary, or 0 if the driver has not
        !           366:     yet published a medium dictionary using publishMediumDictionary(). */
        !           367: 
        !           368:     virtual const OSDictionary * getMediumDictionary() const;
        !           369: 
        !           370: /*! @function copyMediumDictionary
        !           371:     @abstract Returns a copy of the medium dictionary published by the driver.
        !           372:     @discussion The caller is responsible for releasing the dictionary
        !           373:     object returned. Use getMediumDictionary() to get a reference to the
        !           374:     published medium dictionary instead of creating a copy.
        !           375:     @result A copy of the medium dictionary, or 0 if the driver has not
        !           376:     published a medium dictionary using publishMediumDictionary(). */
        !           377: 
        !           378:     virtual OSDictionary * copyMediumDictionary() const;
        !           379: 
        !           380: /*! @function syncRequest
        !           381:     @abstract Perform a request action synchronously.
        !           382:     @discussion Used both internally and also by clients to execute an
        !           383:     arbitrary request action using the IOCommandGate's runAction()
        !           384:     method. For client requests, where the client field is not equal to
        !           385:     'this', the request is filtered by calling syncRequestFilter() to
        !           386:     qualify the client request. This filter function must return true
        !           387:     in order for the request to be accepted and the request action called.
        !           388:     @param client The client (caller) of the synchronous request.
        !           389:     @param target The target object that implements the request action.
        !           390:     @param action The action to perform.
        !           391:     @param ret    The return value from the action is written to the
        !           392:                   integer with the provided address. The result is
        !           393:                   not written if the request was rejected by the request
        !           394:                   filter.
        !           395:     @param arg0 Optional action argument.
        !           396:     @param arg1 Optional action argument.
        !           397:     @param arg2 Optional action argument.
        !           398:     @param arg3 Optional action argument.
        !           399:     @result kIOReturnNotReady if the client request was rejected by the filter.
        !           400:     Otherwise kIOReturnSuccess is returned. */
        !           401: 
        !           402:     virtual IOReturn syncRequest(OSObject *     client,
        !           403:                                  OSObject *     target,
        !           404:                                  RequestAction  action,
        !           405:                                  UInt32 *       ret  = 0,
        !           406:                                  void *         arg0 = 0,
        !           407:                                  void *         arg1 = 0,
        !           408:                                  void *         arg2 = 0,
        !           409:                                  void *         arg3 = 0);
        !           410: 
        !           411: /*! @function getOutputHandler
        !           412:     @abstract Get the address of the method designated to handle output 
        !           413:     packets.
        !           414:     @result the address of the outputPacket() method. */
        !           415: 
        !           416:     virtual IOOutputAction getOutputHandler() const;
        !           417: 
        !           418: /*! @function doEnablePacketFilters
        !           419:     @discussion Call enablePacketFilters() through syncRequest().
        !           420:     See enablePacketFilters(). */
        !           421: 
        !           422:     virtual IOReturn doEnablePacketFilters(IOService * client,
        !           423:                                            UInt32      filters,
        !           424:                                            UInt32 *    activeFiltersP = 0);
        !           425: 
        !           426: /*! @function doGetPacketFilters
        !           427:     @discussion Call getPacketFilters() through syncRequest().
        !           428:     See getPacketFilters(). */
        !           429: 
        !           430:     virtual IOReturn doGetPacketFilters(IOService * client, UInt32 * filtersP);
        !           431: 
        !           432: /*! @function doEnable
        !           433:     @discussion Call enable(IOService *) through syncRequest().
        !           434:     See enable(). */
        !           435: 
        !           436:     virtual IOReturn doEnable(IOService * client);
        !           437: 
        !           438: /*! @function doDisable
        !           439:     @discussion Call disable(IOService *) through syncRequest().
        !           440:     See disable(). */
        !           441: 
        !           442:     virtual IOReturn doDisable(IOService * client);
        !           443: 
        !           444: /*! @function doGetControllerIndex
        !           445:     @discussion Call getControllerIndex(IOService *) through syncRequest().
        !           446:     See getControllerIndex(). */
        !           447: 
        !           448:     virtual IOReturn doGetControllerIndex(IOService * client,
        !           449:                                           UInt32 *    index);
        !           450: 
        !           451: /*! @function doSetMaxTransferUnit
        !           452:     @discussion Call setMaxTransferUnit() through syncRequest().
        !           453:     See setMaxTransferUnit(). */
        !           454: 
        !           455:     virtual IOReturn doSetMaxTransferUnit(IOService * client, UInt32 mtu);
        !           456: 
        !           457: /*! @function doSelectMedium
        !           458:     @discussion Call selectMedium() through syncRequest().
        !           459:     See selectMedium(). */
        !           460: 
        !           461:     virtual IOReturn doSelectMedium(IOService *      client,
        !           462:                                     const OSSymbol * mediumName);
        !           463: 
        !           464: /*! @function doSetOutputQueueCapacity
        !           465:     @discussion Call setOutputQueueCapacity() through syncRequest().
        !           466:     See setOutputQueueCapacity(). */
        !           467: 
        !           468:     virtual IOReturn doSetOutputQueueCapacity(IOService * client,
        !           469:                                               UInt32      capacity);
        !           470: 
        !           471: /*! @function doGetOutputQueueCapacity
        !           472:     @discussion Call getOutputQueueCapacity() through syncRequest().
        !           473:     See getOutputQueueCapacity(). */
        !           474: 
        !           475:     virtual IOReturn doGetOutputQueueCapacity(IOService * client,
        !           476:                                               UInt32 *    capacityP);
        !           477: 
        !           478: /*! @function doGetOutputQueueSize
        !           479:     @discussion Call getOutputQueueSize() through syncRequest().
        !           480:     See getOutputQueueSize(). */
        !           481: 
        !           482:     virtual IOReturn doGetOutputQueueSize(IOService * client,
        !           483:                                           UInt32 *    sizeP);
        !           484: 
        !           485: /*! @function doFlushOutputQueue
        !           486:     @discussion Call flushOutputQueue() through syncRequest().
        !           487:     See flushOutputQueue(). */
        !           488: 
        !           489:     virtual IOReturn doFlushOutputQueue(IOService * client,
        !           490:                                         UInt32 *    flushCountP);
        !           491: 
        !           492: /*! @function doPerformDiagnostics
        !           493:     @discussion Call performDiagnostics() through syncRequest().
        !           494:     See performDiagnostics(). */
        !           495: 
        !           496:     virtual IOReturn doPerformDiagnostics(IOService * client,
        !           497:                                           UInt32 *    failureCode);
        !           498: 
        !           499: protected:
        !           500: 
        !           501: /*! @function free
        !           502:     @abstract Free the IONetworkController instance.
        !           503:     @discussion Free the IONetworkController instance and all allocated
        !           504:     resources, then call super::free(). */
        !           505: 
        !           506:     virtual void free();
        !           507: 
        !           508: /*! @function setOutputQueueCapacity
        !           509:     @abstract Adjust the capacity of the output queue.
        !           510:     @discussion A client request to adjust the capacity of the driver's
        !           511:     output queue (number of packets the queue can hold). If a driver does
        !           512:     not override this method, then the default action is to forward the
        !           513:     request to an IOOutputQueue object if it was created. Otherwise return
        !           514:     kIOReturnUnsupported.
        !           515:     @param capacity The new capacity of the output queue.
        !           516:     @result kIOReturnSuccess on success, kIOReturnBadArgument if the
        !           517:     specified capacity is invalid, or kIOReturnUnsupported if the
        !           518:     function is not supported. */
        !           519: 
        !           520:     virtual IOReturn setOutputQueueCapacity(UInt32 capacity);
        !           521: 
        !           522: /*! @function getOutputQueueCapacity
        !           523:     @abstract Get the capacity of the output queue.
        !           524:     @discussion A client request to get the capacity of the driver's
        !           525:     output queue. If a driver does not override this method, then the
        !           526:     default action is to forward the request to an IOOutputQueue object
        !           527:     if it was created. Otherwise return kIOReturnUnsupported.
        !           528:     @param capacityP Address of an integer where the capacity
        !           529:     shall be written to.
        !           530:     @result kIOReturnSuccess on success, or kIOReturnUnsupported if an
        !           531:     IOOutputQueue object was not created. */
        !           532: 
        !           533:     virtual IOReturn getOutputQueueCapacity(UInt32 * capacityP) const;
        !           534: 
        !           535: /*! @function getOutputQueueSize
        !           536:     @abstract Get the number of packets in the output queue.
        !           537:     @discussion A client request to get the number of packets currently held
        !           538:     by the queue. If a driver does not override this method, then the default
        !           539:     action is to forward the request to an IOOutputQueue object if it was 
        !           540:     created. Otherwise return kIOReturnUnsupported.
        !           541:     @param sizeP Address of an integer where the queue size shall be
        !           542:            written to.
        !           543:     @result kIOReturnSuccess on success, or kIOReturnUnsupported if an
        !           544:     IOOutputQueue object was not created. */
        !           545: 
        !           546:     virtual IOReturn getOutputQueueSize(UInt32 * sizeP) const;
        !           547: 
        !           548: /*! @function flushOutputQueue
        !           549:     @abstract Discard all packets in the output queue.
        !           550:     @discussion A client request to flush all packets currently held by the
        !           551:     queue, and return the number of packets discarded. If a driver does not
        !           552:     override this method, then the default action is to forward the request
        !           553:     to an IOOutputQueue object if it was created. Otherwise return
        !           554:     kIOReturnUnsupported.
        !           555:     @param flushCountP Address of an integer where the number of
        !           556:     discarded packets shall be written to.
        !           557:     @result kIOReturnSuccess on success, or kIOReturnUnsupported if an
        !           558:     IOOutputQueue object was not created. */
        !           559: 
        !           560:     virtual IOReturn flushOutputQueue(UInt32 * flushCountP);
        !           561: 
        !           562: /*! @function ready
        !           563:     @abstract An indication that the controller is ready to service
        !           564:     clients.
        !           565:     @discussion This method is called the first time that a controller
        !           566:     driver calls attachInterface() or attachDebuggerClient(), which is
        !           567:     an indication that the driver has been started and is ready to
        !           568:     service client requests. IONetworkController uses this method to
        !           569:     complete its initialization before any client objects are attached.
        !           570:     @param provider The controller's provider.
        !           571:     @result true on success, false otherwise. */
        !           572: 
        !           573:     virtual bool ready(IOService * provider);
        !           574: 
        !           575: /*! @function enable
        !           576:     @abstract An enable request from an interface client.
        !           577:     @discussion Called by an interface client to enable the controller.
        !           578:     This method must bring up the hardware and enable event sources
        !           579:     to prepare for packet transmission and reception. A driver should
        !           580:     delay the allocation of most runtime resources until this method is
        !           581:     called to conserve shared system resources.
        !           582:     @param interface The interface client object that requested the enable.
        !           583:     @result kIOReturnUnsupported. Driver may override this method and
        !           584:     return kIOReturnSuccess on success, or an error code otherwise. */
        !           585: 
        !           586:     virtual IOReturn enable(IONetworkInterface * interface);
        !           587: 
        !           588: /*! @function disable
        !           589:     @abstract A disable request from an interface client.
        !           590:     @discussion Called by an interface object to disable the controller.
        !           591:     This method should quiesce the hardware and disable event sources.
        !           592:     Any resources allocated in enable() should also be deallocated.
        !           593:     @param interface The interface object that requested the disable.
        !           594:     @result kIOReturnUnsupported. Driver may override this method and
        !           595:     return kIOReturnSuccess on success, or an error code otherwise. */
        !           596: 
        !           597:     virtual IOReturn disable(IONetworkInterface * interface);
        !           598: 
        !           599: /*! @function enable
        !           600:     @abstract An enable request from a client.
        !           601:     @discussion Handle an enable request from a client. The client
        !           602:     object is typecasted using OSDynamicCast, and if the client is an
        !           603:     IOKernelDebugger or an IONetworkInterface, then an overloaded enable
        !           604:     method that takes a more specific argument is called. If the client
        !           605:     matches neither type, a kIOReturnBadArgument is returned.
        !           606:     A driver has the option of override this generic enable method,
        !           607:     or the derived version.
        !           608:     @param client The client object requesting the enable.
        !           609:     @result The return value from the derived enable method, or
        !           610:     kIOReturnBadArgument if the client's type is unknown. */
        !           611: 
        !           612:     virtual IOReturn enable(IOService * client);
        !           613: 
        !           614: /*! @function disable
        !           615:     @abstract A disable request from a client.
        !           616:     @discussion Handle an enable request from a client. The client
        !           617:     object is typecasted using OSDynamicCast, and if the client is an
        !           618:     IOKernelDebugger or an IONetworkInterface, then an overloaded disable
        !           619:     method that takes a more specific argument is called. If the client
        !           620:     matches neither type, a kIOReturnBadArgument is returned.
        !           621:     A driver has the option of override this generic enable method,
        !           622:     or the derived version.
        !           623:     @param client The client object requesting the disable.
        !           624:     @result The return from the derived disable method, or
        !           625:     kIOReturnBadArgument if the client's type is unknown. */
        !           626:     
        !           627:     virtual IOReturn disable(IOService * client);
        !           628: 
        !           629: /*! @function getControllerIndex
        !           630:     @abstract Return an ordinal number for multiport adapters.
        !           631:     @discussion Return an ordinal number for multiport network adapters.
        !           632:     The implementation in IONetworkController will work for PCI controllers
        !           633:     behind a PCI-PCI bridge. This method exists solely to support the
        !           634:     current interface naming scheme, and is likely to
        !           635:     undergo changes or may disappear in the future.
        !           636:     @param indexP The oridinal number should be written to the
        !           637:            integer at this address.
        !           638:     @result kIOReturnSuccess. */
        !           639: 
        !           640:     virtual IOReturn getControllerIndex(UInt32 * indexP) const;
        !           641: 
        !           642: /*! @function setMaxTransferUnit
        !           643:     @abstract Change the controller's MTU size.
        !           644:     @discussion A client request for the controller to change to
        !           645:     a new MTU size.
        !           646:     @param mtu The new MTU size requested.
        !           647:     @result kIOReturnUnsupported. Drivers may override this method
        !           648:     and return either kIOReturnSuccess to indicate that the new MTU size
        !           649:     was accepted and is in effect, or an error to indicate failure. */
        !           650: 
        !           651:     virtual IOReturn setMaxTransferUnit(UInt32 mtu);
        !           652: 
        !           653: /*! @function performDiagnostics
        !           654:     @abstract A request for the driver to perform hardware diagnostics.
        !           655:     @discussion A client request for the driver to perform hardware 
        !           656:     diagnostics and return the test result after completion.
        !           657:     @param resultCodeP In addition to the return code, drivers may
        !           658:     write a hardware specific result code to the integer at this
        !           659:     address.
        !           660:     
        !           661:     @result kIOReturnSuccess if hardware passed all test, otherwise
        !           662:     an appropriate error code should be returned. The default return
        !           663:     is always kIOReturnUnsupported. */
        !           664: 
        !           665:     virtual IOReturn performDiagnostics(UInt32 * resultCodeP);
        !           666: 
        !           667: /*! @function publishCapabilities
        !           668:     @abstract Publish controller's properties and capabilities.
        !           669:     @discussion Discover and publish controller capabilities to the
        !           670:     property table. This method is called by ready().
        !           671:     @result true if all capabilities were discovered and published
        !           672:     successfully, false otherwise. Returning false will prevent client
        !           673:     objects from attaching to the controller since a property that
        !           674:     a client depends on may be missing. */
        !           675: 
        !           676:     virtual bool publishCapabilities();
        !           677: 
        !           678: /*! @function publishMediumDictionary
        !           679:     @abstract Publish a medium dictionary.
        !           680:     @discussion Called by drivers to publish their medium dictionary.
        !           681:     The dictionary consist of IONetworkMedium entries that represent
        !           682:     the entire media selection supported by the hardware. This method
        !           683:     will make a copy of the provided dictionary, then add the copy to
        !           684:     the driver's property table. The dictionary provided can be
        !           685:     released after this call returns. It is permissible to call
        !           686:     this method multiple times, which may be necessary if the hardware's
        !           687:     media capability changes dynamically. However, if this were not
        !           688:     so, then drivers will typically call this method from its start() 
        !           689:     implementation, after the hardware capability is discovered.
        !           690: 
        !           691:     Several methods depends on the presence of a medium dictionary.
        !           692:     They should be called after the dictionary has been published.
        !           693:     Those are:
        !           694:         selectMedium()
        !           695:         setCurrentMedium()
        !           696:         getCurrentMedium()
        !           697:         getMediumDictionary()
        !           698:         copyMediumDictionary()
        !           699:     
        !           700:     Calling publishMediumDictionary() will cause a media change event
        !           701:     to be delivered to all attached interface clients.
        !           702:     @param mediumDict A dictionary containing IONetworkMedium objects.
        !           703:     @result true if the dictionary is valid, and was successfully
        !           704:     added to the property table, false otherwise. */
        !           705: 
        !           706:     virtual bool publishMediumDictionary(const OSDictionary * mediumDict);
        !           707: 
        !           708: /*! @function setCurrentMedium
        !           709:     @abstract Designate an entry in the published medium dictionary as
        !           710:     the currently selected medium.
        !           711:     @discussion From the set of medium objects in the medium dictionary
        !           712:     published by the driver, one of them can be designated as the
        !           713:     currently selected medium. Drivers should call this method whenever
        !           714:     their media selection changes. An entry in the driver's property
        !           715:     table is updated to advertise the current medium.
        !           716:     
        !           717:     A media change event will be broadcasted to all attached interface
        !           718:     clients when the current medium property changes.
        !           719:     
        !           720:     @param medium A medium object to promote as the current medium.
        !           721:     @result true if the medium dictionary exists, the medium object
        !           722:     provided matches an entry in this dictionary, and the property
        !           723:     table update was successful, false otherwise. */
        !           724: 
        !           725:     virtual bool setCurrentMedium(const IONetworkMedium * medium);
        !           726: 
        !           727: /*! @function selectMedium
        !           728:     @abstract Change the controller's medium selection.
        !           729:     @discussion A client request for the controller to change the
        !           730:     selected medium. Drivers may override this method and provide
        !           731:     an implementation appropriate for its hardware, then call
        !           732:     setCurrentMedium() to update the current medium property if
        !           733:     a change occurred.
        !           734:     @param medium An entry in the published medium dictionary.
        !           735:     @result kIOReturnUnsupported. Drivers may override this method and
        !           736:     return kIOReturnSuccess if the selected medium was activated,
        !           737:     or an error code otherwise. */
        !           738: 
        !           739:     virtual IOReturn selectMedium(const IONetworkMedium * medium);
        !           740: 
        !           741: /*! @function setLinkStatus
        !           742:     @abstract Report the link status and the active medium.
        !           743:     @discussion Update the link status parameters published by the
        !           744:     controller. Drivers should call this method whenever the link
        !           745:     status changes. Never call this method from interrupt context
        !           746:     since this method may block. An event will be sent to all
        !           747:     attached interface objects when a change is detected.
        !           748:     @param status Link status bits.
        !           749:            See IONetworkMedium.h for defined link status bits.
        !           750:     @param speed Link speed in units of bits per second.
        !           751:     @param activeMedium A medium entry in the published medium dictionary
        !           752:            where the link was established. This may not be the same as the
        !           753:            current medium. See setCurrentMedium().
        !           754:     @param data An OSData containing any additional link information.
        !           755:     @result true if all link properties were successfully updated,
        !           756:     false otherwise. */
        !           757: 
        !           758:     virtual bool setLinkStatus(UInt32                  status,
        !           759:                                UInt64                  speed,
        !           760:                                const IONetworkMedium * activeMedium,
        !           761:                                OSData *                data = 0);
        !           762: 
        !           763: /*! @function syncRequestFilter
        !           764:     @abstract Filter client requests sent to syncRequest().
        !           765:     @discussion This method is called to qualify all client requests
        !           766:     sent to syncRequest(). This implementation will either allow or
        !           767:     refuse all requests, and this behavior is set by calling the 
        !           768:     enableSyncRequest() or disableSyncRequest() methods. By default,
        !           769:     all requests are allowed.
        !           770:     @param client The client of the synchronous request.
        !           771:     @param target The target object that implements the request action.
        !           772:     @param action The action to perform.
        !           773:     @param arg0 Action argument.
        !           774:     @param arg1 Action argument.
        !           775:     @param arg2 Action argument.
        !           776:     @param arg3 Action argument.
        !           777:     @result true to accept the request and allow the request action to be
        !           778:     called, or false to refuse it. */
        !           779: 
        !           780:     virtual bool syncRequestFilter(OSObject *     client,
        !           781:                                    OSObject *     target,
        !           782:                                    RequestAction  action,
        !           783:                                    void *         arg0,
        !           784:                                    void *         arg1,
        !           785:                                    void *         arg2,
        !           786:                                    void *         arg3);
        !           787: 
        !           788: /*! @function enableSyncRequest
        !           789:     @abstract Set syncRequestFilter() to accept all client requests.
        !           790:     @discussion Enable all client requests sent to the syncRequest() method.
        !           791:     Don't use this method if the driver overrides syncRequestFilter(). */
        !           792: 
        !           793:     virtual void enableSyncRequest();
        !           794: 
        !           795: /*! @function disableSyncRequest
        !           796:     @abstract Set syncRequestFilter() to refuse all client requests.
        !           797:     @discussion Disable all client requests sent to the syncRequest() method.
        !           798:     Don't use this method if the driver overrides syncRequestFilter(). */
        !           799: 
        !           800:     virtual void disableSyncRequest();  
        !           801: 
        !           802: /*! @function getSyncRequestClient
        !           803:     @abstract Get request client.
        !           804:     @discussion Methods that are called by syncRequest() can call this
        !           805:     to get the client object which initiated the request.
        !           806:     @result The request client. If the caller's context does not indicate
        !           807:     that it is running through syncRequest(), then 0 is returned. */
        !           808: 
        !           809:     virtual OSObject * getSyncRequestClient() const;
        !           810: 
        !           811: /*! @function handleOpen
        !           812:     @abstract Handle a client open.
        !           813:     @discussion Handle a client open on the controller object. IOService
        !           814:     calls this method with the arbitration lock held. Subclasses
        !           815:     should not override this method.
        !           816:     @param client The client that is trying to open the controller.
        !           817:     @param options Not used. See IOService.
        !           818:     @param argument Not used. See IOService.
        !           819:     @result true to accept the client open, false to refuse the open. */
        !           820: 
        !           821:     virtual bool handleOpen(IOService *  client,
        !           822:                             IOOptionBits options,
        !           823:                             void *       argument);
        !           824: 
        !           825: /*! @function handleClose
        !           826:     @abstract Handle a client close.
        !           827:     @discussion Handle a close from one of our client objects. IOService
        !           828:     calls this method with the arbitration lock held. Subclasses
        !           829:     should not override this method.
        !           830:     @param client The client that has closed the controller.
        !           831:     @param options Not used. See IOService. */
        !           832: 
        !           833:     virtual void handleClose(IOService * client, IOOptionBits options);
        !           834: 
        !           835: /*! @function handleIsOpen
        !           836:     @abstract Query a client that has an open on the controller.
        !           837:     @discussion This method is always called by IOService with the
        !           838:     arbitration lock held. Subclasses should not override this method.
        !           839:     @result true if the specified client, or any client if none is
        !           840:     specified, presently has an open on this object. */
        !           841: 
        !           842:     virtual bool handleIsOpen(const IOService * client) const;
        !           843: 
        !           844: /*! @function attachInterface
        !           845:     @abstract Attach a new interface client object.
        !           846:     @discussion Create a new interface client object and attach it
        !           847:     to the controller. The createInterface() method is called to
        !           848:     perform the allocation and initialization, followed by a call to 
        !           849:     configureInterface() to configure the interface. Both of these
        !           850:     methods can be overridden by subclasses to customize the
        !           851:     interface client attached. Drivers must call attachInterface()
        !           852:     from its start() method, after it is ready to service client requests.
        !           853:     @param interfaceP If successful (return value is true), then the
        !           854:     interface object will be written to the handle provided.
        !           855:     @param doRegister If true, then registerService() is called to register
        !           856:     the interface, which will trigger the matching process, and cause the 
        !           857:     interface to become registered with the network layer. For drivers that
        !           858:     wish to delay the registration, and hold off servicing requests and data
        !           859:     packets from the network layer, set doRegister to false and call 
        !           860:     registerService() on the interface client when the controller becomes
        !           861:     ready.
        !           862:     @result true on success, false otherwise. */
        !           863: 
        !           864:     virtual bool attachInterface(IONetworkInterface ** interface,
        !           865:                                  bool  doRegister = true);
        !           866: 
        !           867:     virtual bool attachNetworkInterface(IONetworkInterface ** interface,
        !           868:                                         bool  doRegister = true);  // obsolete
        !           869: 
        !           870: /*! @function detachInterface
        !           871:     @abstract Detach an interface client object.
        !           872:     @discussion This method will check that the object provided is indeed
        !           873:     an IONetworkInterface, and if so its terminate() method is called.
        !           874:     The interface object will close and detach from its controller only
        !           875:     after the network layer has removed all references to the data
        !           876:     structures exposed by the interface.
        !           877:     @param interface An interface object to be detached.
        !           878:     @param sync If true, the interface is terminated synchronously.
        !           879:            Note that this may cause detachInterface() to block
        !           880:            for an indefinite period of time. */
        !           881: 
        !           882:     virtual void detachInterface(IONetworkInterface * interface,
        !           883:                                  bool                 sync = false);
        !           884: 
        !           885: /*! @function getPacketBufferConstraints
        !           886:     @abstract Get controller's packet buffer constraints.
        !           887:     @discussion Called by start() to obtain the constraints on the
        !           888:     memory buffer associated with each mbuf allocated through
        !           889:     allocatePacket(). Drivers can override this method to specify
        !           890:     their buffer constraints imposed by their bus master hardware.
        !           891:     Note that outbound packets, those that originate from the
        !           892:     network stack, are not subject to the constraints reported here.
        !           893:     @param constraintsP A pointer to an IOPacketBufferConstraints
        !           894:     structure that that this method is expected to initialize.
        !           895:     See IOPacketBufferConstraints structure definition.
        !           896:     */
        !           897: 
        !           898:     virtual void getPacketBufferConstraints(
        !           899:                     IOPacketBufferConstraints * constraintsP) const;
        !           900: 
        !           901: /*! @function allocatePacket
        !           902:     @discussion Allocate a mbuf packet with the given size. This method
        !           903:     will always return a single mbuf unless the size requested (plus the
        !           904:     alignment padding) is greater than MCLBYTES. The mbuf (or a mbuf
        !           905:     chain) returned is aligned according to the constraints reported
        !           906:     by getPacketBufferConstraints().
        !           907:     
        !           908:     The m_len and pkthdr.len fields in the mbuf is updated by this
        !           909:     method, thus allowing the packet to be passed directly to an
        !           910:     IOMbufMemoryCursor object in order to convert the mbuf to a
        !           911:     scatter-gather list.
        !           912: 
        !           913:     @param size The desired size of the mbuf packet.
        !           914:     @result The allocated mbuf packet, or 0 if allocation failed. */
        !           915: 
        !           916:     virtual struct mbuf * allocatePacket(UInt size);
        !           917: 
        !           918: /*! @function copyPacket
        !           919:     @discussion Make a copy of a mbuf, and return the copy.
        !           920:     The source mbuf is not modified.
        !           921:     @param m The source mbuf.
        !           922:     @param size The number of bytes to copy. If set to 0, then the entire
        !           923:     source mbuf is copied (source length is taken from the m_pkthdr.len).
        !           924:     @result A new mbuf created from the source packet. */
        !           925: 
        !           926:     virtual struct mbuf * copyPacket(const struct mbuf * m, UInt size = 0);
        !           927: 
        !           928: /*! @function replacePacket
        !           929:     @discussion Replace the mbuf pointed by the given pointer with
        !           930:     another mbuf. Drivers can call this method to replace a mbuf before
        !           931:     passing the original mbuf, which contains a received frame, to the
        !           932:     network layer.
        !           933:     @param mp A pointer to the original mbuf that shall be updated by this
        !           934:     method to point to the new mbuf.
        !           935:     @param size If size is 0, then the new mbuf shall have the same size
        !           936:     as the original mbuf that is being replaced. Otherwise, the new
        !           937:     mbuf shall have the size specified here.
        !           938:     @result If mbuf allocation was successful, then the replacement will
        !           939:     take place and the original mbuf will be returned. Otherwise, a NULL
        !           940:     is returned. */
        !           941: 
        !           942:     virtual struct mbuf * replacePacket(struct mbuf ** mp, UInt size = 0);
        !           943: 
        !           944: /*! @function replaceOrCopyPacket
        !           945:     @discussion Either replace or copy the source mbuf given depending
        !           946:     on the amount of data in the source mbuf. This method will either
        !           947:     perform a copy or replace the source mbuf, whichever is more
        !           948:     time efficient. If replaced, then the original mbuf is returned, and
        !           949:     a new mbuf is allocated to take its place. If copied, the source mbuf is
        !           950:     left intact, while a copy is returned that is just big enough to hold
        !           951:     all the data from the source mbuf.
        !           952:     @param mp A pointer to the source mbuf that may be updated by this
        !           953:     method to point to the new mbuf if replaced.
        !           954:     @param rcvlen The number of data bytes in the source mbuf.
        !           955:     @param replacedP Pointer to a bool that is set to true if the
        !           956:            source mbuf was replaced, or set to false if the
        !           957:            source mbuf was copied.
        !           958:     @result A replacement or a copy of the source mbuf, 0 if mbuf
        !           959:     allocation failed. */
        !           960: 
        !           961:     virtual struct mbuf * replaceOrCopyPacket(struct mbuf ** mp,
        !           962:                                               UInt           rcvlen,
        !           963:                                               bool *         replacedP);
        !           964: 
        !           965: /*! @function freePacket
        !           966:     @discussion Release the mbuf back to the free pool.
        !           967:     @param m The mbuf to be freed. */
        !           968: 
        !           969:     virtual void freePacket(struct mbuf * m);
        !           970: 
        !           971: /*! @function createInterface
        !           972:     @abstract Create an interface client object.
        !           973:     @discussion Create a new IONetworkInterface instance.
        !           974:     This method is called by attachInterface() to perform the
        !           975:     allocation and initialization of a new interface client object.
        !           976:     A family specific subclass of IONetworkController must implement
        !           977:     this method and return a matching interface instance. For example,
        !           978:     IOEthernetController implements this method and returns an
        !           979:     IOEthernetInterface instance.
        !           980:     @result The allocated interface object. */
        !           981: 
        !           982:     virtual IONetworkInterface * createInterface() = 0;
        !           983: 
        !           984: /*! @function configureInterface
        !           985:     @abstract Configure an interface client object.
        !           986:     @discussion Configure an interface object created through
        !           987:     createInterface(). IONetworkController will register
        !           988:     its output handler with the interface object provided.
        !           989:     Subclasses may override this method to customize the interface object.
        !           990:     Once the interface is registered and opened by a client, it will
        !           991:     refuse changes to its properties. And since this method is called
        !           992:     before the interface has become registered, this is a final
        !           993:     opportunity for the controller to configure the interface.
        !           994:     @param interface The interface object to be configured.
        !           995:     @result true if configuration was successful, false otherwise
        !           996:     (this will cause attachInterface() to fail). */
        !           997: 
        !           998:     virtual bool configureInterface(IONetworkInterface * interface);
        !           999: 
        !          1000:     // obsolete
        !          1001:     virtual bool configureNetworkInterface(IONetworkInterface * interface);
        !          1002: 
        !          1003: /*! @function createOutputQueue
        !          1004:     @abstract Create an IOOutputQueue to handle output queueing.
        !          1005:     @discussion Called by start() to create an IOOutputQueue instance
        !          1006:     to handle output queueing. The default implementation will always
        !          1007:     return 0, hence no output queue will be created. A driver may override
        !          1008:     this method and return a subclass of IOOutputQueue. IONetworkController
        !          1009:     will keep a reference to the queue created, and will release the 
        !          1010:     object when IONetworkController is freed. Also see getOutputQueue().
        !          1011:     @result A newly allocated and initialized IOOutputQueue instance. */
        !          1012: 
        !          1013:     virtual IOOutputQueue * createOutputQueue();
        !          1014:     virtual IOOutputQueue * allocateOutputQueue();  // obsolete
        !          1015: 
        !          1016: /*! @function getOutputQueue
        !          1017:     @abstract Get the IOOutputQueue object created by createOutputQueue().
        !          1018:     @result Return the output queue created by createOutputQueue(). */
        !          1019: 
        !          1020:     virtual IOOutputQueue * getOutputQueue() const;
        !          1021: 
        !          1022: /*! @function getWorkLoop
        !          1023:     @abstract Get the IOWorkLoop object created by IONetworkController.
        !          1024:     @discussion An IOWorkLoop object is created by the start() method.
        !          1025:     Drivers can call getWorkLoop() to obtain a reference to the
        !          1026:     IOWorkLoop object, and attach their event sources, such
        !          1027:     as IOTimerEventSource or IOInterruptEventSource.
        !          1028:     See IOWorkLoop.
        !          1029:     @result The IOWorkLoop object created by IONetworkController. */
        !          1030: 
        !          1031:     virtual IOWorkLoop * getWorkLoop() const;
        !          1032: 
        !          1033: /*! @function getCommandGate
        !          1034:     @abstract Get the IOCommandGate object created by IONetworkController.
        !          1035:     @discussion An IOCommandGate is created and attached to an
        !          1036:     IOWorkLoop by the start() method. This IOCommandGate object is used
        !          1037:     to handle client requests issued through the syncRequest() method.
        !          1038:     Subclasses that need an IOCommandGate should try to use the object
        !          1039:     returned by this method, rather than creating a new instance.
        !          1040:     See IOCommandGate.
        !          1041:     @result The IOCommandGate object created by IONetworkController. */
        !          1042: 
        !          1043:     virtual IOCommandGate * getCommandGate() const;
        !          1044: 
        !          1045: /*! @function broadcastEvent
        !          1046:     @abstract Send an event to all interface client objects.
        !          1047:     @discussion Broadcast an event to all attached interface objects.
        !          1048:     This is equivalent to calling the IONetworkInterface::inputEvent()
        !          1049:     method for all interfaces.
        !          1050:     
        !          1051:     IONetworkController uses this method to broadcast link and media
        !          1052:     events. Drivers will usually call the inputEvent() method directly
        !          1053:     since it is more efficient, and most drivers will only attach a
        !          1054:     single interface client.
        !          1055:     
        !          1056:     @param type Event type.
        !          1057:     @param arg Event argument.
        !          1058:     @result true if the event was delivered, false if an error occurred
        !          1059:     (unable to perform object allocation) and the event was not delivered. */
        !          1060: 
        !          1061:     virtual bool broadcastEvent(UInt32 type, void * arg = 0);
        !          1062: 
        !          1063: /*! @function getPacketFilters
        !          1064:     @abstract Get the set of packet filters supported by the controller.
        !          1065:     @discussion A subclass must implement this method and report its
        !          1066:     supported filter set. See IOPacketFilter enum for the list of defined
        !          1067:     packet filters.
        !          1068:     @param filtersP A mask of supported filters should be written to the
        !          1069:     integer with this address.
        !          1070:     @result kIOReturnSuccess on success, or an error to indicate
        !          1071:     failure to discover the hardware supported filters. */
        !          1072: 
        !          1073:     virtual IOReturn getPacketFilters(UInt32 * filtersP) = 0;
        !          1074: 
        !          1075: /*! @function enablePacketFilters
        !          1076:     @abstract Enable a set of packet filters supported by the controller.
        !          1077:     @discussion After calling getPacketFilters() to gather the set of
        !          1078:     supported packet filters, a client may issue a request to enable a
        !          1079:     (sub)set of filters from the supported set.
        !          1080:     @param filters Each bit that is set indicates a particular filter that
        !          1081:            should be enabled. Filter bits that cleared should be disabled.
        !          1082:     @param activeFiltersP Must be updated by this method to contain the filter
        !          1083:            set that was activated. Ideally, it should be the same as the filter 
        !          1084:            set specified by the first argument.
        !          1085:     @result kIOReturnSuccess on success, otherwise an error code is
        !          1086:     returned. If (*activeFiltersP != filters), then an error is expected. */
        !          1087: 
        !          1088:     virtual IOReturn enablePacketFilters(UInt32   filters,
        !          1089:                                          UInt32 * activeFiltersP) = 0;
        !          1090: 
        !          1091: /*! @function attachDebuggerClient
        !          1092:     @abstract Attach a new IOKernelDebugger client object. Attaching
        !          1093:     a debugger client implies that the driver supports the kernel
        !          1094:     debugging interface, and must implement the two polled-mode entry
        !          1095:     points. See sendPacket() and receivePacket().
        !          1096:     @discussion Allocate and attach a new IOKernelDebugger client object.
        !          1097:     @param debuggerP An IOKernelDebugger handle that is updated by this
        !          1098:            method to contain the allocated IOKernelDebugger instance.
        !          1099:     @result true on success, false otherwise. */
        !          1100: 
        !          1101:     virtual bool attachDebuggerClient(IOKernelDebugger ** debuggerP);
        !          1102: 
        !          1103: /*! @function detachDebuggerClient
        !          1104:     @abstract Detach an IOKernelDebugger client object.
        !          1105:     @discussion Detach and terminate the IOKernelDebugger client object
        !          1106:     provided. A synchronous termination is issued, and this method returns
        !          1107:     after the client has been terminated.
        !          1108:     @param debugger The IOKernelDebugger instance to be detached and
        !          1109:            terminated. If the argument provided is NULL or is not an
        !          1110:            IOKernelDebugger, this method will return immediately. */
        !          1111: 
        !          1112:     virtual void detachDebuggerClient(IOKernelDebugger * debugger);
        !          1113: 
        !          1114: /*! @function enable
        !          1115:     @abstract An enable request from an IOKernelDebugger client.
        !          1116:     @discussion This method is called when an open is received from an
        !          1117:     IOKernelDebugger client. Drivers that wish to provide debugging
        !          1118:     services must override this method and setup the hardware to
        !          1119:     support the polled-mode send and receive methods; receivePacket()
        !          1120:     and sendPacket(). Debug capable drivers may also override the
        !          1121:     more generic enable/disable calls that take an IOService argument.
        !          1122:     @param debugger The IOKernelDebugger client that issued the open.
        !          1123:     @result kIOReturnSuccess. The driver method must return kIOReturnSuccess
        !          1124:     to allow the debugger open, anything else will cause the debugger open
        !          1125:     to fail and the attachDebuggerClient() method will return false. */
        !          1126: 
        !          1127:     virtual IOReturn enable(IOKernelDebugger * debugger);
        !          1128:     virtual IOReturn handleDebuggerOpen(IOKernelDebugger * debugger);
        !          1129: 
        !          1130: /*! @function disable
        !          1131:     @abstract A disable request from an IOKernelDebugger client.
        !          1132:     @discussion This method is called when a close is received from an
        !          1133:     IOKernelDebugger client. A driver which implements
        !          1134:     enable(IOKernelDebugger *) should also implement this method to
        !          1135:     disable hardware support for the polled-mode send and receive methods.
        !          1136:     @param debugger The IOKernelDebugger client that issued the close.
        !          1137:     @result kIOReturnSuccess. The driver method should return a status
        !          1138:     from the disable operation. */
        !          1139: 
        !          1140:     virtual IOReturn disable(IOKernelDebugger * debugger);
        !          1141:     virtual IOReturn handleDebuggerClose(IOKernelDebugger * debugger);
        !          1142: 
        !          1143: /*! @function reserveDebuggerLock
        !          1144:     @abstract Take the global debugger lock.
        !          1145:     @discussion This method should not be used. Call the
        !          1146:     lock() method provided by IOKernelDebugger instead. */
        !          1147:     
        !          1148:     void reserveDebuggerLock();
        !          1149: 
        !          1150: /*! @function releaseDebuggerLock
        !          1151:     @abstract Release the global debugger lock.
        !          1152:     @discussion This method should not be used. Call the
        !          1153:     unlock() method provided by IOKernelDebugger instead. */
        !          1154: 
        !          1155:     void releaseDebuggerLock();
        !          1156: 
        !          1157: /*! @function receivePacket
        !          1158:     @abstract Debugger polled-mode receive handler.
        !          1159:     @discussion This method must be implemented by a driver that supports
        !          1160:     kernel debugging. After a debugger client is attached through
        !          1161:     attachDebuggerClient(), this method will be called by the debugger
        !          1162:     object to poll for a incoming packet when the debugger is active.
        !          1163:     This method can be called from an interrupt context, and the
        !          1164:     driver must never block or perform any memory allocation. The
        !          1165:     receivePacket() method in IONetworkController is used as a placeholder
        !          1166:     and should never be called. A driver that attaches a debugger client
        !          1167:     must override this method.
        !          1168:     @param pkt Pointer to a receive buffer where the received packet should
        !          1169:            be stored to. The buffer has room for 1518 bytes.
        !          1170:     @param pkt_len The length of the received packet must be written to the
        !          1171:            integer pointed by pkt_len.
        !          1172:     @param timeout The maximum amount of time in milliseconds to poll for
        !          1173:            a packet to arrive before this method must return. */ 
        !          1174: 
        !          1175:     virtual void receivePacket(void * pkt, UInt * pkt_len, UInt timeout);
        !          1176: 
        !          1177: /*! @function sendPacket
        !          1178:     @abstract Debugger polled-mode transmit handler.
        !          1179:     @discussion This method must be implemented by a driver that supports
        !          1180:     kernel debugging. After a debugger client is attached through
        !          1181:     attachDebuggerClient(), this method will be called by the debugger
        !          1182:     object to send an outbound packet generated by the debugger.
        !          1183:     This method can be called from an interrupt context, and the
        !          1184:     driver must never block or perform any memory allocation. The
        !          1185:     sendPacket() method in IONetworkController is used as a placeholder
        !          1186:     and should never be called. A driver that attaches a debugger client
        !          1187:     must override this method.
        !          1188:     @param pkt Pointer to a transmit buffer containing the packet to be sent.
        !          1189:     @param pkt_len The amount of data in the transmit buffer. */
        !          1190: 
        !          1191:     virtual void sendPacket(void * pkt, UInt pkt_len);
        !          1192: };
        !          1193: 
        !          1194: #define IONetworkAction IONetworkController::RequestAction
        !          1195: 
        !          1196: inline bool
        !          1197: IONetworkController::attachNetworkInterface(IONetworkInterface ** interface,
        !          1198:                                             bool  doRegister = true)
        !          1199: {
        !          1200:     return attachInterface(interface, doRegister);
        !          1201: }
        !          1202: 
        !          1203: #endif /* !_IONETWORKCONTROLLER_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.