[4140] in Athena Bugs

home help back first fref pref prev next nref lref last post

VS3100 sdc floppy light never turns off

daemon@ATHENA.MIT.EDU (epeisach@ATHENA.MIT.EDU)
Mon Feb 5 13:11:39 1990

From: epeisach@ATHENA.MIT.EDU
Date: Mon, 5 Feb 90 13:11:10 -0500
To: bugs@ATHENA.MIT.EDU

The floppy drive does not shut off it's light or motor when not in use.
This is true in the ultrix configuration (although on VMS systems, the
light does go out). 

I have added a deslection routine that is only used on the 3100's with a
rx23 drive. I also keep track if the block and/or character device is
open and shutdown the drive only if both are closed. 

The changes given below are relative to the previous fix I submitted. 
Files affected: vax/conf.c vaxuba/sdc.c and vaxuba/sdcreg.h

	Ezra

*** /tmp/,RCSt1003115	Mon Feb  5 13:06:57 1990
--- sdc.c	Wed Jan 31 08:59:47 1990
***************
*** 155,160 ****
--- 155,161 ----
  
  #include "sdc_data.c"
  
+ #define MAJORCHAR 47 /* In conf.c - line in cdevsw */
  
  int
  sdprobe(), sdslave(), sdattach(), sdintr(), sdustart();
***************
*** 205,210 ****
--- 206,212 ----
  int ddm_err = 0;		/* Deleted Data Mark error */
  int rx50blk, rx50nsect;		/* starting block no. and no. of sectors for
  				 * each transfer for RX50 */
+ int rx23deselect=0;
  /*
   * HDC 9224 chip register access delay macro.
   * Must insure a minimum of 700 ns between disk
***************
*** 445,450 ****
--- 447,456 ----
  	    ui->ui_type = DT_RX33;
  	    sd_st.sd_type[ui->ui_slave] = DT_RX33;
  	}
+ 	if(cpu == VAX_420 && (sd_st.sd_type[0] <= 0) && 
+ 	   (sd_st.sd_type[1] <= 0) &&
+ 	   (sd_st.sd_type[ui->ui_slave] != DT_RX33))
+ 	    rx23deselect = 1;
  	return (1);
  	/* break; */
  
***************
*** 466,477 ****
      sd_st.sd_softcnt[ui->ui_slave] = 0;	/* initialize soft error count */
      sd_st.sd_hardcnt[ui->ui_slave] = 0;	/* initialize hard error count */
      ui->ui_flags = 0;
  }
  
! sdopen(dev, flag)
      dev_t dev;
      int flag;
  {
      register int unit = minor(dev) >> 3;
      register struct uba_device *ui;
      register int i;
--- 472,504 ----
      sd_st.sd_softcnt[ui->ui_slave] = 0;	/* initialize soft error count */
      sd_st.sd_hardcnt[ui->ui_slave] = 0;	/* initialize hard error count */
      ui->ui_flags = 0;
+     sd_st.sd_open = 0;
+     sd_st.sd_bopen = 0;
+     sd_st.sd_copen = 0;
+     if(rx23deselect) {
+ 	/* Turn off motor and deselect */
+ 	rx23_deselect();
+     }
  }
  
! sdbopen(dev, flag)
      dev_t dev;
      int flag;
  {
+     sdopen(dev, flag, 1);
+ }
+ 
+ sdcopen(dev, flag)
+     dev_t dev;
+     int flag;
+ {
+     sdopen(dev, flag, 0);
+ }
+ 
+ sdopen(dev, flag, block)
+     dev_t dev;
+     int flag,block;
+ {
      register int unit = minor(dev) >> 3;
      register struct uba_device *ui;
      register int i;
***************
*** 536,544 ****
--- 563,614 ----
  	}
      }
  #endif notdef
+     sd_st.sd_open++;
+     if (block) {
+ 	sd_st.sd_bopen++;
+     } else {
+ 	sd_st.sd_copen++;
+     }
      return (0);
  }
  
+ sdbclose(dev, flag)
+ 	dev_t dev;
+ 	int flag;
+ {
+     sdclose(dev, flag, 1);
+ }
+ 
+ sdcclose(dev, flag)
+ 	dev_t dev;
+ 	int flag;
+ {
+     sdclose(dev, flag, 0);
+ }
+ 
+ sdclose(dev, flag, block)
+ 	dev_t dev;
+ 	int flag, block;
+ {
+     if(block) {
+ 	sd_st.sd_bopen = 0;
+     } else {
+ 	sd_st.sd_copen = 0;
+     }
+     if ((sd_st.sd_bopen == 0) && (sd_st.sd_copen == 0)) {
+ 	sd_st.sd_open = 0;
+     }
+     if (sdcbuf.b_actf == NULL) {
+ 	sdcbuf.b_active = 0;
+ 	if(rx23deselect) {
+ 	    /* If queue now empty - deselect - otherwise code in sdustart will
+ 	       handle it */
+ 	    rx23_deselect();
+ 	}
+     }
+     return(0);
+ }
+ 
  sdstrategy(bp)
      register struct buf *bp;
  {
***************
*** 662,667 ****
--- 732,741 ----
      /* Check if any request pending for the controller */
      if ((dp = sdcbuf.b_actf) == NULL) {
  	sdcbuf.b_active = 0;
+ 
+ 	if(rx23deselect && !sd_st.sd_open) {
+ 	    rx23_deselect();
+ 	}
  	/* deallocate the 16K shared buffer */
  	return (VS_DEALLOC);
      }
***************
*** 1346,1351 ****
--- 1420,1439 ----
      sdiaddr->nb_int_msk |= SINT_DC;
      return (0);
  }
+ 
+ /* This routine turns off the rx23 motor and deselects the controller */
+ rx23_deselect()
+ {
+     register struct nb1_regs *sdaddr = (struct nb1_regs *) umem;
+ 
+     sdaddr->dkc_cmd = (SD_SETREG | UDC_RTCNT);
+     sdc_delay();
+     sdaddr->dkc_reg = RT_CNT;	/* UDC_RTCNT */
+     sd_deselect();
+     dsket_type = -1;
+     sd_rxcyl = 0;
+ }
+ 
  
  /* This routine issues the RESTORE command to the controller */
  
*** /tmp/,RCSt1003122	Mon Feb  5 13:09:54 1990
--- sdcreg.h	Wed Dec 27 15:56:20 1989
***************
*** 277,282 ****
--- 277,285 ----
  	short	sd_drno;	/* drive number currently transferring */
  	int	sd_blkno;	/* block no */
  	int	sd_nsect;	/* no. of sectors being written */
+ 	int	sd_open;	/* If controller in use */
+ 	int	sd_copen;	/* If open for char i/o */
+ 	int	sd_bopen;	/* If open for block i/o */
  	short	sd_hd;	/* current head */
  	union {
  		short	sd_word;
*** /tmp/,RCSt1003128	Mon Feb  5 13:10:19 1990
--- conf.c	Wed Dec 27 15:07:03 1989
***************
*** 6,12 ****
   *	@(#)conf.c	7.1 (Berkeley) 6/5/86
   */
  #ifndef lint
! static char rcs_id[] = {"$Header: /wombat/u3/sys/vax/RCS/conf.c,v 1.1 89/12/27 10:22:11 epeisach Exp Locker: epeisach $"};
  #endif not lint
  /*
   * RCS Info
--- 6,12 ----
   *	@(#)conf.c	7.1 (Berkeley) 6/5/86
   */
  #ifndef lint
! static char rcs_id[] = {"$Header: /u3/sys/vax/RCS/conf.c,v 1.1 89/12/27 10:22:11 epeisach Exp Locker: epeisach $"};
  #endif not lint
  /*
   * RCS Info
***************
*** 168,177 ****
   */
  #define	NSD	NRD+NRX
  #if NSD > 0
! int	sdopen(),sdstrategy(),sdread(),sdwrite(),sdioctl();
! int	sddump(),sdsize();
  #else
! #define sdopen		nodev
  #define sdstrategy	nodev
  #define sdread		nodev
  #define sdwrite 	nodev
--- 168,180 ----
   */
  #define	NSD	NRD+NRX
  #if NSD > 0
! int	sdcopen(),sdbopen(),sdstrategy(),sdread(),sdwrite(),sdioctl();
! int	sddump(),sdsize(),sdcclose(),sdbclose();
  #else
! #define sdbopen		nodev
! #define sdcopen		nodev
! #define sdbclose	nodev
! #define sdcclose	nodev
  #define sdstrategy	nodev
  #define sdread		nodev
  #define sdwrite 	nodev
***************
*** 381,387 ****
  #endif 
  	{ stopen,	stclose,	ststrategy,	stdump, 	/*18*/
  	  0,		B_TAPE },
! 	{ sdopen,	nulldev,	sdstrategy,	sddump, 	/*19*/
  	  sdsize,	0 },
  	{ tzopen, 	tzclose, 	tzstrategy,	tzdump,		/*20*/
  	  0, 		B_TAPE },
--- 384,390 ----
  #endif 
  	{ stopen,	stclose,	ststrategy,	stdump, 	/*18*/
  	  0,		B_TAPE },
! 	{ sdbopen,	sdbclose,	sdstrategy,	sddump, 	/*19*/
  	  sdsize,	0 },
  	{ tzopen, 	tzclose, 	tzstrategy,	tzdump,		/*20*/
  	  0, 		B_TAPE },
***************
*** 1090,1096 ****
  	stioctl,	nulldev,	nulldev,	0,
  	seltrue,	nodev,
  	
! 	sdopen, 	nulldev,	sdread, 	sdwrite,	/*47*/
  	sdioctl,	nulldev,	nulldev,	0,
  	seltrue,	nodev,
  	
--- 1093,1099 ----
  	stioctl,	nulldev,	nulldev,	0,
  	seltrue,	nodev,
  	
! 	sdcopen, 	sdcclose,	sdread, 	sdwrite,	/*47*/
  	sdioctl,	nulldev,	nulldev,	0,
  	seltrue,	nodev,
  	



home help back first fref pref prev next nref lref last post