This is cachecon.c in view mode; [Download] [Up]
/* cachecon.c 04 feb 90 Paul V. O'Neill -- Coastal Imaging Lab, Oregon State University For Wren V 94181-702 Prints current or saved cache control parameters. Optionally sets or clears cache control bit AND SAVES IT. from: * Generic SCSI driver example. * * History * ------- * 10-Apr-89 Doug Mitchell * Write after read to avoid trashing system disk. * 20-Mar-89 Doug Mitchell at NeXT * Created. * * Procedure: * open sg0; * set (target,lun) to (1,0); * execute Request Sense command; * Read 4 blocks; * Write 4 blocks; */ #include <fcntl.h> #include <stdio.h> #include <sys/types.h> #include <nextdev/scsireg.h> #define SENSE_SIZE 0x40 /* sense buffer size */ char sbuf[SENSE_SIZE]; /* sense buffer */ int fd; /* file descriptor */ int target=0; /* BE CAREFUL -- THIS IS YOUR SYSTEM THAT YOUR'RE MUCKING WITH */ int lun=0; char *dev_name="/dev/sg0"; main(argc,argv) int argc; char *argv[]; { struct scsi_adr sa; int rtn; int i; int pcf; /* parameter control flag */ pcf = 0; /* default will be current params */ /* open /dev/sg0 */ if ((fd = open (dev_name, O_RDWR)) < 0) { fprintf(stderr,"\nCould not open %s - fd = %XH\n",dev_name,fd); fprintf(stderr,"errno = %d\n",errno); perror("open"); exit(1); } /* set (target,lun) */ sa.sa_target = target; sa.sa_lun = lun; if (ioctl(fd,SGIOCSTL,&sa) < 0) { fprintf(stderr,"Error setting target %d lun %d\n",target,lun); fprintf(stderr,"errno = %d\n",errno); perror("ioctl(SGIOCSTL)"); exit(1); } if(gs_request_sense()) /* clear unit attention */ exit(1); for(i=0;i<SENSE_SIZE;i++) /* clear parameter list */ sbuf[i] = 0; if( argc != 2 ) usage(); switch(*argv[1]) { /* may or may not do a mode_select */ case 'c': pcf = 0; break; case 's': pcf = 1; break; case '0': if(gs_mode_select(0)) exit(1); fprintf(stderr,"mode select successful.\n"); break; case '1': if(gs_mode_select(1)) exit(1); fprintf(stderr,"mode select successful.\n"); break; default: usage(); break; } for(i=0;i<SENSE_SIZE;i++) /* clear parameter list */ sbuf[i] = 0; if(gs_mode_sense(pcf)) /* alwasy do a mode_sense */ exit(1); fprintf(stderr,"Sense_Mode ok, cache control params to stdout.\n"); fprintf(stderr,"Number 14 is the one your are interested in.\n"); fprintf(stderr,"01 -> cache off 11 -> cache on\n"); for (i=0; i<30; i++) printf("%2d = %02.2x\n", i, (u_char)sbuf[i]); /* close /dev/sg0 */ if ((rtn = close(fd)) < 0) { fprintf(stderr,"\nCould not close %s - fd = %XH\n",dev_name,fd); fprintf(stderr,"\nerrno = %d\n",errno); perror("close"); exit(1); } else exit(0); } /* main() */ usage() { fprintf(stderr, "usage: cachecon [ c|s|0|1 ]\n"); exit(-1); } /* * standard I/O routines */ gs_request_sense() { struct scsi_req sr; struct cdb_6 *cdbp = &sr.sr_cdb.cdb_c6; cdb_clr(cdbp); cdbp->c6_opcode = C6OP_REQSENSE; cdbp->c6_lun = lun; cdbp->c6_len = SENSE_SIZE; sr.sr_dma_dir = SR_DMA_RD; sr.sr_addr = sbuf; sr.sr_dma_max = SENSE_SIZE; sr.sr_ioto = 10; return(do_ioc(&sr)); } /* gs_request_sense() */ gs_mode_sense(pcf) int pcf; /* page control field flag */ { struct scsi_req sr; struct cdb_6 *cdbp = &sr.sr_cdb.cdb_c6; cdb_clr(cdbp); cdbp->c6_opcode = C6OP_MODESENSE; cdbp->c6_lun = lun; cdbp->c6_lba = 0x3800; /* current Cache Control Params */ if( pcf ) cdbp->c6_lba = 0xf800; /* saved Cache Control Params */ cdbp->c6_len = SENSE_SIZE; sr.sr_dma_dir = SR_DMA_RD; sr.sr_addr = sbuf; sr.sr_dma_max = SENSE_SIZE; sr.sr_ioto = 10; return(do_ioc(&sr)); } /* gs_mode_sense() */ gs_mode_select(cc) int cc; /* cache control flag */ { struct scsi_req sr; struct cdb_6 *cdbp = &sr.sr_cdb.cdb_c6; cdb_clr(cdbp); /* clr the Control Data Block */ cdbp->c6_opcode = C6OP_MODESELECT; cdbp->c6_lun = lun; cdbp->c6_lba = 0x10000; /* sets Save Mode Parameters bit */ cdbp->c6_len = 20; /* 4 byte header, 2byte page header, 14 byte page params */ sr.sr_dma_dir = SR_DMA_WR; sr.sr_dma_max = SENSE_SIZE; sr.sr_addr = sbuf; sr.sr_ioto = 10; sbuf[4] = 0x38; /* Cache Control Parameters */ sbuf[5] = 14; /* page length */ sbuf[6] = 0x01; if ( cc ) sbuf[6] = 0x11; /* this is the BIGGY */ sbuf[7] = 0xff; return(do_ioc(&sr)); } /* gs_mode_select() */ cdb_clr(cdbp) union cdb *cdbp; { int i; char *p; p = (char *)cdbp; for(i=0; i<sizeof(union cdb); i++) *p++ = 0; } do_ioc(sr) struct scsi_req *sr; { if (ioctl(fd,SGIOCREQ,sr) < 0) { fprintf(stderr,"..Error executing ioctl\n"); fprintf(stderr,"errno = %d\n",errno); perror("ioctl(SGIOCREQ)"); return(1); } if(sr->sr_io_status) { fprintf(stderr,"sr_io_status = 0x%X\n",sr->sr_io_status); if(sr->sr_io_status == SR_IOST_CHKSV) { fprintf(stderr," sense key = %02XH sense code = %02XH\n", sr->sr_esense.er_sensekey, sr->sr_esense.er_addsensecode); } fprintf(stderr,"SCSI status = %02XH\n",sr->sr_scsi_status); return(1); } return(0); } /* do_ioc() */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.