aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/pci/slc90e66.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/pci/slc90e66.c')
-rw-r--r--drivers/ide/pci/slc90e66.c22
1 files changed, 6 insertions, 16 deletions
diff --git a/drivers/ide/pci/slc90e66.c b/drivers/ide/pci/slc90e66.c
index 628b0664f576..ae8e91324577 100644
--- a/drivers/ide/pci/slc90e66.c
+++ b/drivers/ide/pci/slc90e66.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * linux/drivers/ide/pci/slc90e66.c Version 0.15 Jul 6, 2007 2 * linux/drivers/ide/pci/slc90e66.c Version 0.16 Jul 14, 2007
3 * 3 *
4 * Copyright (C) 2000-2002 Andre Hedrick <andre@linux-ide.org> 4 * Copyright (C) 2000-2002 Andre Hedrick <andre@linux-ide.org>
5 * Copyright (C) 2006-2007 MontaVista Software, Inc. <source@mvista.com> 5 * Copyright (C) 2006-2007 MontaVista Software, Inc. <source@mvista.com>
@@ -95,19 +95,17 @@ static void slc90e66_tune_pio (ide_drive_t *drive, u8 pio)
95 spin_unlock_irqrestore(&ide_lock, flags); 95 spin_unlock_irqrestore(&ide_lock, flags);
96} 96}
97 97
98static void slc90e66_tune_drive (ide_drive_t *drive, u8 pio) 98static void slc90e66_set_pio_mode(ide_drive_t *drive, const u8 pio)
99{ 99{
100 pio = ide_get_best_pio_mode(drive, pio, 4);
101 slc90e66_tune_pio(drive, pio); 100 slc90e66_tune_pio(drive, pio);
102 (void) ide_config_drive_speed(drive, XFER_PIO_0 + pio); 101 (void) ide_config_drive_speed(drive, XFER_PIO_0 + pio);
103} 102}
104 103
105static int slc90e66_tune_chipset (ide_drive_t *drive, u8 xferspeed) 104static int slc90e66_tune_chipset(ide_drive_t *drive, const u8 speed)
106{ 105{
107 ide_hwif_t *hwif = HWIF(drive); 106 ide_hwif_t *hwif = HWIF(drive);
108 struct pci_dev *dev = hwif->pci_dev; 107 struct pci_dev *dev = hwif->pci_dev;
109 u8 maslave = hwif->channel ? 0x42 : 0x40; 108 u8 maslave = hwif->channel ? 0x42 : 0x40;
110 u8 speed = ide_rate_filter(drive, xferspeed);
111 int sitre = 0, a_speed = 7 << (drive->dn * 4); 109 int sitre = 0, a_speed = 7 << (drive->dn * 4);
112 int u_speed = 0, u_flag = 1 << drive->dn; 110 int u_speed = 0, u_flag = 1 << drive->dn;
113 u16 reg4042, reg44, reg48, reg4a; 111 u16 reg4042, reg44, reg48, reg4a;
@@ -127,11 +125,6 @@ static int slc90e66_tune_chipset (ide_drive_t *drive, u8 xferspeed)
127 case XFER_MW_DMA_2: 125 case XFER_MW_DMA_2:
128 case XFER_MW_DMA_1: 126 case XFER_MW_DMA_1:
129 case XFER_SW_DMA_2: break; 127 case XFER_SW_DMA_2: break;
130 case XFER_PIO_4:
131 case XFER_PIO_3:
132 case XFER_PIO_2:
133 case XFER_PIO_1:
134 case XFER_PIO_0: break;
135 default: return -1; 128 default: return -1;
136 } 129 }
137 130
@@ -151,10 +144,7 @@ static int slc90e66_tune_chipset (ide_drive_t *drive, u8 xferspeed)
151 pci_write_config_word(dev, 0x4a, reg4a & ~a_speed); 144 pci_write_config_word(dev, 0x4a, reg4a & ~a_speed);
152 } 145 }
153 146
154 if (speed > XFER_PIO_4) 147 slc90e66_tune_pio(drive, slc90e66_dma_2_pio(speed));
155 slc90e66_tune_pio(drive, slc90e66_dma_2_pio(speed));
156 else
157 slc90e66_tune_pio(drive, speed - XFER_PIO_0);
158 148
159 return ide_config_drive_speed(drive, speed); 149 return ide_config_drive_speed(drive, speed);
160} 150}
@@ -167,7 +157,7 @@ static int slc90e66_config_drive_xfer_rate (ide_drive_t *drive)
167 return 0; 157 return 0;
168 158
169 if (ide_use_fast_pio(drive)) 159 if (ide_use_fast_pio(drive))
170 slc90e66_tune_drive(drive, 255); 160 ide_set_max_pio(drive);
171 161
172 return -1; 162 return -1;
173} 163}
@@ -183,7 +173,7 @@ static void __devinit init_hwif_slc90e66 (ide_hwif_t *hwif)
183 hwif->irq = hwif->channel ? 15 : 14; 173 hwif->irq = hwif->channel ? 15 : 14;
184 174
185 hwif->speedproc = &slc90e66_tune_chipset; 175 hwif->speedproc = &slc90e66_tune_chipset;
186 hwif->tuneproc = &slc90e66_tune_drive; 176 hwif->set_pio_mode = &slc90e66_set_pio_mode;
187 177
188 pci_read_config_byte(hwif->pci_dev, 0x47, &reg47); 178 pci_read_config_byte(hwif->pci_dev, 0x47, &reg47);
189 179