Annotation of kernel/bsd/dev/ppc/drvDECchip21040/DECchip2104x.m, 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:  * Copyright (c) 1995-1996 NeXT Software, Inc.
        !            27:  *
        !            28:  * Hardware independent (relatively) code for the DECchip 2104x
        !            29:  *
        !            30:  * HISTORY
        !            31:  *
        !            32:  * 26-Apr-95   Rakesh Dubey (rdubey) at NeXT 
        !            33:  *     Created.
        !            34:  * 11-Oct-95   Dieter Siegmund (dieter) at NeXT
        !            35:  *     Added performance hooks; changed transmit interrupt
        !            36:  *     to only interrupt every N / 2 times, where N is the
        !            37:  *     number of transmit descriptors.  This reduces the
        !            38:  *      number of interrupts taken, and the amount of CPU
        !            39:  *     used by the driver.
        !            40:  *     Removed timeout mechanism.
        !            41:  * 02-Nov-95   Rakesh Dubey (rdubey) at NeXT 
        !            42:  *     Added support for 21041 based adapters.
        !            43:  *        -- serial ROM for station address
        !            44:  *        -- new network interface selection scheme
        !            45:  * 11-Dec-95   Dieter Siegmund (dieter) at NeXT
        !            46:  *     Re-named 2104x.m, split out 21040 and 21041 personalities.
        !            47:  * 07-Feb-96   Dieter Siegmund (dieter) at NeXT
        !            48:  *     Fixed multicast.
        !            49:  * 25-Jun-96   Dieter Siegmund (dieter) at NeXT
        !            50:  *     Added kernel debugger support.
        !            51:  * 05-Aug-97   Joe Liu at Apple
        !            52:  *     Made kernel debugger support more robust.
        !            53:  */
        !            54: 
        !            55: #import "DECchip2104x.h"
        !            56: #import "DECchip2104xPrivate.h"
        !            57: 
        !            58: 
        !            59: //#define DEBUG
        !            60: 
        !            61: #import "DECchip2104xInline.h"
        !            62: 
        !            63: @implementation DECchip2104x
        !            64: 
        !            65: /*
        !            66:  * Public Factory Methods
        !            67:  */
        !            68:  
        !            69: + (BOOL)probe:(IOPCIDevice *)devDesc
        !            70: {
        !            71:     DECchip2104x               *dev;
        !            72: 
        !            73:     IOLog("%s: PCI Dev: %d Func: %d Bus: %d\n", [self name],
        !            74:          devDesc->deviceNum, devDesc->functionNum, devDesc->busNum);
        !            75: 
        !            76:     // Veryfy the corect number of memory ranges
        !            77:     // Range 0 is I/O Space access to CSR's
        !            78:     // Range 1 is Memory Space access to Expansion ROM
        !            79:     // Range 2 is Memory Space access to CSR's
        !            80:     if ([devDesc numMemoryRanges] != 3) {
        !            81:       IOLog("%s: Incorrect number of memory ranges -> %d\n",
        !            82:            [self name], [devDesc numMemoryRanges]);
        !            83:       return NO;
        !            84:     }
        !            85: 
        !            86:     dev = [self alloc];
        !            87:     if (dev == nil) {
        !            88:        IOLog("%s: Failed to alloc instance\n", [self name]);
        !            89:        return NO;
        !            90:     }
        !            91: 
        !            92:     return [dev initFromDeviceDescription:devDesc] != nil;
        !            93: }
        !            94: 
        !            95: /*
        !            96:  * Public Instance Methods
        !            97:  */
        !            98: - initFromDeviceDescription:(IODeviceDescription *)devDesc
        !            99: {
        !           100:     if ([super initFromDeviceDescription:devDesc] == nil) {
        !           101:        [self free];
        !           102:        return nil;
        !           103:     }
        !           104:     KDB_txBuf = [self allocateNetbuf];
        !           105:     if (KDB_txBuf == NULL) {
        !           106:        IOLog("%s: couldn't allocate KDB netbuf\n", [self name]);
        !           107:        [self free];
        !           108:        return nil;
        !           109:     }
        !           110:     resetAndEnabled = NO;
        !           111:     return self;
        !           112: }
        !           113: 
        !           114: - free
        !           115: {
        !           116:     int                i;
        !           117:     
        !           118:     [self clearTimeout];
        !           119:     
        !           120:     [self _resetChip];
        !           121:     
        !           122:     if (networkInterface)
        !           123:        [networkInterface free];
        !           124: 
        !           125:     for (i = 0; i < DEC_21X40_RX_RING_LENGTH; i++)
        !           126:        if (rxNetbuf[i])
        !           127:            nb_free(rxNetbuf[i]);
        !           128:     for (i = 0; i < DEC_21X40_TX_RING_LENGTH; i++)
        !           129:        if (txNetbuf[i])
        !           130:            nb_free(txNetbuf[i]);
        !           131: 
        !           132:     
        !           133: //    if (memoryPtr) {
        !           134: //     IOFree(memoryPtr, memorySize);
        !           135: //    }
        !           136: //    [self enableAllInterrupts];
        !           137:     
        !           138:     return [super free];
        !           139: }
        !           140: 
        !           141: - (void) enableAdapterInterrupts
        !           142: {
        !           143: 
        !           144: //kprintf("[DECchip2104x enableAdapterInterrupts]\n");
        !           145: 
        !           146:     writeCsr(ioBase, DEC_21X40_CSR7, interruptMask.data);
        !           147: }
        !           148: 
        !           149: - (void) disableAdapterInterrupts
        !           150: {
        !           151: 
        !           152: //kprintf("[DECchip2104x disableAdapterInterrupts]\n");
        !           153: 
        !           154:     writeCsr(ioBase, DEC_21X40_CSR7, 0);
        !           155: }
        !           156: 
        !           157: - (BOOL)resetAndEnable:(BOOL)enable
        !           158: {
        !           159: 
        !           160: //kprintf("[DECchip2104x resetAndEnable]\n");
        !           161: 
        !           162:     resetAndEnabled = NO;
        !           163:     [self clearTimeout];
        !           164:     [self disableAdapterInterrupts];
        !           165:     
        !           166:     [self _resetChip];
        !           167:     
        !           168:     if (enable)        {
        !           169:     
        !           170:        if (![self _initRxRing] || ![self _initTxRing]) {
        !           171:            return NO;
        !           172:        }
        !           173: 
        !           174:        if ([self _initChip] == NO) {
        !           175:            [self setRunning:NO];
        !           176:            return NO;
        !           177:        }
        !           178: 
        !           179:        [self _startTransmit];
        !           180:        [self _startReceive];
        !           181:        
        !           182:        if ([self enableAllInterrupts] != IO_R_SUCCESS) {
        !           183:            [self setRunning:NO];
        !           184:            return NO;
        !           185:        }
        !           186:        [self enableAdapterInterrupts];
        !           187:     } 
        !           188:     
        !           189:     [self setRunning:enable];
        !           190:     
        !           191:     resetAndEnabled = YES;
        !           192:     return YES;
        !           193: }
        !           194: 
        !           195: 
        !           196: - (void)interruptOccurred
        !           197: {    
        !           198:     csrRegUnion        interruptReg;
        !           199: 
        !           200: //kprintf("[DECchip2104x interruptOccurred]\n");
        !           201: 
        !           202: #ifdef PERF    
        !           203:     if (perfQ) {
        !           204:        ev_p.eventId = PERF_INTR_ENTER_ID;
        !           205:        perfEvent(perfQ, &ev_p);
        !           206:     }
        !           207: #endif PERF
        !           208:     
        !           209:     while (1) {
        !           210:     
        !           211:        [self reserveDebuggerLock];
        !           212:        interruptReg.data = readCsr(ioBase, DEC_21X40_CSR5);
        !           213:        writeCsr(ioBase, DEC_21X40_CSR5, interruptReg.data);
        !           214:        [self releaseDebuggerLock];
        !           215: #ifdef DEBUG
        !           216:        IOLog("%s: interruptOccurred: status %x\n", [self name],
        !           217:                interruptReg.data);
        !           218: #endif DEBUG
        !           219:        
        !           220:        if (!interruptReg.csr5.ti && !interruptReg.csr5.ri &&
        !           221:                        !interruptReg.csr5.tjt) {
        !           222: #ifdef DEBUG
        !           223:            IOLog("%s: BOGUS interrupt: status %x\n", [self name],
        !           224:                    interruptReg.data);
        !           225: #endif DEBUG
        !           226:            break;
        !           227:        }
        !           228:                
        !           229:        if (interruptReg.csr5.ri) {
        !           230:            [self _receiveInterruptOccurred];
        !           231:        }   
        !           232:        if (interruptReg.csr5.ti) {
        !           233:                [self reserveDebuggerLock];
        !           234:            [self _transmitInterruptOccurred];
        !           235:                [self releaseDebuggerLock];
        !           236:            [self serviceTransmitQueue];
        !           237:        }   
        !           238:        if (interruptReg.csr5.tjt) {
        !           239:            //[self _jabberInterruptOccurred];
        !           240:        }   
        !           241:     }
        !           242:     [self enableAllInterrupts];
        !           243: #ifdef PERF    
        !           244:     if (perfQ) {
        !           245:        ev_p.eventId = PERF_INTR_EXIT_ID;
        !           246:        perfEvent(perfQ, &ev_p);
        !           247:     }
        !           248: #endif PERF
        !           249: }
        !           250:     
        !           251: - (void) serviceTransmitQueue
        !           252: {
        !           253:     netbuf_t                   packet;
        !           254: 
        !           255: //kprintf("[DECchip2104x serviceTransmitQueue]\n");
        !           256: 
        !           257: 
        !           258:     while (txNumFree && [transmitQueue count] > 0 
        !           259:           && (packet = [transmitQueue dequeue]))
        !           260:         [self _transmitPacket:packet];
        !           261: }
        !           262: 
        !           263: - (void)transmit:(netbuf_t)pkt
        !           264: {
        !           265: 
        !           266: //kprintf("[DECchip2104x transmit]\n");
        !           267: 
        !           268:     if (!pkt) {
        !           269:        IOLog("%s: transmit: received NULL netbuf\n", [self name]);
        !           270:        return;
        !           271:     }
        !           272:     
        !           273:     if (![self isRunning]) {
        !           274:        nb_free(pkt);
        !           275:        return;
        !           276:     }
        !           277:     
        !           278:        [self reserveDebuggerLock];
        !           279:     [self _transmitInterruptOccurred]; /* check for tx completions */
        !           280:        [self releaseDebuggerLock];
        !           281:        
        !           282:     /*
        !           283:      * Queue the packet if we're out of transmit descriptors
        !           284:      */
        !           285:     [self serviceTransmitQueue];
        !           286:     if (txNumFree == 0 || [transmitQueue count] > 0)
        !           287:        [transmitQueue enqueue:pkt];
        !           288:     else
        !           289:        [self _transmitPacket:pkt];
        !           290: 
        !           291: }
        !           292: 
        !           293: - (int) transmitQueueSize
        !           294: {
        !           295: //kprintf("[DECchip2104x transmitQueueSize]\n");
        !           296: 
        !           297: 
        !           298:     return (TRANSMIT_QUEUE_SIZE);
        !           299: }
        !           300: 
        !           301: - (int) transmitQueueCount
        !           302: {
        !           303: //kprintf("[DECchip2104x transmitQueueCount]\n");
        !           304: 
        !           305: 
        !           306:     return ([transmitQueue count]);
        !           307: }
        !           308: 
        !           309: - (int) pendingTransmitCount
        !           310: {
        !           311: 
        !           312: //kprintf("[DECchip2104x pendingTransmitCount]\n");
        !           313: 
        !           314:     return ([transmitQueue count] + (DEC_21X40_TX_RING_LENGTH - txNumFree));
        !           315: }
        !           316: 
        !           317: - (void)timeoutOccurred
        !           318: {
        !           319: //kprintf("[DECchip2104x timeoutOccurred]\n");
        !           320: 
        !           321: #ifdef PERF    
        !           322:     if (perfQ) {
        !           323:        ev_p.eventId = PERF_INTR_ENTER_ID;
        !           324:        perfEvent(perfQ, &ev_p);
        !           325:     }
        !           326: #endif PERF
        !           327: 
        !           328: #ifdef DEBUG
        !           329:     IOLog("tx timeout: txPutIndex=%d, txDoneIndex=%d, txNumFree=%d\n",
        !           330:        txPutIndex, txDoneIndex, txNumFree);
        !           331: #endif DEBUG
        !           332: 
        !           333:     if ([self isRunning]) {
        !           334:        [self reserveDebuggerLock];
        !           335:        [self _transmitInterruptOccurred];
        !           336:        [self releaseDebuggerLock];
        !           337:        [self serviceTransmitQueue];
        !           338:     }
        !           339: #ifdef PERF    
        !           340:     if (perfQ) {
        !           341:        ev_p.eventId = PERF_INTR_EXIT_ID;
        !           342:        perfEvent(perfQ, &ev_p);
        !           343:     }
        !           344: #endif PERF
        !           345: }
        !           346: 
        !           347: - (netbuf_t)allocateNetbuf
        !           348: {
        !           349:     netbuf_t           packet;
        !           350:     unsigned int       packetAlignment;
        !           351: 
        !           352: //kprintf("[DECchip2104x allocateNetbuf]\n");
        !           353:        
        !           354:     packet = nb_alloc(NETWORK_BUFSIZE + NETWORK_BUFALIGNMENT);
        !           355:     if (packet) {
        !           356:        packetAlignment = 
        !           357:                (unsigned)nb_map(packet) & (NETWORK_BUFALIGNMENT - 1);
        !           358:        if (packetAlignment)
        !           359:            nb_shrink_top(packet, NETWORK_BUFALIGNMENT - packetAlignment);
        !           360:        nb_shrink_bot(packet, nb_size(packet) - ETHERMAXPACKET);
        !           361:     }
        !           362: #ifdef DEBUG
        !           363:     else {
        !           364:        IOLog("%s: nb_alloc() returned NULL\n", [self name]);
        !           365: //     IOBreakToDebugger();
        !           366:     }
        !           367: #endif DEBUG
        !           368:     
        !           369:     return packet;
        !           370: }
        !           371: 
        !           372: - (BOOL)enablePromiscuousMode
        !           373: {
        !           374:     csrRegUnion        reg;
        !           375: 
        !           376: //kprintf("[DECchip2104x enablePromiscuousMode]\n");
        !           377:     
        !           378:     isPromiscuous = YES;
        !           379: 
        !           380:     [self reserveDebuggerLock];
        !           381:     reg.data = readCsr(ioBase, DEC_21X40_CSR6);
        !           382:     reg.csr6.pr = 1;
        !           383:     writeCsr(ioBase, DEC_21X40_CSR6, reg.data);
        !           384:     [self releaseDebuggerLock];
        !           385: 
        !           386:     return YES;
        !           387: }
        !           388: 
        !           389: - (void)disablePromiscuousMode
        !           390: {
        !           391:     csrRegUnion        reg;
        !           392: 
        !           393: //kprintf("[DECchip2104x disablePromiscuousMode]\n");
        !           394:     
        !           395:     isPromiscuous = NO;
        !           396:     
        !           397:     [self reserveDebuggerLock];
        !           398:     reg.data = readCsr(ioBase, DEC_21X40_CSR6);
        !           399:     reg.csr6.pr = 0;
        !           400:     writeCsr(ioBase, DEC_21X40_CSR6, reg.data);
        !           401:     [self releaseDebuggerLock];
        !           402: 
        !           403:     return;
        !           404: }
        !           405: 
        !           406: - (BOOL)enableMulticastMode
        !           407: {
        !           408: 
        !           409: //kprintf("[DECchip2104x enableMulticastMode]\n");
        !           410: 
        !           411:     multicastEnabled = YES;
        !           412:     return YES;
        !           413: }
        !           414:         
        !           415: - (void)disableMulticastMode
        !           416: {
        !           417: 
        !           418: //kprintf("[DECchip2104x disableMulticastMode]\n");
        !           419: 
        !           420:     /* 
        !           421:      * Clear out any current addresses 
        !           422:      */
        !           423:     if (multicastEnabled) {
        !           424:        [self reserveDebuggerLock];
        !           425:        if (![self _setAddressFiltering:NO])
        !           426:            IOLog("%s: disable multicast mode failed\n",[self name]);
        !           427:        [self releaseDebuggerLock];
        !           428:     }
        !           429:     multicastEnabled = NO;
        !           430: }
        !           431: 
        !           432: - (void)addMulticastAddress:(enet_addr_t *)addr
        !           433: {
        !           434: 
        !           435: //kprintf("[DECchip2104x addMulticastAddress: %x:%x:%x:%x:%x:%x]\n",
        !           436: //     addr->ea_byte[0],addr->ea_byte[1],addr->ea_byte[2],
        !           437: //     addr->ea_byte[3],addr->ea_byte[4],addr->ea_byte[5]);
        !           438: 
        !           439:     multicastEnabled = YES;
        !           440:     [self reserveDebuggerLock];
        !           441:     if (![self _setAddressFiltering:NO])
        !           442:        IOLog("%s: add multicast address failed\n",[self name]);
        !           443:     [self releaseDebuggerLock];
        !           444: }
        !           445: 
        !           446: - (void)removeMulticastAddress:(enet_addr_t *)addr
        !           447: {
        !           448: 
        !           449: //kprintf("[DECchip2104x removeMulticastAddress]\n");
        !           450: 
        !           451:     [self reserveDebuggerLock];
        !           452:     if (![self _setAddressFiltering:NO])
        !           453:        IOLog("%s: remove multicast address failed\n",[self name]);
        !           454:     [self releaseDebuggerLock];
        !           455: }
        !           456: 
        !           457: /*
        !           458:  * Power management methods. 
        !           459:  */
        !           460: - (IOReturn)getPowerState:(PMPowerState *)state_p
        !           461: {
        !           462:     return IO_R_UNSUPPORTED;
        !           463: }
        !           464: 
        !           465: - (IOReturn)setPowerState:(PMPowerState)state
        !           466: {
        !           467:     if (state == PM_OFF) {
        !           468:        resetAndEnabled = NO;
        !           469:         [self _resetChip];
        !           470:        return IO_R_SUCCESS;
        !           471:     }
        !           472:     return IO_R_UNSUPPORTED;
        !           473: }
        !           474: 
        !           475: - (IOReturn)getPowerManagement:(PMPowerManagementState *)state_p
        !           476: {
        !           477:     return IO_R_UNSUPPORTED;
        !           478: }
        !           479: 
        !           480: - (IOReturn)setPowerManagement:(PMPowerManagementState)state
        !           481: {
        !           482:     return IO_R_UNSUPPORTED;
        !           483: }
        !           484: 
        !           485: - (void)getStationAddress:(enet_addr_t *)ea
        !           486: {
        !           487: 
        !           488: //kprintf("[DECchip2104x getStationAddress]\n");
        !           489: 
        !           490:     return;
        !           491: }
        !           492: 
        !           493: - (void)selectInterface
        !           494: {
        !           495: //kprintf("[DECchip2104x selectInterface]\n");
        !           496: 
        !           497:     return;
        !           498: }
        !           499: 
        !           500: 
        !           501: @end
        !           502: 

unix.superglobalmegacorp.com

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