Annotation of XNU/iokit/Families/IOUSBBus/IOUSBRootHubDevice.cpp, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /*
        !            23:  * Copyright (c) 1998 Apple Computer, Inc.  All rights reserved.
        !            24:  *
        !            25:  * HISTORY
        !            26:  *
        !            27:  */
        !            28: 
        !            29: #include <libkern/OSByteOrder.h>
        !            30: 
        !            31: #include "IOUSBRootHubDevice.h"
        !            32: 
        !            33: #define super  IOUSBDevice
        !            34: #define self   this
        !            35: #define DEBUGGING_LEVEL 0
        !            36: #define DEBUGLOG kprintf
        !            37: 
        !            38: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        !            39: 
        !            40: OSDefineMetaClassAndStructors( IOUSBRootHubDevice, IOUSBDevice )
        !            41: 
        !            42: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
        !            43: 
        !            44: 
        !            45: // intercept regular hub requests since the controller simulates the root hub
        !            46: IOReturn IOUSBRootHubDevice::deviceRequest(IOUSBDevRequest     *request,
        !            47:                                            IOUSBCompletion     *completion = 0)
        !            48: {
        !            49:     IOReturn           err = 0;
        !            50:     UInt16             theRequest;
        !            51:     UInt16             wIndex;
        !            52:     UInt16             wValue;
        !            53:     UInt16             wLength;
        !            54:     UInt8              dType, dIndex;
        !            55: 
        !            56:     
        !            57:     if (!request)
        !            58:         return(kIOReturnBadArgument);
        !            59: 
        !            60:     wValue = OSReadLittleInt16(&request->wValue, 0);
        !            61:     wIndex = OSReadLittleInt16(&request->wIndex, 0);
        !            62:     wLength = OSReadLittleInt16(&request->wLength, 0);
        !            63: 
        !            64: #if (DEBUGGING_LEVEL > 0)
        !            65:     DEBUGLOG("%s: deviceRequest([%x,%s,%x,%x],[%x,%x],[%x,%lx])", getName(),
        !            66:              request->bRequest,
        !            67:              request->rqDirection?"in":"out",
        !            68:              request->rqType, request->rqRecipient,
        !            69:              wValue, wIndex, wLength, (UInt32)request->pData);
        !            70: #endif
        !            71: 
        !            72:     theRequest = EncodeRequest(request->bRequest, request->rqDirection,
        !            73:                                request->rqType,   request->rqRecipient);
        !            74:     switch (theRequest)
        !            75:     {
        !            76:         // Standard Requests
        !            77:         case kClearDeviceFeature:
        !            78: #if (DEBUGGING_LEVEL > 0)
        !            79:             DEBUGLOG("\tkClearDeviceFeature\n");
        !            80: #endif
        !            81:             if (wIndex == 0)
        !            82:                 err = _controller->clearRootHubFeature(wValue);
        !            83:             else
        !            84:                 err = kIOReturnBadArgument;
        !            85:             break;
        !            86: 
        !            87:         case kGetDescriptor:
        !            88: #if (DEBUGGING_LEVEL > 0)
        !            89:             DEBUGLOG("\tkGetDescriptor\n");
        !            90: #endif
        !            91:             dType = wValue >> 8;
        !            92:             dIndex = wValue & 0x00FF;
        !            93:             switch (dType) {
        !            94:                 case kUSBDeviceDesc:
        !            95:                     err = _controller->getRootHubDeviceDescriptor(
        !            96:                                    (IOUSBDeviceDescriptor*)request->pData);
        !            97:                     break;
        !            98: 
        !            99:                 case kUSBConfDesc:
        !           100:                 {
        !           101:                     OSData *fullDesc = OSData::withCapacity(1024); // FIXME
        !           102:                     UInt16 newLength;
        !           103:                     
        !           104:                     err = _controller->getRootHubConfDescriptor(fullDesc);
        !           105:                     newLength = fullDesc->getLength();
        !           106:                     if (newLength < wLength)
        !           107:                         wLength = newLength;
        !           108:                     bcopy(fullDesc->getBytesNoCopy(),
        !           109:                           (char *)request->pData,
        !           110:                           wLength);
        !           111:                     request->wLenDone = wLength;
        !           112:                     fullDesc->free();
        !           113:                     break;
        !           114:                 }
        !           115: 
        !           116:                 case kUSBStringDesc:
        !           117:                 default:
        !           118:                     err = kIOReturnInvalid;
        !           119:             }
        !           120:             break;
        !           121: 
        !           122:         case kGetDeviceStatus:
        !           123: #if (DEBUGGING_LEVEL > 0)
        !           124:             DEBUGLOG("\tkGetDeviceStatus\n");
        !           125: #endif
        !           126:             if (wValue == 0 && wIndex == 0 && request->pData != 0)
        !           127:                 *(UInt16*)(request->pData) = HostToUSBWord(1); // self-powered
        !           128:             else
        !           129:                 err = kIOReturnBadArgument;
        !           130:             break;
        !           131: 
        !           132:         case kSetAddress:
        !           133: #if (DEBUGGING_LEVEL > 0)
        !           134:             DEBUGLOG("\tkSetAddress\n");
        !           135: #endif
        !           136:             if (wIndex == 0)
        !           137:                 err = _controller->setHubAddress(wValue);
        !           138:             else
        !           139:                 err = kIOReturnBadArgument;
        !           140:             break;
        !           141:                 
        !           142:         case kSetConfiguration:
        !           143: #if (DEBUGGING_LEVEL > 0)
        !           144:             DEBUGLOG("\tkSetConfiguration\n");
        !           145: #endif
        !           146:             if (wIndex == 0)
        !           147:                 configuration = wValue;
        !           148:             else
        !           149:                 err = kIOReturnBadArgument;
        !           150:             break;
        !           151: 
        !           152:         case kSetDeviceFeature:
        !           153: #if (DEBUGGING_LEVEL > 0)
        !           154:             DEBUGLOG("\tkSetDeviceFeature\n");
        !           155: #endif
        !           156:             if (wIndex == 0)
        !           157:                 err = _controller->setRootHubFeature(wValue);
        !           158:             else
        !           159:                 err = kIOReturnBadArgument;
        !           160:             break;
        !           161: 
        !           162:         case kGetConfiguration:
        !           163: #if (DEBUGGING_LEVEL > 0)
        !           164:             DEBUGLOG("\tkGetConfiguration\n");
        !           165: #endif
        !           166:             if (wIndex == 0 && request->pData != 0)
        !           167:                 *(UInt8*)(request->pData) = configuration;
        !           168:             else
        !           169:                 err = kIOReturnBadArgument;
        !           170:             break;
        !           171: 
        !           172:         case kClearInterfaceFeature:
        !           173:         case kClearEndpointFeature:
        !           174:         case kGetInterface:
        !           175:         case kGetInterfaceStatus:
        !           176:         case kGetEndpointStatus:
        !           177:         case kSetInterfaceFeature:
        !           178:         case kSetEndpointFeature:
        !           179:         case kSetDescriptor:
        !           180:         case kSetInterface:
        !           181:         case kSyncFrame:
        !           182: #if (DEBUGGING_LEVEL > 0)
        !           183:             DEBUGLOG("\tUNIMPLEMENTED request\n"); 
        !           184: #endif
        !           185:             err = kIOReturnUnsupported;
        !           186:             break;
        !           187: 
        !           188:         // Class Requests
        !           189:         case kClearHubFeature:
        !           190: #if (DEBUGGING_LEVEL > 0)
        !           191:             DEBUGLOG("\tkClearHubFeature\n");
        !           192: #endif
        !           193:             if (wIndex == 0)
        !           194:                 err = _controller->clearRootHubFeature(wValue);
        !           195:             else
        !           196:                 err = kIOReturnBadArgument;
        !           197:             break;
        !           198: 
        !           199:         case kClearPortFeature:
        !           200: #if (DEBUGGING_LEVEL > 0)
        !           201:             DEBUGLOG("\tkClearPortFeature\n");
        !           202: #endif
        !           203:             err = _controller->clearRootHubPortFeature(wValue, wIndex);
        !           204:             break;
        !           205: 
        !           206:         case kGetPortState:
        !           207: #if (DEBUGGING_LEVEL > 0)
        !           208:             DEBUGLOG("\tkGetPortState\n");
        !           209: #endif
        !           210:             if (wValue == 0 && request->pData != 0)
        !           211:                 err = _controller->getRootHubPortState((UInt8 *)request->pData,
        !           212:                                                        wIndex);
        !           213:             else
        !           214:                 err = kIOReturnBadArgument;
        !           215:             break;
        !           216: 
        !           217:         case kGetHubDescriptor:
        !           218: #if (DEBUGGING_LEVEL > 0)
        !           219:             DEBUGLOG("\tkGetHubDescriptor\n");
        !           220: #endif
        !           221:             if (wValue == kUSBHubDescriptorType && request->pData != 0)
        !           222:                 err = _controller->getRootHubDescriptor(
        !           223:                                         (IOUSBHubDescriptor *)request->pData);
        !           224:             else
        !           225:                 err = kIOReturnBadArgument;
        !           226:             break;
        !           227: 
        !           228:         case kGetHubStatus:
        !           229: #if (DEBUGGING_LEVEL > 0)
        !           230:             DEBUGLOG("\tkGetHubStatus\n");
        !           231: #endif
        !           232:             if (wValue == 0 && wIndex == 0 && request->pData != 0)
        !           233:                 err = _controller->getRootHubStatus(
        !           234:                                               (IOUSBHubStatus *)request->pData);
        !           235:             else
        !           236:                 err = kIOReturnBadArgument;
        !           237:            break;
        !           238: 
        !           239:         case kGetPortStatus:
        !           240: #if (DEBUGGING_LEVEL > 0)
        !           241:             DEBUGLOG("\tkGetPortStatus\n");
        !           242: #endif
        !           243:             if (wValue == 0 && request->pData != 0)
        !           244:                 err = _controller->getRootHubPortStatus(
        !           245:                                (IOUSBHubPortStatus *)request->pData, wIndex);
        !           246:             else
        !           247:                 err = kIOReturnBadArgument;
        !           248:             break;
        !           249: 
        !           250:         case kSetHubDescriptor:
        !           251: #if (DEBUGGING_LEVEL > 0)
        !           252:             DEBUGLOG("\tkSetHubDescriptor\n");
        !           253: #endif
        !           254:             if (request->pData != 0)
        !           255:                 err = _controller->setRootHubDescriptor(
        !           256:                                                    (OSData *)request->pData);
        !           257:             else
        !           258:                 err = kIOReturnBadArgument;
        !           259:             break;
        !           260: 
        !           261:         case kSetHubFeature:
        !           262: #if (DEBUGGING_LEVEL > 0)
        !           263:             DEBUGLOG("\tkSetHubFeature\n");
        !           264: #endif
        !           265:             if (wIndex == 0)
        !           266:                 err = _controller->setRootHubFeature(wValue);
        !           267:             else
        !           268:                 err = kIOReturnBadArgument;
        !           269:             break;
        !           270: 
        !           271:         case kSetPortFeature:
        !           272: #if (DEBUGGING_LEVEL > 0)
        !           273:             DEBUGLOG("\tkSetPortFeature\n");
        !           274: #endif
        !           275:             err = _controller->setRootHubPortFeature(wValue, wIndex);
        !           276:             break;
        !           277: 
        !           278:         default:
        !           279: #if (DEBUGGING_LEVEL > 0)
        !           280:             DEBUGLOG("\tINVALID request\n"); 
        !           281: #endif
        !           282:             err = kIOReturnInvalid;
        !           283: 
        !           284:     }
        !           285:     return(err);
        !           286: }
        !           287: 

unix.superglobalmegacorp.com

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