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

unix.superglobalmegacorp.com

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