diff options
Diffstat (limited to 'drivers/ide/pci/sis5513.c')
-rw-r--r-- | drivers/ide/pci/sis5513.c | 99 |
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 | ||
308 | static void sis_set_dma_mode(ide_drive_t *drive, const u8 speed) | 308 | static 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, ®dw); |
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, ®dw); | 327 | static 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, ®); |
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, ®); | 342 | } |
342 | /* Force the UDMA bit on if we want to use UDMA */ | 343 | |
343 | reg |= 0x80; | 344 | static 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 | } | 352 | static 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 | ||
363 | static u8 sis5513_ata133_udma_filter(ide_drive_t *drive) | 360 | static u8 sis5513_ata133_udma_filter(ide_drive_t *drive) |