aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/pci/sis5513.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/pci/sis5513.c')
-rw-r--r--drivers/ide/pci/sis5513.c99
1 files changed, 48 insertions, 51 deletions
diff --git a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c
index d90b42917775..85d36996e6af 100644
--- a/drivers/ide/pci/sis5513.c
+++ b/drivers/ide/pci/sis5513.c
@@ -305,59 +305,56 @@ static void sis_set_pio_mode(ide_drive_t *drive, const u8 pio)
305 sis_program_timings(drive, XFER_PIO_0 + pio); 305 sis_program_timings(drive, XFER_PIO_0 + pio);
306} 306}
307 307
308static void sis_set_dma_mode(ide_drive_t *drive, const u8 speed) 308static void sis_ata133_program_udma_timings(ide_drive_t *drive, const u8 mode)
309{ 309{
310 ide_hwif_t *hwif = HWIF(drive); 310 struct pci_dev *dev = drive->hwif->pci_dev;
311 struct pci_dev *dev = hwif->pci_dev; 311 u32 regdw = 0;
312 u8 drive_pci = sis_ata133_get_base(drive), clk, idx;
312 313
313 /* Config chip for mode */ 314 pci_read_config_dword(dev, drive_pci, &regdw);
314 switch(speed) { 315
315 case XFER_UDMA_6: 316 regdw |= 0x04;
316 case XFER_UDMA_5: 317 regdw &= 0xfffff00f;
317 case XFER_UDMA_4: 318 /* check if ATA133 enable */
318 case XFER_UDMA_3: 319 clk = (regdw & 0x08) ? ATA_133 : ATA_100;
319 case XFER_UDMA_2: 320 idx = mode - XFER_UDMA_0;
320 case XFER_UDMA_1: 321 regdw |= cycle_time_value[clk][idx] << 4;
321 case XFER_UDMA_0: 322 regdw |= cvs_time_value[clk][idx] << 8;
322 if (chipset_family >= ATA_133) { 323
323 u32 regdw = 0; 324 pci_write_config_dword(dev, drive_pci, regdw);
324 u8 drive_pci = sis_ata133_get_base(drive); 325}
325 326
326 pci_read_config_dword(dev, drive_pci, &regdw); 327static void sis_ata33_program_udma_timings(ide_drive_t *drive, const u8 mode)
327 regdw |= 0x04; 328{
328 regdw &= 0xfffff00f; 329 struct pci_dev *dev = drive->hwif->pci_dev;
329 /* check if ATA133 enable */ 330 u8 drive_pci = 0x40 + drive->dn * 2, reg = 0, i = chipset_family;
330 if (regdw & 0x08) { 331
331 regdw |= (unsigned long)cycle_time_value[ATA_133][speed-XFER_UDMA_0] << 4; 332 pci_read_config_byte(dev, drive_pci + 1, &reg);
332 regdw |= (unsigned long)cvs_time_value[ATA_133][speed-XFER_UDMA_0] << 8; 333
333 } else { 334 /* force the UDMA bit on if we want to use UDMA */
334 regdw |= (unsigned long)cycle_time_value[ATA_100][speed-XFER_UDMA_0] << 4; 335 reg |= 0x80;
335 regdw |= (unsigned long)cvs_time_value[ATA_100][speed-XFER_UDMA_0] << 8; 336 /* clean reg cycle time bits */
336 } 337 reg &= ~((0xff >> (8 - cycle_time_range[i])) << cycle_time_offset[i]);
337 pci_write_config_dword(dev, (unsigned long)drive_pci, regdw); 338 /* set reg cycle time bits */
338 } else { 339 reg |= cycle_time_value[i][mode - XFER_UDMA_0] << cycle_time_offset[i];
339 u8 drive_pci = 0x40 + drive->dn * 2, reg = 0; 340
340 341 pci_write_config_byte(dev, drive_pci + 1, reg);
341 pci_read_config_byte(dev, drive_pci+1, &reg); 342}
342 /* Force the UDMA bit on if we want to use UDMA */ 343
343 reg |= 0x80; 344static void sis_program_udma_timings(ide_drive_t *drive, const u8 mode)
344 /* clean reg cycle time bits */ 345{
345 reg &= ~((0xFF >> (8 - cycle_time_range[chipset_family])) 346 if (chipset_family >= ATA_133) /* ATA_133 */
346 << cycle_time_offset[chipset_family]); 347 sis_ata133_program_udma_timings(drive, mode);
347 /* set reg cycle time bits */ 348 else /* ATA_33/66/100a/100/133a */
348 reg |= cycle_time_value[chipset_family][speed-XFER_UDMA_0] 349 sis_ata33_program_udma_timings(drive, mode);
349 << cycle_time_offset[chipset_family]; 350}
350 pci_write_config_byte(dev, drive_pci+1, reg); 351
351 } 352static void sis_set_dma_mode(ide_drive_t *drive, const u8 speed)
352 break; 353{
353 case XFER_MW_DMA_2: 354 if (speed >= XFER_UDMA_0)
354 case XFER_MW_DMA_1: 355 sis_program_udma_timings(drive, speed);
355 case XFER_MW_DMA_0: 356 else
356 sis_program_timings(drive, speed); 357 sis_program_timings(drive, speed);
357 break;
358 default:
359 break;
360 }
361} 358}
362 359
363static u8 sis5513_ata133_udma_filter(ide_drive_t *drive) 360static u8 sis5513_ata133_udma_filter(ide_drive_t *drive)