summaryrefslogtreecommitdiffstats
path: root/sys/pc98/cbus
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2002-10-05 15:15:43 +0000
committerphk <phk@FreeBSD.org>2002-10-05 15:15:43 +0000
commitde27611d217b814c30bb86b0224235c8322c2ec5 (patch)
treedfe9ae26fdf47f4f578ab052d73205528187d6c8 /sys/pc98/cbus
parent2670ddfd3d617662ee379ec7c426c9cd053767ae (diff)
downloadFreeBSD-src-de27611d217b814c30bb86b0224235c8322c2ec5.zip
FreeBSD-src-de27611d217b814c30bb86b0224235c8322c2ec5.tar.gz
Merge the last couple of my changes to fd.c into the pc98 version.
Sponsored by: DARPA & NAI Labs
Diffstat (limited to 'sys/pc98/cbus')
-rw-r--r--sys/pc98/cbus/fdc.c71
1 files changed, 20 insertions, 51 deletions
diff --git a/sys/pc98/cbus/fdc.c b/sys/pc98/cbus/fdc.c
index 8c6301c..b088ee3 100644
--- a/sys/pc98/cbus/fdc.c
+++ b/sys/pc98/cbus/fdc.c
@@ -63,7 +63,6 @@
#include <sys/conf.h>
#include <sys/devicestat.h>
#include <sys/disk.h>
-#include <sys/disklabel.h>
#include <sys/fcntl.h>
#include <sys/fdcio.h>
#include <sys/filio.h>
@@ -190,7 +189,7 @@ struct fdc_data
#endif
};
-#define BIO_FORMAT BIO_CMD2
+#define FDBIO_FORMAT BIO_CMD2
typedef int fdu_t;
typedef int fdcu_t;
@@ -264,7 +263,7 @@ FDC_ACCESSOR(fdunit, FDUNIT, int)
#define NUMDENS 16
#endif
-#define BIO_RDSECTID BIO_CMD1
+#define FDBIO_RDSECTID BIO_CMD1
/*
* List of native drive densities. Order must match enum fd_drivetype
@@ -2102,7 +2101,7 @@ fdstrategy(struct bio *bp)
goto bad;
}
fdblk = 128 << (fd->ft->secsize);
- if (bp->bio_cmd != BIO_FORMAT && bp->bio_cmd != BIO_RDSECTID) {
+ if (bp->bio_cmd != FDBIO_FORMAT && bp->bio_cmd != FDBIO_RDSECTID) {
if (fd->flags & FD_NONBLOCK) {
bp->bio_error = EAGAIN;
bp->bio_flags |= BIO_ERROR;
@@ -2345,7 +2344,7 @@ fdautoselect(dev_t dev)
fd->ft = fdtp;
id.cyl = id.head = 0;
- rv = fdmisccmd(dev, BIO_RDSECTID, &id);
+ rv = fdmisccmd(dev, FDBIO_RDSECTID, &id);
if (rv != 0)
continue;
if (id.cyl != 0 || id.head != 0 ||
@@ -2353,7 +2352,7 @@ fdautoselect(dev_t dev)
continue;
id.cyl = 2;
id.head = fd->ft->heads - 1;
- rv = fdmisccmd(dev, BIO_RDSECTID, &id);
+ rv = fdmisccmd(dev, FDBIO_RDSECTID, &id);
if (id.cyl != 2 || id.head != fdtp->heads - 1 ||
id.secshift != fdtp->secsize)
continue;
@@ -2429,8 +2428,8 @@ fdstate(fdc_p fdc)
idf = ISADMA_READ;
else
idf = ISADMA_WRITE;
- format = bp->bio_cmd == BIO_FORMAT;
- rdsectid = bp->bio_cmd == BIO_RDSECTID;
+ format = bp->bio_cmd == FDBIO_FORMAT;
+ rdsectid = bp->bio_cmd == FDBIO_RDSECTID;
if (format)
finfo = (struct fd_formb *)bp->bio_data;
TRACE1("fd%d", fdu);
@@ -3120,14 +3119,14 @@ fdmisccmd(dev_t dev, u_int cmd, void *data)
* cylinder, and use the desired head.
*/
bp->bio_cmd = cmd;
- if (cmd == BIO_FORMAT) {
+ if (cmd == FDBIO_FORMAT) {
bp->bio_blkno =
(finfo->cyl * (fd->ft->sectrac * fd->ft->heads) +
finfo->head * fd->ft->sectrac) *
fdblk / DEV_BSIZE;
bp->bio_bcount = sizeof(struct fd_idfield_data) *
finfo->fd_formb_nsecs;
- } else if (cmd == BIO_RDSECTID) {
+ } else if (cmd == FDBIO_RDSECTID) {
bp->bio_blkno =
(idfield->cyl * (fd->ft->sectrac * fd->ft->heads) +
idfield->head * fd->ft->sectrac) *
@@ -3153,8 +3152,6 @@ fdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td)
{
fdu_t fdu;
fd_p fd;
- struct fd_type *fdt;
- struct disklabel *lp;
struct fdc_status *fsp;
struct fdc_readid *rid;
size_t fdblk;
@@ -3173,6 +3170,15 @@ fdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td)
* FD_NONBLOCK still being set.
*/
switch (cmd) {
+
+ case DIOCGMEDIASIZE:
+ *(off_t *)addr = (128 << (fd->ft->secsize)) * fd->ft->size;
+ return (0);
+
+ case DIOCGSECTORSIZE:
+ *(u_int *)addr = 128 << (fd->ft->secsize);
+ return (0);
+
case FIONBIO:
if (*(int *)addr != 0)
fd->flags |= FD_NONBLOCK;
@@ -3271,43 +3277,6 @@ fdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td)
error = 0;
switch (cmd) {
- case DIOCGDINFO:
- lp = malloc(sizeof(*lp), M_TEMP, M_ZERO);
- lp->d_secsize = fdblk;
- fdt = fd->ft;
- lp->d_secpercyl = fdt->size / fdt->tracks;
- lp->d_type = DTYPE_FLOPPY;
- if (readdisklabel(dev, lp) != NULL)
- error = EINVAL;
- else
- *(struct disklabel *)addr = *lp;
- free(lp, M_TEMP);
- break;
-
- case DIOCSDINFO:
- if ((flag & FWRITE) == 0)
- return (EBADF);
- /*
- * XXX perhaps should call setdisklabel() to do error checking
- * although there is nowhere to "set" the result. Perhaps
- * should always just fail.
- */
- break;
-
- case DIOCWLABEL:
- if ((flag & FWRITE) == 0)
- return (EBADF);
- break;
-
- case DIOCWDINFO:
- if ((flag & FWRITE) == 0)
- return (EBADF);
- lp = malloc(DEV_BSIZE, M_TEMP, M_ZERO);
- error = setdisklabel(lp, (struct disklabel *)addr, (u_long)0);
- if (error != 0)
- error = writedisklabel(dev, lp);
- free(lp, M_TEMP);
- break;
case FD_FORM:
if ((flag & FWRITE) == 0)
@@ -3315,7 +3284,7 @@ fdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td)
if (((struct fd_formb *)addr)->format_version !=
FD_FORMAT_VERSION)
return (EINVAL); /* wrong version of formatting prog */
- error = fdmisccmd(dev, BIO_FORMAT, addr);
+ error = fdmisccmd(dev, FDBIO_FORMAT, addr);
break;
case FD_GTYPE: /* get drive type */
@@ -3364,7 +3333,7 @@ fdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct thread *td)
rid = (struct fdc_readid *)addr;
if (rid->cyl > MAX_CYLINDER || rid->head > MAX_HEAD)
return (EINVAL);
- error = fdmisccmd(dev, BIO_RDSECTID, addr);
+ error = fdmisccmd(dev, FDBIO_RDSECTID, addr);
break;
default:
OpenPOWER on IntegriCloud