Annotation of ntddk/src/scsi/scsitape/class/physlogi.c, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1992 Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     physlogi.c
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     This module contains functions used specifically by tape drivers.
        !            12:     It contains functions that do physical to pseudo-logical and pseudo-
        !            13:     logical to physical tape block address/position translation.
        !            14: 
        !            15: Author:
        !            16: 
        !            17:     Mike Colandreo (Maynard)
        !            18: 
        !            19: Environment:
        !            20: 
        !            21:     kernel mode only
        !            22: 
        !            23: Revision History:
        !            24: 
        !            25: --*/
        !            26: 
        !            27: #include "ntddk.h"
        !            28: #include "tape.h"
        !            29: #include "physlogi.h"
        !            30: 
        !            31: //
        !            32: // defines for various QIC physical tape format constants
        !            33: //
        !            34: 
        !            35: #define  QIC_150_BOT_OFFSET  2
        !            36: #define  QIC_525_PSEUDO_PHYSICAL_BLOCK_SIZE  512
        !            37: #define  QIC_525_PHYSICAL_BLOCK_SIZE  1024
        !            38: #define  QIC_525_DATA_BLKS_PER_FRAME  14
        !            39: #define  QIC_525_ECC_BLKS_PER_FRAME  2
        !            40: #define  QIC_525_BLKS_PER_FRAME  16
        !            41: #define  QIC_525_BOT_OFFSET  16
        !            42: #define  QIC_1350_PHYSICAL_BLOCK_SIZE  512
        !            43: #define  QIC_1350_DATA_BLKS_PER_FRAME  52
        !            44: #define  QIC_1350_ECC_BLKS_PER_FRAME  12
        !            45: #define  QIC_1350_BLKS_PER_FRAME  64
        !            46: #define  QIC_1350_BOT_OFFSET  64
        !            47: 
        !            48: 
        !            49: ULONG
        !            50: TapePhysicalBlockToLogicalBlock(
        !            51:     IN UCHAR DensityCode,
        !            52:     IN ULONG PhysicalBlockAddress,
        !            53:     IN ULONG BlockLength,
        !            54:     IN BOOLEAN FromBOT
        !            55:     )
        !            56: 
        !            57: /*++
        !            58: Routine Description:
        !            59: 
        !            60:     This routine will translate from a QIC physical tape format
        !            61:     specific physical/absolute block address to a pseudo-logical
        !            62:     block address.
        !            63: 
        !            64: Arguments:
        !            65: 
        !            66:     DensityCode            // tape media density code
        !            67:     PhysicalBlockAddress   // tape format specific tape block address
        !            68:     BlockLength            // mode select/sense block length setting
        !            69:     FromBOT                // true/false - translate from BOT
        !            70: 
        !            71: Return Value:
        !            72: 
        !            73:     ULONG
        !            74: 
        !            75: --*/
        !            76: 
        !            77: {
        !            78:     ULONG logicalBlockAddress;
        !            79:     ULONG frames;
        !            80: 
        !            81: 
        !            82:     logicalBlockAddress = PhysicalBlockAddress;
        !            83: 
        !            84:     switch ( DensityCode ) {
        !            85:         case 0:
        !            86:             logicalBlockAddress = 0xFFFFFFFF;
        !            87:             break;
        !            88: 
        !            89:         case QIC_24:
        !            90:             logicalBlockAddress--;
        !            91:             break;
        !            92: 
        !            93:         case QIC_120:
        !            94:             logicalBlockAddress--;
        !            95:             break;
        !            96: 
        !            97:         case QIC_150:
        !            98:             if (FromBOT) {
        !            99:                 if (logicalBlockAddress > QIC_150_BOT_OFFSET) {
        !           100:                     logicalBlockAddress -= QIC_150_BOT_OFFSET;
        !           101:                 } else {
        !           102:                     logicalBlockAddress = 0;
        !           103:                 }
        !           104:             } else {
        !           105:                 logicalBlockAddress--;
        !           106:             }
        !           107:             break;
        !           108: 
        !           109:         case QIC_525:
        !           110:         case QIC_1000:
        !           111:         case QIC_2GB:
        !           112:             if (FromBOT && (logicalBlockAddress >= QIC_525_BOT_OFFSET)) {
        !           113:                 logicalBlockAddress -= QIC_525_BOT_OFFSET;
        !           114:             }
        !           115:             if (logicalBlockAddress != 0) {
        !           116:                 frames = logicalBlockAddress/QIC_525_BLKS_PER_FRAME;
        !           117:                 logicalBlockAddress -= QIC_525_ECC_BLKS_PER_FRAME*frames;
        !           118:                 switch (BlockLength) {
        !           119:                     case QIC_525_PHYSICAL_BLOCK_SIZE:
        !           120:                         break;
        !           121: 
        !           122:                     case QIC_525_PSEUDO_PHYSICAL_BLOCK_SIZE:
        !           123:                         logicalBlockAddress *= 2;
        !           124:                         break;
        !           125: 
        !           126:                     default:
        !           127:                         if (BlockLength > QIC_525_PHYSICAL_BLOCK_SIZE) {
        !           128:                             if ((BlockLength%QIC_525_PHYSICAL_BLOCK_SIZE) == 0) {
        !           129:                                 logicalBlockAddress /=
        !           130:                                     BlockLength/QIC_525_PHYSICAL_BLOCK_SIZE;
        !           131:                             } else {
        !           132:                                 logicalBlockAddress /=
        !           133:                                     1+(BlockLength/QIC_525_PHYSICAL_BLOCK_SIZE);
        !           134:                             }
        !           135:                         }
        !           136:                         break;
        !           137:                 }
        !           138:             }
        !           139:             break;
        !           140: 
        !           141:         case QIC_1350:
        !           142:         case QIC_2100:
        !           143:             if (FromBOT && (logicalBlockAddress >= QIC_1350_BOT_OFFSET)) {
        !           144:                 logicalBlockAddress -= QIC_1350_BOT_OFFSET;
        !           145:             }
        !           146:             if (logicalBlockAddress != 0) {
        !           147:                 frames = logicalBlockAddress/QIC_1350_BLKS_PER_FRAME;
        !           148:                 logicalBlockAddress -= QIC_1350_ECC_BLKS_PER_FRAME*frames;
        !           149:                 if (BlockLength > QIC_1350_PHYSICAL_BLOCK_SIZE) {
        !           150:                     if ((BlockLength%QIC_1350_PHYSICAL_BLOCK_SIZE) == 0) {
        !           151:                         logicalBlockAddress /=
        !           152:                             BlockLength/QIC_1350_PHYSICAL_BLOCK_SIZE;
        !           153:                     } else {
        !           154:                         logicalBlockAddress /=
        !           155:                             1+(BlockLength/QIC_1350_PHYSICAL_BLOCK_SIZE);
        !           156:                     }
        !           157:                 }
        !           158:             }
        !           159:             break;
        !           160:     }
        !           161: 
        !           162:     return logicalBlockAddress;
        !           163: 
        !           164: } // end TapePhysicalBlockToLogicalBlock()
        !           165: 
        !           166: 
        !           167: TAPE_PHYS_POSITION
        !           168: TapeLogicalBlockToPhysicalBlock(
        !           169:     IN UCHAR DensityCode,
        !           170:     IN ULONG LogicalBlockAddress,
        !           171:     IN ULONG BlockLength,
        !           172:     IN BOOLEAN FromBOT
        !           173:     )
        !           174: 
        !           175: /*++
        !           176: Routine Description:
        !           177: 
        !           178:     This routine will translate from a pseudo-logical block address
        !           179:     to a QIC physical tape format specific physical/absolute block
        !           180:     address and (space) block delta.
        !           181: 
        !           182: Arguments:
        !           183: 
        !           184:     DensityCode            // tape media density code
        !           185:     LogicalBlockAddress    // pseudo-logical tape block address
        !           186:     BlockLength            // mode select/sense block length setting
        !           187:     FromBOT                // true/false - translate from BOT
        !           188: 
        !           189: Return Value:
        !           190: 
        !           191:     TAPE_PHYS_POSITION info/structure
        !           192: 
        !           193: --*/
        !           194: 
        !           195: {
        !           196:     TAPE_PHYS_POSITION physPosition;
        !           197:     ULONG physicalBlockAddress;
        !           198:     ULONG remainder = 0;
        !           199:     ULONG frames;
        !           200: 
        !           201: 
        !           202:     physicalBlockAddress = LogicalBlockAddress;
        !           203: 
        !           204:     switch ( DensityCode ) {
        !           205:         case 0:
        !           206:             physicalBlockAddress = 0xFFFFFFFF;
        !           207:             break;
        !           208: 
        !           209:         case QIC_24:
        !           210:             physicalBlockAddress++;
        !           211:             break;
        !           212: 
        !           213:         case QIC_120:
        !           214:             physicalBlockAddress++;
        !           215:             break;
        !           216: 
        !           217:         case QIC_150:
        !           218:             if (FromBOT) {
        !           219:                 physicalBlockAddress += QIC_150_BOT_OFFSET;
        !           220:             } else {
        !           221:                 physicalBlockAddress++;
        !           222:             }
        !           223:             break;
        !           224: 
        !           225:         case QIC_525:
        !           226:         case QIC_1000:
        !           227:         case QIC_2GB:
        !           228:             if (physicalBlockAddress != 0) {
        !           229:                 switch (BlockLength) {
        !           230:                     case QIC_525_PHYSICAL_BLOCK_SIZE:
        !           231:                         break;
        !           232: 
        !           233:                     case QIC_525_PSEUDO_PHYSICAL_BLOCK_SIZE:
        !           234:                         remainder = physicalBlockAddress & 0x00000001;
        !           235:                         physicalBlockAddress >>= 1;
        !           236:                         break;
        !           237: 
        !           238:                     default:
        !           239:                         if (BlockLength > QIC_525_PHYSICAL_BLOCK_SIZE) {
        !           240:                             if ((BlockLength%QIC_525_PHYSICAL_BLOCK_SIZE) == 0) {
        !           241:                                 physicalBlockAddress *=
        !           242:                                     BlockLength/QIC_525_PHYSICAL_BLOCK_SIZE;
        !           243:                             } else {
        !           244:                                 physicalBlockAddress *=
        !           245:                                     1+(BlockLength/QIC_525_PHYSICAL_BLOCK_SIZE);
        !           246:                             }
        !           247:                         }
        !           248:                         break;
        !           249: 
        !           250:                 }
        !           251:                 frames = physicalBlockAddress/QIC_525_DATA_BLKS_PER_FRAME;
        !           252:                 physicalBlockAddress += QIC_525_ECC_BLKS_PER_FRAME*frames;
        !           253:             }
        !           254:             if (FromBOT) {
        !           255:                 physicalBlockAddress += QIC_525_BOT_OFFSET;
        !           256:             }
        !           257:             break;
        !           258: 
        !           259:         case QIC_1350:
        !           260:         case QIC_2100:
        !           261:             if (physicalBlockAddress != 0) {
        !           262:                 if (BlockLength > QIC_1350_PHYSICAL_BLOCK_SIZE) {
        !           263:                     if ((BlockLength%QIC_1350_PHYSICAL_BLOCK_SIZE) == 0) {
        !           264:                         physicalBlockAddress *=
        !           265:                             BlockLength/QIC_1350_PHYSICAL_BLOCK_SIZE;
        !           266:                     } else {
        !           267:                         physicalBlockAddress *=
        !           268:                             1+(BlockLength/QIC_1350_PHYSICAL_BLOCK_SIZE);
        !           269:                     }
        !           270:                 }
        !           271:                 frames = physicalBlockAddress/QIC_1350_DATA_BLKS_PER_FRAME;
        !           272:                 physicalBlockAddress += QIC_1350_ECC_BLKS_PER_FRAME*frames;
        !           273:             }
        !           274:             if (FromBOT) {
        !           275:                 physicalBlockAddress += QIC_1350_BOT_OFFSET;
        !           276:             }
        !           277:             break;
        !           278:     }
        !           279: 
        !           280:     physPosition.SeekBlockAddress = physicalBlockAddress;
        !           281:     physPosition.SpaceBlockCount = remainder;
        !           282: 
        !           283:     return physPosition;
        !           284: 
        !           285: } // end TapeLogicalBlockToPhysicalBlock()

unix.superglobalmegacorp.com

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