Date: Mon, 11 Jan 1999 18:24:34 -0800 (PST) From: Andrew Sherrod <ixkatl@yahoo.com> To: current@FreeBSD.ORG Cc: ixkatl@yahoo.com Subject: Fwd: [Modified Patch] Re: i386/9431: wd.c Does nto recognize certain LBA disks [patch attached] Message-ID: <19990112022434.28366.rocketmail@send101.yahoomail.com>
next in thread | raw e-mail | index | archive | help
Have to correct myself.
My original message to -current:
> I think I found a problem in the wd.ccode which makes
> it unable to recognize certain LBA disks.
> The code assumes any LBA disk will return 16383 as the
> number of cylinders. In my case, at least (Award BIOS
> on a Tyan Trinity motherboard) two of the three disks
> do NOT return this number, so the disk size is
> underestimated by the kernel probes. [Yes, I DID fix
> this by putting on a DOS partition, but wouldn't it
> be nice to not have to rely on DOS partitions for
> disk geometry?]
> Well, I don't know if this fixes any other disk
> geometry problems, as I haven't tried it out very
> extensively, but this patch does make dmesg
> (and the boot time probes) return the correct number
> of sectors.
> Could anyone tell me if this breaks anything? And what
> the reasoning was behind the 16383 restriction. (After
> all, it only reaches that line of code if the LBA flag
> is set anyway. So we already know it is in LBA mode.
> The 16383 seems superfluous.)
> Andrew Sherrod
[Patch omitted]
---------------------------------------------------
My follow-up post to GNATS:
> Correcting my own mistake here. (Never try to patch
>something too late at night.)
> The piece of code I changed was NOT inside the LBA
> flag portion. Insterad, it was in the "else" part
> of the "if lba_flag" code.
> The reason? It seems Award BIOS (at least some
> versions) do not return any flags when LBA is active.
> So, the patch still stands, it simply needs a better
> explanation.
> (I could really use the input of some disk gurus
> here. Any idea why the Award BIOS would NOT return
> any flags? And, more important, if LBA is not
> enabled, will any lba_size value be returned?Or if
> LBA is off is a null or 0 returned?)
> Proposed patches for 2.2.8 and 3.0.0 follow:
> *** wd.c.2_2_8 Mon Jan 11 20:59:44 1999
> --- wd.c.original.2_2_8 Mon Jan 11 20:41:01 1999
> ***************
> *** 1727,1740 ****
> 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_secperunit = du->dk_dd.d_secpercyl *
du->dk_dd.d_ncylinders;
> ! /* It appears that Award BIOSes (At least the more recent
> ! versions) do not return an LBA flag when probed. However,
> ! as an LBA size should not be returned when LBA mode is
not
> ! active, this hack seems safe.
> !
> ! A. Sherrod 01/11/1998 */
> !
> ! if(du->dk_dd.d_secperunit < wp->wdp_lbasize) {
> du->dk_dd.d_secperunit = wp->wdp_lbasize;
> du->dk_dd.d_ncylinders =
> du->dk_dd.d_secperunit / du->dk_dd.d_secpercyl;
> --- 1727,1734 ----
> 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_secperunit = du->dk_dd.d_secpercyl *
du->dk_dd.d_ncylinders;
> ! if (wp->wdp_cylinders == 16383 &&
> ! du->dk_dd.d_secperunit < wp->wdp_lbasize) {
> du->dk_dd.d_secperunit = wp->wdp_lbasize;
> du->dk_dd.d_ncylinders =
> du->dk_dd.d_secperunit / du->dk_dd.d_secpercyl;
> >
> *** wd.c.3_0 Mon Jan 11 21:01:30 1999
> --- wd.c.original.3_0 Sun Jan 10 21:27:22 1999
> ***************
> *** 1949,1964 ****
> du->dk_dd.d_ntracks * du->dk_dd.d_nsectors;
> du->dk_dd.d_secperunit =
> du->dk_dd.d_secpercyl * du->dk_dd.d_ncylinders;
> !
> ! /* It appears that certain Award BIOSes (newer versions
> ! apparently) do not return LBA flags when LBA is
> ! active. Hwoever, as LBA size should not be returned
> ! when LBA is off, this hack should be safe.
> !
> ! A. Sherrod 01/11/1998 */
> !
> !
> ! if(du->dk_dd.d_secperunit < wp->wdp_lbasize) {
> du->dk_dd.d_secperunit = wp->wdp_lbasize;
> du->dk_dd.d_ncylinders =
> du->dk_dd.d_secperunit / du->dk_dd.d_secpercyl;
> --- 1949,1956 ----
> du->dk_dd.d_ntracks * du->dk_dd.d_nsectors;
> du->dk_dd.d_secperunit =
> du->dk_dd.d_secpercyl * du->dk_dd.d_ncylinders;
> ! if (wp->wdp_cylinders == 16383 &&
> ! du->dk_dd.d_secperunit < wp->wdp_lbasize) {
> du->dk_dd.d_secperunit = wp->wdp_lbasize;
> du->dk_dd.d_ncylinders =
> du->dk_dd.d_secperunit / du->dk_dd.d_secpercyl;
>
_________________________________________________________
DO YOU YAHOO!?
Get your free @yahoo.com address at http://mail.yahoo.com
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19990112022434.28366.rocketmail>
