Annotation of driverkit/tests/sctest.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:  * sctest - test of SCSIController object. Linked with libSCSIController.o.
                     26:  */
                     27:  
                     28: #define FAKE_HARDWARE  1
                     29: 
                     30: #import <bsd/sys/types.h>
                     31: #import <bsd/libc.h>
                     32: #import <SCSIController/SCSIController.h>
                     33: #import <SCSIController/SCSIControllerPrivate.h>
                     34: #import <architecture/nrw/SCSI_channel.h>
                     35: #import <driverkit/return.h>
                     36: #import <driverkit/align.h>
                     37: 
                     38: /*
                     39:  * prototypes for private functions.
                     40:  */
                     41: static void usage(char **argv);
                     42: static void print_menu();
                     43: static void setupScsiReq(scsiReq_t *scsiReq);
                     44: void dump_buf(u_char *buf, int size);
                     45: 
                     46: /*
                     47:  * Menu stuff.
                     48:  */
                     49: struct menu_entry {
                     50:        char    menu_c;
                     51:        char    *name;
                     52:        void    (*men_fcn)();
                     53: };
                     54: 
                     55: static void scReset();
                     56: static void cdbRead();
                     57: static void cdbWrite();
                     58: static void setTarget();
                     59: static void setLun();
                     60: static void quit();
                     61: static void setupCDB();
                     62: static void setDmaMax();
                     63: static void setDmaDir();
                     64: static void dumpBuf();
                     65: 
                     66: struct menu_entry me_array[] = {
                     67: 
                     68:        {'t',   "Reset"         , scReset       },
                     69:        {'r',   "cdbRead"       , cdbRead       },
                     70:        {'w',   "cdbWrite"      , cdbWrite      },
                     71:        {'T',   "Set Target"    , setTarget     },
                     72:        {'L',   "Set lun"       , setLun        },
                     73:        {'c',   "Setup CDB"     , setupCDB      },
                     74:        {'d',   "Set DMA Size"  , setDmaMax     },
                     75:        {'D',   "Set DMA Dir"   , setDmaDir     },
                     76:        {'b',   "Dump r/w buf"  , dumpBuf       },
                     77:        {'h',   "Help"          , print_menu    },
                     78:        {'x',   "Exit"          , quit          },
                     79:        {'q',   NULL            , quit          },
                     80:        {0,     NULL            , NULL          }
                     81: };
                     82: 
                     83: #define MAX_DMA_SIZE   (8 * 512)
                     84: 
                     85: /*
                     86:  * Static variables.
                     87:  */
                     88: int ioTimeout = 10;
                     89: int target = 0;
                     90: int lun = 0;
                     91: id controllerId;
                     92: u_char cdb_bytes[12];
                     93: u_int dmaMax = MAX_DMA_SIZE;
                     94: SCSIDmaDir_t dmaDir = SCSI_DMA_READ;
                     95: char *rwbuf;
                     96: char *rwbuf_unalign;
                     97: 
                     98: /*
                     99:  * User-specified variables.
                    100:  */
                    101: int verbose = 0;               /* used by libIODevice */
                    102: int ioStub = 0;
                    103: 
                    104: int main(int argc, char **argv)
                    105: {
                    106:        int arg;
                    107:        char instr[80];
                    108:        struct  menu_entry *mep;
                    109:        int ok;
                    110:        
                    111:        if(argc < 1)
                    112:                usage(argv);
                    113:        for(arg=1; arg<argc; arg++) {
                    114:                switch(argv[arg][0]) {
                    115:                    case 'v':
                    116:                        verbose++;
                    117:                        break;
                    118:                    case 's':
                    119:                        ioStub++;
                    120:                        break;
                    121:                    default:
                    122:                        usage(argv);
                    123:                }
                    124:        }
                    125: 
                    126:        rwbuf_unalign = malloc(MAX_DMA_SIZE + 2 * SCSI_BUFSIZE);
                    127:        rwbuf = IOAlign(char *, rwbuf_unalign, SCSI_BUFSIZE);
                    128:        
                    129:         IOInitGeneralFuncs();
                    130: #ifdef DDM_DEBUG
                    131:        IOInitDDM(200, "scxpr");
                    132: #endif DDM_DEBUG
                    133: 
                    134:        /*
                    135:         * Instantiate and init the controller object.
                    136:         */
                    137:        controllerId = [SCSIController probe:0 deviceMaster:PORT_NULL];
                    138:        if(controllerId == nil) {
                    139:                printf("SCSIController probe FAILED\n");
                    140:                exit(-1);
                    141:        }
                    142:        
                    143:        print_menu();
                    144:        while(1) {
                    145:                printf("Enter Selection: ");
                    146:                gets(instr);
                    147:                mep = me_array;
                    148:                ok = 0;
                    149:                while(mep->menu_c) {
                    150:                        if(mep->menu_c == instr[0]) {
                    151:                                ok = 1;
                    152:                                (*mep->men_fcn)();
                    153:                                break;
                    154:                        }
                    155:                        else
                    156:                                mep++;
                    157:                }
                    158:                if(!ok)
                    159:                        printf("***Illegal Selection\n");
                    160:        }
                    161:        return(0);
                    162: }
                    163: 
                    164: static void usage(char **argv)
                    165: {
                    166:        printf("usage: %s [options]\n", argv[0]);
                    167:        printf("Options:\n");
                    168:        printf("\tv  verbose mode\n");
                    169:        printf("\ts  Use I/O stub\n");
                    170:        exit(1);
                    171: }
                    172: 
                    173: static void print_menu() {
                    174:        
                    175:        struct menu_entry *mep;
                    176:        
                    177:        printf("\n");
                    178:        mep = me_array;
                    179:        while(mep->menu_c) {
                    180:                if(mep->name)
                    181:                        printf(" %c: %s\n", mep->menu_c, mep->name);
                    182:                mep++;
                    183:        }
                    184:        printf("\n");
                    185: } /* print_menu() */
                    186: 
                    187: static void scReset()
                    188: {
                    189:        scStatus rtn;
                    190:        
                    191:        rtn = [controllerId scsiReset];
                    192:        if(rtn) {
                    193:                printf("...scsiReset returned %d\n", rtn);
                    194:        }
                    195: }
                    196: 
                    197: static void cdbRead()
                    198: {
                    199:        scsiReq_t scsiReq;
                    200:        scStatus rtn;
                    201:        
                    202:        setupScsiReq(&scsiReq);
                    203:        rtn = [controllerId executeCdbRead:&scsiReq buffer:rwbuf];
                    204:        if(rtn) {
                    205:                printf("...executeCdbRead returned %s\n", 
                    206:                        IOFindNameForValue(rtn, scStatusValues));
                    207:                printf("        ioStatus = %s\n", 
                    208:                        IOFindNameForValue(scsiReq.ioStatus, scStatusValues));
                    209:        }
                    210:        else if(scsiReq.ioStatus) {
                    211:                printf("...executeCdbRead: ioStatus = %d\n", 
                    212:                        IOFindNameForValue(scsiReq.ioStatus, scStatusValues));
                    213:        }
                    214:        else if(scsiReq.dmaXfr)
                    215:                printf("dmaXfr = %d\n", scsiReq.dmaXfr);
                    216:        else
                    217:                printf("...OK\n");
                    218: }
                    219: 
                    220: static void cdbWrite()
                    221: {
                    222:        scsiReq_t scsiReq;
                    223:        scStatus rtn;
                    224:        
                    225:        setupScsiReq(&scsiReq);
                    226:        rtn = [controllerId executeCdbWrite:&scsiReq buffer:rwbuf];
                    227:        if(rtn) {
                    228:                printf("...executeCdbWrite returned %s\n", 
                    229:                        IOFindNameForValue(rtn, scStatusValues));
                    230:                printf("        ioStatus = %s\n", 
                    231:                        IOFindNameForValue(scsiReq.ioStatus, scStatusValues));
                    232:        }
                    233:        else if(scsiReq.ioStatus) {
                    234:                printf("...executeCdbWrite: ioStatus = %d\n", 
                    235:                        IOFindNameForValue(scsiReq.ioStatus, scStatusValues));
                    236:        }
                    237:        else if(scsiReq.dmaXfr)
                    238:                printf("dmaXfr = %d\n", scsiReq.dmaXfr);
                    239:        else
                    240:                printf("...OK\n");
                    241: }
                    242: 
                    243: static void setTarget()
                    244: {
                    245:        char instr[100];
                    246:        
                    247:        printf("Enter new target (CR = %d): ", target);
                    248:        gets(instr);
                    249:        if(instr[0]) 
                    250:                target = atoi(instr);
                    251: }
                    252: 
                    253: static void setLun()
                    254: {
                    255:        char instr[100];
                    256:        
                    257:        printf("Enter new lun (CR = %d): ", lun);
                    258:        gets(instr);
                    259:        if(instr[0]) 
                    260:                lun = atoi(instr);
                    261: }
                    262: 
                    263: static void setDmaMax()
                    264: {
                    265:        char instr[100];
                    266:        int ok;
                    267:        
                    268:        do {
                    269:                printf("Enter new dmaMax (CR = %d): ", dmaMax);
                    270:                gets(instr);
                    271:                if(instr[0]) 
                    272:                        dmaMax = atoi(instr);
                    273:                if(dmaMax > MAX_DMA_SIZE) {
                    274:                        printf("Maximum DMA size is %d\n", MAX_DMA_SIZE);
                    275:                        ok = 0;
                    276:                }
                    277:                else {
                    278:                        ok = 1;
                    279:                }
                    280:        } while(!ok);
                    281: }
                    282: 
                    283: static void setDmaDir()
                    284: {
                    285:        char instr[100];
                    286:        
                    287:        printf("Enter new dmaDir (r/w, CR = %s): ", 
                    288:                dmaDir == SCSI_DMA_READ ? "Read" : "Write");
                    289:        gets(instr);
                    290:        switch(instr[0]) {
                    291:            case 'r':
                    292:                dmaDir = SCSI_DMA_READ;
                    293:                break;
                    294:            case 'w':
                    295:                dmaDir = SCSI_DMA_WRITE;
                    296:                break;
                    297:            default:
                    298:                break;
                    299:        }
                    300: }
                    301: 
                    302: 
                    303: static void setupCDB()
                    304: {
                    305:        int i;
                    306:        char instr[20];
                    307:        
                    308:        printf("Enter <ESC> at any prompt to quit\n");
                    309:        for(i=0; i<12; i++) {
                    310:                printf("  CDB byte %d (CR = 0x%02x): ", i, cdb_bytes[i]);
                    311:                gets(instr);
                    312:                switch(instr[0]) {
                    313:                    case '\0':
                    314:                        break;                  /* take current value */
                    315:                    case 0x1b:                  /* Escape */
                    316:                        goto outOfHere;
                    317:                    default:
                    318:                        cdb_bytes[i] = atoh(instr);
                    319:                        break;
                    320:                }
                    321:        }
                    322: outOfHere:
                    323:        printf("CDB bytes: ");
                    324:        for(i=0; i<12; i++) 
                    325:                printf("0x%02x ", cdb_bytes[i]);
                    326:        printf("\n");
                    327: }
                    328: 
                    329: static void setupScsiReq(scsiReq_t *scsiReq)
                    330: {
                    331:        bzero(scsiReq, sizeof(scsiReq_t));
                    332:        scsiReq->target = target;
                    333:        scsiReq->lun = lun;
                    334:        bcopy(cdb_bytes, &scsiReq->cdb, 12);
                    335:        scsiReq->dmaDir = dmaDir;
                    336:        scsiReq->dmaMax = dmaMax;
                    337:        scsiReq->ioTimeout = ioTimeout;
                    338: }
                    339: 
                    340: static void dumpBuf()
                    341: {
                    342:        dump_buf((u_char *)rwbuf, MAX_DMA_SIZE);
                    343: }
                    344: 
                    345: static void quit()
                    346: {
                    347:        exit(0);
                    348: }
                    349: 
                    350: #ifdef notdef
                    351: void dump_buf(u_char *buf, int size) {
                    352: 
                    353:        int i;
                    354:        char c[100];
                    355:        
                    356:        printf("\n");
                    357:        for(i=0; i<size; i++) {
                    358:                if((i>0) && (i%0x100 == 0)) {
                    359:                        printf("\n...More? (y/anything) ");
                    360:                        gets(c);
                    361:                        if(c[0] != 'y')
                    362:                                return;
                    363:                }
                    364:                if(i%0x10 == 0)
                    365:                        printf("\n %03X: ",i);
                    366:                else if(i%8 == 0)
                    367:                        printf("  ");
                    368:                printf("%02X ",buf[i]);
                    369:        }
                    370:        printf("\n");
                    371: } /* dump_buf() */ 
                    372: #endif notdef

unix.superglobalmegacorp.com

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