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

1.1       root        1: /* 
                      2:  * Mach Operating System
                      3:  * Copyright (c) 1993,1991,1990,1989 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: /* This goes away as soon as we move it in the Ux server */
                     27: 
                     28: 
                     29: 
                     30: #include <mach/std_types.h>
                     31: #include <scsi/compat_30.h>
                     32: #include <scsi/scsi.h>
                     33: #include <scsi/scsi_defs.h>
                     34: #include <scsi/rz.h>
                     35: #include <scsi/rz_labels.h>
                     36: #include <sys/types.h>
                     37: #include <sys/ioctl.h>
                     38: 
                     39: #if (NSCSI > 0)
                     40: #define LABEL_DEBUG(x,y) if (label_flag&x) y
                     41: 
                     42: #include <i386at/disk.h>
                     43: #include <device/device_types.h>
                     44: #include <device/disk_status.h>
                     45: 
                     46: 
                     47: int scsi_abs_sec = -1;
                     48: int scsi_abs_count = -1;
                     49: 
                     50: scsi_rw_abs(dev, data, rw, sec, count)
                     51:        dev_t           dev;
                     52: {
                     53:        io_req_t        ior;
                     54:        io_return_t     error;
                     55: 
                     56:        io_req_alloc(ior,0);
                     57:        ior->io_next = 0;
                     58:        ior->io_unit = dev & (~(MAXPARTITIONS-1));      /* sort of */
                     59:        ior->io_unit |= PARTITION_ABSOLUTE;
                     60:        ior->io_data = (io_buf_ptr_t)data;
                     61:        ior->io_count = count;
                     62:        ior->io_recnum = sec;
                     63:        ior->io_error = 0;
                     64:        if (rw == IO_READ)
                     65:                ior->io_op = IO_READ;
                     66:        else
                     67:                ior->io_op = IO_WRITE;
                     68:        scdisk_strategy(ior);
                     69:        iowait(ior);
                     70:        error = ior->io_error;
                     71:        io_req_free(ior);
                     72:        return(error);
                     73: }
                     74: 
                     75: io_return_t
                     76: scsi_i386_get_status(dev, tgt, flavor, status, status_count)
                     77: int            dev;
                     78: target_info_t  *tgt;
                     79: int            flavor;
                     80: dev_status_t   status;
                     81: unsigned int   *status_count;
                     82: {
                     83: 
                     84:        switch (flavor) {
                     85:        case V_GETPARMS: {
                     86:                struct disklabel *lp = &tgt->dev_info.disk.l;
                     87:                struct disk_parms *dp = (struct disk_parms *)status;
                     88:                extern struct disklabel default_label;
                     89:                int part = rzpartition(dev);
                     90: 
                     91:                if (*status_count < sizeof (struct disk_parms)/sizeof(int))
                     92:                        return (D_INVALID_OPERATION);
                     93:                dp->dp_type = DPT_WINI; 
                     94:                dp->dp_secsiz = lp->d_secsize;
                     95:                if (lp->d_nsectors == default_label.d_nsectors &&
                     96:                    lp->d_ntracks == default_label.d_ntracks &&
                     97:                    lp->d_ncylinders == default_label.d_ncylinders) {
                     98:                        /* I guess there is nothing there */
                     99:                        /* Well, then, Adaptec's like ... */
                    100:                        dp->dp_sectors = 32;
                    101:                        dp->dp_heads = 64;
                    102:                        dp->dp_cyls = lp->d_secperunit / 64 / 32 ;
                    103:                } else {
                    104:                        dp->dp_sectors = lp->d_nsectors;
                    105:                        dp->dp_heads = lp->d_ntracks;
                    106:                        dp->dp_cyls = lp->d_ncylinders;
                    107:                }
                    108: 
                    109:                dp->dp_dossectors = 32;
                    110:                dp->dp_dosheads = 64;
                    111:                dp->dp_doscyls = lp->d_secperunit / 64 / 32;
                    112:                dp->dp_ptag = 0;
                    113:                dp->dp_pflag = 0;
                    114: /* !!! partition changes */
                    115: printf("USING PARTIOION TABLE\n");
                    116:                dp->dp_pstartsec = lp->d_partitions[part].p_offset;
                    117:                dp->dp_pnumsec = lp->d_partitions[part].p_size;
                    118:                *status_count = sizeof(struct disk_parms)/sizeof(int);
                    119:                break;
                    120:        }
                    121:        case V_RDABS:
                    122:                if (*status_count < DEV_BSIZE/sizeof (int)) {
                    123:                        printf("RDABS bad size %x", *status_count);
                    124:                        return (D_INVALID_OPERATION);
                    125:                }
                    126:                if (scsi_rw_abs(dev, status, IO_READ, scsi_abs_sec, DEV_BSIZE) != D_SUCCESS)
                    127:                        return(D_INVALID_OPERATION);
                    128:                *status_count = DEV_BSIZE/sizeof(int);
                    129:                break;
                    130:        case V_VERIFY: {
                    131:                int count = scsi_abs_count * DEV_BSIZE;
                    132:                int sec = scsi_abs_sec;
                    133:                char *scsi_verify_buf;
                    134: #include "vm/vm_kern.h"
                    135: 
                    136:                (void) kmem_alloc(kernel_map, &scsi_verify_buf, PAGE_SIZE);
                    137: 
                    138:                *status = 0;
                    139:                while (count > 0) {
                    140:                        int xcount = (count < PAGE_SIZE) ? count : PAGE_SIZE;
                    141:                        if (scsi_rw_abs(dev, scsi_verify_buf, IO_READ, sec, xcount) != D_SUCCESS) {
                    142:                                *status = BAD_BLK;
                    143:                                break;
                    144:                        } else {
                    145:                                count -= xcount;
                    146:                                sec += xcount / DEV_BSIZE;
                    147:                        }
                    148:                }
                    149:                (void) kmem_free(kernel_map, scsi_verify_buf, PAGE_SIZE);
                    150:                *status_count = 1;
                    151:                break;
                    152:        }
                    153:        default:
                    154:                return(D_INVALID_OPERATION);
                    155:        }
                    156:        return D_SUCCESS;
                    157: }
                    158: 
                    159: io_return_t
                    160: scsi_i386_set_status(dev, tgt, flavor, status, status_count)
                    161: int            dev;
                    162: target_info_t  *tgt;
                    163: int            flavor;
                    164: int            *status;
                    165: unsigned int   status_count;
                    166: {
                    167:        io_req_t        ior;
                    168: 
                    169:        switch (flavor) {
                    170:        case V_SETPARMS:
                    171:                printf("scsdisk_set_status: invalid flavor V_SETPARMS\n");
                    172:                return(D_INVALID_OPERATION);
                    173:                break;
                    174:        case V_REMOUNT:
                    175:                tgt->flags &= ~TGT_ONLINE;
                    176:                break;
                    177:        case V_ABS:
                    178:                scsi_abs_sec = status[0];
                    179:                if (status_count == 2)
                    180:                        scsi_abs_count = status[1];
                    181:                break;
                    182:        case V_WRABS:
                    183:                if (status_count < DEV_BSIZE/sizeof (int)) {
                    184:                        printf("RDABS bad size %x", status_count);
                    185:                        return (D_INVALID_OPERATION);
                    186:                }
                    187:                if (scsi_rw_abs(dev, status, IO_WRITE, scsi_abs_sec, DEV_BSIZE) != D_SUCCESS)
                    188:                        return(D_INVALID_OPERATION);
                    189:                break;
                    190:        default:
                    191:                return(D_INVALID_OPERATION);
                    192:        }
                    193:        return D_SUCCESS;
                    194: }
                    195: #endif  /* NSCSI > 0 */
                    196: 

unix.superglobalmegacorp.com

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