Annotation of XNU/iokit/IOKit/usb/IOUSBController.h, revision 1.1.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) 1998 Apple Computer, Inc.  All rights reserved.
                     24:  *
                     25:  * HISTORY
                     26:  *
                     27:  */
                     28: 
                     29: 
                     30: #ifndef _IOKIT_IOUSBCONTROLLER_H
                     31: #define _IOKIT_IOUSBCONTROLLER_H
                     32: 
                     33: #include <IOKit/IOService.h>
                     34: #include <IOKit/IOMemoryDescriptor.h>
                     35: #include <libkern/c++/OSArray.h>
                     36: #include <IOKit/IODeviceMemory.h>
                     37: #include <IOKit/IOWorkLoop.h>
                     38: #include <IOKit/IOCommandGate.h>
                     39: 
                     40: #include <IOKit/usb/USB.h>
                     41: #include <IOKit/usb/IOUSBBus.h>
                     42: #include <IOKit/usb/IOUSBDevice.h>
                     43: #include <IOKit/usb/USBHub.h>
                     44: 
                     45: /*
                     46:  * USB Command
                     47:  * This is the command block for a USB command to be queued on the
                     48:  * Command Gate of the WorkLoop.  Although the actual work of creating
                     49:  * the command and enqueueing it is done for them via the deviceRequest,
                     50:  * read, and write methods, this is the primary way that devices will get
                     51:  * work done.
                     52:  * Note: This is private to IOUSBController and should be moved to a
                     53:  * private header.
                     54:  */
                     55: 
                     56: typedef enum {
                     57:     DEVICE_REQUEST,    // Device request using pointer
                     58:     READ,
                     59:     WRITE,
                     60:     CREATE_EP,
                     61:     DELETE_EP,
                     62:     DEVICE_REQUEST_DESC        // Device request using descriptor
                     63: } usbCommand;
                     64: 
                     65: typedef struct {
                     66:     usbCommand         selector;
                     67:     IOUSBDevRequest    *request;
                     68:     USBDeviceAddress   address;
                     69:     UInt8              endpoint;
                     70:     UInt8              direction;
                     71:     UInt8              type;
                     72:     IOMemoryDescriptor         *buffer;
                     73:     IOUSBCompletion    completion;
                     74:     UInt32             dataRemaining;  // For Control transfers
                     75:     UInt8              stage;          // For Control transfers
                     76:     IOReturn           status;
                     77: } IOUSBCommand;
                     78: 
                     79: typedef struct {
                     80:     usbCommand         selector;
                     81:     USBDeviceAddress   address;
                     82:     UInt8              endpoint;
                     83:     UInt8              direction;
                     84:     IOMemoryDescriptor *buffer;
                     85:     IOUSBIsocCompletion        completion;
                     86:     UInt64             startFrame;
                     87:     UInt32             numFrames;
                     88:     IOUSBIsocFrame *   frameList;
                     89:     IOReturn           status;
                     90: } IOUSBIsocCommand;
                     91: 
                     92: /*
                     93:  * Errata
                     94:  * These indicate the anomolies of the various chips sets.  Test
                     95:  * for these in errataBits.
                     96:  */
                     97: enum {
                     98:     // turn off UHCI test mode
                     99:     kErrataCMDDisableTestMode          = (1 << 0),
                    100:     // Don't cross page boundaries in a single transfer
                    101:     kErrataOnlySinglePageTransfers     = (1 << 1),
                    102:     // UIM will retry out transfers with buffer underrun errors
                    103:     kErrataRetryBufferUnderruns                = (1 << 2),
                    104:     // UIM will insert delay buffer between HS and LS transfers
                    105:     kErrataLSHSOpti                    = (1 << 3),
                    106:     // Always set the NOCP bit in rhDescriptorA register
                    107:     kErrataDisableOvercurrent          = (1 << 4),
                    108:     // Don't allow port suspend at the root hub
                    109:     kErrataLucentSuspendResume         = (1 << 5)
                    110: };
                    111: /* errataBits */
                    112: 
                    113: /*
                    114:     This table contains the list of errata that are necessary for known problems with particular devices.
                    115:     The format is vendorID, product ID, lowest revisionID needing errata, highest rev needing errata, errataBits.
                    116:     The result of all matches is ORed together, so more than one entry may match.
                    117:     Typically for a given errata a list of revisions that this applies to is supplied.
                    118: */
                    119: 
                    120: struct ErrataListEntryStruct {
                    121:     UInt16                             vendID;
                    122:     UInt16                             deviceID;
                    123:     UInt16                             revisionLo;
                    124:     UInt16                             revisionHi;
                    125:     UInt32                             errata;
                    126: };
                    127: 
                    128: typedef struct ErrataListEntryStruct
                    129:                     ErrataListEntry,
                    130:                     *ErrataListEntryPtr;
                    131: 
                    132: class IOUSBController;
                    133: class IOUSBDeviceZero;
                    134: class IOUSBRootHubDevice;
                    135: class IOMemoryDescriptor;
                    136: 
                    137: void IOUSBSyncCompletion(void *target, void * parameter,
                    138:                                   IOReturn     status,
                    139:                                   UInt32       bufferSizeRemaining);
                    140: 
                    141: void  IOUSBSyncIsoCompletion(void *target, void * parameter,
                    142:                                   IOReturn     status,
                    143:                                   IOUSBIsocFrame *pFrames);
                    144: 
                    145: 
                    146: 
                    147: /*!
                    148:     @class IOUSBController
                    149:     @abstract Base class for USB hardware driver
                    150:     @discussion Not many directly useful methods for USB device driver writers,
                    151:     IOUSBDevice, IOUSBInterface and IOUSBPipe provide more useful abstractions.
                    152:     The bulk of this class interfaces between IOKit and the low-level UIM, which is
                    153:     based on the MacOS9 UIM.
                    154: */
                    155: class IOUSBController : public IOUSBBus
                    156: {
                    157:     OSDeclareAbstractStructors(IOUSBController)
                    158: 
                    159: protected:
                    160: 
                    161:     IOWorkLoop                 *_workLoop;
                    162:     IOCommandGate      *_commandGate;
                    163: 
                    164:     IOUSBRootHubDevice *_rootHubDevice;
                    165: 
                    166:     IOLock *           _devZeroLock;
                    167: 
                    168:     static IOReturn doDeleteEP(OSObject *owner,
                    169:                                void *arg0, void *arg1,
                    170:                                void *arg2, void *arg3);
                    171:     static IOReturn doCreateEP(OSObject *owner,
                    172:                                void *arg0, void *arg1,
                    173:                                void *arg2, void *arg3);
                    174: 
                    175:     static IOReturn doControlTransfer(OSObject *owner,
                    176:                                void *arg0, void *arg1,
                    177:                                void *arg2, void *arg3);
                    178:     static IOReturn doIOTransfer(OSObject *owner,
                    179:                                void *arg0, void *arg1,
                    180:                                void *arg2, void *arg3);
                    181:     static IOReturn doIsocTransfer(OSObject *owner,
                    182:                                void *arg0, void *arg1,
                    183:                                void *arg2, void *arg3);
                    184:     virtual bool init(OSDictionary * propTable);
                    185:     virtual bool start( IOService * provider );
                    186: 
                    187:     virtual IOUSBDevice *newDevice();
                    188:     IOReturn   CreateDevice(IOUSBDevice                *device,
                    189:                             USBDeviceAddress           deviceAddress,
                    190:                              IOUSBDeviceDescriptor     *desc,
                    191:                              UInt8                     speed,
                    192:                              UInt32                    powerAvailable);
                    193:     IOReturn   getNubResources( IOService * regEntry );
                    194:     USBDeviceAddress   getNewAddress(void);
                    195:     IOReturn    ControlTransaction(IOUSBCommand *command);
                    196:     IOReturn    InterruptTransaction(IOUSBCommand *command);
                    197:     IOReturn    BulkTransaction(IOUSBCommand *command);
                    198:     IOReturn    IsocTransaction(IOUSBIsocCommand *command);
                    199:     void       ControlPacketHandler(
                    200:                                 void *                 parameter,
                    201:                                 IOReturn       status,
                    202:                                 UInt32         bufferSizeRemaining);
                    203:     void       InterruptPacketHandler(
                    204:                                 void *                 parameter,
                    205:                                 IOReturn       status,
                    206:                                 UInt32         bufferSizeRemaining);
                    207:     void       BulkPacketHandler(
                    208:                                 void *                 parameter,
                    209:                                 IOReturn       status,
                    210:                                 UInt32         bufferSizeRemaining);
                    211: 
                    212:     void       IsocCompletionHandler(
                    213:                                void *  parameter,
                    214:                                 IOReturn       status,
                    215:                                 IOUSBIsocFrame *pFrames);
                    216: 
                    217:     // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                    218:     // Invokes the specified completion action of the request.  If
                    219:     // the completion action is unspecified, no action is taken.
                    220:     inline void complete(IOUSBCompletion       completion,
                    221:                          IOReturn              status,
                    222:                          UInt32                        actualByteCount = 0);
                    223: 
                    224:     void freeCommand(IOUSBCommand * command);
                    225: 
                    226:     virtual UInt32 GetErrataBits(UInt16 vendorID, UInt16 deviceID, UInt16 revisionID);
                    227: 
                    228:     /*
                    229:      * UIM methods
                    230:      */
                    231:     virtual IOReturn UIMInitialize(IOService * provider) = 0;
                    232:     virtual IOReturn UIMFinalize() = 0;
                    233:     // Control
                    234:     virtual IOReturn UIMCreateControlEndpoint(
                    235:             UInt8                              functionNumber,
                    236:             UInt8                              endpointNumber,
                    237:             UInt16                             maxPacketSize,
                    238:             UInt8                              speed) = 0;
                    239: 
                    240:     virtual IOReturn UIMCreateControlTransfer(
                    241:             short                              functionNumber,
                    242:             short                              endpointNumber,
                    243:             IOUSBCompletion                    completion,
                    244:             void *                             CBP,
                    245:             bool                               bufferRounding,
                    246:             UInt32                             bufferSize,
                    247:             short                              direction) = 0;
                    248: 
                    249:     virtual IOReturn UIMCreateControlTransfer(
                    250:             short                              functionNumber,
                    251:             short                              endpointNumber,
                    252:             IOUSBCompletion                    completion,
                    253:             IOMemoryDescriptor *               CBP,
                    254:             bool                               bufferRounding,
                    255:             UInt32                             bufferSize,
                    256:             short                              direction) = 0;
                    257:     
                    258:     // Bulk
                    259:     virtual IOReturn UIMCreateBulkEndpoint(
                    260:             UInt8                              functionNumber,
                    261:             UInt8                              endpointNumber,
                    262:             UInt8                              direction,
                    263:             UInt8                              speed,
                    264:             UInt8                              maxPacketSize) = 0;
                    265: 
                    266:     virtual IOReturn UIMCreateBulkTransfer(
                    267:             short                              functionNumber,
                    268:             short                              endpointNumber,
                    269:             IOUSBCompletion                    completion,
                    270:             IOMemoryDescriptor *               CBP,
                    271:             bool                               bufferRounding,
                    272:             UInt32                             bufferSize,
                    273:             short                              direction) = 0;
                    274: 
                    275:     // Interrupt
                    276:     virtual IOReturn UIMCreateInterruptEndpoint(
                    277:             short                              functionAddress,
                    278:             short                              endpointNumber,
                    279:             UInt8                              direction,
                    280:             short                              speed,
                    281:             UInt16                             maxPacketSize,
                    282:             short                              pollingRate) = 0;
                    283: 
                    284:     virtual IOReturn UIMCreateInterruptTransfer(
                    285:             short                              functionNumber,
                    286:             short                              endpointNumber,
                    287:             IOUSBCompletion                    completion,
                    288:             IOMemoryDescriptor *               CBP,
                    289:             bool                               bufferRounding,
                    290:             UInt32                             bufferSize,
                    291:             short                              direction) = 0;
                    292: 
                    293:     // Isoch
                    294:     virtual IOReturn UIMCreateIsochEndpoint(
                    295:             short                              functionAddress,
                    296:             short                              endpointNumber,
                    297:             UInt32                             maxPacketSize,
                    298:             UInt8                              direction) = 0;
                    299: 
                    300:     virtual IOReturn UIMCreateIsochTransfer(
                    301:             short                      functionAddress,
                    302:             short                      endpointNumber,
                    303:             IOUSBIsocCompletion                completion,
                    304:             UInt8                      direction,
                    305:             UInt64                     frameStart,
                    306:             IOMemoryDescriptor *       pBuffer,
                    307:             UInt32                     frameCount,
                    308:             IOUSBIsocFrame             *pFrames) = 0;
                    309: 
                    310:     virtual IOReturn UIMAbortEndpoint(
                    311:             short                              functionNumber,
                    312:             short                              endpointNumber,
                    313:             short                              direction) = 0;
                    314: 
                    315:     virtual IOReturn UIMDeleteEndpoint(
                    316:             short                              functionNumber,
                    317:             short                              endpointNumber,
                    318:             short                              direction) = 0;
                    319:     
                    320:     virtual IOReturn UIMClearEndpointStall(
                    321:             short                              functionNumber,
                    322:             short                              endpointNumber,
                    323:             short                              direction) = 0;
                    324: 
                    325:     virtual void UIMRootHubStatusChange(void) = 0;
                    326: 
                    327: public:
                    328: 
                    329:     /*!
                    330:        @struct Endpoint
                    331:         Describes an endpoint of a device.
                    332:        Simply an easier to use version of the endpoint descriptor.
                    333:         @field descriptor The raw endpoint descriptor.
                    334:         @field number Endpoint number
                    335:        @field direction Endpoint direction: kUSBOut, kUSBIn, kUSBAnyDirn
                    336:        @field transferType Type of endpoint: kUSBControl, kUSBIsoc, kUSBBulk, kUSBInterrupt
                    337:        @field maxPacketSize Maximum packet size for endpoint
                    338:        @field interval Polling interval in milliseconds (only relevent for Interrupt endpoints)
                    339:     */
                    340:     struct Endpoint {
                    341:         IOUSBEndpointDescriptor        *descriptor;
                    342:         UInt8                  number;
                    343:         UInt8                  direction;      // in, out
                    344:         UInt8                  transferType;   // cntrl, bulk, isoc, int
                    345:         UInt16                 maxPacketSize;
                    346:         UInt8                  interval;
                    347:     };
                    348: 
                    349:     // Implements IOService::getWorkLoop const member function
                    350:     virtual IOWorkLoop *getWorkLoop() const;
                    351:     
                    352:     /*
                    353:      * Root hub methods
                    354:      * Only of interest to the IOUSBRootHubDevice object
                    355:      */
                    356:     virtual IOReturn getRootHubDeviceDescriptor(IOUSBDeviceDescriptor *desc) = 0;
                    357:     virtual IOReturn getRootHubDescriptor(IOUSBHubDescriptor *desc) = 0;
                    358:     virtual IOReturn setRootHubDescriptor(OSData *buffer) = 0;
                    359:     virtual IOReturn getRootHubConfDescriptor(OSData *desc) = 0;
                    360:     virtual IOReturn getRootHubStatus(IOUSBHubStatus *status) = 0;
                    361:     virtual IOReturn setRootHubFeature(UInt16 wValue) = 0;
                    362:     virtual IOReturn clearRootHubFeature(UInt16 wValue) = 0;
                    363:     virtual IOReturn getRootHubPortStatus(IOUSBHubPortStatus *status,
                    364:                                                 UInt16 port) = 0;
                    365:     virtual IOReturn setRootHubPortFeature(UInt16 wValue, UInt16 port) = 0;
                    366:     virtual IOReturn clearRootHubPortFeature(UInt16 wValue, UInt16 port) = 0;
                    367:     virtual IOReturn getRootHubPortState(UInt8 *state, UInt16 port) = 0;
                    368:     virtual IOReturn setHubAddress(UInt16 wValue) = 0;
                    369: 
                    370:     /*!
                    371:        @function openPipe
                    372:         Open a pipe to the specified device endpoint
                    373:         @param address Address of the device on the USB bus
                    374:        @param speed of the device: kUSBHighSpeed or kUSBLowSpeed
                    375:         @param endpoint description of endpoint to connect to
                    376:     */
                    377:     virtual IOReturn openPipe(USBDeviceAddress address, UInt8 speed,
                    378:                               Endpoint *endpoint);
                    379:     /*!
                    380:         @function closePipe
                    381:         Close a pipe to the specified device endpoint
                    382:         @param address Address of the device on the USB bus
                    383:        @param endpoint description of endpoint
                    384:     */
                    385:     virtual IOReturn closePipe(USBDeviceAddress address,
                    386:                                Endpoint * endpoint);
                    387: 
                    388:     // Controlling pipe state
                    389:     /*!
                    390:         @function abortPipe
                    391:         Abort pending I/O to/from the specified endpoint, causing them to complete
                    392:        with return code kIOReturnAborted
                    393:         @param address Address of the device on the USB bus
                    394:         @param endpoint description of endpoint
                    395:     */
                    396:     virtual IOReturn abortPipe(USBDeviceAddress address,
                    397:                                Endpoint * endpoint);
                    398:     /*!
                    399:         @function resetPipe
                    400:         Abort pending I/O and clear stalled state - this method is a combination of
                    401:        abortPipe and clearPipeStall
                    402:         @param address Address of the device on the USB bus
                    403:         @param endpoint description of endpoint
                    404:     */
                    405:     virtual IOReturn resetPipe(USBDeviceAddress address,
                    406:                                Endpoint * endpoint);
                    407:     /*!
                    408:         @function clearPipeStall
                    409:         Clear a pipe stall.
                    410:         @param address Address of the device on the USB bus
                    411:         @param endpoint description of endpoint
                    412:     */
                    413:     virtual IOReturn clearPipeStall(USBDeviceAddress address,
                    414:                                     Endpoint * endpoint);
                    415: 
                    416:     // Transferring Data
                    417:     /*!
                    418:         @function read
                    419:         Read from an interrupt or bulk endpoint
                    420:        @param buffer place to put the transferred data
                    421:         @param address Address of the device on the USB bus
                    422:         @param endpoint description of endpoint
                    423:        @param completion describes action to take when buffer has been filled 
                    424:     */
                    425:     virtual IOReturn read(IOMemoryDescriptor *         buffer,
                    426:                           USBDeviceAddress     address,
                    427:                           Endpoint *   endpoint,
                    428:                           IOUSBCompletion *    completion);
                    429:     /*!
                    430:         @function write
                    431:         Write to an interrupt or bulk endpoint
                    432:         @param buffer place to get the transferred data
                    433:         @param address Address of the device on the USB bus
                    434:         @param endpoint description of endpoint
                    435:         @param completion describes action to take when buffer has been emptied
                    436:     */
                    437:     virtual IOReturn write(IOMemoryDescriptor *        buffer,
                    438:                            USBDeviceAddress    address,
                    439:                            Endpoint *  endpoint,
                    440:                            IOUSBCompletion *   completion);
                    441: 
                    442:     /*!
                    443:         @function isocIO
                    444:         Read from or write to an isochronous endpoint
                    445:         @param buffer place to put the transferred data
                    446:         @param frameStart USB frame number of the frame to start transfer
                    447:         @param numFrames Number of frames to transfer
                    448:         @param frameList Bytes to transfer and result for each frame
                    449:         @param address Address of the device on the USB bus
                    450:         @param endpoint description of endpoint
                    451:         @param completion describes action to take when buffer has been filled
                    452:     */
                    453:     virtual IOReturn isocIO(IOMemoryDescriptor * buffer,
                    454:                           UInt64 frameStart,
                    455:                          UInt32 numFrames,
                    456:                           IOUSBIsocFrame *frameList,
                    457:                           USBDeviceAddress     address,
                    458:                           Endpoint *   endpoint,
                    459:                           IOUSBIsocCompletion *        completion);
                    460:     /*!
                    461:         @function deviceRequest
                    462:         Make a control request to the specified endpoint
                    463:        There are two versions of this method, one uses a simple void *
                    464:         to point to the data portion of the transfer, the other uses an
                    465:        IOMemoryDescriptor to point to the data.
                    466:        @param request parameter block for the control request
                    467:        @param completion describes action to take when the request has been executed
                    468:         @param address Address of the device on the USB bus
                    469:        @param epNum endpoint number
                    470:     */
                    471:     virtual IOReturn deviceRequest(IOUSBDevRequest *   request,
                    472:                                    IOUSBCompletion *   completion,
                    473:                                    USBDeviceAddress address, UInt8 epNum);
                    474:     virtual IOReturn deviceRequest(IOUSBDevRequestDesc *request,
                    475:                                    IOUSBCompletion *   completion,
                    476:                                    USBDeviceAddress address, UInt8 epNum);
                    477: 
                    478:     /*
                    479:      * Methods used by the hub driver to initialize a device
                    480:      */
                    481:     /*!
                    482:        @function AcquireDeviceZero
                    483:        Get the device zero lock - call this before resetting a device, to ensure there's
                    484:        only one device with address 0
                    485:     */
                    486:     virtual IOReturn AcquireDeviceZero();
                    487:     /*!
                    488:         @function ReleaseDeviceZero
                    489:         Release the device zero lock - call this to release the device zero lock,
                    490:        when there is no longer a device at address 0
                    491:     */
                    492:     virtual void ReleaseDeviceZero(void);
                    493: 
                    494:     /*!
                    495:         @function WaitForReleaseDeviceZero
                    496:         Block until the device zero lock is released
                    497:     */
                    498:     void       WaitForReleaseDeviceZero();
                    499: 
                    500:     /*!
                    501:         @function ConfigureDeviceZero
                    502:         create a pipe to the default pipe for the device at address 0
                    503:         @param maxPacketSize max packet size for the pipe
                    504:        @param speed Device speed
                    505:     */
                    506:     IOReturn   ConfigureDeviceZero(UInt8 maxPacketSize, UInt8 speed);
                    507:     /*!
                    508:         @function GetDeviceZeroDescriptor
                    509:         read the device descriptor of the device at address 0
                    510:        @param desc pointer to descriptor
                    511:     */
                    512:     IOReturn   GetDeviceZeroDescriptor(IOUSBDeviceDescriptor *desc);
                    513:     /*!
                    514:         @function SetDeviceZeroAddress
                    515:         Set the device address of the device currently at address 0.
                    516:        When this routine returns, it's safe to release the device zero lock.
                    517:        @param address New address for the device
                    518:        @param maxPacketSize maximum packet size for the default pipe
                    519:        @param speed speed of the device
                    520:     */
                    521:     IOReturn   SetDeviceZeroAddress(USBDeviceAddress address,
                    522:                                UInt8 maxPacketSize, UInt8 speed);
                    523:     /*!
                    524:        @function MakeDevice
                    525:        Create a new device object for the device currently at address 0.
                    526:        This routine calls SetDeviceZeroAddress() with a new, unique, address for the device
                    527:        and adds the device into the registry.
                    528:        @param desc Device descriptor of the device
                    529:        @param speed Device speed
                    530:        @param power Bus power available to the device
                    531:        @result Pointer to the newly-created device, 0 if the object coudn't be created. 
                    532:     */
                    533:     IOUSBDevice *MakeDevice(IOUSBDeviceDescriptor *desc,
                    534:                                             UInt8 speed, UInt32 power);
                    535: 
                    536:     /*!
                    537:        @function GetBandwidthAvailable
                    538:         Returns the available bandwidth (in bytes) per frame for
                    539:        isochronous transfers.
                    540:        @result maximum number of bytes that a new iso pipe could transfer
                    541:        per frame given current allocations.
                    542:     */
                    543:     virtual UInt32 GetBandwidthAvailable() = 0;
                    544: 
                    545:     /*!
                    546:         @function GetFrameNumber
                    547:         Returns the full current frame number.
                    548:         @result The frame number.
                    549:     */
                    550:     virtual UInt64 GetFrameNumber() = 0;
                    551: 
                    552:     /*!
                    553:         @function GetFrameNumber32
                    554:         Returns the least significant 32 bits of the frame number.
                    555:         @result The lsb 32 bits of the frame number.
                    556:     */
                    557:     virtual UInt32 GetFrameNumber32() = 0;
                    558: 
                    559:     // Debugger polled mode
                    560:     virtual void pollInterrupts(IOUSBCompletionAction safeAction=0) = 0;
                    561:     virtual IOReturn PolledRead(
                    562:             short                              functionNumber,
                    563:             short                              endpointNumber,
                    564:             IOUSBCompletion                    completion,
                    565:             IOMemoryDescriptor *               CBP,
                    566:             bool                               bufferRounding,
                    567:             UInt32                             bufferSize);
                    568: };
                    569: 
                    570: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                    571: // Inline Functions
                    572: 
                    573: inline void IOUSBController::complete(IOUSBCompletion  completion,
                    574:                                       IOReturn         status,
                    575:                                       UInt32           actualByteCount)
                    576: {
                    577:     if (completion.action)  (*completion.action)(completion.target,
                    578:                                                  completion.parameter,
                    579:                                                  status,
                    580:                                                  actualByteCount);
                    581: }
                    582: 
                    583: #endif /* ! _IOKIT_IOUSBCONTROLLER_H */
                    584: 

unix.superglobalmegacorp.com

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