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/