Annotation of drvEIDE/idemodes.tproj/idemodes.c, 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.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:  * idemodes.c -- User level utility to print ATA disk parameters
        !            29:  *             (will work with only 3.3 IDE driver patch and later)
        !            30:  *
        !            31:  * HISTORY
        !            32:  * 14-Aug-1994  Rakesh Dubey at NeXT
        !            33:  *     Created.
        !            34:  *
        !            35:  */
        !            36:  
        !            37: #import <stdio.h>
        !            38: #import <stdlib.h>
        !            39: #import <string.h>
        !            40: #import <sys/ioctl.h>
        !            41: #import <errno.h>
        !            42: #import <libc.h>
        !            43: 
        !            44: /* FIXME */
        !            45: #import <ata_extern.h>
        !            46: 
        !            47: void print_ide_info(ideIdentifyInfo_t *ideInfo);
        !            48: void get_info_for_drive(char *name);
        !            49: 
        !            50: char *progname;
        !            51: 
        !            52: int main(int argc, char *argv[])
        !            53: {
        !            54:     int i;
        !            55:     
        !            56:     if (argc == 1)     {
        !            57:        fprintf(stderr, "Usages: %s <raw_device>\n", argv[0]);
        !            58:        exit(0);
        !            59:     }
        !            60: 
        !            61:     progname = argv[0];
        !            62:     
        !            63:     for (i = 1; i < argc; i++) {
        !            64:        get_info_for_drive(argv[i]);
        !            65:     }
        !            66:        
        !            67:     exit(0);
        !            68: }
        !            69: 
        !            70: void get_info_for_drive(char *name)
        !            71: {
        !            72:     int fd, status;
        !            73:     ideIoReq_t ioReq;
        !            74:     ideIdentifyInfo_t *ideInfo;
        !            75: 
        !            76:     if ((fd = open(name, O_RDONLY)) < 0)       {
        !            77:        //fprintf(stderr, "%s: can't open %s\n", progname, name);
        !            78:        perror(progname);
        !            79:        exit(1);
        !            80:     }
        !            81: 
        !            82:     bzero(&ioReq, sizeof(ideIoReq_t));
        !            83: 
        !            84:     ideInfo = (ideIdentifyInfo_t *) malloc(sizeof(ideIdentifyInfo_t));
        !            85:     if (ideInfo == NULL)       {
        !            86:        perror(progname);
        !            87:        exit(2);
        !            88:     }
        !            89:     bzero(ideInfo, sizeof(ideIdentifyInfo_t));
        !            90: 
        !            91:     ioReq.cmd = IDE_IDENTIFY_DRIVE;
        !            92:     ioReq.addr = (void *) ideInfo;
        !            93: 
        !            94:     if ((status = ioctl(fd, IDEDIOCREQ, &ioReq)) < 0)  {
        !            95:        perror(progname);
        !            96:        free(ideInfo);
        !            97:        exit(1);
        !            98:     }
        !            99: 
        !           100:     close(fd);
        !           101:     
        !           102:     if (status != IDER_SUCCESS)        {
        !           103:        fprintf(stderr, "Command failed: error %d, status 0x%0x\n", 
        !           104:                status, ioReq.status);
        !           105:        free(ideInfo);
        !           106:        exit(3);
        !           107:     }
        !           108: 
        !           109:     print_ide_info(ideInfo);
        !           110:     free(ideInfo);
        !           111: 
        !           112: }
        !           113: 
        !           114: char *byte_swap_string(char *s, int len)
        !           115: {
        !           116:     int i;
        !           117:     char *tmp;
        !           118: 
        !           119:     tmp = (char *)malloc(len);
        !           120: 
        !           121:     for (i = 0; i < len/2; i++)        {
        !           122:        tmp[2*i] = s[2*i+1];
        !           123:        tmp[2*i+1] = s[2*i];
        !           124:     }
        !           125:     strncpy(s, tmp, len);
        !           126:     s[len-1] = '\0';
        !           127: 
        !           128:     free(tmp);
        !           129:     return s;
        !           130: }
        !           131: 
        !           132: 
        !           133: void print_ide_info(ideIdentifyInfo_t *ideInfo)
        !           134: {
        !           135:     int transfer_mode;
        !           136:     unsigned int sec_cnt;
        !           137:     unsigned long capacity;
        !           138:     unsigned char printall;
        !           139:     short *data = (short *)ideInfo;
        !           140:     int i;
        !           141: 
        !           142:     printall = 0;
        !           143:     
        !           144:     /* Name */
        !           145:     printf("Drive Name: %s\n", byte_swap_string(ideInfo->modelNumber, 40));
        !           146:     printf("Firmware Revision: %s\n",
        !           147:        byte_swap_string(ideInfo->firmwareRevision, 8));
        !           148:     printf("Serial Number: %s\n", 
        !           149:        byte_swap_string(ideInfo->serialNumber, 10));
        !           150: 
        !           151:     /* Physical (hopefully) parameters */
        !           152:     printf("Cylinders: %d, heads: %d, sectors per track: %d.\n",
        !           153:        ideInfo->cylinders, ideInfo->heads, ideInfo->sectorsPerTrack);
        !           154: 
        !           155:     /* What this thing can do */
        !           156:     printf("Capabilities: ");
        !           157:     if (ideInfo->capabilities & IDE_CAP_LBA_SUPPORTED) {
        !           158:        printf("LBA"); 
        !           159:     }
        !           160:     
        !           161:     if (ideInfo->capabilities & IDE_CAP_IORDY_SUPPORTED) {
        !           162:        printf(", IORDY"); 
        !           163:     }
        !           164:     if (ideInfo->capabilities & IDE_CAP_DMA_SUPPORTED)
        !           165:        printf(", DMA"); 
        !           166:     printf("\n");
        !           167: 
        !           168:     /* Drive buffer features */
        !           169:     printf("Drive Buffer: ");
        !           170:     if (ideInfo->bufferType != 0)      {
        !           171:        printf("type %d, size %d sectors.\n",
        !           172:                ideInfo->bufferType, ideInfo->bufferSize);
        !           173:     }
        !           174: 
        !           175:     /* Transfer mode */
        !           176:     printf("Data Transfer: ");
        !           177:     transfer_mode = (ideInfo->pioDataTransferCyleTimingMode &
        !           178:                IDE_PIO_TIMING_MODE_MASK) >> 8;
        !           179:     printf("PIO Mode %d", transfer_mode); 
        !           180: 
        !           181:     if (ideInfo->capabilities & IDE_CAP_DMA_SUPPORTED) {
        !           182:                int i;
        !           183:        
        !           184:                /* Single word DMA */
        !           185:                transfer_mode = (ideInfo->dmaDataTransferCyleTimingMode &
        !           186:                    IDE_DMA_TIMING_MODE_MASK) >> 8;
        !           187:            printf(", SW DMA Mode %d", transfer_mode); 
        !           188: 
        !           189:                /* Multiword DMA */
        !           190:                for (i = 2; i >= 0; i--) {
        !           191:                        if (ideInfo->mwDma & (1 << i)) {
        !           192:                                printf(", MW DMA Mode %d", i);
        !           193:                                break;
        !           194:                        }
        !           195:                }
        !           196:                
        !           197:                /* UDMA/33 */
        !           198:                if (ideInfo->fieldValidity & IDE_WORD88_SUPPORTED) {
        !           199:                        for (i = 2; i >= 0; i--) {
        !           200:                                if (ideInfo->UDma & (1 << i)) {
        !           201:                                        printf(", UDMA/33 Mode %d", i);
        !           202:                                        break;
        !           203:                                }
        !           204:                        }
        !           205:                }
        !           206:     }
        !           207:     printf("\n");
        !           208:        
        !           209:     /* Transfer mode with IOCHRDY */
        !           210:     if ((ideInfo->fieldValidity & IDE_WORDS64_TO_68_SUPPORTED) &&
        !           211:        (ideInfo->capabilities & IDE_CAP_IORDY_SUPPORTED))      {
        !           212:        printf("Data Transfer (with IORDY): ");
        !           213:        transfer_mode = ideInfo->fcPioDataTransferCyleTimingMode;
        !           214:        if (transfer_mode & IDE_FC_PIO_MODE_5_SUPPORTED)
        !           215:            printf("PIO Mode 5 ");
        !           216:        else if (transfer_mode & IDE_FC_PIO_MODE_4_SUPPORTED)
        !           217:            printf("PIO Mode 4 ");
        !           218:        else if (transfer_mode & IDE_FC_PIO_MODE_3_SUPPORTED)
        !           219:            printf("PIO Mode 3 ");
        !           220: 
        !           221:        printf("\n");
        !           222:     }
        !           223:     
        !           224:     sec_cnt = ideInfo->multipleSectors & IDE_MULTI_SECTOR_MASK;
        !           225:     if (sec_cnt > 0)   {
        !           226:        printf("Multiple Sector: %d sectors per transfer.\n",
        !           227:                sec_cnt); 
        !           228:     }
        !           229: 
        !           230:     /* Drive capacity */
        !           231:     if (ideInfo->capabilities & IDE_CAP_LBA_SUPPORTED) {
        !           232:        capacity = ideInfo->userAddressableSectors;
        !           233:     } else {
        !           234:        capacity = ideInfo->cylinders * ideInfo->heads * 
        !           235:                ideInfo->sectorsPerTrack;
        !           236:     }
        !           237: 
        !           238:     /*
        !           239:      * Some disks that support LBA have bogus info in userAddressableSectors
        !           240:      * field. 
        !           241:      */
        !           242:     capacity = ideInfo->cylinders * ideInfo->heads * 
        !           243:            ideInfo->sectorsPerTrack;
        !           244:     
        !           245:     printf("Drive Capacity: %lu sectors of 512 bytes each (total %7.2f MB).\n", 
        !           246:        capacity, (float) (capacity*512.0)/(1024*1024)); 
        !           247: 
        !           248:     /*
        !           249:      * Dump all data returned by IDENTIFY DRIVE command. 
        !           250:      */
        !           251:     if (printall)      {
        !           252:        for (i = 0; i < 256; i++)       {
        !           253:            if (i % 8 == 0)
        !           254:                printf("\n%3d: ", i);
        !           255:            printf("%4x ", data[i] & 0x0ffff);
        !           256:        }
        !           257:        printf("\n");
        !           258:     }
        !           259:     
        !           260:     return;
        !           261: }

unix.superglobalmegacorp.com

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