[4140] in Athena Bugs
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,