RM03 volume valid bit?

notes at isucs1.UUCP notes at isucs1.UUCP
Mon Oct 14 18:11:14 AEST 1985



Here is one possible fix for the VV problem that you mention.  I hacked
up a RM02/3 driver for V6 UNIX years ago and it seemed to work ok.
The structure for drivers in V6 and 2.8bsd are sure to be different, but
maybe you can patch in similar changes in your system.  The idea is to
specifically look at the VV flag in the interrupt routine (called "rmintr"
here) and if set, just reset the drive.  The command that discovered that the
drive was not ready will be re-executed.  I have included pertinent constants
from the driver, and the code for "rmintr".  I'd be happy to mail out the
entire driver if needed.

Jim Davis
Iowa State University
UUCP:   {umn-cs okstate csu-cs}!isucs1!davis
CSNET:  davis at iowa-state



#define RMADDR  0176700
#define NRM     2               /*  allowable # of drives for this driver  */
#define NSECS   32              /*  number of sectors per track         */
#define NTRKS   5               /*  number of tracks per cylinder       */

/*   DRIVE COMMANDS             */
#define GO      01
#define RECAL   06
#define DRVCLR  010
#define OFFSET  014
#define PRESET  020
#define PACKACK 022
#define WCOM    060
#define RCOM    070

/*  STATUS FLAGS IN "RMDS"      */
#define VV      0100            /*  valid volume on line        */
#define DRY     0200            /*  drive ready                 */
#define PIP     020000          /*  positioning in progress     */

/*  STATUS FLAGS IN "RMCS1"     */
#define TRE     040000          /*  transfer error (composite)  */
#define IE      0100            /*  interrupt enable            */

/*  ERROR FLAGS IN "RMER1"      */
#define UNS     040000          /*  drive unsafe                */
#define DTE     010000          /*  drive timing error          */
#define OPI     020000          /*  operation incomplete        */
#define DCK     0100000         /*  ECC - data check error      */
#define ECH     0100            /*  ECC - hard error            */

/*  FLAGS IN "RMCS2"            */
#define CLR     040             /* controller clear             */

/*  FLAGS IN "RMOF"             */
#define FMT32   010000          /* 16 bit /word format          */



rmintr()
{  register struct buf *bp;

   if (rmtab.d_active == 0)
        return;
   bp = rmtab.d_actf;
   rmtab.d_active = 0;

   if (RMADDR->rmcs1 & TRE) {
        /*  some kind of error - reset drive status  */
	deverror(bp, RMADDR->rmcs2, RMADDR->rmer1);

        /*  wait for all commands to complete - even non-transfer  */
        while( (RMADDR->rmds & DRY)==0);

        /*  look for VV bit clear - pack may have been changed  */
        if ( (RMADDR->rmds & VV)==0) {
                RMADDR->rmcs1 = DRVCLR|TRE|IE|GO;
                RMADDR->rmcs1 = PRESET|GO;
                RMADDR->rmof  = FMT32;
        }

        else if(RMADDR->rmer1 & (UNS|DTE|OPI)) {
                RMADDR->rmcs1 = DRVCLR|TRE|IE|GO;
                RMADDR->rmcs1 = RECAL|GO;
                rmwait();
        }
        else  RMADDR->rmcs1 = DRVCLR|TRE|IE|GO;

        if (++rmtab.d_errcnt <= 10) {
                rmstart();
                return;
        }
        bp->b_flags =| B_ERROR;
   }
   rmtab.d_errcnt = 0;
   rmtab.d_actf = bp->av_forw;
   bp->b_resid = RMADDR->rmwc;
   iodone(bp);
   rmstart();
}
/********/



More information about the Comp.unix mailing list