summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa
diff options
context:
space:
mode:
Diffstat (limited to 'sys/i386/isa')
-rw-r--r--sys/i386/isa/fd.c106
1 files changed, 71 insertions, 35 deletions
diff --git a/sys/i386/isa/fd.c b/sys/i386/isa/fd.c
index 0493b24..91e6066 100644
--- a/sys/i386/isa/fd.c
+++ b/sys/i386/isa/fd.c
@@ -43,7 +43,7 @@
* SUCH DAMAGE.
*
* from: @(#)fd.c 7.4 (Berkeley) 5/25/91
- * $Id: fd.c,v 1.83 1996/03/31 18:04:51 joerg Exp $
+ * $Id: fd.c,v 1.84 1996/04/02 04:51:04 scrappy Exp $
*
*/
@@ -246,9 +246,9 @@ static struct fd_data {
int track; /* where we think the head is */
int options; /* user configurable options, see ioctl_fd.h */
int dkunit; /* disk stats unit number */
-#ifdef DEVFS
- void *bdev;
- void *cdev;
+#ifdef DEVFS
+ void *bdevs[1 + NUMDENS + MAXPARTITIONS];
+ void *cdevs[1 + NUMDENS + MAXPARTITIONS];
#endif
} fd_data[NFD];
@@ -567,10 +567,11 @@ fdattach(struct isa_device *dev)
int fdsu, st0, st3, i, unithasfd;
struct isa_device *fdup;
int ic_type = 0;
-#ifdef DEVFS
+#ifdef DEVFS
int mynor;
- char name[64];
-#endif /* DEVFS */
+ int typemynor;
+ int typesize;
+#endif
fdc->fdcu = fdcu;
fdc->flags |= FDC_ATTACHED;
@@ -715,18 +716,12 @@ fdattach(struct isa_device *dev)
fd->type = FD_1200;
kdc_fd[fdu].kdc_description =
"1.2MB (1200K) 5.25in floppy disk drive";
-#ifdef DEVFS
- sprintf(name,"rfd%d.1200",fdu);
-#endif /* DEVFS */
break;
case RTCFDT_144M:
printf("1.44MB 3.5in\n");
fd->type = FD_1440;
kdc_fd[fdu].kdc_description =
"1.44MB (1440K) 3.5in floppy disk drive";
-#ifdef DEVFS
- sprintf(name,"rfd%d.1440",fdu);
-#endif /* DEVFS */
break;
case RTCFDT_288M:
case RTCFDT_288M_1:
@@ -734,47 +729,88 @@ fdattach(struct isa_device *dev)
fd->type = FD_1440;
kdc_fd[fdu].kdc_description =
"2.88MB (2880K) 3.5in floppy disk drive in 1.44 mode";
-#ifdef DEVFS
- sprintf(name,"rfd%d.1440",fdu);
-#endif /* DEVFS */
break;
case RTCFDT_360K:
printf("360KB 5.25in\n");
fd->type = FD_360;
kdc_fd[fdu].kdc_description =
"360KB 5.25in floppy disk drive";
-#ifdef DEVFS
- sprintf(name,"rfd%d.360",fdu);
-#endif /* DEVFS */
break;
case RTCFDT_720K:
printf("720KB 3.5in\n");
fd->type = FD_720;
kdc_fd[fdu].kdc_description =
"720KB 3.5in floppy disk drive";
-#ifdef DEVFS
- sprintf(name,"rfd%d.720",fdu);
-#endif /* DEVFS */
break;
default:
printf("unknown\n");
fd->type = NO_TYPE;
-#ifdef DEVFS
- sprintf(name,"rfd%d.xxxx",fdu);
-#endif /* DEVFS */
- break;
+ dev_detach(&kdc_fd[fdu]);
+ continue;
}
kdc_fd[fdu].kdc_state = DC_IDLE;
#ifdef DEVFS
- mynor = 8 * fdu;
- fd->bdev = devfs_add_devswf(&fd_bdevsw, mynor, DV_BLK,
- UID_ROOT, GID_OPERATOR, 0640,
- "%s", name + 1);
- fd->cdev = devfs_add_devswf(&fd_cdevsw, mynor, DV_CHR,
- UID_ROOT, GID_OPERATOR, 0640,
- "%s", name);
- devfs_link(fd->bdev, "fd%d", fdu);
- devfs_link(fd->cdev, "rfd%d", fdu);
+ mynor = fdu << 6;
+ fd->bdevs[0] = devfs_add_devswf(&fd_bdevsw, mynor, DV_BLK,
+ UID_ROOT, GID_OPERATOR, 0640,
+ "fd%d", fdu);
+ fd->cdevs[0] = devfs_add_devswf(&fd_cdevsw, mynor, DV_CHR,
+ UID_ROOT, GID_OPERATOR, 0640,
+ "rfd%d", fdu);
+ for (i = 1; i < 1 + NUMDENS; i++) {
+ /*
+ * XXX this and the lookup in Fdopen() should be
+ * data driven.
+ */
+ switch (fd->type) {
+ case FD_360:
+ if (i != FD_360)
+ continue;
+ break;
+ case FD_720:
+ if (i != FD_720 && i != FD_800 && i != FD_820)
+ continue;
+ break;
+ case FD_1200:
+ if (i != FD_360 && i != FD_720 && i != FD_800
+ && i != FD_820 && i != FD_1200
+ && i != FD_1440 && i != FD_1480)
+ continue;
+ break;
+ case FD_1440:
+ if (i != FD_720 && i != FD_800 && i != FD_820
+ && i != FD_1200 && i != FD_1440
+ && i != FD_1480 && i != FD_1720)
+ continue;
+ break;
+ }
+ typemynor = mynor | i;
+ typesize = fd_types[i - 1].size / 2;
+ /*
+ * XXX all these conversions give bloated code and
+ * confusing names.
+ */
+ if (typesize == 1476)
+ typesize = 1480;
+ if (typesize == 1722)
+ typesize = 1720;
+ fd->bdevs[i] =
+ devfs_add_devswf(&fd_bdevsw, typemynor, DV_BLK,
+ UID_ROOT, GID_OPERATOR, 0640,
+ "fd%d.%d", fdu, typesize);
+ fd->cdevs[i] =
+ devfs_add_devswf(&fd_cdevsw, typemynor, DV_CHR,
+ UID_ROOT, GID_OPERATOR, 0640,
+ "rfd%d.%d", fdu, typesize);
+ }
+ for (i = 0; i < MAXPARTITIONS; i++) {
+ fd->bdevs[1 + NUMDENS + i] =
+ devfs_link(fd->bdevs[0],
+ "fd%d%c", fdu, 'a' + i);
+ fd->cdevs[1 + NUMDENS + i] =
+ devfs_link(fd->cdevs[0],
+ "rfd%d%c", fdu, 'a' + i);
+ }
#endif /* DEVFS */
if (dk_ndrive < DK_NDRIVE) {
sprintf(dk_names[dk_ndrive], "fd%d", fdu);
OpenPOWER on IntegriCloud