summaryrefslogtreecommitdiff
path: root/sys/dev/ata
diff options
context:
space:
mode:
authorderaadt <deraadt@NetBSD.org>1993-05-10 05:53:22 +0000
committerderaadt <deraadt@NetBSD.org>1993-05-10 05:53:22 +0000
commit545cc18754f17cbb77c4c80574b90f6ced122161 (patch)
treedd0207cf05a30f0de80aad54360e0b1368e55a85 /sys/dev/ata
parent3558cc99e402609a4cb6bd642111c7ee06b1f273 (diff)
This patch allows the wd device driver to tell how big the disks are on
WD1007-derived controllers. In this example, wdc0 is a WD1007-clone, and wdc1 is a WD1003-clone. WD1007 controllers are generally ESDI and IDE controllers. wdc0 at 0x1f0-0x1f7 irq 14 on isa wd0 at wdc0 targ 0: 322MB 1224 cyl, 15 head, 36 sec <disktype> wdc1 at 0x170-0x17f irq 7 on isa wd2 at wdc1 targ 0: (unknown size) <disktype>
Diffstat (limited to 'sys/dev/ata')
-rw-r--r--sys/dev/ata/wd.c118
1 files changed, 65 insertions, 53 deletions
diff --git a/sys/dev/ata/wd.c b/sys/dev/ata/wd.c
index 23f9b945591..c15c627eb62 100644
--- a/sys/dev/ata/wd.c
+++ b/sys/dev/ata/wd.c
@@ -38,7 +38,7 @@
/* Note: This code heavily modified by tih@barsoom.nhh.no; use at own risk! */
/* The following defines represent only a very small part of the mods, most */
-/* of them are not marked in any way. -tih */
+/* of them are not marked in any way. -tih */
#undef WDOPENLOCK /* Prevent reentrancy in wdopen() for testing */
#define TIHMODS /* wdopen() workaround, some splx() calls */
@@ -230,9 +230,7 @@ int
wdattach(struct isa_device *dvp)
{
int unit, lunit;
- struct isa_device *wdup;
struct disk *du;
- int first = 0;
if (dvp->id_masunit == -1)
return(0);
@@ -263,8 +261,15 @@ wdattach(struct isa_device *dvp)
if(wdgetctlr(unit, du) == 0) {
int i, blank;
- printf("wd%d at wdc%d slave %d: <",
- lunit, dvp->id_masunit, unit);
+ printf("wd%d at wdc%d targ %d: ",
+ dvp->id_unit, dvp->id_masunit, dvp->id_physid);
+ if(du->dk_params.wdp_heads==0)
+ printf("(unknown size) <");
+ else
+ printf("%dMB %d cyl, %d head, %d sec <",
+ du->dk_dd.d_ncylinders * du->dk_dd.d_secpercyl / 2048,
+ du->dk_dd.d_ncylinders, du->dk_dd.d_ntracks,
+ du->dk_dd.d_nsectors);
for (i=blank=0; i<sizeof(du->dk_params.wdp_model); i++) {
char c = du->dk_params.wdp_model[i];
if (blank && c == ' ')
@@ -282,7 +287,7 @@ wdattach(struct isa_device *dvp)
printf(">\n");
} else {
/*printf("wd%d at wdc%d slave %d -- error\n",
- lunit, dvp->id_masunit, unit); */
+ lunit, dvp->id_masunit, unit);*/
wddrives[lunit] = 0;
free(du, M_TEMP);
return 0;
@@ -627,7 +632,7 @@ wdintr(struct intrframe wdif)
#ifdef WDDEBUG
printf("I%d ", ctrlr);
#endif
-
+
while ((status = inb(wdc+wd_status)) & WDCS_BUSY)
;
@@ -1135,59 +1140,66 @@ wdgetctlr(int u, struct disk *du)
}
#endif
- /*
- * If WDCC_READP fails then we might have an old drive so we try
- * a seek to 0; if that passes then the drive is there but it's
- * OLD AND KRUSTY.
- */
- if (stat & WDCS_ERR) {
- stat = wdcommand(du, WDCC_RESTORE | WD_STEP);
- if(stat & WDCS_ERR) {
- splx(x);
- return(inb(wdc+wd_error));
+ if( (stat & WDCS_ERR) == 0) {
+ /* obtain parameters */
+ wp = &du->dk_params;
+ insw(wdc+wd_data, tb, sizeof(tb)/sizeof(short));
+ bcopy(tb, wp, sizeof(struct wdparams));
+
+ /* shuffle string byte order */
+ for (i=0; i < sizeof(wp->wdp_model); i+=2) {
+ u_short *p;
+ p = (u_short *) (wp->wdp_model + i);
+ *p = ntohs(*p);
}
- stat = 0x7f; /* MFM/RLL marker for later. */
- }
-
- /* obtain parameters */
- wp = &du->dk_params;
- insw(wdc+wd_data, tb, sizeof(tb)/sizeof(short));
- bcopy(tb, wp, sizeof(struct wdparams));
-
- /* shuffle string byte order */
- for (i=0; i < sizeof(wp->wdp_model); i+=2) {
- u_short *p;
- p = (u_short *) (wp->wdp_model + i);
- *p = ntohs(*p);
- }
-/*
- printf("gc %x cyl %d trk %d sec %d type %d sz %d model %s\n", wp->wdp_config,
- wp->wdp_fixedcyl+wp->wdp_removcyl, wp->wdp_heads, wp->wdp_sectors,
- wp->wdp_cntype, wp->wdp_cnsbsz, wp->wdp_model);
-*/
-
- /* update disklabel given drive information */
- du->dk_dd.d_ncylinders = wp->wdp_fixedcyl + wp->wdp_removcyl /*+- 1*/;
- du->dk_dd.d_ntracks = wp->wdp_heads;
- du->dk_dd.d_nsectors = wp->wdp_sectors;
- du->dk_dd.d_secpercyl = du->dk_dd.d_ntracks * du->dk_dd.d_nsectors;
- du->dk_dd.d_partitions[1].p_size = du->dk_dd.d_secpercyl * wp->wdp_sectors;
- du->dk_dd.d_partitions[1].p_offset = 0;
+ strncpy(du->dk_dd.d_typename, "ESDI/IDE", sizeof du->dk_dd.d_typename);
+ du->dk_dd.d_type = DTYPE_ESDI;
+ bcopy(wp->wdp_model+20, du->dk_dd.d_packname, 14-1);
+
+ /* update disklabel given drive information */
+ du->dk_dd.d_ncylinders = wp->wdp_fixedcyl + wp->wdp_removcyl /*+- 1*/;
+ du->dk_dd.d_ntracks = wp->wdp_heads;
+ du->dk_dd.d_nsectors = wp->wdp_sectors;
+ du->dk_dd.d_secpercyl = du->dk_dd.d_ntracks * du->dk_dd.d_nsectors;
+ du->dk_dd.d_partitions[1].p_size = du->dk_dd.d_secpercyl *
+ wp->wdp_sectors;
+ du->dk_dd.d_partitions[1].p_offset = 0;
+ } else {
+ /*
+ * If WDCC_READP fails then we might have an old drive
+ * so we try a seek to 0; if that passes then the
+ * drive is there but it's OLD AND KRUSTY.
+ */
+ stat = wdcommand(du, WDCC_RESTORE | WD_STEP);
+ if(stat & WDCS_ERR) {
+ splx(x);
+ return(inb(wdc+wd_error));
+ }
- /* dubious ... */
- if(stat == 0x7f) {
strncpy(du->dk_dd.d_typename, "ST506", sizeof du->dk_dd.d_typename);
for(i=0; i<sizeof(wp->wdp_model); i++)
wp->wdp_model[i] = ' ';
strncpy(du->dk_params.wdp_model, "Unknown Type",
sizeof du->dk_params.wdp_model);
du->dk_dd.d_type = DTYPE_ST506;
- } else {
- strncpy(du->dk_dd.d_typename, "ESDI/IDE", sizeof du->dk_dd.d_typename);
- du->dk_dd.d_type = DTYPE_ESDI;
- bcopy(wp->wdp_model+20, du->dk_dd.d_packname, 14-1);
+
+ /* XXX -- HOW DO WE FAKE THIS?? */
+ du->dk_dd.d_ncylinders = wp->wdp_fixedcyl + wp->wdp_removcyl /*+- 1*/;
+ du->dk_dd.d_ntracks = wp->wdp_heads;
+ du->dk_dd.d_nsectors = wp->wdp_sectors;
+ du->dk_dd.d_secpercyl = du->dk_dd.d_ntracks * du->dk_dd.d_nsectors;
+ du->dk_dd.d_partitions[1].p_size = du->dk_dd.d_secpercyl *
+ wp->wdp_sectors;
+ du->dk_dd.d_partitions[1].p_offset = 0;
}
+
+#if 0
+ printf("gc %x cyl %d trk %d sec %d type %d sz %d model %s\n", wp->wdp_config,
+ wp->wdp_fixedcyl+wp->wdp_removcyl, wp->wdp_heads, wp->wdp_sectors,
+ wp->wdp_cntype, wp->wdp_cnsbsz, wp->wdp_model);
+#endif
+
/* better ... */
du->dk_dd.d_subtype |= DSTYPE_GEOMETRY;
@@ -1289,7 +1301,7 @@ wdioctl(dev_t dev, int cmd, caddr_t addr, int flag)
wdsetctlr(dev, du);
/* simulate opening partition 0 so write succeeds */
- du->dk_openpart |= (1 << 0); /* XXX */
+ du->dk_openpart |= (1 << 0); /* XXX */
wlab = du->dk_wlabel;
du->dk_wlabel = 1;
error = writedisklabel(dev, wdstrategy,
@@ -1368,7 +1380,7 @@ wdsize(dev_t dev)
return((int)du->dk_dd.d_partitions[part].p_size);
}
-extern char *vmmap; /* poor name! */
+extern char *vmmap; /* poor name! */
/* dump core after a system crash */
int
@@ -1502,7 +1514,7 @@ wddump(dev_t dev)
if (inb(wdc+wd_status) & WDCS_ERR)
return(EIO);
- /* Check data request (should be done). */
+ /* Check data request (should be done). */
if (inb(wdc+wd_status) & WDCS_DRQ)
return(EIO);