|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.