Annotation of Gnu-Mach/scsi/scsi_disk.c, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Mach Operating System
                      3:  * Copyright (c) 1991,1990 Carnegie Mellon University
                      4:  * All Rights Reserved.
                      5:  * 
                      6:  * Permission to use, copy, modify and distribute this software and its
                      7:  * documentation is hereby granted, provided that both the copyright
                      8:  * notice and this permission notice appear in all copies of the
                      9:  * software, derivative works or modified versions, and any portions
                     10:  * thereof, and that both notices appear in supporting documentation.
                     11:  * 
                     12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     15:  * 
                     16:  * Carnegie Mellon requests users of this software to return to
                     17:  * 
                     18:  *  Software Distribution Coordinator  or  [email protected]
                     19:  *  School of Computer Science
                     20:  *  Carnegie Mellon University
                     21:  *  Pittsburgh PA 15213-3890
                     22:  * 
                     23:  * any improvements or extensions that they make and grant Carnegie Mellon
                     24:  * the rights to redistribute these changes.
                     25:  */
                     26: /*
                     27:  *     File: scsi_disk.c
                     28:  *     Author: Alessandro Forin, Carnegie Mellon University
                     29:  *     Date:   10/90
                     30:  *
                     31:  *     Middle layer of the SCSI driver: SCSI protocol implementation
                     32:  *
                     33:  * This file contains code for SCSI commands for DISK devices.
                     34:  */
                     35: 
                     36: #include <string.h>
                     37: 
                     38: #include <mach/std_types.h>
                     39: #include <scsi/compat_30.h>
                     40: 
                     41: #include <scsi/scsi.h>
                     42: #include <scsi/scsi2.h>
                     43: #include <scsi/scsi_defs.h>
                     44: 
                     45: #if  (NSCSI > 0)
                     46: 
                     47: 
                     48: char *scdisk_name(internal)
                     49:        boolean_t       internal;
                     50: {
                     51:        return internal ? "rz" : "disk";
                     52: }
                     53: 
                     54: /*
                     55:  * SCSI commands partially specific to disks
                     56:  */
                     57: void scdisk_read( tgt, secno, ior)
                     58:        register target_info_t  *tgt;
                     59:        register unsigned int   secno;
                     60:        io_req_t                ior;
                     61: {
                     62:        scsi_cmd_read_t         *cmd;
                     63:        register unsigned       len;
                     64:        unsigned int            max_dma_data;
                     65: 
                     66:        max_dma_data = scsi_softc[(unsigned char)tgt->masterno]->max_dma_data;
                     67: 
                     68:        len = ior->io_count;
                     69:        if (len > max_dma_data)
                     70:                len = max_dma_data;
                     71:        if (len < tgt->block_size)
                     72:                len = tgt->block_size;
                     73: 
                     74:        cmd = (scsi_cmd_read_t*) (tgt->cmd_ptr);
                     75:        cmd->scsi_cmd_code = SCSI_CMD_READ;
                     76:        cmd->scsi_cmd_lun_and_lba1 = (secno>>16)&SCSI_LBA_MASK;
                     77:        cmd->scsi_cmd_lba2         = (secno>> 8)&0xff;
                     78:        cmd->scsi_cmd_lba3         = (secno    )&0xff;
                     79:        cmd->scsi_cmd_xfer_len     = len / tgt->block_size;
                     80:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                     81:        
                     82:        tgt->cur_cmd = SCSI_CMD_READ;
                     83: 
                     84:        scsi_go(tgt, sizeof(*cmd), len, FALSE);
                     85: }
                     86: 
                     87: void scdisk_write( tgt, secno, ior)
                     88:        register target_info_t  *tgt;
                     89:        register unsigned int   secno;
                     90:        io_req_t                ior;
                     91: {
                     92:        scsi_cmd_write_t        *cmd;
                     93:        unsigned                len;    /* in bytes */
                     94:        unsigned int            max_dma_data;
                     95: 
                     96:        max_dma_data = scsi_softc[(unsigned char)tgt->masterno]->max_dma_data;
                     97: 
                     98:        len = ior->io_count;
                     99:        if (len > max_dma_data)
                    100:                len = max_dma_data;
                    101:        if (len < tgt->block_size)
                    102:                len = tgt->block_size;
                    103: 
                    104:        cmd = (scsi_cmd_write_t*) (tgt->cmd_ptr);
                    105:        cmd->scsi_cmd_code = SCSI_CMD_WRITE;
                    106:        cmd->scsi_cmd_lun_and_lba1 = (secno>>16)&SCSI_LBA_MASK;
                    107:        cmd->scsi_cmd_lba2         = (secno>> 8)&0xff;
                    108:        cmd->scsi_cmd_lba3         = (secno    )&0xff;
                    109:        cmd->scsi_cmd_xfer_len     = len / tgt->block_size;
                    110:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    111:        
                    112:        tgt->cur_cmd = SCSI_CMD_WRITE;
                    113: 
                    114:        scsi_go(tgt, sizeof(*cmd), 0, FALSE);
                    115: }
                    116: 
                    117: 
                    118: int scdisk_mode_select(tgt, lbn, ior, mdata, mlen, save)
                    119:        register target_info_t  *tgt;
                    120:        register int            lbn;
                    121:        io_req_t                ior;
                    122:        char                    *mdata;
                    123:        int mlen, save;
                    124: {
                    125:        scsi_cmd_mode_select_t  *cmd;
                    126:        scsi_mode_select_param_t        *parm;
                    127: 
                    128:        bzero(tgt->cmd_ptr, sizeof(*cmd) + sizeof(*parm));
                    129:        cmd = (scsi_cmd_mode_select_t*) (tgt->cmd_ptr);
                    130:        cmd->scsi_cmd_code = SCSI_CMD_MODE_SELECT;
                    131:        cmd->scsi_cmd_lun_and_lba1 = SCSI_CMD_MSL_PF;   /* XXX only if... */
                    132:        cmd->scsi_cmd_xfer_len = sizeof(scsi_mode_select_param_t);/* no vuq */
                    133: 
                    134:        parm = (scsi_mode_select_param_t*) (cmd + 1);
                    135:        if (mdata) {
                    136:                cmd->scsi_cmd_xfer_len = mlen;
                    137:                bcopy(mdata, (char*)parm, mlen);
                    138:                if (save)
                    139:                        cmd->scsi_cmd_lun_and_lba1 |= SCSI_CMD_MSL_SP;
                    140:        } else {
                    141:                /* parm->medium_type = if (floppy)disk.. */
                    142:                parm->desc_len = 8;
                    143:                /* this really is the LBN */
                    144:                parm->descs[0].density_code = 0;/* XXX default XXX */
                    145:                parm->descs[0].reclen1 = (lbn>>16)&0xff;
                    146:                parm->descs[0].reclen2 = (lbn>> 8)&0xff;
                    147:                parm->descs[0].reclen3 = (lbn    )&0xff;
                    148:                mlen = sizeof(*parm);
                    149:        }
                    150: 
                    151:        tgt->cur_cmd = SCSI_CMD_MODE_SELECT;
                    152: 
                    153:        scsi_go_and_wait(tgt, sizeof(*cmd) + mlen, 0, ior);
                    154: 
                    155:        return tgt->done;
                    156: }
                    157: 
                    158: /*
                    159:  * SCSI commands fully specific to disks
                    160:  */
                    161: int scsi_read_capacity( tgt, lbn, ior)
                    162:        register target_info_t  *tgt;
                    163:        int                     lbn;
                    164:        io_req_t                ior;
                    165: {
                    166:        scsi_cmd_read_capacity_t        *cmd;
                    167: 
                    168:        bzero(tgt->cmd_ptr, sizeof(*cmd));
                    169:        cmd = (scsi_cmd_read_capacity_t*) (tgt->cmd_ptr);
                    170:        cmd->scsi_cmd_code = SCSI_CMD_READ_CAPACITY;
                    171:        /* all zeroes, unless... */
                    172:        if (lbn) {
                    173:                cmd->scsi_cmd_rcap_flags = SCSI_CMD_RCAP_PMI;
                    174:                cmd->scsi_cmd_lba1 = (lbn>>24);
                    175:                cmd->scsi_cmd_lba2 = (lbn>>16)&0xff;
                    176:                cmd->scsi_cmd_lba3 = (lbn>> 8)&0xff;
                    177:                cmd->scsi_cmd_lba4 = (lbn    )&0xff;
                    178:        }
                    179:        
                    180:        tgt->cur_cmd = SCSI_CMD_READ_CAPACITY;
                    181: 
                    182:        scsi_go_and_wait(tgt, sizeof(*cmd), sizeof(scsi_rcap_data_t),ior);
                    183: 
                    184:        return tgt->done;
                    185: }
                    186: 
                    187: void scsi_reassign_blocks( tgt, defect_list, n_defects, ior)
                    188:        register target_info_t  *tgt;
                    189:        unsigned int            *defect_list;   /* In ascending order ! */
                    190:        int                     n_defects;
                    191:        io_req_t                ior;
                    192: {
                    193:        scsi_cmd_reassign_blocks_t      *cmd;
                    194:        scsi_Ldefect_data_t             *parm;
                    195: 
                    196:        cmd = (scsi_cmd_reassign_blocks_t*) (tgt->cmd_ptr);
                    197:        cmd->scsi_cmd_code = SCSI_CMD_REASSIGN_BLOCKS;
                    198:        cmd->scsi_cmd_lun_and_lba1 = 0;
                    199:        cmd->scsi_cmd_lba2         = 0;
                    200:        cmd->scsi_cmd_lba3         = 0;
                    201:        cmd->scsi_cmd_xfer_len     = 0;
                    202:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    203: 
                    204:        parm = (scsi_Ldefect_data_t *) (cmd + 1);
                    205:        parm->res1 = parm->res2 = 0;
                    206:        n_defects *= 4; /* in 4-byte-ints */
                    207:        parm->list_len_msb = n_defects >> 8;
                    208:        parm->list_len_lsb = n_defects;
                    209:        bcopy((char*)defect_list, (char*)parm->defects, n_defects);
                    210: 
                    211:        tgt->cur_cmd = SCSI_CMD_REASSIGN_BLOCKS;
                    212: 
                    213:        scsi_go(tgt, sizeof(*cmd) + sizeof(*parm) + (n_defects - 4), 0, FALSE);
                    214: }
                    215: 
                    216: void scsi_medium_removal( tgt, allow, ior)
                    217:        register target_info_t  *tgt;
                    218:        boolean_t               allow;
                    219:        io_req_t                ior;
                    220: {
                    221:        scsi_cmd_medium_removal_t       *cmd;
                    222: 
                    223:        cmd = (scsi_cmd_medium_removal_t*) (tgt->cmd_ptr);
                    224:        cmd->scsi_cmd_code = SCSI_CMD_PREVENT_ALLOW_REMOVAL;
                    225:        cmd->scsi_cmd_lun_and_lba1 = 0;
                    226:        cmd->scsi_cmd_lba2         = 0;
                    227:        cmd->scsi_cmd_lba3         = 0;
                    228:        cmd->scsi_cmd_pa_prevent   = allow ? 0 : 1;
                    229:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    230: 
                    231: 
                    232:        tgt->cur_cmd = SCSI_CMD_PREVENT_ALLOW_REMOVAL;
                    233: 
                    234:        scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior);
                    235: }
                    236: 
                    237: int scsi_format_unit( tgt, mode, vuqe, intlv, ior)
                    238:        register target_info_t  *tgt;
                    239:        int mode, vuqe;
                    240:        register unsigned int   intlv;
                    241:        io_req_t                ior;
                    242: {
                    243:        scsi_cmd_format_t       *cmd;
                    244:        char                    *parms;
                    245: 
                    246:        cmd = (scsi_cmd_format_t*) (tgt->cmd_ptr);
                    247:        cmd->scsi_cmd_code = SCSI_CMD_FORMAT_UNIT;
                    248:        cmd->scsi_cmd_lun_and_lba1 =
                    249:                mode & (SCSI_CMD_FMT_FMTDATA|SCSI_CMD_FMT_CMPLIST|SCSI_CMD_FMT_LIST_TYPE);
                    250:        cmd->scsi_cmd_lba2         = vuqe;
                    251:        cmd->scsi_cmd_lba3         = intlv >>  8;
                    252:        cmd->scsi_cmd_xfer_len     = intlv;
                    253:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    254: 
                    255:        parms = (char*) cmd + 1;
                    256:        if (ior->io_count)
                    257:                bcopy(ior->io_data, parms, ior->io_count);
                    258:        else
                    259:                bzero(parms, 0xff - sizeof(*cmd));
                    260: 
                    261:        tgt->cur_cmd = SCSI_CMD_FORMAT_UNIT;
                    262: 
                    263:        scsi_go_and_wait(tgt, sizeof(*cmd) + ior->io_count, 0, ior);
                    264:        return tgt->done;
                    265: }
                    266: 
                    267: 
                    268: /* Group 1 Commands */
                    269: 
                    270: void scsi_long_read( tgt, secno, ior)
                    271:        register target_info_t  *tgt;
                    272:        register unsigned int   secno; 
                    273:        io_req_t                ior;
                    274: {
                    275:        scsi_cmd_long_read_t    *cmd;
                    276:        register unsigned       len, n_blks;
                    277:        unsigned int            max_dma_data;
                    278: 
                    279:        max_dma_data = scsi_softc[(unsigned char)tgt->masterno]->max_dma_data;
                    280: 
                    281:        len = ior->io_count;
                    282:        if (len > max_dma_data)
                    283:                len = max_dma_data;
                    284:        if (len < tgt->block_size)
                    285:                len = tgt->block_size;
                    286:        n_blks = len /tgt->block_size;
                    287: 
                    288:        cmd = (scsi_cmd_long_read_t*) (tgt->cmd_ptr);
                    289:        cmd->scsi_cmd_code = SCSI_CMD_LONG_READ;
                    290:        cmd->scsi_cmd_lun_and_relbit = 0;
                    291:        cmd->scsi_cmd_lba1           = secno >> 24;
                    292:        cmd->scsi_cmd_lba2           = secno >> 16;
                    293:        cmd->scsi_cmd_lba3           = secno >>  8;
                    294:        cmd->scsi_cmd_lba4           = secno;
                    295:        cmd->scsi_cmd_xxx            = 0;
                    296:        cmd->scsi_cmd_xfer_len_1     = n_blks >> 8;
                    297:        cmd->scsi_cmd_xfer_len_2     = n_blks;
                    298:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    299:        
                    300:        tgt->cur_cmd = SCSI_CMD_LONG_READ;
                    301: 
                    302:        scsi_go(tgt, sizeof(*cmd), len, FALSE);
                    303: }
                    304: 
                    305: void scsi_long_write( tgt, secno, ior)
                    306:        register target_info_t  *tgt;
                    307:        register unsigned int   secno;
                    308:        io_req_t                ior;
                    309: {
                    310:        scsi_cmd_long_write_t   *cmd;
                    311:        unsigned                len;    /* in bytes */
                    312:        unsigned int            max_dma_data, n_blks;
                    313: 
                    314:        max_dma_data = scsi_softc[(unsigned char)tgt->masterno]->max_dma_data;
                    315: 
                    316:        len = ior->io_count;
                    317:        if (len > max_dma_data)
                    318:                len = max_dma_data;
                    319:        if (len < tgt->block_size)
                    320:                len = tgt->block_size;
                    321:        n_blks = len /tgt->block_size;
                    322: 
                    323:        cmd = (scsi_cmd_long_write_t*) (tgt->cmd_ptr);
                    324:        cmd->scsi_cmd_code = SCSI_CMD_LONG_WRITE;
                    325:        cmd->scsi_cmd_lun_and_relbit = 0;
                    326:        cmd->scsi_cmd_lba1           = secno >> 24;
                    327:        cmd->scsi_cmd_lba2           = secno >> 16;
                    328:        cmd->scsi_cmd_lba3           = secno >>  8;
                    329:        cmd->scsi_cmd_lba4           = secno;
                    330:        cmd->scsi_cmd_xxx            = 0;
                    331:        cmd->scsi_cmd_xfer_len_1     = n_blks >> 8;
                    332:        cmd->scsi_cmd_xfer_len_2     = n_blks;
                    333:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    334:        
                    335:        tgt->cur_cmd = SCSI_CMD_LONG_WRITE;
                    336: 
                    337:        scsi_go(tgt, sizeof(*cmd), 0, FALSE);
                    338: }
                    339: 
                    340: int scdisk_verify( tgt, secno, nsectrs, ior)
                    341:        register target_info_t  *tgt;
                    342:        int secno, nsectrs;
                    343:        io_req_t                ior;
                    344: {
                    345:        scsi_cmd_verify_long_t  *cmd;
                    346:        int                     len;
                    347: 
                    348:        len = ior->io_count;
                    349: 
                    350:        cmd = (scsi_cmd_verify_long_t*) (tgt->cmd_ptr);
                    351:        cmd->scsi_cmd_code = SCSI_CMD_VERIFY_1;
                    352:        cmd->scsi_cmd_lun_and_relbit = len ? SCSI_CMD_VFY_BYTCHK : 0;
                    353:        cmd->scsi_cmd_lba1           = secno >> 24;
                    354:        cmd->scsi_cmd_lba2           = secno >> 16;
                    355:        cmd->scsi_cmd_lba3           = secno >>  8;
                    356:        cmd->scsi_cmd_lba4           = secno;
                    357:        cmd->scsi_cmd_xxx            = 0;
                    358:        cmd->scsi_cmd_xfer_len_1     = (nsectrs) >> 8;
                    359:        cmd->scsi_cmd_xfer_len_2     = nsectrs;
                    360:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    361:        
                    362:        tgt->cur_cmd = SCSI_CMD_VERIFY_1;
                    363: 
                    364:        scsi_go_and_wait(tgt, sizeof(*cmd) + len, 0, ior);
                    365:        return tgt->done;
                    366: }
                    367: 
                    368: 
                    369: int scsi_read_defect( tgt, mode, ior)
                    370:        register target_info_t  *tgt;
                    371:        register unsigned int   mode; 
                    372:        io_req_t                ior;
                    373: {
                    374:        scsi_cmd_long_read_t    *cmd;
                    375:        register unsigned       len;
                    376: 
                    377:        len = ior->io_count;
                    378:        if (len > 0xffff)
                    379:                len = 0xffff;
                    380: 
                    381:        cmd = (scsi_cmd_read_defect_t*) (tgt->cmd_ptr);
                    382:        cmd->scsi_cmd_code = SCSI_CMD_READ_DEFECT_DATA;
                    383:        cmd->scsi_cmd_lun_and_relbit = 0;
                    384:        cmd->scsi_cmd_lba1           = mode & 0x1f;
                    385:        cmd->scsi_cmd_lba2           = 0;
                    386:        cmd->scsi_cmd_lba3           = 0;
                    387:        cmd->scsi_cmd_lba4           = 0;
                    388:        cmd->scsi_cmd_xxx            = 0;
                    389:        cmd->scsi_cmd_xfer_len_1     = (len) >> 8;
                    390:        cmd->scsi_cmd_xfer_len_2     = (len);
                    391:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    392:        
                    393:        /* ++ HACK Alert */
                    394: /*     tgt->cur_cmd = SCSI_CMD_READ_DEFECT_DATA;*/
                    395:        tgt->cur_cmd = SCSI_CMD_LONG_READ;
                    396:        /* -- HACK Alert */
                    397: 
                    398:        scsi_go(tgt, sizeof(*cmd), len, FALSE);
                    399:        iowait(ior);
                    400:        return tgt->done;
                    401: }
                    402: 
                    403: 
                    404: #if    0 /* unused commands */
                    405: scsi_rezero_unit( tgt, ior)
                    406:        register target_info_t  *tgt;
                    407:        io_req_t                ior;
                    408: {
                    409:        scsi_cmd_rezero_t       *cmd;
                    410: 
                    411:        cmd = (scsi_cmd_rezero_t*) (tgt->cmd_ptr);
                    412:        cmd->scsi_cmd_code = SCSI_CMD_REZERO_UNIT;
                    413:        cmd->scsi_cmd_lun_and_lba1 = 0;
                    414:        cmd->scsi_cmd_lba2         = 0;
                    415:        cmd->scsi_cmd_lba3         = 0;
                    416:        cmd->scsi_cmd_xfer_len     = 0;
                    417:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    418: 
                    419: 
                    420:        tgt->cur_cmd = SCSI_CMD_REZERO_UNIT;
                    421: 
                    422:        scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior);
                    423: 
                    424: }
                    425: 
                    426: scsi_seek( tgt, where, ior)
                    427:        register target_info_t  *tgt;
                    428:        register unsigned int   where;
                    429:        io_req_t                ior;
                    430: {
                    431:        scsi_cmd_seek_t *cmd;
                    432: 
                    433:        cmd = (scsi_cmd_seek_t*) (tgt->cmd_ptr);
                    434:        cmd->scsi_cmd_code = SCSI_CMD_SEEK;
                    435:        cmd->scsi_cmd_lun_and_lba1 = (where >> 16) & 0x1f;
                    436:        cmd->scsi_cmd_lba2         = where >>  8;
                    437:        cmd->scsi_cmd_lba3         = where;
                    438:        cmd->scsi_cmd_xfer_len     = 0;
                    439:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    440: 
                    441: 
                    442:        tgt->cur_cmd = SCSI_CMD_SEEK;
                    443: 
                    444:        scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior);
                    445: 
                    446: }
                    447: 
                    448: scsi_reserve( tgt, len, id, mode, ior)
                    449:        register target_info_t  *tgt;
                    450:        register unsigned int   len;
                    451:        unsigned char           id;
                    452:        io_req_t                ior;
                    453: {
                    454:        scsi_cmd_reserve_t      *cmd;
                    455: 
                    456:        cmd = (scsi_cmd_reserve_t*) (tgt->cmd_ptr);
                    457:        cmd->scsi_cmd_code = SCSI_CMD_RESERVE;
                    458:        cmd->scsi_cmd_lun_and_lba1 = mode & 0x1f;
                    459:        cmd->scsi_cmd_reserve_id   = id;
                    460:        cmd->scsi_cmd_extent_llen1 = len >>  8;
                    461:        cmd->scsi_cmd_extent_llen2 = len;
                    462:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    463: 
                    464: 
                    465:        tgt->cur_cmd = SCSI_CMD_RESERVE;
                    466: 
                    467:        scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior);
                    468: 
                    469: }
                    470: 
                    471: scsi_release( tgt, id, mode, ior)
                    472:        register target_info_t  *tgt;
                    473:        unsigned char           id, mode;
                    474:        io_req_t                ior;
                    475: {
                    476:        scsi_cmd_release_t      *cmd;
                    477: 
                    478:        cmd = (scsi_cmd_release_t*) (tgt->cmd_ptr);
                    479:        cmd->scsi_cmd_code = SCSI_CMD_RELEASE;
                    480:        cmd->scsi_cmd_lun_and_lba1 = mode & 0x1f;
                    481:        cmd->scsi_cmd_reserve_id   = id;
                    482:        cmd->scsi_cmd_lba3         = 0;
                    483:        cmd->scsi_cmd_xfer_len     = 0;
                    484:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    485: 
                    486: 
                    487:        tgt->cur_cmd = SCSI_CMD_RELEASE;
                    488: 
                    489:        scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior);
                    490: 
                    491: }
                    492: 
                    493: 
                    494: /* Group 1 Commands */
                    495: 
                    496: scsi_long_seek( tgt, secno, ior)
                    497:        register target_info_t  *tgt;
                    498:        io_req_t                ior;
                    499: {
                    500:        scsi_cmd_long_seek_t    *cmd;
                    501: 
                    502:        cmd = (scsi_cmd_long_seek_t*) (tgt->cmd_ptr);
                    503:        cmd->scsi_cmd_code = SCSI_CMD_LONG_SEEK;
                    504:        cmd->scsi_cmd_lun_and_relbit = 0;
                    505:        cmd->scsi_cmd_lba1           = secno >> 24;
                    506:        cmd->scsi_cmd_lba2           = secno >> 16;
                    507:        cmd->scsi_cmd_lba3           = secno >>  8;
                    508:        cmd->scsi_cmd_lba4           = secno;
                    509:        cmd->scsi_cmd_xxx            = 0;
                    510:        cmd->scsi_cmd_xfer_len_1     = 0;
                    511:        cmd->scsi_cmd_xfer_len_2     = 0;
                    512:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    513:        
                    514:        tgt->cur_cmd = SCSI_CMD_LONG_SEEK;
                    515: 
                    516:        scsi_go(tgt, sizeof(*cmd), 0, FALSE);
                    517: }
                    518: 
                    519: scsi_write_verify( tgt, secno, ior)
                    520:        register target_info_t  *tgt;
                    521:        io_req_t                ior;
                    522: {
                    523:        scsi_cmd_write_vfy_t    *cmd;
                    524:        unsigned                len;    /* in bytes */
                    525:        unsigned int            max_dma_data, n_blks;
                    526: 
                    527:        max_dma_data = scsi_softc[(unsigned char)tgt->masterno]->max_dma_data;
                    528: 
                    529:        len = ior->io_count;
                    530:        if (len > max_dma_data)
                    531:                len = max_dma_data;
                    532:        if (len < tgt->block_size)
                    533:                len = tgt->block_size;
                    534:        n_blks = len / tgt->block_size;
                    535: 
                    536:        cmd = (scsi_cmd_write_vfy_t*) (tgt->cmd_ptr);
                    537:        cmd->scsi_cmd_code = SCSI_CMD_WRITE_AND_VERIFY;
                    538:        cmd->scsi_cmd_lun_and_relbit = SCSI_CMD_VFY_BYTCHK;
                    539:        cmd->scsi_cmd_lba1           = secno >> 24;
                    540:        cmd->scsi_cmd_lba2           = secno >> 16;
                    541:        cmd->scsi_cmd_lba3           = secno >>  8;
                    542:        cmd->scsi_cmd_lba4           = secno;
                    543:        cmd->scsi_cmd_xxx            = 0;
                    544:        cmd->scsi_cmd_xfer_len_1     = n_blks >> 8;
                    545:        cmd->scsi_cmd_xfer_len_2     = n_blks;
                    546:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    547:        
                    548:        tgt->cur_cmd = SCSI_CMD_WRITE_AND_VERIFY;
                    549: 
                    550:        scsi_go(tgt, sizeof(*cmd), 0, FALSE);
                    551: }
                    552: 
                    553: scsi_search_data( tgt, secno, how, flags, ior)
                    554:        register target_info_t  *tgt;
                    555:        io_req_t                ior;
                    556: {
                    557:        scsi_cmd_search_t       *cmd;
                    558:        unsigned                len;    /* in bytes */
                    559:        unsigned int            max_dma_data, n_blks;
                    560: 
                    561:        max_dma_data = scsi_softc[(unsigned char)tgt->masterno]->max_dma_data;
                    562: 
                    563:        if (how != SCSI_CMD_SEARCH_HIGH &&
                    564:            how != SCSI_CMD_SEARCH_EQUAL &&
                    565:            how != SCSI_CMD_SEARCH_LOW)
                    566:                panic("scsi_search_data");
                    567: 
                    568:        len = ior->io_count;
                    569:        if (len > max_dma_data)
                    570:                len = max_dma_data;
                    571:        n_blks = len / tgt->block_size;
                    572: 
                    573:        cmd = (scsi_cmd_search_t*) (tgt->cmd_ptr);
                    574:        cmd->scsi_cmd_code = how;
                    575:        cmd->scsi_cmd_lun_and_relbit = flags & 0x1e;
                    576:        cmd->scsi_cmd_lba1           = secno >> 24;
                    577:        cmd->scsi_cmd_lba2           = secno >> 16;
                    578:        cmd->scsi_cmd_lba3           = secno >>  8;
                    579:        cmd->scsi_cmd_lba4           = secno;
                    580:        cmd->scsi_cmd_xxx            = 0;
                    581:        cmd->scsi_cmd_xfer_len_1     = n_blks >> 8;
                    582:        cmd->scsi_cmd_xfer_len_2     = n_blks;
                    583:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    584:        
                    585:        tgt->cur_cmd = how;
                    586: 
                    587:        scsi_go(tgt, sizeof(*cmd), 0, FALSE);
                    588: }
                    589: 
                    590: 
                    591: scsi_set_limits( tgt, secno, nblocks, inhibit, ior)
                    592:        register target_info_t  *tgt;
                    593:        io_req_t                ior;
                    594: {
                    595:        scsi_cmd_set_limits_t   *cmd;
                    596: 
                    597:        cmd = (scsi_cmd_set_limits_t*) (tgt->cmd_ptr);
                    598:        cmd->scsi_cmd_code = SCSI_CMD_SET_LIMITS;
                    599:        cmd->scsi_cmd_lun_and_relbit = inhibit & 0x3;
                    600:        cmd->scsi_cmd_lba1           = secno >> 24;
                    601:        cmd->scsi_cmd_lba2           = secno >> 16;
                    602:        cmd->scsi_cmd_lba3           = secno >>  8;
                    603:        cmd->scsi_cmd_lba4           = secno;
                    604:        cmd->scsi_cmd_xxx            = 0;
                    605:        cmd->scsi_cmd_xfer_len_1     = nblocks >> 8;
                    606:        cmd->scsi_cmd_xfer_len_2     = nblocks;
                    607:        cmd->scsi_cmd_ctrl_byte = 0;    /* not linked */
                    608:        
                    609:        tgt->cur_cmd = SCSI_CMD_SET_LIMITS;
                    610: 
                    611:        scsi_go(tgt, sizeof(*cmd), 0, FALSE);
                    612: }
                    613: 
                    614: 
                    615: #endif
                    616: 
                    617: #ifdef SCSI2
                    618: scsi_lock_cache
                    619: scsi_prefetch
                    620: scsi_read_defect_data
                    621: scsi_sync_cache
                    622: scsi_write_same
                    623: #endif SCSI2
                    624: #endif  /* NSCSI > 0 */

unix.superglobalmegacorp.com

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