📄 rzdisk.c
字号:
/* * Inform the user what's going on. */ printf("\nCHANGING DISK DRIVE PARAMETERS TO DEFAULT VALUES!!!\n"); printstr("\nARE YOU SURE (y/n)? "); if(!confirm()) return; /* * Get the DEFAULT disk drive parameters. */ bzero((char *)&ms, sizeof(ms)); ms.ms_pgcode = 0x3f; ms.ms_length = sizeof(ms) - 4; ms.ms_pgctrl = DEFAULT_VALUES; if(execute_rzcmd(SCSI_MODE_SENSE, (char *)&ms) != SUCCESS) { if(geterror() != NO_ERROR) return; } bzero((char *)&msc, sizeof(msc)); msc.ms_pgcode = 0x3f; msc.ms_length = sizeof(ms) - 4; msc.ms_pgctrl = CHANGED_VALUES; if(execute_rzcmd(SCSI_MODE_SENSE, (char *)&msc) != SUCCESS) { if(geterror() != NO_ERROR) return; } /* * Cannot SAVE the parameters for the RRD40 disk. */ if(rrd40_disk) setps = 0; /* * Can SAVE the parameters for the RZ22,RZ23,RZ55 disks. */ else { printstr("\nSAVE THE DEFAULT VALUES ON DISK (y/n)? "); if(confirm()) setps = 1; else setps = 0; } ms.ms_hdr.sense_len = 0; ms.ms_hdr.wp = 0; ms.ms_page1.ps = 0; ms.ms_page2.ps = 0; ms.ms_page3.ps = 0; ms.ms_page4.ps = 0; ms.ms_page8.ps = 0; ms.ms_page37.ps = 0; ms.ms_setps = setps; ms.ms_length = sizeof(ms) - 4; fix_mode_select_params(); /* Adjust the length if no page 8 */ if(ms.ms_page8.pgcode != 8) { ms.ms_length -= sizeof(ms.ms_page8); byteptr = (u_char *)&ms.ms_page8; ms_page37 = *((struct page_code_37 *)byteptr); } else ms_page37 = ms.ms_page37; /* Adjust the length if no DEC unique page 37 */ if(ms_page37.pgcode != 37) ms.ms_length -= sizeof(ms_page37); /* Adjust the length for the RZ22/RZ23 disks */ if(rz22_rz23_disk) { ms.ms_length = ms.ms_length - sizeof(ms.ms_page2) - sizeof(ms.ms_page3) - sizeof(ms.ms_page4); if(ms_page37.pgcode == 37) { byteptr = (u_char *)&ms.ms_page2; bcopy((char *)&ms_page37, byteptr, sizeof(ms_page37)); } } /* Adjust the length for the RRD40 disk */ if(rrd40_disk) { ms.ms_length = ms.ms_length - sizeof(ms.ms_page2) - sizeof(ms.ms_page3) - sizeof(ms.ms_page4); } /* * Change the disk drive parameters to their DEFAULT values. */ printf("\nChanging disk drive parameters for device (%s).\n", rzdisk); if(execute_rzcmd(SCSI_MODE_SELECT, (char *)&ms) != SUCCESS) { if(geterror() != NO_ERROR) return; } return;interactive: /* * Inform the user what's going on. */ printf("\nCHANGING DISK DRIVE PARAMETERS INTERACTIVELY!!!\n"); printstr("\nARE YOU SURE (y/n)? "); if(!confirm()) return; /* * Get the CURRENT disk drive parameters. */ bzero((char *)&ms, sizeof(ms)); ms.ms_pgcode = 0x3f; ms.ms_length = sizeof(ms) - 4; ms.ms_pgctrl = CURRENT_VALUES; if(execute_rzcmd(SCSI_MODE_SENSE, (char *)&ms) != SUCCESS) { if(geterror() != NO_ERROR) return; } bzero((char *)&msc, sizeof(msc)); msc.ms_pgcode = 0x3f; msc.ms_length = sizeof(ms) - 4; msc.ms_pgctrl = CHANGED_VALUES; if(execute_rzcmd(SCSI_MODE_SENSE, (char *)&msc) != SUCCESS) { if(geterror() != NO_ERROR) return; } /* * This section asks the user which parameters they want to * change. The utility displays one page at a time and asks * asks the user if they want to change any parameters in * that given page. This goes on until all pages have been * displayed to the user. */ printf("\nBlock descriptor:\n"); printf(" Density code\t\t\t\t%d\n", ms.ms_desc.density_code); printf(" Number of blocks\t\t\t%d\n", ((ms.ms_desc.nblks2<<16) + (ms.ms_desc.nblks1<<8) + ms.ms_desc.nblks0)); printf(" Block length\t\t\t\t%d\n", ((ms.ms_desc.blklen2<<16) + (ms.ms_desc.blklen1<<8) + ms.ms_desc.blklen0)); printstr("\nDo you want to change the block length (y/n)? "); if(confirm()) { printstr("Enter the new block length? "); value = getinteger(); ms.ms_desc.blklen2 = ((value >> 16) & 0xff); ms.ms_desc.blklen1 = ((value >> 8) & 0xff); ms.ms_desc.blklen0 = ((value >> 0) & 0xff); }page1_ask: printf("\nPage 1 error recovery parameters:\n"); printf(" PS\t\t\t\t\t%d\n", ms.ms_page1.ps); printf(" Page code\t\t\t\t%d\n", ms.ms_page1.pgcode); printf(" Page length\t\t\t\t%d\n", ms.ms_page1.pglength); printf(" Flags\t\t\t\t\t0x%02x\n", ms.ms_page1.flags); printf(" Retry count\t\t\t\t%d\n", ms.ms_page1.retry_count); printf(" Correction span\t\t\t%d\n", ms.ms_page1.correct_span); printf(" Head offset count\t\t\t%d\n", ms.ms_page1.head_offset); printf(" Data strobe offset count\t\t%d\n", ms.ms_page1.data_strobe); printf(" Recovery time limit\t\t\t%d\n", ms.ms_page1.recovery_time); printstr("\nDo you want to change any fields in this page (y/n)? "); if(confirm()) { if(msc.ms_page1.flags) { printstr("Enter the new flags in (HEX)? "); value = gethexnum(); ms.ms_page1.flags = value; } if(msc.ms_page1.retry_count) { printstr("Enter the new retry count? "); value = getinteger(); ms.ms_page1.retry_count = value; } if(msc.ms_page1.correct_span) { printstr("Enter the new correction span? "); value = getinteger(); ms.ms_page1.correct_span = value; } if(msc.ms_page1.head_offset) { printstr("Enter the new head offset count? "); value = getinteger(); ms.ms_page1.head_offset = value; } if(msc.ms_page1.data_strobe) { printstr("Enter the new data strobe offset count? "); value = getinteger(); ms.ms_page1.data_strobe = value; } if(msc.ms_page1.recovery_time) { printstr("Enter the new recovery time limit? "); value = getinteger(); ms.ms_page1.recovery_time = value; } }page2_ask: if(rrd40_disk) goto done_asking; if(rz22_rz23_disk) { byteptr = (u_char *)&ms.ms_page8; ms_page37 = *((struct page_code_37 *)byteptr); goto page37_ask; } printf("\nPage 2 disconnect/reconnect parameters:\n"); printf(" PS\t\t\t\t\t%d\n", ms.ms_page2.ps); printf(" Page code\t\t\t\t%d\n", ms.ms_page2.pgcode); printf(" Page length\t\t\t\t%d\n", ms.ms_page2.pglength); printf(" Buffer full ratio\t\t\t%d\n", ms.ms_page2.bus_fratio); printf(" Buffer empty ratio\t\t\t%d\n", ms.ms_page2.bus_eratio); printf(" Bus inactivity limit\t\t\t%d\n", ((ms.ms_page2.bus_inactive1<<8) + ms.ms_page2.bus_inactive0)); printf(" Disconnect time limit\t\t\t%d\n", ((ms.ms_page2.disconn_time1<<8) + ms.ms_page2.disconn_time0)); printf(" Connect time limit\t\t\t%d\n", ((ms.ms_page2.conn_time1<<8) + ms.ms_page2.conn_time0)); printstr("\nDo you want to change any fields in this page (y/n)? "); if(confirm()) { if(msc.ms_page2.bus_fratio) { printstr("Enter the new bus full ratio? "); value = getinteger(); ms.ms_page2.bus_fratio = value; } if(msc.ms_page2.bus_eratio) { printstr("Enter the new bus empty ratio? "); value = getinteger(); ms.ms_page2.bus_eratio = value; } if(msc.ms_page2.bus_inactive1 || msc.ms_page2.bus_inactive0) { printstr("Enter the new bus inactivity limit? "); value = getinteger(); ms.ms_page2.bus_inactive1 = ((value >> 8) & 0xff); ms.ms_page2.bus_inactive0 = ((value >> 0) & 0xff); } if(msc.ms_page2.disconn_time1 || msc.ms_page2.disconn_time0) { printstr("Enter the new disconnect time limit? "); value = getinteger(); ms.ms_page2.disconn_time1 = ((value >> 8) & 0xff); ms.ms_page2.disconn_time0 = ((value >> 0) & 0xff); } if(msc.ms_page2.conn_time1 || msc.ms_page2.conn_time0) { printstr("Enter the new connect time limit? "); value = getinteger(); ms.ms_page2.conn_time1 = ((value >> 8) & 0xff); ms.ms_page2.conn_time0 = ((value >> 0) & 0xff); } }page3_ask: printf("\nPage 3 direct-access device format parameters:\n"); printf(" PS\t\t\t\t\t%d\n", ms.ms_page3.ps); printf(" Page code\t\t\t\t%d\n", ms.ms_page3.pgcode); printf(" Page length\t\t\t\t%d\n", ms.ms_page3.pglength); printf(" Tracks per zone\t\t\t%d\n", ((ms.ms_page3.tpz1<<8) + ms.ms_page3.tpz0)); printf(" Alternate sectors per zone\t\t%d\n", ((ms.ms_page3.aspz1<<8) + ms.ms_page3.aspz0)); printf(" Alternate tracks per zone\t\t%d\n", ((ms.ms_page3.atpz1<<8) + ms.ms_page3.atpz0)); printf(" Alternate tracks per volume\t\t%d\n", ((ms.ms_page3.atpv1<<8) + ms.ms_page3.atpv0)); printf(" Sectors per track\t\t\t%d\n", ((ms.ms_page3.spt1<<8) + ms.ms_page3.spt0)); printf(" Data bytes per phy sector\t\t%d\n", ((ms.ms_page3.bps1<<8) + ms.ms_page3.bps0)); printf(" Interleave\t\t\t\t%d\n", ((ms.ms_page3.interleave1<<8) + ms.ms_page3.interleave0)); printf(" Track skew\t\t\t\t%d\n", ((ms.ms_page3.track_skew1<<8) + ms.ms_page3.track_skew0)); printf(" Cylinder skew\t\t\t\t%d\n", ((ms.ms_page3.cylinder_skew1<<8) + ms.ms_page3.cylinder_skew0)); printf(" Flags\t\t\t\t\t0x%02x\n", ms.ms_page1.flags); printstr("\nDo you want to change any fields in this page (y/n)? "); if(confirm()) { if(msc.ms_page3.tpz1 || msc.ms_page3.tpz0) { printstr("Enter the new tracks per zone? "); value = getinteger(); ms.ms_page3.tpz1 = ((value >> 8) & 0xff); ms.ms_page3.tpz0 = ((value >> 0) & 0xff); } if(msc.ms_page3.aspz1 || msc.ms_page3.aspz0) { printstr("Enter the new alternate sectors per zone? "); value = getinteger(); ms.ms_page3.aspz1 = ((value >> 8) & 0xff); ms.ms_page3.aspz0 = ((value >> 0) & 0xff); } if(msc.ms_page3.atpz1 || msc.ms_page3.atpz0) { printstr("Enter the new alternate tracks per zone? "); value = getinteger(); ms.ms_page3.atpz1 = ((value >> 8) & 0xff); ms.ms_page3.atpz0 = ((value >> 0) & 0xff); } if(msc.ms_page3.atpv1 || msc.ms_page3.atpv0) { printstr("Enter the new alternate tracks per volume? "); value = getinteger(); ms.ms_page3.atpv1 = ((value >> 8) & 0xff); ms.ms_page3.atpv0 = ((value >> 0) & 0xff); } if(msc.ms_page3.spt1 || msc.ms_page3.spt0) { printstr("Enter the new sectors per track? "); value = getinteger(); ms.ms_page3.spt1 = ((value >> 8) & 0xff); ms.ms_page3.spt0 = ((value >> 0) & 0xff); } if(msc.ms_page3.bps1 || msc.ms_page3.bps0) { printstr("Enter the new bytes per sector? "); value = getinteger(); ms.ms_page3.bps1 = ((value >> 8) & 0xff); ms.ms_page3.bps0 = ((value >> 0) & 0xff); } if(msc.ms_page3.interleave1 || msc.ms_page3.interleave0) { printstr("Enter the new interleave factor? "); value = getinteger(); ms.ms_page3.interleave1 = ((value >> 8) & 0xff); ms.ms_page3.interleave0 = ((value >> 0) & 0xff); } if(msc.ms_page3.track_skew1 || msc.ms_page3.track_skew0) { printstr("Enter the new track skew? "); value = getinteger(); ms.ms_page3.track_skew1 = ((value >> 8) & 0xff); ms.ms_page3.track_skew0 = ((value >> 0) & 0xff); } if(msc.ms_page3.cylinder_skew1 || msc.ms_page3.cylinder_skew0) { printstr("Enter the new cylinder skew? "); value = getinteger(); ms.ms_page3.cylinder_skew1 = ((value >> 8) & 0xff); ms.ms_page3.cylinder_skew0 = ((value >> 0) & 0xff); } if(msc.ms_page3.flags) { printstr("Enter the new flags in (HEX)? "); value = gethexnum(); ms.ms_page3.flags = value; } }page4_ask: printf("\nPage 4 rigid disk drive geometry parameters:\n"); printf(" PS\t\t\t\t\t%d\n", ms.ms_page4.ps); printf(" Page code\t\t\t\t%d\n", ms.ms_page4.pgcode); printf(" Page length\t\t\t\t%d\n", ms.ms_page4.pglength); printf(" Maximum number of cylinders\t\t%d\n", ((ms.ms_page4.ncyl2<<16) + (ms.ms_page4.ncyl1<<8) + ms.ms_page4.ncyl0)); printf(" Maximum number of heads\t\t%d\n", ms.ms_page4.nheads); printf(" Write precompensation start\t\t%d\n", ((ms.ms_page4.wprecomp2<<16) + (ms.ms_page4.wprecomp1<<8) + ms.ms_page4.wprecomp0)); printf(" Reduced write current start\t\t%d\n", ((ms.ms_page4.rwc2<<16) + (ms.ms_page4.rwc1<<8) + ms.ms_page4.rwc0)); printf(" Drive step rate\t\t\t%d\n", ((ms.ms_page4.dsr1<<8) + ms.ms_page4.dsr0)); printf(" Landing zone cylinder\t\t\t%d\n", ((ms.ms_page4.lzc2<<16) + (ms.ms_page4.lzc1<<8) + ms.ms_page4.lzc0)); printstr("\nDo you want to change any fields in this page (y/n)? "); if(confirm()) { if(msc.ms_page4.ncyl2 || msc.ms_page4.ncyl1 || msc.ms_page4.ncyl0) { printstr("Enter the number of cylinders? "); value = getinteger(); ms.ms_page4.ncyl2 = ((value >> 16) & 0xff); ms.ms_page4.ncyl1 = ((value >> 8) & 0xff); ms.ms_page4.ncyl0 = ((value >> 0) & 0xff); } if(msc.ms_page4.nheads) { printstr("Enter the number of heads? "); value = getinteger(); ms.ms_page4.nheads = value; } if(msc.ms_page4.wprecomp2 || msc.ms_page4.wprecomp1 || msc.ms_page4.wprecomp0) { printstr("Enter the write precompensation start? "); value = getinteger(); ms.ms_page4.wprecomp2 = ((value >> 16) & 0xff); ms.ms_page4.wprecomp1 = ((value >> 8) & 0xff); ms.ms_page4.wprecomp0 = ((value >> 0) & 0xff); } if(msc.ms_page4.rwc2 || msc.ms_page4.rwc1 || msc.ms_page4.rwc0) { printstr("Enter the reduced write current start? "); value = getinteger(); ms.ms_page4.rwc2 = ((value >> 16) & 0xff); ms.ms_page4.rwc1 = ((value >> 8) & 0xff); ms.ms_page4.rwc0 = ((value >> 0) & 0xff); } if(msc.ms_page4.dsr1 || msc.ms_page4.dsr0) { printstr("Enter the drive step rate? "); value = getinteger(); ms.ms_page4.dsr1 = ((value >> 8) & 0xff); ms.ms_page4.dsr0 = ((value >> 0) & 0xff); } if(msc.ms_page4.lzc1 || msc.ms_page4.lzc0) { printstr("Enter the landing zone cylinder? "); value = getinteger(); ms.ms_page4.lzc1 = ((value >> 8) & 0xff); ms.ms_page4.lzc0 = ((value >> 0) & 0xff); } }page8_ask: if(ms.ms_page8.pgcode != 8) { byteptr = (u_char *)&ms.ms_page8; ms_page37 = *((struct page_code_37 *)byteptr); goto page37_ask; } else ms_page37 = ms.ms_page37; printf("\nPage 8 caching parameters:\n"); printf(" PS\t\t\t\t\t%d\n", ms.ms_page8.ps); printf(" Page code\t\t\t\t%d\n", ms.ms_page8.pgcode); printf(" Page length\t\t\t\t%d\n", ms.ms_page8.pglength); printf(" Read cache disable bit\t\t0x%x\n", ms.ms_page8.rc); printf(" Multiple selection bit\t\t0x%x\n", ms.ms_page8.ms); printf(" Write cache enable bit\t\t0x%x\n", ms.ms_page8.wce); printf(" Write retention priority\t\t%d\n", ms.ms_page8.wrp); printf(" Demand read retention priority\t%d\n", ms.ms_page8.drrp); printf(" Disable prefetch transfer length\t%d\n", ((ms.ms_page8.dpftl1<<8) + ms.ms_page8.dpftl0)); printf(" Minimum prefetch\t\t\t%d\n", ((ms.ms_page8.minpf1<<8) + ms.ms_page8.minpf0)); printf(" Maximum prefetch\t\t\t%d\n", ((ms.ms_page8.maxpf1<<8) + ms.ms_page8.maxpf0)); printf(" Maximum prefetch ceiling\t\t%d\n", ((ms.ms_page8.maxpfc1<<8) + ms.ms_page8.maxpfc0)); printstr("\nDo you want to change any fields in this page (y/n)? "); if(confirm()) { if(msc.ms_page8.rc) { printstr("Set read cache disable (RC) bit (y/n)? "); if(confirm()) ms.ms_page8.rc = 1; else ms.ms_page8.rc = 0; } if(msc.ms_page8.ms) { printstr("Set mutiple selection (MS) bit (y/n)? "); if(confirm()) ms.ms_page8.ms = 1; else ms.ms_page8.ms = 0; } if(msc.ms_page8.wce) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -