Annotation of ntddk/src/scsi/qic117/config.c, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1993 - Colorado Memory Systems, Inc.
        !             4: All Rights Reserved
        !             5: 
        !             6: Module Name:
        !             7: 
        !             8:     config.c
        !             9: 
        !            10: Abstract:
        !            11: 
        !            12:     configures the FDC and drive to the correct speed.
        !            13: 
        !            14: Revision History:
        !            15: 
        !            16: 
        !            17: 
        !            18: 
        !            19: --*/
        !            20: 
        !            21: //
        !            22: // include files
        !            23: //
        !            24: 
        !            25: #include <ntddk.h>                        // various NT definitions
        !            26: #include <ntdddisk.h>                    // disk device driver I/O control codes
        !            27: #include <ntiologc.h>
        !            28: #include "common.h"
        !            29: #include "drvtask.h"                     // this driver's data declarations
        !            30: #include "mt1defs.h"                     // this driver's data declarations
        !            31: #include "mt1strc.h"                     // this driver's data declarations
        !            32: #include "q117data.h"                    // this driver's data declarations
        !            33: 
        !            34: 
        !            35: STATUS
        !            36: Q117iConfigureDrive(
        !            37:     IN PTAPE_EXTENSION TapeExtension
        !            38:     )
        !            39: 
        !            40: /*++
        !            41: 
        !            42: Routine Description:
        !            43: 
        !            44:     Configure the tape drive with a pre-defined state.
        !            45: 
        !            46:         Put the tape drive into the Primary mode.  This command should work
        !            47:         regardless of the current state of the drive.
        !            48: 
        !            49:         Set or determine the tape speed depending upon whether or not the
        !            50:         tape drive is a CMS drive.
        !            51: 
        !            52:         Read the current track or set the current track to 0 also depending
        !            53:         upon whether or not the tape drive is a CMS drive.
        !            54: 
        !            55: Arguments:
        !            56: 
        !            57:     TapeExtension -
        !            58: 
        !            59: Return Value:
        !            60: 
        !            61: 
        !            62: 
        !            63: --*/
        !            64: 
        !            65: {
        !            66:     STATUS retval = NoErr;       // return value
        !            67:     CHAR newSpeed;             // tape drive transfer rate
        !            68: 
        !            69:     //
        !            70:     // Make sure that the tape drive is out there.
        !            71:     //
        !            72: 
        !            73:     retval = Q117iGetDriveError(TapeExtension);
        !            74: 
        !            75:     if (retval && retval != NoTape) {
        !            76: 
        !            77:         return(retval);
        !            78: 
        !            79:     }
        !            80: 
        !            81:     //
        !            82:     // We will only configure (set the transfer rate) the tape drive if we
        !            83:     // know that it is ours.  This is because we assume that our drive is
        !            84:     // the only variable speed drive available.
        !            85:     //
        !            86: 
        !            87:     if (TapeExtension->SpeedChangeOK) {
        !            88: 
        !            89:     //
        !            90:     // Send the Select_Speed command to the tape drive.   This ommand is sent
        !            91:     // in 2 parts (cmd - arg) and we must be sure that the drive is ready to
        !            92:     // receive the argument before sending it.  The drive is ready either when
        !            93:     // it starts generating index pusles or after approximately 20 ms.
        !            94:     //
        !            95: 
        !            96:         if ((retval = Q117iSendByte(TapeExtension, Select_Speed)) != NoErr) {
        !            97: 
        !            98:             return(retval);
        !            99: 
        !           100:         }
        !           101: 
        !           102:         Q117iSleep(TapeExtension, mt_wt2ticks, FALSE);
        !           103: 
        !           104:         if (TapeExtension->XferRate.XferRate == FAST) {
        !           105: 
        !           106:             newSpeed = TapeExtension->XferRate.TapeFast + 2;
        !           107: 
        !           108:         } else {
        !           109: 
        !           110:             newSpeed = TapeExtension->XferRate.TapeSlow + 2;
        !           111: 
        !           112:         }
        !           113: 
        !           114:         if ((retval = Q117iSendByte(TapeExtension, newSpeed)) != NoErr) {
        !           115: 
        !           116:             return(retval);
        !           117: 
        !           118:         }
        !           119: 
        !           120:         //
        !           121:         // Wait for the drive to become ready again.  Specified time is 10
        !           122:         // secs.
        !           123:         //
        !           124: 
        !           125:         retval = Q117iWaitCommandComplete(TapeExtension, mt_wt010s);
        !           126: 
        !           127:         if (retval && retval != NoTape) {
        !           128: 
        !           129:             return(retval);
        !           130: 
        !           131:         }
        !           132: 
        !           133:         //
        !           134:         // Set the current track indicator to an unknow position.  This will
        !           135:         // force a track change command on the first read write to the tape.
        !           136:         //
        !           137: 
        !           138:         TapeExtension->TapePosition.C_Track = -1;
        !           139:     }
        !           140: 
        !           141:     return(NoErr);
        !           142: }
        !           143: 
        !           144: 
        !           145: STATUS
        !           146: Q117iConfigureFDC(
        !           147:     IN PTAPE_EXTENSION TapeExtension
        !           148:     )
        !           149: 
        !           150: /*++
        !           151: 
        !           152: Routine Description:
        !           153: 
        !           154:     To configure the floppy controller chip according to the current
        !           155:     FDC parameters.
        !           156: 
        !           157: Arguments:
        !           158: 
        !           159:     TapeExtension -
        !           160: 
        !           161: Return Value:
        !           162: 
        !           163: 
        !           164: --*/
        !           165: 
        !           166: {
        !           167:     STATUS retval;
        !           168:     CHAR fdcType;                  // flag to indicate an 82077 FDC
        !           169:     struct specify_cmd setup_N;
        !           170:     struct config_cmd configure;
        !           171: 
        !           172:     if (TapeExtension->XferRate.XferRate == FAST) {
        !           173: 
        !           174:         Q117iDCR_Out(TapeExtension, TapeExtension->XferRate.FDC_Fast);
        !           175: 
        !           176:     } else {
        !           177: 
        !           178:         Q117iDCR_Out(TapeExtension, TapeExtension->XferRate.FDC_Slow);
        !           179: 
        !           180:     }
        !           181: 
        !           182: 
        !           183:     // Determine if the FDC is an 82077
        !           184: 
        !           185:     if ((retval = Q117iDGetFDC(TapeExtension, (PUCHAR)&fdcType)) != NoErr) {
        !           186: 
        !           187:         return(retval);
        !           188: 
        !           189:     }
        !           190: 
        !           191:     if (fdcType == FDC_82077 ||
        !           192:         fdcType == FDC_82077AA ||
        !           193:         fdcType == FDC_82078_44 ||
        !           194:         fdcType == FDC_82078_64 ||
        !           195:         fdcType == FDC_NATIONAL) {
        !           196: 
        !           197:         WRITE_CONTROLLER(&TapeExtension->QControllerData->FDC_Addr->tdr,
        !           198:                         curu);
        !           199: 
        !           200:         if (TapeExtension->XferRate.XferRate == FAST) {
        !           201: 
        !           202:             WRITE_CONTROLLER(&TapeExtension->QControllerData->FDC_Addr->MSDSR.dsr,
        !           203:                             TapeExtension->XferRate.FDC_Fast);
        !           204: 
        !           205:             if (TapeExtension->XferRate.FDC_Fast == FDC_500Kbps) {
        !           206: 
        !           207:                 WRITE_CONTROLLER(&TapeExtension->QControllerData->FDC_Addr->tdr,
        !           208:                                 curb);
        !           209: 
        !           210:             }
        !           211: 
        !           212:         } else {
        !           213: 
        !           214:             WRITE_CONTROLLER(
        !           215:                 &TapeExtension->QControllerData->FDC_Addr->MSDSR.dsr,
        !           216:                 TapeExtension->XferRate.FDC_Slow);
        !           217: 
        !           218:             if (TapeExtension->XferRate.FDC_Slow == FDC_250Kbps) {
        !           219: 
        !           220:                 WRITE_CONTROLLER(
        !           221:                     &TapeExtension->QControllerData->FDC_Addr->tdr,
        !           222:                     curb);
        !           223:             }
        !           224: 
        !           225:             if (TapeExtension->XferRate.FDC_Slow == FDC_500Kbps) {
        !           226: 
        !           227:                 WRITE_CONTROLLER(
        !           228:                     &TapeExtension->QControllerData->FDC_Addr->tdr,
        !           229:                     curb);
        !           230: 
        !           231:             }
        !           232:         }
        !           233: 
        !           234:         configure.cmd = FDC_CONFIG;
        !           235:         configure.czero = 0;
        !           236:         configure.FIFOTHR = FDC_FIFO;
        !           237:         configure.POLL = 0;
        !           238:         configure.EFIFO = 0;
        !           239:         configure.EIS = 0;
        !           240:         configure.reserved = 0;
        !           241:         configure.PRETRK = 0x00;
        !           242: 
        !           243:         if (retval = Q117iProgramFDC(TapeExtension,
        !           244:                                     (CHAR *)&configure,
        !           245:                                     sizeof(configure),
        !           246:                                     FALSE)) {
        !           247: 
        !           248:             return(retval);
        !           249: 
        !           250:         }
        !           251:     }
        !           252: 
        !           253:     setup_N.command = FDC_SPECIFY;
        !           254:     setup_N.SRT_HUT = TapeExtension->XferRate.XferRate ?
        !           255:                     TapeExtension->XferRate.SRT_Fast :
        !           256:                     TapeExtension->XferRate.SRT_Slow;
        !           257:     setup_N.HLT_ND = 0x02;
        !           258:     retval = Q117iProgramFDC(TapeExtension,
        !           259:                             (CHAR *)&setup_N,
        !           260:                             sizeof(setup_N),
        !           261:                             FALSE);
        !           262: 
        !           263:     return(retval);
        !           264: }

unix.superglobalmegacorp.com

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