Annotation of kernel/bsd/dev/ppc/drvATADisk/ATADisk.m, revision 1.1.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 1997-1998 by Apple Computer, Inc., All rights reserved.
                     27:  * Copyright 1994-1997 NeXT Software, Inc., All rights reserved.
                     28:  *
                     29:  * ATADisk.m - Exported methods for IDE/ATA Disk device class. 
                     30:  *
                     31:  * HISTORY 
                     32:  * 07-Jul-1994  Rakesh Dubey at NeXT
                     33:  *     Created from original driver written by David Somayajulu.
                     34:  */
                     35:  
                     36: #import <driverkit/return.h>
                     37: #import <driverkit/driverTypes.h>
                     38: #import <driverkit/devsw.h>
                     39: #import <driverkit/generalFuncs.h>
                     40: #import <driverkit/kernelDiskMethods.h>
                     41: #import <driverkit/IODevice.h>
                     42: #import <machkit/NXLock.h>
                     43: #import <sys/systm.h>
                     44: 
                     45: #import "ATADisk.h"
                     46: #import "ATADiskInternal.h"
                     47: #import "ATADiskKernel.h"
                     48: 
                     49: //#define DEBUG
                     50: 
                     51: static int diskUnit = 0;
                     52: static BOOL switchTableInited = NO;    
                     53: 
                     54: /*
                     55:  * List of controllers that have been already probed. We need this since each
                     56:  * Instance table lists ATADisk as well as IdeController classes. And we need
                     57:  * to create instances of disks attached to each controller only once. 
                     58:  */
                     59: static int probedControllerCount = 0;
                     60: static id probedControllers[MAX_IDE_CONTROLLERS];
                     61: 
                     62: @implementation ATADisk
                     63: 
                     64: static Protocol *protocols[] = {
                     65:     @protocol(IdeControllerPublic),
                     66:     nil
                     67: };
                     68: 
                     69: + (Protocol **)requiredProtocols
                     70: {
                     71:     return protocols;
                     72: }
                     73: 
                     74: + (IODeviceStyle)deviceStyle
                     75: {
                     76:     return IO_IndirectDevice;
                     77: }
                     78: 
                     79: /*
                     80:  * IDE drives come with a built in controller on each drive. Hence we can
                     81:  * have just one object per controller-disk pair. Probe is invoked at load
                     82:  * time. It determines what drives are on the bus and alloc's and init:'s an
                     83:  * instance of this class for each one. 
                     84:  *
                     85:  */
                     86: 
                     87: + (BOOL)probe : deviceDescription
                     88: {
                     89:     id diskId;
                     90:     IODevAndIdInfo *idMap = ide_idmap();
                     91:     int unit, i;
                     92:     id controllerId = [deviceDescription directDevice];
                     93: 
                     94: #ifdef DEBUG
                     95:     IOLog("ATADisk probed with controller id %x\n", controllerId);
                     96: #endif DEBUG
                     97:     
                     98:     for (i = 0; i < probedControllerCount; i++)        {
                     99:        if (probedControllers[i] == controllerId)       {
                    100:            IOLog("ATADisk already probed for controller %x\n", controllerId);
                    101:            return YES;
                    102:        }
                    103:     }
                    104:     probedControllers[probedControllerCount++] = controllerId;
                    105:     
                    106:     for (unit = 0; unit < MAX_IDE_DRIVES; unit++) {
                    107:     
                    108:        diskId = [[ATADisk alloc] initFromDeviceDescription:deviceDescription];
                    109:        [diskId initResources:controllerId];
                    110:        [diskId setDevAndIdInfo:&(idMap[diskUnit])];
                    111:        
                    112:        if ([diskId ideDiskInit:diskUnit target:unit] == NO) {
                    113:            [diskId free];
                    114:            continue;
                    115:        }
                    116:        
                    117:        if (([self hd_devsw_init:deviceDescription]) == NO) {
                    118:            [diskId free];
                    119:            IOLog("ATADisk: failed to add to devsw tables.\n");
                    120:            return NO;
                    121:        }
                    122:        
                    123:        /*
                    124:         * Success; we initialized a drive. Have DiskObject superclass take
                    125:         * care of the rest. 
                    126:         */
                    127:        [diskId setDeviceKind:"ATADisk"];
                    128:        [diskId setIsPhysical:YES];
                    129:        [diskId registerDevice];
                    130:        diskUnit += 1;
                    131:     }
                    132:     
                    133:     return YES;
                    134: }
                    135: 
                    136: 
                    137: - getDevicePath:(char *)path maxLength:(int)maxLen useAlias:(BOOL)doAlias
                    138: {
                    139:     if( [super getDevicePath:path maxLength:maxLen  useAlias:doAlias]) {
                    140: 
                    141:        char    unitStr[ 12 ];
                    142:        int     len = maxLen - strlen( path);
                    143: 
                    144:        sprintf( unitStr, "/@%x", [self driveNum]);
                    145:        len -= strlen( unitStr);
                    146:        if( len < 0)
                    147:            return( nil);
                    148:         strcat( path, unitStr);
                    149:        return( self);
                    150:     }
                    151:     return( nil);
                    152: }
                    153: 
                    154: - (char *) matchDevicePath:(char *)matchPath
                    155: {
                    156:     BOOL       matches = NO;
                    157:     char    *  unitStr;
                    158:     extern long int strtol(const char *nptr, char **endptr, int base);
                    159: 
                    160:     unitStr = [super matchDevicePath:matchPath];
                    161:     if( unitStr) {
                    162:         unitStr = strchr( unitStr, '@');
                    163:         if( unitStr) {
                    164:             matches = ([self driveNum] == strtol( unitStr + 1, &unitStr, 16));
                    165:         }
                    166:     }
                    167:     if( matches)
                    168:         return( unitStr);
                    169:     else
                    170:         return( NULL);
                    171: }
                    172: 
                    173: - property_IOUnit:(char *)result length:(unsigned int *)maxLen
                    174: {
                    175:     sprintf( result, "%d", [self driveNum]);
                    176: }
                    177: 
                    178: 
                    179: /*
                    180:  * Add our entry to the device switch tables. 
                    181:  */
                    182: + (BOOL)hd_devsw_init:deviceDescription
                    183: {
                    184:     extern int seltrue();
                    185:     
                    186:     /*
                    187:      * We get called once for each IDE controller in the system; we
                    188:      * only have to call IOAddToCdevsw() once.
                    189:      */
                    190:     if (switchTableInited == YES)      {
                    191:        return YES;
                    192:     }
                    193: 
                    194: #if 0  
                    195:     if ([self addToCdevswFromDescription: deviceDescription
                    196:                                     open: (IOSwitchFunc) ideopen
                    197:                                    close: (IOSwitchFunc) ideclose
                    198:                                     read: (IOSwitchFunc) ideread
                    199:                                    write: (IOSwitchFunc) idewrite
                    200:                                    ioctl: (IOSwitchFunc) ideioctl
                    201:                                     stop: (IOSwitchFunc) eno_stop
                    202:                                    reset: (IOSwitchFunc) nulldev
                    203:                                   select: (IOSwitchFunc) seltrue
                    204:                                     mmap: (IOSwitchFunc) eno_mmap
                    205:                                     getc: (IOSwitchFunc) eno_getc
                    206:                                     putc: (IOSwitchFunc) eno_putc] != YES)
                    207:     {
                    208:            return NO;
                    209:     }
                    210: 
                    211:     if ([self addToBdevswFromDescription: deviceDescription
                    212:                                     open: (IOSwitchFunc) ideopen
                    213:                                    close: (IOSwitchFunc) ideclose
                    214:                                 strategy: (IOSwitchFunc) idestrategy
                    215:                                    ioctl: (IOSwitchFunc) ideioctl
                    216:                                     dump: (IOSwitchFunc) eno_dump
                    217:                                    psize: (IOSwitchFunc) idesize
                    218:                                   isTape: FALSE] != YES)
                    219:     {
                    220:            return NO;
                    221:     }
                    222: #endif
                    223: 
                    224:     if (  IOAddToCdevswAt(     15,
                    225:                                (IOSwitchFunc) ideopen,
                    226:                                (IOSwitchFunc) ideclose,
                    227:                                (IOSwitchFunc) ideread,
                    228:                                (IOSwitchFunc) idewrite,
                    229:                                        (IOSwitchFunc) ideioctl,
                    230:                                        (IOSwitchFunc) eno_stop,
                    231:                                        (IOSwitchFunc) nulldev,
                    232:                                        (IOSwitchFunc) seltrue,
                    233:                                        (IOSwitchFunc) eno_mmap,
                    234:                                        (IOSwitchFunc) eno_getc,
                    235:                                        (IOSwitchFunc) eno_putc) < 0 )
                    236:     {
                    237:        return NO;
                    238:     }
                    239:     [self setCharacterMajor: 15];
                    240: 
                    241:     if ( IOAddToBdevswAt(      3,
                    242:                                 (IOSwitchFunc) ideopen,
                    243:                                 (IOSwitchFunc) ideclose,
                    244:                                 (IOSwitchFunc) idestrategy,
                    245:                                 (IOSwitchFunc) ideioctl,
                    246:                                 (IOSwitchFunc) eno_dump,
                    247:                                 (IOSwitchFunc) idesize,
                    248:                                 FALSE ) < 0 )
                    249:     {
                    250:        return NO;
                    251:     }
                    252:     [self setBlockMajor: 3];
                    253: 
                    254:    ide_init_idmap(self);
                    255:     
                    256:     switchTableInited = YES;
                    257:     
                    258: //#ifdef undef
                    259:     IOLog("IDE: block major %d, character major %d\n",
                    260:        [self blockMajor], [self characterMajor]);
                    261: //#endif undef
                    262: 
                    263:     return YES;
                    264: }
                    265: 
                    266: 
                    267: /*
                    268:  * Common read/write methods. These are used directly in the kernel; user-level
                    269:  * methods using remote objects as defined in IODevice.h in turn call these.
                    270:  */
                    271: - (IOReturn) readAt            : (unsigned)offset 
                    272:                                    length : (unsigned)length 
                    273:                                    buffer : (unsigned char *)buffer
                    274:                                    actualLength : (unsigned *)actualLength 
                    275:                                    client : (vm_task_t)client
                    276: {
                    277:     IOReturn rtn;
                    278:        
                    279:     rtn = [self deviceRwCommon : IDEC_READ
                    280:            block : offset
                    281:            length : length 
                    282:            buffer : buffer
                    283:            client: client
                    284:            pending : NULL
                    285:            actualLength : actualLength];
                    286:     return(rtn);
                    287: }                                
                    288: 
                    289: - (IOReturn) readAsyncAt       : (unsigned)offset 
                    290:                                    length : (unsigned)length 
                    291:                                    buffer : (unsigned char *)buffer
                    292:                                    pending : (void *)pending
                    293:                                    client : (vm_task_t)client
                    294: {
                    295:     IOReturn rtn;
                    296:        
                    297:     rtn = [self deviceRwCommon : IDEC_READ
                    298:            block : offset
                    299:            length : length 
                    300:            buffer : buffer
                    301:            client : client
                    302:            pending : (void *)pending
                    303:            actualLength : NULL];
                    304:     return(rtn);
                    305: }                                
                    306:                
                    307: - (IOReturn) writeAt           : (unsigned)offset 
                    308:                                  length : (unsigned)length 
                    309:                                  buffer : (unsigned char *)buffer
                    310:                                  actualLength : (unsigned *)actualLength 
                    311:                                  client : (vm_task_t)client
                    312: {
                    313:     IOReturn rtn;
                    314:     
                    315:     rtn = [self deviceRwCommon : IDEC_WRITE
                    316:            block : offset
                    317:            length : length 
                    318:            buffer : buffer
                    319:            client: client
                    320:            pending : NULL
                    321:            actualLength : actualLength];
                    322: 
                    323:     return(rtn);
                    324: }                                
                    325:                  
                    326: - (IOReturn) writeAsyncAt      : (unsigned)offset 
                    327:                                  length : (unsigned)length 
                    328:                                  buffer : (unsigned char *)buffer
                    329:                                  pending : (void *)pending
                    330:                                  client : (vm_task_t)client
                    331: {
                    332:     IOReturn rtn;
                    333:     
                    334:     rtn = [self deviceRwCommon : IDEC_WRITE
                    335:            block : offset
                    336:            length : length 
                    337:            buffer : buffer
                    338:            client : client
                    339:            pending : (void *)pending
                    340:            actualLength : NULL];
                    341:     return(rtn);
                    342: }                                
                    343: 
                    344: - (IOReturn)updatePhysicalParameters
                    345: {
                    346:     // we have got everything we need during initialization
                    347: 
                    348:     return(IO_R_SUCCESS);
                    349: }
                    350: 
                    351: - (void)abortRequest
                    352: {
                    353:     ideBuf_t *ideBuf;
                    354:     IOReturn rtn;
                    355:     
                    356:     ideBuf = [self allocIdeBuf:NULL];
                    357:     ideBuf->command = IDEC_ABORT;
                    358:     ideBuf->buf = NULL;
                    359:     ideBuf->needsDisk =  0;
                    360:     ideBuf->oneWay = 0;
                    361:     rtn = [self enqueueIdeBuf:ideBuf];
                    362:     [self freeIdeBuf:ideBuf];
                    363: }
                    364: 
                    365: - (void)diskBecameReady
                    366: {
                    367:     [_ioQLock lock];
                    368:     [_ioQLock unlockWith:WORK_AVAILABLE];
                    369: }
                    370: 
                    371: - (IOReturn)isDiskReady        : (BOOL)prompt
                    372: {
                    373:     return(IO_R_SUCCESS);
                    374: }
                    375: 
                    376: - (IODiskReadyState)updateReadyState
                    377: {
                    378:     return([self lastReadyState]);
                    379: }
                    380: 
                    381: - (IOReturn) ejectPhysical
                    382: {
                    383:     return(IO_R_UNSUPPORTED);
                    384: }
                    385: 
                    386: - (int)deviceOpen:(u_int)intentions
                    387: {
                    388:     return(0);
                    389: }
                    390: 
                    391: - (void)deviceClose
                    392: {
                    393:     return;
                    394: }
                    395: 
                    396: - (ideDriveInfo_t)ideGetDriveInfo
                    397: {
                    398:     return(_ideInfo);
                    399: }
                    400: 
                    401: - (id)cntrlr
                    402: {
                    403:     return _cntrlr;
                    404: }
                    405: 
                    406: - (unsigned)driveNum
                    407: {
                    408:     return _driveNum;
                    409: }
                    410: 
                    411: - (IOReturn)getIntValues:(unsigned int *)values
                    412:            forParameter:(IOParameterName)parameter
                    413:            count:(unsigned int *)count
                    414: {
                    415:     int maxCount = *count;
                    416:     int blockMajor, characterMajor;
                    417: 
                    418:     if (maxCount == 0) {
                    419:        maxCount = IO_MAX_PARAMETER_ARRAY_LENGTH;
                    420:     }
                    421:     
                    422:     if (strcmp(parameter, "BlockMajor") == 0) {
                    423:         ide_block_char_majors(&blockMajor, &characterMajor);
                    424:        values[0] = blockMajor;
                    425:        *count = 1;
                    426:        return IO_R_SUCCESS;
                    427:     }
                    428:     if (strcmp(parameter, "CharacterMajor") == 0) {
                    429:         ide_block_char_majors(&blockMajor, &characterMajor);
                    430:        values[0] = characterMajor;
                    431:        *count = 1;
                    432:        return IO_R_SUCCESS;
                    433:     }
                    434:     
                    435:     /*
                    436:      * Pass to superclass what we can't handle. 
                    437:      */
                    438:     return [super getIntValues:values forParameter:parameter
                    439:                count:&maxCount];
                    440: }
                    441: 
                    442: @end

unix.superglobalmegacorp.com

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