diff options
| author | deraadt <deraadt@NetBSD.org> | 1993-05-10 05:53:22 +0000 |
|---|---|---|
| committer | deraadt <deraadt@NetBSD.org> | 1993-05-10 05:53:22 +0000 |
| commit | 545cc18754f17cbb77c4c80574b90f6ced122161 (patch) | |
| tree | dd0207cf05a30f0de80aad54360e0b1368e55a85 /sys/dev | |
| parent | 3558cc99e402609a4cb6bd642111c7ee06b1f273 (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')
| -rw-r--r-- | sys/dev/ata/wd.c | 118 | ||||
| -rw-r--r-- | sys/dev/isa/wd.c | 118 |
2 files changed, 130 insertions, 106 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); diff --git a/sys/dev/isa/wd.c b/sys/dev/isa/wd.c index 23f9b945591..c15c627eb62 100644 --- a/sys/dev/isa/wd.c +++ b/sys/dev/isa/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); |
