summaryrefslogtreecommitdiff
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.c54
1 files changed, 25 insertions, 29 deletions
diff --git a/sys/i386/isa/wd.c b/sys/i386/isa/wd.c
index 488615575464f..6a5f73023a177 100644
--- a/sys/i386/isa/wd.c
+++ b/sys/i386/isa/wd.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)wd.c 7.2 (Berkeley) 5/9/91
- * $Id: wd.c,v 1.185 1999/01/16 01:06:23 bde Exp $
+ * $Id: wd.c,v 1.176 1998/09/15 08:15:30 gibbs Exp $
*/
/* TODO:
@@ -67,8 +67,8 @@
#include "opt_atapi.h"
#include "opt_devfs.h"
#include "opt_hw_wdog.h"
-#include "opt_ide_delay.h"
#include "opt_wd.h"
+#include "pci.h"
#include <sys/param.h>
#include <sys/dkbad.h>
@@ -106,11 +106,7 @@
extern void wdstart(int ctrlr);
-#ifdef IDE_DELAY
-#define TIMEOUT IDE_DELAY
-#else
#define TIMEOUT 10000
-#endif
#define RETRIES 5 /* number of retries before giving up */
#define RECOVERYTIME 500000 /* usec for controller to recover after err */
#define MAXTRANSFER 255 /* max size of transfer in sectors */
@@ -311,16 +307,19 @@ wdprobe(struct isa_device *dvp)
du->dk_ctrlr = dvp->id_unit;
interface = du->dk_ctrlr / 2;
du->dk_interface = interface;
- du->dk_port = dvp->id_iobase;
- if (wddma[interface].wdd_candma != NULL) {
- du->dk_dmacookie =
- wddma[interface].wdd_candma(dvp->id_iobase, du->dk_ctrlr,
- du->dk_unit);
- du->dk_altport =
- wddma[interface].wdd_altiobase(du->dk_dmacookie);
- }
- if (du->dk_altport == 0)
+#if !defined(DISABLE_PCI_IDE) && (NPCI > 0)
+ if (wddma[interface].wdd_candma) {
+ du->dk_dmacookie = wddma[interface].wdd_candma(dvp->id_iobase, du->dk_ctrlr);
+ du->dk_port = dvp->id_iobase;
+ du->dk_altport = wddma[interface].wdd_altiobase(du->dk_dmacookie);
+ } else {
+ du->dk_port = dvp->id_iobase;
du->dk_altport = du->dk_port + wd_ctlr;
+ }
+#else
+ du->dk_port = dvp->id_iobase;
+ du->dk_altport = du->dk_port + wd_ctlr;
+#endif
/* check if we have registers that work */
outb(du->dk_port + wd_sdh, WDSD_IBM); /* set unit 0 */
@@ -423,8 +422,6 @@ wdattach(struct isa_device *dvp)
struct disk *du;
struct wdparams *wp;
- dvp->id_intr = wdintr;
-
if (dvp->id_unit >= NWDC)
return (0);
@@ -665,17 +662,17 @@ wdstrategy(register struct buf *bp)
/* queue transfer on drive, activate drive and controller if idle */
s = splbio();
+ bufqdisksort(&drive_queue[lunit], bp);
+
+ if (wdutab[lunit].b_active == 0)
+ wdustart(du); /* start drive */
+
/* Pick up changes made by readdisklabel(). */
if (du->dk_flags & DKFL_LABELLING && du->dk_state > RECAL) {
wdsleep(du->dk_ctrlr, "wdlab");
du->dk_state = WANTOPEN;
}
- bufqdisksort(&drive_queue[lunit], bp);
-
- if (wdutab[lunit].b_active == 0)
- wdustart(du); /* start drive */
-
#ifdef CMD640
if (wdtab[du->dk_ctrlr_cmd640].b_active == 0)
#else
@@ -1033,12 +1030,11 @@ wdstart(int ctrlr)
*/
void
-wdintr(void *unitnum)
+wdintr(int unit)
{
register struct disk *du;
register struct buf *bp;
int dmastat = 0; /* Shut up GCC */
- int unit = (int)unitnum;
#ifdef CMD640
int ctrlr_atapi;
@@ -1087,7 +1083,8 @@ wdintr(void *unitnum)
if (du->dk_flags & (DKFL_DMA|DKFL_USEDMA)) {
/* XXX SMP boxes sometimes generate an early intr. Why? */
if ((wddma[du->dk_interface].wdd_dmastatus(du->dk_dmacookie) & WDDS_INTERRUPT)
- != 0)
+ == 0)
+ return;
dmastat = wddma[du->dk_interface].wdd_dmadone(du->dk_dmacookie);
}
@@ -1879,8 +1876,7 @@ failed:
* check drive's DMA capability
*/
if (wddma[du->dk_interface].wdd_candma) {
- du->dk_dmacookie = wddma[du->dk_interface].wdd_candma(
- du->dk_port, du->dk_ctrlr, du->dk_unit);
+ du->dk_dmacookie = wddma[du->dk_interface].wdd_candma(du->dk_port, du->dk_ctrlr);
/* does user want this? */
if ((du->cfg_flags & WDOPT_DMA) &&
/* have we got a DMA controller? */
@@ -2253,11 +2249,11 @@ static void
wderror(struct buf *bp, struct disk *du, char *mesg)
{
if (bp == NULL)
- printf("wd%d: %s", du->dk_lunit, mesg);
+ printf("wd%d: %s:\n", du->dk_lunit, mesg);
else
diskerr(bp, "wd", mesg, LOG_PRINTF, du->dk_skip,
dsgetlabel(bp->b_dev, du->dk_slices));
- printf(" (status %b error %b)\n",
+ printf("wd%d: status %b error %b\n", du->dk_lunit,
du->dk_status, WDCS_BITS, du->dk_error, WDERR_BITS);
}