Annotation of kernel/bsd/dev/ppc/drvUSBCMD/Library/uslUtility.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
        !             7:  * Reserved.  This file contains Original Code and/or Modifications of
        !             8:  * Original Code as defined in and that are subject to the Apple Public
        !             9:  * Source License Version 1.1 (the "License").  You may not use this file
        !            10:  * except in compliance with the License.  Please obtain a copy of the
        !            11:  * License at http://www.apple.com/publicsource and read it before using
        !            12:  * this file.
        !            13:  * 
        !            14:  * The Original Code and all software distributed under the License are
        !            15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            19:  * License for the specific language governing rights and limitations
        !            20:  * under the License.
        !            21:  * 
        !            22:  * @APPLE_LICENSE_HEADER_END@
        !            23:  */
        !            24: 
        !            25: /*
        !            26:        File:           uslUtility.c
        !            27: 
        !            28:        Contains:       xxx put contents here xxx
        !            29: 
        !            30:        Version:        xxx put version here xxx
        !            31: 
        !            32:        Copyright:      � 1998 by Apple Computer, Inc., all rights reserved.
        !            33: 
        !            34:        File Ownership:
        !            35: 
        !            36:                DRI:                            xxx put dri here xxx
        !            37: 
        !            38:                Other Contact:          xxx put other contact here xxx
        !            39: 
        !            40:                Technology:                     xxx put technology here xxx
        !            41: 
        !            42:        Writers:
        !            43: 
        !            44:                (TC)    Tom Clark
        !            45:                (DF)    David Ferguson
        !            46:                (DKF)   David Ferguson
        !            47:                (BT)    Barry Twycross
        !            48: 
        !            49:        Change History (most recent first):
        !            50: 
        !            51:         <USB33>        10/29/98        BT              Close old configurations on reset or reconfiguration.
        !            52:         <USB32>         10/7/98        BT              Fix callback at task time.
        !            53:         <USB31>         10/7/98        BT              Add 32bit endian functions
        !            54:         <USB30>         9/29/98        BT              Use real frame timing
        !            55:         <USB29>         9/28/98        BT              Add device reset function
        !            56:         <USB28>         8/24/98        BT              Eliminate old checkPB version, add new one for Isoc
        !            57:         <USB27>         8/13/98        BT              Add multibus support
        !            58:         <USB26>         8/12/98        BT              Move root hub into UIM again
        !            59:         <USB25>         7/28/98        BT              Dev zero is valid ref
        !            60:         <USB24>         7/10/98        TC              Essentially take out <USB19>.
        !            61:         <USB23>          7/9/98        BT              Clean up queues when device deleted. Merge in branch
        !            62:         <USB22>          7/2/98        BT              Fix dealloc mem to zero buffer ptr.
        !            63:         <USB21>          7/2/98        BT              Use UIM time for internal timing
        !            64:         <USB20>          7/2/98        BT              Return the right framenumber from USBDelay. Let framecount take
        !            65:                                                                        kNoCallBack.
        !            66:         <USB19>         6/30/98        BT              Move Root hub sim into UIM
        !            67:         <USB18>         6/15/98        DF              Remove compiler build problem.  It didn't like passing a pointer
        !            68:                                                                        to a struct pointer that was declared volatile.
        !            69:         <USB17>         6/14/98        DF              Cancel InterruptTimer when being replaced.
        !            70:         <USB16>          6/5/98        BT              DeallocMem will work immediatlty
        !            71:         <USB15>          6/5/98        BT              Use UIM time
        !            72:         <USB14>         4/30/98        BT              Add real interrupt driven timer
        !            73:         <USB13>         4/23/98        BT              Add hub watchdog function
        !            74:         <USB12>         4/16/98        BT              Eliminate debugger
        !            75:         <USB11>         4/10/98        BT              add USB to host word
        !            76:         <USB10>          4/9/98        BT              Use USB.h
        !            77:                 <9>      4/8/98        BT              More error checking
        !            78:                 <8>      4/2/98        BT              Error checking for nil call backs. Also Ferg's Use DSL Timing
        !            79:                                                                        Services directly
        !            80:                 <7>     3/11/98        BT              Give time to root hub int sim
        !            81:                 <6>      3/2/98        BT              Back out timer changes
        !            82:                 <5>     2/24/98        BT              Change timer to non-persistant
        !            83:                 <4>     2/19/98        BT              Make timer non task time.
        !            84:                 <3>     2/16/98        BT              Fix calling processdone queue and timer too often.
        !            85:          <USB2>          2/9/98        DKF             add USBIdleTask for handling events that need file I/O safe
        !            86:                                                                        time.
        !            87:                 <1>     1/29/98        BT              first checked in
        !            88: */
        !            89: 
        !            90: #include "../driverservices.h"
        !            91: #include "../USB.h"
        !            92: #include "../USBpriv.h"
        !            93: #include "uslpriv.h"
        !            94: #include "../uimpriv.h"
        !            95: #import <sys/callout.h>
        !            96: #import <kernserv/ns_timer.h>
        !            97: 
        !            98: 
        !            99: static QHdrPtr delayQueue;
        !           100: static QHdrPtr notifyQueue;
        !           101: static QHdrPtr memoryQueue;
        !           102: static unsigned long notifyFlag = 0;
        !           103: volatile TimerID curTimerID;
        !           104: 
        !           105: static UInt32 idled;
        !           106: #define ONE_MILLI_SECOND  1000000ULL     /* nanoseconds/10**6 */
        !           107: void timerHandler(void *p1);  //naga
        !           108: static SInt32 interruptPriority;
        !           109: 
        !           110: 
        !           111: void uslCleanAQueue(QHdrPtr queue, USBDeviceRef ref)
        !           112: {      // This is assuming its called at secondary interrupt time.
        !           113: USBPB *pb, *pbNext;
        !           114: 
        !           115:        if(CurrentExecutionLevel() != kSecondaryInterruptLevel)
        !           116:        {
        !           117:                USBExpertStatus(0, "USL - clean Q call at wrong time", ref);
        !           118:                return;
        !           119:        }
        !           120:        
        !           121:        if(queue == nil)
        !           122:        {
        !           123:                return;
        !           124:        }
        !           125:        pb = (void *)queue->qHead;
        !           126:        
        !           127:        while(pb != nil)
        !           128:        {
        !           129:                pbNext = (void *)pb->qlink;
        !           130:                if(isSameDevice(pb->usbReference, ref))
        !           131:                {
        !           132:                        USBExpertStatus(0, "USL - killing Q element", ref);
        !           133:                        PBDequeue((void *)pb, queue);   // unqueue it an forget it
        !           134:                }               
        !           135:                pb = pbNext;
        !           136:        }
        !           137: }
        !           138: 
        !           139: void uslCleanDelayQueue(USBDeviceRef ref)
        !           140: {      // This is assuming its called at secondary interrupt time.
        !           141:        uslCleanAQueue(delayQueue, ref);
        !           142: }
        !           143: 
        !           144: 
        !           145: void uslCleanNotifyQueue(USBDeviceRef ref)
        !           146: {      // This is assuming its called at secondary interrupt time.
        !           147:        uslCleanAQueue(notifyQueue, ref);
        !           148: }
        !           149: 
        !           150: 
        !           151: void uslCleanMemQueue(USBDeviceRef ref)
        !           152: {      // This is assuming its called at secondary interrupt time.
        !           153:        uslCleanAQueue(memoryQueue, ref);
        !           154: }
        !           155: 
        !           156: 
        !           157: 
        !           158: 
        !           159: 
        !           160: void uslInterruptPriority(UInt32 delta)
        !           161: {
        !           162:        AddAtomic(delta, &interruptPriority);
        !           163:        if(interruptPriority < 0)
        !           164:        {
        !           165:                USBExpertStatus(0, "USL - interrrupt prority gone negative", interruptPriority);
        !           166:        }
        !           167: }
        !           168: 
        !           169: 
        !           170: OSStatus USBResetDevice(USBPB *pb)
        !           171: {
        !           172: //      --> usbReference       device/interface/endpoint - which device.
        !           173: usbDevice *dev;
        !           174: pipe *p;
        !           175: OSStatus err;
        !           176: 
        !           177:        if(!checkPBVersion(pb, kUSBPowerReset))
        !           178:        {
        !           179:                return(pb->usbStatus);
        !           180:        }
        !           181: 
        !           182:        dev = getDevicePtr(pb->usbReference);
        !           183:        if(dev == nil)
        !           184:        {
        !           185:                err = findPipe(pb->usbReference, &p);
        !           186:                if(p != nil)
        !           187:                {
        !           188:                        dev = getDevicePtr(p->devIntfRef);
        !           189:                }
        !           190:        }
        !           191:        if(dev == nil)
        !           192:        {
        !           193:                pb->usbStatus = kUSBUnknownDeviceErr;
        !           194:                return(pb->usbStatus);
        !           195:        }
        !           196: 
        !           197:        uslUnconfigureDevice(dev);
        !           198: 
        !           199:        pb->usbStatus = kUSBPending;
        !           200:        pb->usb.hub.Request = kUSBHubPortResetRequest;
        !           201:        err = USBExpertNotifyParentMsg(dev->ID, pb);
        !           202:        if(err != noErr)
        !           203:        {
        !           204:                pb->usbStatus = err;
        !           205:                return(err);
        !           206:        }
        !           207:        else
        !           208:        {
        !           209:                return(kUSBPending);
        !           210:        }
        !           211: }
        !           212: 
        !           213: 
        !           214: OSStatus USBGetFrameNumberImmediate(USBPB *pb)
        !           215: {
        !           216: //      --> usbReference       device/interface/endpoint. Specifies which bus
        !           217: //      --> usbReqCount        size of buffer (should be 0 or sizeof(UInt64)
        !           218: //      --> usbBuffer          nil/point to UInt64 structure for full count
        !           219: //     <--  usbActCount        size of data returned.
        !           220: //     <--  usbFrame   low 32 bits of current frame number.
        !           221: union{
        !           222:        UInt64 u;
        !           223:        UnsignedWide s;
        !           224:        }frame;
        !           225: Boolean nocallBack = false;
        !           226: UInt32 bus;
        !           227: 
        !           228:        // Oops, forgot to validate this
        !           229:        pb->usbStatus = validateRef(pb->usbReference, &bus);
        !           230:        if(pb->usbStatus != noErr)
        !           231:        {
        !           232:                return(pb->usbStatus);
        !           233:        }
        !           234: 
        !           235:        if(pb->usbCompletion == kUSBNoCallBack)
        !           236:        {
        !           237:                nocallBack = true;
        !           238:                pb->usbCompletion = (void *)-2;
        !           239:        } 
        !           240:        if(!checkPBVersion(pb, 0))
        !           241:        {
        !           242:                return(pb->usbStatus);
        !           243:        }
        !           244:        if(nocallBack)
        !           245:        {
        !           246:                pb->usbCompletion = kUSBNoCallBack;
        !           247:        }
        !           248:        frame.u = UIMGetCurrentFrame(bus);
        !           249:        pb->usbFrame = frame.s.lo;
        !           250:        if( (pb->usbBuffer != nil) && (pb->usbReqCount != 0) )
        !           251:        {
        !           252:                pb->usbActCount = pb->usbReqCount;
        !           253:                if(pb->usbActCount > sizeof(frame))
        !           254:                {
        !           255:                        pb->usbActCount = sizeof(frame);
        !           256:                }
        !           257:                usb_BlockMoveData(&frame, pb->usbBuffer, pb->usbActCount);
        !           258:        }
        !           259:        return(noErr);
        !           260: 
        !           261: }
        !           262: 
        !           263: UInt32 deltaFrames(UInt32 previous, UInt32 bus)
        !           264: {
        !           265: union{
        !           266:        UInt64 u;
        !           267:        UnsignedWide s;
        !           268:        }frame;
        !           269: 
        !           270:        frame.u = UIMGetCurrentFrame(bus);
        !           271:        if(previous > frame.s.lo)
        !           272:        {
        !           273:                previous -= frame.s.lo;
        !           274:                return(~previous+1);
        !           275:        }
        !           276:        else
        !           277:        {
        !           278:                return(frame.s.lo - previous);
        !           279:        }
        !           280: }
        !           281: 
        !           282: 
        !           283: void finaliseNotifications(void)
        !           284: {
        !           285:        AbsoluteTime    wastedTime;
        !           286:        
        !           287:        PBQueueDelete(notifyQueue);
        !           288:        PBQueueDelete(memoryQueue);
        !           289:        while (curTimerID) {
        !           290:                if (CancelTimer(curTimerID, &wastedTime) == noErr)
        !           291:                        curTimerID = 0;
        !           292:        }
        !           293: }
        !           294: 
        !           295: void initialiseNotifications(void)
        !           296: {
        !           297:        if( (PBQueueCreate(&notifyQueue) != noErr) ||
        !           298:                (PBQueueInit(notifyQueue) != noErr) )
        !           299:        {
        !           300:                /* Panic */
        !           301:                USBExpertStatus(0,"USL - failed to initialise notification queue", 0);
        !           302:        }
        !           303:        if( (PBQueueCreate(&memoryQueue) != noErr) ||
        !           304:                (PBQueueInit(memoryQueue) != noErr) )
        !           305:        {
        !           306:                /* Panic */
        !           307:                USBExpertStatus(0,"USL - failed to initialise memory queue", 0);
        !           308:        }
        !           309: 
        !           310:        idled = 0;
        !           311:        timerHandler(0);
        !           312: 
        !           313: }
        !           314: 
        !           315: static void taskTimeDoMemory(USBPB *pb)
        !           316: {
        !           317: Boolean dealloc;
        !           318:        dealloc = (pb->usbFlags & (1 << kUSLTTMemDeAllocFlagShift)) != 0;
        !           319:        pb->usbFlags &= ~(1 << kUSLTTMemDeAllocFlagShift);
        !           320: 
        !           321:        if(dealloc)
        !           322:        {
        !           323:                pb->usbStatus = PoolDeallocate(pb->usbBuffer);
        !           324:                pb->usbBuffer = nil;
        !           325:        }
        !           326:        else
        !           327:        {
        !           328:                pb->usbBuffer = PoolAllocateResident(pb->usbReqCount, true /*Boolean clear*/);
        !           329:                if(pb->usbBuffer != nil)
        !           330:                {
        !           331:                        pb->usbActCount = pb->usbReqCount;
        !           332:                        pb->usbStatus = noErr;
        !           333:                }
        !           334:                else
        !           335:                {
        !           336:                        pb->usbActCount = 0;
        !           337:                        pb->usbStatus = memFullErr;     /* How do you find the right error code???? */
        !           338:                }
        !           339:        }
        !           340:        (pb->usbCompletion)(pb);
        !           341: }
        !           342: 
        !           343: static void NotifyHandlerProc( )
        !           344: {
        !           345: USBPB *pb;
        !           346: 
        !           347:        notifyFlag = false;     /* Queue Processed */
        !           348:        
        !           349:        /* Note these don't use interrupt priority, they do not happen at int time */
        !           350:        while(PBDequeueFirst(notifyQueue, (void *)&pb) == noErr)
        !           351:        {
        !           352:                pb->usbStatus = noErr;          /* Call back with right error status */
        !           353:                (pb->usbCompletion)(pb);
        !           354:        }
        !           355:        while(PBDequeueFirst(memoryQueue, (void *)&pb) == noErr)
        !           356:        {
        !           357:                taskTimeDoMemory(pb);
        !           358:        }
        !           359: 
        !           360: }
        !           361: 
        !           362: static void startNotifier(void)
        !           363: {
        !           364:        notifyFlag = true;
        !           365: }
        !           366: 
        !           367: static OSStatus uslTTCallBack(USBPB *pb)
        !           368: {
        !           369:        pb->usbStatus = PBEnqueueLast((void *)pb, notifyQueue);
        !           370:        startNotifier();
        !           371:        return(pb->usbStatus);  /* safe, this is synchronised */
        !           372: }
        !           373: 
        !           374: static OSStatus uslTTmem(USBPB *pb)
        !           375: {
        !           376:        pb->usbStatus = PBEnqueueLast((void *)pb, memoryQueue);
        !           377:        startNotifier();
        !           378:        return(pb->usbStatus);  /* safe, this is synchronised */
        !           379: }
        !           380: 
        !           381: OSStatus uslAllocMem(USBPB *pb)
        !           382: {
        !           383:        pb->usbFlags &= ~(1 << kUSLTTMemDeAllocFlagShift);
        !           384:        return(uslTTmem(pb));
        !           385: }
        !           386: 
        !           387: OSStatus USBAllocMem(USBPB *pb)
        !           388: {
        !           389:        pb->usbStatus = validateRef(pb->usbReference, nil);
        !           390:        if(pb->usbStatus != noErr)
        !           391:        {
        !           392:                return(pb->usbStatus);
        !           393:        }
        !           394: 
        !           395:        if(!checkPBVersion(pb, kUSBTaskTimeFlag))
        !           396:        {
        !           397:                return(pb->usbStatus);
        !           398:        }
        !           399: 
        !           400:        return(uslAllocMem(pb));
        !           401: }
        !           402: 
        !           403: OSStatus uslDeallocMem(USBPB *pb)
        !           404: {
        !           405:        pb->usbFlags |= (1 << kUSLTTMemDeAllocFlagShift);
        !           406:        return(uslTTmem(pb));
        !           407: }
        !           408: 
        !           409: OSStatus USBDeallocMem(USBPB *pb)
        !           410: {
        !           411: Boolean nocallBack = false;
        !           412: 
        !           413:        if(pb->usbCompletion == kUSBNoCallBack)
        !           414:        {
        !           415:                nocallBack = true;
        !           416:                pb->usbCompletion = (void *)-2;
        !           417:        }
        !           418:        else
        !           419:        {
        !           420:                pb->usbStatus = validateRef(pb->usbReference, nil);
        !           421:                if(pb->usbStatus != noErr)
        !           422:                {
        !           423:                        return(pb->usbStatus);
        !           424:                }
        !           425:        }
        !           426:        if(!checkPBVersion(pb, kUSBTaskTimeFlag))
        !           427:        {
        !           428:                return(pb->usbStatus);
        !           429:        }
        !           430:        if(nocallBack)
        !           431:        {
        !           432:        void *buffer;
        !           433:                if(CurrentExecutionLevel() != kTaskLevel)
        !           434:                {
        !           435:                        return(kUSBCompletionError);
        !           436:                }
        !           437:                pb->usbCompletion = kUSBNoCallBack;
        !           438:                buffer = pb->usbBuffer;
        !           439:                pb->usbBuffer = nil;    // BT 2Jun98, don't forget to zero this, its in the spec
        !           440:                return(PoolDeallocate(buffer));
        !           441:        }
        !           442:        return(uslDeallocMem(pb));
        !           443: }
        !           444: 
        !           445: void initialiseDelays(void)
        !           446: {
        !           447:        if( (PBQueueCreate(&delayQueue) != noErr) ||
        !           448:                (PBQueueInit(delayQueue) != noErr) )
        !           449:        {
        !           450:                /* Panic */
        !           451:                USBExpertStatus(0,"USL - failed to initialise delay queue", 0);
        !           452:        }
        !           453: }
        !           454: 
        !           455: void finaliseDelays(void)
        !           456: {
        !           457:        PBQueueDelete(delayQueue);
        !           458: }
        !           459: 
        !           460: static OSStatus uslDelay(USBPB *pb, UInt32 bus)
        !           461: {
        !           462: OSStatus err = noErr;
        !           463: 
        !           464:        /* waits the specified number of frames then calls the handler */
        !           465:        /* length (soon to be usbReqCount) - required frame count to delay */
        !           466:        if( (delayQueue == nil) || (notifyQueue == nil) )
        !           467:        {
        !           468:                pb->usbStatus = kUSBInternalErr;
        !           469:                return(kUSBInternalErr);
        !           470:        }
        !           471: 
        !           472:        pb->usbActCount = pb->usbReqCount + deltaFrames(0, bus);
        !           473:        pb->qType = kUSBDelayQType;
        !           474:        pb->usbStatus = kUSBPending;
        !           475: 
        !           476:        err = PBEnqueueLast((void *)pb, delayQueue);
        !           477:        uslInterruptPriority(+1);
        !           478: 
        !           479:        if(err != noErr)
        !           480:        {
        !           481:                pb->usbStatus = err;
        !           482:        }
        !           483:        else
        !           484:        {
        !           485:                err = kUSBPending;
        !           486:        }
        !           487:        return(err);
        !           488: }
        !           489: 
        !           490: OSStatus USBDelay(USBPB *pb)
        !           491: {
        !           492: OSStatus err = noErr;
        !           493: UInt32 bus;
        !           494: 
        !           495:        pb->usbStatus = validateRef(pb->usbReference, &bus);
        !           496:        if(pb->usbStatus != noErr)
        !           497:        {
        !           498:                return(pb->usbStatus);
        !           499:        }
        !           500: 
        !           501:        /* waits the specified number of frames then calls the handler */
        !           502:        /* length (soon to be usbReqCount) - required frame count to delay */
        !           503:        if(delayQueue == nil)
        !           504:        {
        !           505:                return(kUSBInternalErr);
        !           506:        }
        !           507: 
        !           508:        if(!checkPBVersion(pb, kUSBTaskTimeFlag))
        !           509:        {
        !           510:                return(pb->usbStatus);
        !           511:        }
        !           512:        return(uslDelay(pb, bus));
        !           513: }
        !           514: 
        !           515: static void processDelayQ( Duration currentDuration)
        !           516: {
        !           517: USBPB *pb, *pbNext;
        !           518: UInt32 bus=0;
        !           519: 
        !           520:        if(delayQueue == nil)
        !           521:        {
        !           522:                return;
        !           523:        }
        !           524:        /* Walk the que, safe, we're the only thing to take elements off */
        !           525: 
        !           526:        pb = (void *)delayQueue->qHead;
        !           527:        
        !           528:        while(pb != nil)
        !           529:        {
        !           530:                pbNext = (void *)pb->qlink;
        !           531:        
        !           532:                if(pb->usbActCount <= currentDuration)
        !           533:                {
        !           534:                        if(PBDequeue((void *)pb, delayQueue) == noErr)
        !           535:                        {
        !           536:                                if( ( (pb->usbFlags & kUSBTaskTimeFlag) != 0) &&
        !           537:                                        (CurrentExecutionLevel() != kTaskLevel) )
        !           538:                                {
        !           539:                                        uslTTCallBack(pb);
        !           540:                                }
        !           541:                                else
        !           542:                                {
        !           543:                                        uslInterruptPriority(-1);
        !           544:                                        pb->usbStatus = noErr;
        !           545:                                        (*pb->usbCompletion)(pb);
        !           546:                                }
        !           547:                        }
        !           548:                }
        !           549:                
        !           550:                pb = pbNext;
        !           551:        }
        !           552: 
        !           553: }
        !           554: 
        !           555: static Boolean uslInterruptSafeIdle(UInt32 currFrame)
        !           556: {
        !           557: static UInt32 nextRootHub, lastRootHub;
        !           558: static UInt32 lastDone = 0;
        !           559: 
        !           560:        if(currFrame != lastDone)       // don't run more than once per millisecond.
        !           561:        {
        !           562:                
        !           563:                lastDone = currFrame;
        !           564:                //UIMProcessDoneQueue();        /* Note this is simulated only */
        !           565:                
        !           566:                if( (currFrame > nextRootHub) || (currFrame < lastRootHub) )
        !           567:                {
        !           568:                        UIMPollRootHubSim();
        !           569:                        uslHubWatchDog(currFrame);
        !           570:                        lastRootHub = currFrame;
        !           571:                        nextRootHub = currFrame + 50;
        !           572:                }
        !           573:                processDelayQ(currFrame);
        !           574:                return(true);
        !           575:        }
        !           576:        return(false);
        !           577: }
        !           578: 
        !           579: void USBIdleTask(void)
        !           580: {
        !           581: UInt32 currentFrame;
        !           582:        idled = 0;
        !           583:        
        !           584:        currentFrame = UIMGetAFrame();
        !           585: 
        !           586:        if(uslInterruptSafeIdle(currentFrame) && notifyFlag)
        !           587:        {
        !           588:                NotifyHandlerProc();
        !           589:        }
        !           590:        
        !           591: }
        !           592: 
        !           593: 
        !           594: void timerHandler(void *p1)  //naga it used to be void *p1,void *p2)
        !           595: {
        !           596: TimerID                timerID;
        !           597: Duration currentFrame, delay;
        !           598: AbsoluteTime expirationTime;
        !           599: AbsoluteTime currentTime        = UpTime();
        !           600: 
        !           601:        p1 = 0;
        !           602: //     p2 = 0;
        !           603:        
        !           604:        if(idled != 0)
        !           605:        {
        !           606:                //USBExpertStatus(0, "USL - Interrupt task idle", idled);
        !           607:                currentFrame = UIMGetAFrame();
        !           608:                uslInterruptSafeIdle(currentFrame);
        !           609:                if(idled > 18)
        !           610:                {
        !           611:                        idled = 18;
        !           612:                }
        !           613:        }
        !           614:        
        !           615:        if(interruptPriority > 0)
        !           616:        {
        !           617:                //USBExpertStatus(0, "USL - interruptPriority:", interruptPriority);
        !           618:                delay = 20 - idled;     // milliseconds
        !           619:                idled++;
        !           620:        }
        !           621:        else
        !           622:        {
        !           623:                delay = 100;
        !           624:        }
        !           625:        expirationTime = AddAbsoluteToAbsolute(currentTime,
        !           626:                                                DurationToAbsolute(delay));
        !           627: //kprintf("***timerhandler:Setting timerHandler delay=%d\n",delay);
        !           628: ns_timeout(timerHandler,p1,delay*ONE_MILLI_SECOND,CALLOUT_PRI_SOFTINT0);
        !           629: //     SetInterruptTimer(&expirationTime, timerHandler, nil, &timerID);
        !           630:        curTimerID = timerID;
        !           631:        return(0);
        !           632: }
        !           633: 
        !           634: 
        !           635: 
        !           636: 
        !           637: 
        !           638: 
        !           639: /* ************* Endianisms ************* */
        !           640: 
        !           641: UInt16 HostToUSBWord(UInt16 value)
        !           642: {
        !           643:        return( (value << 8) | (value >> 8) );
        !           644: }
        !           645: 
        !           646: /* This is identical to above, but can't make defining it language independant */
        !           647: UInt16 USBToHostWord(UInt16 value)
        !           648: {
        !           649:        return( (value << 8) | (value >> 8) );
        !           650: }
        !           651: 
        !           652: UInt32 HostToUSBLong(UInt32 value)
        !           653: {
        !           654:        return(
        !           655:                (((UInt32) value) >> 24)                                |               
        !           656:                ((((UInt32) value) >> 8) & 0xFF00)              |               
        !           657:                ((((UInt32) value) << 8) & 0xFF0000)    |               
        !           658:                (((UInt32) value) << 24)
        !           659:                );
        !           660: 
        !           661: }
        !           662: 
        !           663: UInt32 USBToHostLong(UInt32 value)
        !           664: {
        !           665:        return(
        !           666:                (((UInt32) value) >> 24)                                |               
        !           667:                ((((UInt32) value) >> 8) & 0xFF00)              |               
        !           668:                ((((UInt32) value) << 8) & 0xFF0000)    |               
        !           669:                (((UInt32) value) << 24)
        !           670:                );
        !           671: 
        !           672: }
        !           673: 
        !           674: 
        !           675: Boolean immediateError(OSStatus err)
        !           676: {
        !           677:        return((err != kUSBPending) && (err != noErr) );
        !           678: }
        !           679: 
        !           680: 

unix.superglobalmegacorp.com

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