patch-2.4.0-test1 linux/drivers/ide/piix.c
Next file: linux/drivers/ide/via82cxxx.c
Previous file: linux/drivers/ide/ide.c
Back to the patch index
Back to the overall index
- Lines: 84
- Date:
Wed May 24 08:40:41 2000
- Orig file:
v2.3.99-pre9/linux/drivers/ide/piix.c
- Orig date:
Tue May 23 15:31:34 2000
diff -u --recursive --new-file v2.3.99-pre9/linux/drivers/ide/piix.c linux/drivers/ide/piix.c
@@ -86,7 +86,7 @@
u32 bibma = bmide_dev->resource[4].start;
u16 reg40 = 0, psitre = 0, reg42 = 0, ssitre = 0;
u8 c0 = 0, c1 = 0;
- u8 reg44 = 0, reg48 = 0, reg4a = 0, reg4b = 0, reg54 = 0;
+ u8 reg44 = 0, reg48 = 0, reg4a = 0, reg4b = 0, reg54 = 0, reg55 = 0;
pci_read_config_word(bmide_dev, 0x40, ®40);
pci_read_config_word(bmide_dev, 0x42, ®42);
@@ -95,6 +95,7 @@
pci_read_config_byte(bmide_dev, 0x4a, ®4a);
pci_read_config_byte(bmide_dev, 0x4b, ®4b);
pci_read_config_byte(bmide_dev, 0x54, ®54);
+ pci_read_config_byte(bmide_dev, 0x55, ®55);
psitre = (reg40 & 0x4000) ? 1 : 0;
ssitre = (reg42 & 0x4000) ? 1 : 0;
@@ -264,13 +265,15 @@
ide_hwif_t *hwif = HWIF(drive);
struct pci_dev *dev = hwif->pci_dev;
byte maslave = hwif->channel ? 0x42 : 0x40;
- int a_speed = 2 << (drive->dn * 4);
+ int a_speed = 3 << (drive->dn * 4);
int u_flag = 1 << drive->dn;
- int v_flag = 0x10 << drive->dn;
+ int v_flag = 0x01 << drive->dn;
+ int w_flag = 0x10 << drive->dn;
int u_speed = 0;
int err = 0;
int sitre;
short reg4042, reg44, reg48, reg4a, reg54;
+ byte reg55;
pci_read_config_word(dev, maslave, ®4042);
sitre = (reg4042 & 0x4000) ? 1 : 0;
@@ -278,6 +281,7 @@
pci_read_config_word(dev, 0x48, ®48);
pci_read_config_word(dev, 0x4a, ®4a);
pci_read_config_word(dev, 0x54, ®54);
+ pci_read_config_byte(dev, 0x55, ®55);
switch(speed) {
case XFER_UDMA_4:
@@ -294,6 +298,7 @@
if (speed >= XFER_UDMA_0) {
if (!(reg48 & u_flag))
pci_write_config_word(dev, 0x48, reg48|u_flag);
+ pci_write_config_byte(dev, 0x55, (byte) reg55 & ~w_flag);
if (!(reg4a & u_speed)) {
pci_write_config_word(dev, 0x4a, reg4a & ~a_speed);
pci_write_config_word(dev, 0x4a, reg4a|u_speed);
@@ -313,6 +318,8 @@
pci_write_config_word(dev, 0x4a, reg4a & ~a_speed);
if (reg54 & v_flag)
pci_write_config_word(dev, 0x54, reg54 & ~v_flag);
+ if (reg55 & w_flag)
+ pci_write_config_byte(dev, 0x55, (byte) reg55 & ~w_flag);
}
piix_tune_drive(drive, piix_dma_2_pio(speed));
@@ -404,10 +411,11 @@
unsigned int __init ata66_piix (ide_hwif_t *hwif)
{
byte reg54h = 0, reg55h = 0, ata66 = 0;
- byte mask = hwif->channel ? 0x0c : 0x03;
+ byte mask = hwif->channel ? 0xc0 : 0x30;
pci_read_config_byte(hwif->pci_dev, 0x54, ®54h);
pci_read_config_byte(hwif->pci_dev, 0x55, ®55h);
+
ata66 = (reg54h & mask) ? 1 : 0;
return ata66;
@@ -415,8 +423,10 @@
void __init ide_init_piix (ide_hwif_t *hwif)
{
+#ifndef CONFIG_IA64
if (!hwif->irq)
hwif->irq = hwif->channel ? 15 : 14;
+#endif /* CONFIG_IA64 */
hwif->tuneproc = &piix_tune_drive;
hwif->drives[0].autotune = 1;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)