diff options
| -rw-r--r-- | drivers/ide/pci/sis5513.c | 78 |
1 files changed, 45 insertions, 33 deletions
diff --git a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c index d90b42917775..3f35386d9cad 100644 --- a/drivers/ide/pci/sis5513.c +++ b/drivers/ide/pci/sis5513.c | |||
| @@ -305,11 +305,52 @@ 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; | ||
| 313 | |||
| 314 | pci_read_config_dword(dev, drive_pci, ®dw); | ||
| 315 | |||
| 316 | regdw |= 0x04; | ||
| 317 | regdw &= 0xfffff00f; | ||
| 318 | /* check if ATA133 enable */ | ||
| 319 | clk = (regdw & 0x08) ? ATA_133 : ATA_100; | ||
| 320 | idx = mode - XFER_UDMA_0; | ||
| 321 | regdw |= cycle_time_value[clk][idx] << 4; | ||
| 322 | regdw |= cvs_time_value[clk][idx] << 8; | ||
| 323 | |||
| 324 | pci_write_config_dword(dev, drive_pci, regdw); | ||
| 325 | } | ||
| 326 | |||
| 327 | static void sis_ata33_program_udma_timings(ide_drive_t *drive, const u8 mode) | ||
| 328 | { | ||
| 329 | struct pci_dev *dev = drive->hwif->pci_dev; | ||
| 330 | u8 drive_pci = 0x40 + drive->dn * 2, reg = 0, i = chipset_family; | ||
| 331 | |||
| 332 | pci_read_config_byte(dev, drive_pci + 1, ®); | ||
| 312 | 333 | ||
| 334 | /* force the UDMA bit on if we want to use UDMA */ | ||
| 335 | reg |= 0x80; | ||
| 336 | /* clean reg cycle time bits */ | ||
| 337 | reg &= ~((0xff >> (8 - cycle_time_range[i])) << cycle_time_offset[i]); | ||
| 338 | /* set reg cycle time bits */ | ||
| 339 | reg |= cycle_time_value[i][mode - XFER_UDMA_0] << cycle_time_offset[i]; | ||
| 340 | |||
| 341 | pci_write_config_byte(dev, drive_pci + 1, reg); | ||
| 342 | } | ||
| 343 | |||
| 344 | static void sis_program_udma_timings(ide_drive_t *drive, const u8 mode) | ||
| 345 | { | ||
| 346 | if (chipset_family >= ATA_133) /* ATA_133 */ | ||
| 347 | sis_ata133_program_udma_timings(drive, mode); | ||
| 348 | else /* ATA_33/66/100a/100/133a */ | ||
| 349 | sis_ata33_program_udma_timings(drive, mode); | ||
| 350 | } | ||
| 351 | |||
| 352 | static void sis_set_dma_mode(ide_drive_t *drive, const u8 speed) | ||
| 353 | { | ||
| 313 | /* Config chip for mode */ | 354 | /* Config chip for mode */ |
| 314 | switch(speed) { | 355 | switch(speed) { |
| 315 | case XFER_UDMA_6: | 356 | case XFER_UDMA_6: |
| @@ -319,36 +360,7 @@ static void sis_set_dma_mode(ide_drive_t *drive, const u8 speed) | |||
| 319 | case XFER_UDMA_2: | 360 | case XFER_UDMA_2: |
| 320 | case XFER_UDMA_1: | 361 | case XFER_UDMA_1: |
| 321 | case XFER_UDMA_0: | 362 | case XFER_UDMA_0: |
| 322 | if (chipset_family >= ATA_133) { | 363 | sis_program_udma_timings(drive, speed); |
| 323 | u32 regdw = 0; | ||
| 324 | u8 drive_pci = sis_ata133_get_base(drive); | ||
| 325 | |||
| 326 | pci_read_config_dword(dev, drive_pci, ®dw); | ||
| 327 | regdw |= 0x04; | ||
| 328 | regdw &= 0xfffff00f; | ||
| 329 | /* check if ATA133 enable */ | ||
| 330 | if (regdw & 0x08) { | ||
| 331 | regdw |= (unsigned long)cycle_time_value[ATA_133][speed-XFER_UDMA_0] << 4; | ||
| 332 | regdw |= (unsigned long)cvs_time_value[ATA_133][speed-XFER_UDMA_0] << 8; | ||
| 333 | } else { | ||
| 334 | regdw |= (unsigned long)cycle_time_value[ATA_100][speed-XFER_UDMA_0] << 4; | ||
| 335 | regdw |= (unsigned long)cvs_time_value[ATA_100][speed-XFER_UDMA_0] << 8; | ||
| 336 | } | ||
| 337 | pci_write_config_dword(dev, (unsigned long)drive_pci, regdw); | ||
| 338 | } else { | ||
| 339 | u8 drive_pci = 0x40 + drive->dn * 2, reg = 0; | ||
| 340 | |||
| 341 | pci_read_config_byte(dev, drive_pci+1, ®); | ||
| 342 | /* Force the UDMA bit on if we want to use UDMA */ | ||
| 343 | reg |= 0x80; | ||
| 344 | /* clean reg cycle time bits */ | ||
| 345 | reg &= ~((0xFF >> (8 - cycle_time_range[chipset_family])) | ||
| 346 | << cycle_time_offset[chipset_family]); | ||
| 347 | /* set reg cycle time bits */ | ||
| 348 | reg |= cycle_time_value[chipset_family][speed-XFER_UDMA_0] | ||
| 349 | << cycle_time_offset[chipset_family]; | ||
| 350 | pci_write_config_byte(dev, drive_pci+1, reg); | ||
| 351 | } | ||
| 352 | break; | 364 | break; |
| 353 | case XFER_MW_DMA_2: | 365 | case XFER_MW_DMA_2: |
| 354 | case XFER_MW_DMA_1: | 366 | case XFER_MW_DMA_1: |
