summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa/wd.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/i386/isa/wd.c')
-rw-r--r--sys/i386/isa/wd.c84
1 files changed, 44 insertions, 40 deletions
diff --git a/sys/i386/isa/wd.c b/sys/i386/isa/wd.c
index b8cf448..2794ecd 100644
--- a/sys/i386/isa/wd.c
+++ b/sys/i386/isa/wd.c
@@ -176,7 +176,7 @@ static void wderror(struct buf *bp, struct disk *du, char *mesg);
static void wdflushirq(struct disk *du, int old_ipl);
static int wdreset(struct disk *du);
static void wdsleep(int ctrlr, char *wmesg);
-static void wdtimeout(caddr_t cdu, int ticks);
+static void wdtimeout(caddr_t cdu);
static int wdunwedge(struct disk *du);
static int wdwait(struct disk *du, u_char bits_wanted, int timeout);
@@ -184,6 +184,8 @@ struct isa_driver wdcdriver = {
wdprobe, wdattach, "wdc",
};
+extern char *readdisklabel();
+
/*
* Probe for controller.
*/
@@ -321,7 +323,7 @@ wdattach(struct isa_device *dvp)
* Start timeout routine for this drive.
* XXX timeout should be per controller.
*/
- wdtimeout((caddr_t)du, 0);
+ wdtimeout((caddr_t)du);
} else {
free(du, M_TEMP);
wddrives[lunit] = NULL;
@@ -397,7 +399,8 @@ wdstrategy(register struct buf *bp)
dp = &wdutab[lunit];
s = splbio();
- cldisksort(dp, bp, 254*DEV_BSIZE);
+ /* cldisksort(dp, bp, 254*DEV_BSIZE); */
+ disksort(dp, bp);
if (dp->b_active == 0)
wdustart(du); /* start drive */
@@ -440,13 +443,15 @@ wdustart(register struct disk *du)
if (bp == NULL)
return;
+ dp->b_actf = bp->b_actf;
+ bp->b_actf = NULL;
/* link onto controller queue */
- dp->b_forw = NULL;
- if (wdtab[ctrlr].b_actf == NULL)
- wdtab[ctrlr].b_actf = dp;
- else
- wdtab[ctrlr].b_actl->b_forw = dp;
- wdtab[ctrlr].b_actl = dp;
+ if (wdtab[ctrlr].b_actf == NULL) {
+ wdtab[ctrlr].b_actf = bp;
+ } else {
+ *wdtab[ctrlr].b_actb = bp;
+ }
+ wdtab[ctrlr].b_actb = &bp->b_actf;
/* mark the drive unit as busy */
dp->b_active = 1;
@@ -474,20 +479,10 @@ wdstart(int ctrlr)
loop:
/* is there a drive for the controller to do a transfer with? */
- dp = wdtab[ctrlr].b_actf;
- if (dp == NULL)
+ bp = wdtab[ctrlr].b_actf;
+ if (bp == NULL)
return;
- /*
- * Is there a transfer to this drive? If so, link it on the
- * controller's queue.
- */
- bp = dp->b_actf;
- if (bp == NULL) {
- wdtab[ctrlr].b_actf = dp->b_forw;
- goto loop;
- }
-
/* obtain controller and drive information */
lunit = wdunit(bp->b_dev);
du = wddrives[lunit];
@@ -671,9 +666,10 @@ wdintr(int unit)
return;
}
- dp = wdtab[unit].b_actf;
- bp = dp->b_actf;
+ bp = wdtab[unit].b_actf;
du = wddrives[wdunit(bp->b_dev)];
+ dp = &wdutab[du->dk_lunit];
+
du->dk_timeout = 0;
if (wdwait(du, 0, TIMEOUT) < 0) {
@@ -783,13 +779,12 @@ outt:
done: ;
/* done with this transfer, with or without error */
du->dk_flags &= ~DKFL_SINGLE;
- wdtab[unit].b_actf = dp->b_forw;
+ wdtab[unit].b_actf = bp->b_actf;
wdtab[unit].b_errcnt = 0;
bp->b_resid = bp->b_bcount - du->dk_skip * DEV_BSIZE;
- du->dk_skip = 0;
dp->b_active = 0;
- dp->b_actf = bp->av_forw;
dp->b_errcnt = 0;
+ du->dk_skip = 0;
biodone(bp);
}
@@ -797,8 +792,7 @@ done: ;
wdtab[unit].b_active = 0;
/* anything more on drive queue? */
- if (dp->b_actf)
- wdustart(du);
+ wdustart(du);
/* anything more for controller to do? */
if (wdtab[unit].b_actf)
wdstart(unit);
@@ -871,11 +865,16 @@ wdopen(dev_t dev, int flags, int fmt, struct proc *p)
* to the driver by resetting the state machine.
*/
save_label = du->dk_dd;
+ du->dk_dd.d_partitions[WDRAW].p_offset = 0;
+ du->dk_dd.d_partitions[WDRAW].p_size = 0x7fffffff;/* XXX */
#define WDSTRATEGY ((int (*)(struct buf *)) wdstrategy) /* XXX */
msg = readdisklabel(makewddev(major(dev), lunit, WDRAW),
- (d_strategy_t *) WDSTRATEGY, &du->dk_dd,
- du->dk_dospartitions, &du->dk_bad,
- (struct buf **)NULL);
+ WDSTRATEGY, &du->dk_dd,
+ du->dk_dospartitions, &du->dk_bad);
+/*
+ msg = readdisklabel(makewddev(major(dev), lunit, WDRAW),
+ WDSTRATEGY, &du->dk_dd);
+*/
du->dk_flags &= ~DKFL_LABELLING;
if (msg != NULL) {
du->dk_dd = save_label;
@@ -1347,7 +1346,7 @@ wdioctl(dev_t dev, int cmd, caddr_t addr, int flag)
du->dk_openpart |= (1 << 0); /* XXX */
wlab = du->dk_wlabel;
du->dk_wlabel = 1;
- error = writedisklabel(dev, (d_strategy_t *) WDSTRATEGY,
+ error = writedisklabel(dev, WDSTRATEGY,
&du->dk_dd, du->dk_dospartitions);
du->dk_openpart = du->dk_copenpart | du->dk_bopenpart;
du->dk_wlabel = wlab;
@@ -1406,19 +1405,24 @@ wdsize(dev_t dev)
{
int lunit = wdunit(dev), part = wdpart(dev), val;
struct disk *du;
+ int size;
- if (lunit >= NWD || wddospart(dev) || (du = wddrives[lunit]) == NULL)
+ if (lunit >= NWD || wddospart(dev) || (du = wddrives[lunit]) == NULL) {
return (-1);
+ }
val = 0;
- if (du->dk_state == CLOSED)
+ if (du->dk_state == CLOSED) {
val = wdopen(makewddev(major(dev), lunit, WDRAW),
FREAD, S_IFBLK, 0);
- if (val != 0 || du->dk_flags & DKFL_WRITEPROT)
+ }
+ if (val != 0 || du->dk_flags & DKFL_WRITEPROT) {
return (-1);
- return ((int)du->dk_dd.d_partitions[part].p_size);
+ }
+ size = ((int)du->dk_dd.d_partitions[part].p_size);
+ return size;
}
-extern char *vmmap; /* poor name! */
+extern char *ptvmmap; /* poor name! */
/*
* Dump core after a system crash.
@@ -1580,7 +1584,7 @@ out:
return (EIO);
}
while (blkcnt != 0) {
- pmap_enter(kernel_pmap, CADDR1, trunc_page(addr),
+ pmap_enter(kernel_pmap, (vm_offset_t)CADDR1, trunc_page(addr),
VM_PROT_READ, TRUE);
/* Ready to send data? */
@@ -1685,7 +1689,7 @@ wdsleep(int ctrlr, char *wmesg)
}
static void
-wdtimeout(caddr_t cdu, int ticks)
+wdtimeout(caddr_t cdu)
{
struct disk *du;
int x;
@@ -1700,7 +1704,7 @@ wdtimeout(caddr_t cdu, int ticks)
du->dk_flags |= DKFL_SINGLE;
wdstart(du->dk_ctrlr);
}
- timeout(wdtimeout, cdu, hz);
+ timeout((timeout_func_t)wdtimeout, cdu, hz);
splx(x);
}
OpenPOWER on IntegriCloud