SYS$LOADABLE_IMAGES:DKDRIVER.EXE/jou=[]DKDRIVER-ZIP/out=[]DKDRIVER-ZIP ! ! Patch VMS V5.5-2 DKDRIVER (X-18A7) such that it ... ! ... doesn't reject a disk with ARRE or AWRE mode bits set, ! but instead _clears_ these bits on its own ! ... turns _off_ the reporting of recovered errors ! for _all_ "removable" media except CD-ROM (e.g. IOMEGA ZIP 100) ! ... doesn't reject a disk which won't return C/H/S geometry, ! but instead 'fakes' a CD-ROM-like (*/6/4) geometry ! ... doesn't fail on some sort of "hardware error" right away, ! but retries a few times (because it just _looks_ better) ! ! DKDRIVER-ZIP.0552 Version 4 (NOT compatible with versions 1..3!) ! ! w.j.m. 11-aug-1997 ! 13-aug-1997 wjm: ECOs re-structured, comments added ! 14-aug-1997 wjm: do not clear PER for CD-ROM ! !------------------------------------------------------------------------------- ! define dk$dpt = 0 ! define dk$ddt = 00198 ! .PSECT $$$115_DRIVER ! define mode_sense = dk$ddt + 017AD define mode_sense_60$ = mode_sense + <019A3 - 017AD> define mode_sense_75$ = mode_sense + <019C3 - 017AD> define mode_sense_92$ = mode_sense + <019E1 - 017AD> define mode_sense_95$ = mode_sense + <019E6 - 017AD> ! define mode_select = dk$ddt + 01B43 define mode_select_20$ = mode_select + <01BE0 - 01B43> ! define send_command = dk$ddt + 022F0 ! define dk_patch = dk$ddt + 02F15 ! 200. bytes at end of driver define dk_end = dk$ddt + 02FDD ! ! define DEV$V_SWL = 0019 define DPT$W_SIZE = 0008 define SS$_NORMAL = 0001 define UCB$L_DEVCHAR = 003C define UCB$L_DK_FLAGS = 0158 define UCB$V_REMOVABLE = 0 ! DK_FLAGS bit define UCB$V_CDROM = 0010 ! DK_FLAGS bit define UCB$B_HWERR_RETRY = 0170 define UCB$B_RECOV_PAR = 01A0 ! ! ! Define bit masks for 1st byte of "error recovery" SCSI mode page #1 ! define m_dcr = 01 ! disable correction define m_dte = 02 ! disable transfer on error define m_per = 04 ! post error (allegedly relates to _recovered_ errors) define m_eec = 08 ! enable early correction define m_rc = 10 ! read continuous define m_tb = 20 ! transfer block define m_arre = 40 ! automatic read relocation define m_awre = 80 ! automatic write relocation ! ! set eco 99 ! initialize patch area ---------------------------------------- ! !* Here, we create a "patch area descriptor" for the patch area !* at the end of DKDRIVER (left zero-filled at assembly time), !* such that subsequent patches can use it in "modular" fashion, !* e.g. via CHECK ECO 99. ! verify/long dk_patch ! check that patch area is unused (=zero) yet 0 0 exit ! verify/word dk$dpt + DPT$W_SIZE ! check that `dk_end' matches DKDRIVER's size + exit ! set patch/init= dk_patch ! create patch descriptor ! update !----------------------------------------------------------------------- ! set eco 100 ! mode page #1 bits (ARWE, ARRE, PER) -------------------------- check eco 99 ! need patch area set patch dk_patch ! !* Here, UCB$B_RECOV_PAR+2 has the first byte from mode page #1, !* as received via a MODE SENSE command. !* Old code will reject (i.e. declare offline) !* SCSI disks with any of AWRE, ARRE, or RC set. ! verify/inst mode_sense + <018E0 - 017AD> ' bitb #m_awre+m_arre+m_rc,w^UCB$B_RECOV_PAR+2(r3)' ' beql $0.10' ' brw mode_sense_95$' ! reject AWRE, ARRE, RC '$0.10: brw mode_sense_60$' exit ! verify/inst mode_sense_60$ ! normal processing continues here ' movzbl b^1(r0),r2' ' addl #2,r2' exit ! !* We shall test for RC only, so as to not "a priori" !* reject disks that happen to have AWRE & ARRE set ! replace/inst mode_sense + <018E0 - 017AD> ' bitb #m_awre+m_arre+m_rc,w^UCB$B_RECOV_PAR+2(r3)' exit ' bitb #m_rc,w^UCB$B_RECOV_PAR+2(r3)' ! reject RC only exit ! !* Here, DKDRIVER decides if it should send a MODE SELECT command !* that will change mode page #1. !* !* Old code looks for TB, DTE, and PER and wants all of them set. !* If they're set already, no MODE SELECT command will be sent !* (AWRE and ARRE are known to be clear due to the above test). !* !* New code has to deal with a more complicated situation: !* We want ARRE and AWRE clear (they may be set), and for !* removable non-CDROM disks we also want PER clear - they !* may _rely_ on built-in error recovery to work at all. ! replace/inst mode_select + <01B59 - 01B43> ' bicb3 #00FF-m_tb-m_dte-m_per,w^UCB$B_RECOV_PAR+2(r3),r1' ' cmpb #m_tb+m_dte+m_per,r1' ' beql mode_select_20$' ! branch around mode select exit ' bicb3 #00FF-m_awre-m_arre-m_tb-m_dte-m_per,w^UCB$B_RECOV_PAR+2(r3),r1' ' movb #m_tb+m_dte+m_per,r2' ! desired value (AxRE clear) ' bbc #UCB$V_REMOVABLE,w^UCB$L_DK_FLAGS(r3),$0.21' ! removable? ' bbs #UCB$V_CDROM,w^UCB$L_DK_FLAGS(r3),$0.21' ! not a CD-ROM? ' bicb #m_per,r2' ! yes, M_PER not desired '$0.21: cmpb r2,r1' ! already having desired mode? ' beql mode_select_20$' ! br if so (no-op) exit ! !* Here, UCB$B_RECOV_PAR+2 (cf. above) is modified for use !* with the MODE SELECT command issued subsequently. !* Some bits (DCR and EEC) are always left unchanged. ! replace/inst mode_select + <01BA2 - 01B43> ! modify mode page #1, 1st byte ' movab w^UCB$B_RECOV_PAR+2(r3),r6' ' bisb #m_tb+m_per+m_dte,w^UCB$B_RECOV_PAR+2(r3)' exit ' movab w^UCB$B_RECOV_PAR+2(r3),r6' ! (unchanged) ' bisb #m_tb+m_per+m_dte,(r6)' ! set bits as before ' bicb #m_awre+m_arre,(r6)' ! clear ARRE and AWRE ' bbc #UCB$V_REMOVABLE,w^UCB$L_DK_FLAGS(r3),$0.31' ! removable? ' bbs #UCB$V_CDROM,w^UCB$L_DK_FLAGS(r3),$0.31' ! not a CD-ROM? ' bicb #m_per,(r6)' ! if so, clear PER '$0.31: nop' exit ! update !----------------------------------------------------------------------- ! set eco 101 ! allow for missing C/H/S values ------------------------------- ! patch area not required ! !* This is a successful exit from the `mode_sense' routine. ! verify/inst mode_sense_75$ ' movzwl #SS$_NORMAL,r0' exit ! !* Here, it has been noticed that non-zero values for each of the C/H/S !* "geometry" parameters could not be determined via MODE SENSE commands. !* Old code does handle this condition for CD-ROM (in fact, write-protected) !* drives only, by using a READ CAPACITY command later, and faking an !* appropriate c/6/4 CD-ROM-style geometry; other disks will be set offline. !* We shall permit the CD-ROM "fake" to be used for any disk. !* This seems to match the behaviour of VMS V7.1 DKDRIVER. ! replace/inst mode_sense_92$ ' bbs #DEV$V_SWL,b^UCB$L_DEVCHAR(r3),mode_sense_75$' exit ' brb mode_sense_75$' ! always allow for missing or zero C/H/S data exit ! update !----------------------------------------------------------------------- ! set eco 102 ! raise HWERR_RETRY_CNT from 1 to 10 --------------------------- ! patch area not required ! !* An assembly-time constant determining the number of times !* that certain hardware errors (details unknown) are retried, !* is 1 in V5.5-2, making for zero retries. !* Allowing for 9 retries _may_ improve the resiliency. !* Here, we modify the single reference to that constant. ! replace/inst send_command+000A ' movb #1,w^UCB$B_HWERR_RETRY(r3)' exit ' movb #0A,w^UCB$B_HWERR_RETRY(r3)' exit ! update !----------------------------------------------------------------------- ! exit