Re: Disk Performance Issues [AMD Viper plus IDE chipset problems. (wrong udma "autodetection")]

From: Miguel S Filipe (m3thos@netcabo.pt)
Date: Wed Nov 20 2002 - 15:10:36 EST


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Manish Lachwani wrote:
| I have noticed something with the IDE drivers especially with the Seagate
| drives. The promise driver (eg 20277) detects the UDMA 5 mode correctly.
|
| This is what it does:
|
| byte ultra_66 = ((id->dma_ultra & 0x0010) ||
| (id->dma_ultra & 0x0008)) ? 1 : 0;
| byte ultra_100 = ((id->dma_ultra & 0x0020) ||
| (ultra_66)) ? 1 : 0;
| byte ultra_133 = ((id->dma_ultra & 0x0040) ||
| (ultra_100)) ? 1 : 0;
|
| Now, lets take a PIIX driver
|
| int ultra100 = ((dev->device ==
| PCI_DEVICE_ID_INTEL_82801BA_8) ||
| (dev->device ==
| PCI_DEVICE_ID_INTEL_82801BA_9) ||
| (dev->device ==
| PCI_DEVICE_ID_INTEL_82801CA_10)) ? 1 : 0;
| int ultra66 = ((ultra100) ||
| (dev->device ==
| PCI_DEVICE_ID_INTEL_82801AA_1) ||
| (dev->device ==
| PCI_DEVICE_ID_INTEL_82372FB_1)) ? 1 : 0;
|
| if ((id->dma_ultra & 0x0020) && (udma_66) && (ultra100)) {
| speed = XFER_UDMA_5;
|
| where ultra100 and ultra66 is not or'ed with 0x0010 and 0x0008. The final
| check is only with 0x0020. I have found this issues with other IDE drivers
| like amd74xx.c, serverworks.c etc. SO, make the above changes in the
drivers
| and u should see UDMA 5 on those seagate drives on startup ...
|
| Thanks
| Manish
Okay, now, i've been looking in drivers/ide/amd74xx.c
and
config_chipset_for_dma(ide_drive_t)
has:
byte udma_66 = eighty_ninty_three(drive);
byte udma_100 = ((dev->device==PCI_DEVICE_ID_AMD_VIPER_7411)||

(dev->device==PCI_DEVICE_ID_AMD_VIPER_7441)) ? 1 : 0;

and.. also.. like you've said:
if ((id->dma_ultra & 0x0020) && (udma_66) && (udma_100)) {
~ speed = XFER_UDMA_5;

now.. my lame question is:
should I put:
byte udma66 = (eighty_ninty_three(drive) & 0x0010 ||
               eighty_ninty_three(drive) & 0x0008) ? 1 : 0;
or eighty_ninty_three (ide_drive_t *drive), or even some other thing be
the one that should be changed for a proper fix. (if this is really the
way to solve it)

One other thing...
in config_chipset_for_dma() right after the declarations we have:

if(udma_100)
        udma_66 = eighty_ninty_three(drive);

is this really needed, since udma_66 is declared and initialized with
that same value?

Sorry if this are lame questions, just trying to learn... :-\

Thanks
Miguel Sousa Filipe

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQE92+w8YBjDU2rJcrARAolPAJ4xi1LIpGcNUTUlGY+Qg9ZlzABxSQCcDBzl
Q/y4q7IiE0O5HllvTD877ZU=
=RBMC
-----END PGP SIGNATURE-----

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Nov 23 2002 - 22:00:33 EST