diff options
Diffstat (limited to 'drivers/ide/ide-iops.c')
-rw-r--r-- | drivers/ide/ide-iops.c | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 5403e4a44be4..27bb70ddd459 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
@@ -27,21 +27,6 @@ | |||
27 | #include <asm/uaccess.h> | 27 | #include <asm/uaccess.h> |
28 | #include <asm/io.h> | 28 | #include <asm/io.h> |
29 | 29 | ||
30 | void SELECT_DRIVE(ide_drive_t *drive) | ||
31 | { | ||
32 | ide_hwif_t *hwif = drive->hwif; | ||
33 | const struct ide_port_ops *port_ops = hwif->port_ops; | ||
34 | struct ide_cmd cmd; | ||
35 | |||
36 | if (port_ops && port_ops->selectproc) | ||
37 | port_ops->selectproc(drive); | ||
38 | |||
39 | memset(&cmd, 0, sizeof(cmd)); | ||
40 | cmd.tf_flags = IDE_TFLAG_OUT_DEVICE; | ||
41 | |||
42 | drive->hwif->tp_ops->tf_load(drive, &cmd); | ||
43 | } | ||
44 | |||
45 | void SELECT_MASK(ide_drive_t *drive, int mask) | 30 | void SELECT_MASK(ide_drive_t *drive, int mask) |
46 | { | 31 | { |
47 | const struct ide_port_ops *port_ops = drive->hwif->port_ops; | 32 | const struct ide_port_ops *port_ops = drive->hwif->port_ops; |
@@ -55,7 +40,7 @@ u8 ide_read_error(ide_drive_t *drive) | |||
55 | struct ide_cmd cmd; | 40 | struct ide_cmd cmd; |
56 | 41 | ||
57 | memset(&cmd, 0, sizeof(cmd)); | 42 | memset(&cmd, 0, sizeof(cmd)); |
58 | cmd.tf_flags = IDE_TFLAG_IN_FEATURE; | 43 | cmd.tf_flags = IDE_TFLAG_IN_ERROR; |
59 | 44 | ||
60 | drive->hwif->tp_ops->tf_read(drive, &cmd); | 45 | drive->hwif->tp_ops->tf_read(drive, &cmd); |
61 | 46 | ||
@@ -306,6 +291,7 @@ int ide_driveid_update(ide_drive_t *drive) | |||
306 | drive->id[ATA_ID_UDMA_MODES] = id[ATA_ID_UDMA_MODES]; | 291 | drive->id[ATA_ID_UDMA_MODES] = id[ATA_ID_UDMA_MODES]; |
307 | drive->id[ATA_ID_MWDMA_MODES] = id[ATA_ID_MWDMA_MODES]; | 292 | drive->id[ATA_ID_MWDMA_MODES] = id[ATA_ID_MWDMA_MODES]; |
308 | drive->id[ATA_ID_SWDMA_MODES] = id[ATA_ID_SWDMA_MODES]; | 293 | drive->id[ATA_ID_SWDMA_MODES] = id[ATA_ID_SWDMA_MODES]; |
294 | drive->id[ATA_ID_CFA_MODES] = id[ATA_ID_CFA_MODES]; | ||
309 | /* anything more ? */ | 295 | /* anything more ? */ |
310 | 296 | ||
311 | kfree(id); | 297 | kfree(id); |
@@ -356,10 +342,10 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed) | |||
356 | disable_irq_nosync(hwif->irq); | 342 | disable_irq_nosync(hwif->irq); |
357 | 343 | ||
358 | udelay(1); | 344 | udelay(1); |
359 | SELECT_DRIVE(drive); | 345 | tp_ops->dev_select(drive); |
360 | SELECT_MASK(drive, 1); | 346 | SELECT_MASK(drive, 1); |
361 | udelay(1); | 347 | udelay(1); |
362 | tp_ops->set_irq(hwif, 0); | 348 | tp_ops->write_devctl(hwif, ATA_NIEN | ATA_DEVCTL_OBS); |
363 | 349 | ||
364 | memset(&cmd, 0, sizeof(cmd)); | 350 | memset(&cmd, 0, sizeof(cmd)); |
365 | cmd.tf_flags = IDE_TFLAG_OUT_FEATURE | IDE_TFLAG_OUT_NSECT; | 351 | cmd.tf_flags = IDE_TFLAG_OUT_FEATURE | IDE_TFLAG_OUT_NSECT; |
@@ -371,7 +357,7 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed) | |||
371 | tp_ops->exec_command(hwif, ATA_CMD_SET_FEATURES); | 357 | tp_ops->exec_command(hwif, ATA_CMD_SET_FEATURES); |
372 | 358 | ||
373 | if (drive->quirk_list == 2) | 359 | if (drive->quirk_list == 2) |
374 | tp_ops->set_irq(hwif, 1); | 360 | tp_ops->write_devctl(hwif, ATA_DEVCTL_OBS); |
375 | 361 | ||
376 | error = __ide_wait_stat(drive, drive->ready_stat, | 362 | error = __ide_wait_stat(drive, drive->ready_stat, |
377 | ATA_BUSY | ATA_DRQ | ATA_ERR, | 363 | ATA_BUSY | ATA_DRQ | ATA_ERR, |
@@ -386,9 +372,14 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed) | |||
386 | return error; | 372 | return error; |
387 | } | 373 | } |
388 | 374 | ||
389 | id[ATA_ID_UDMA_MODES] &= ~0xFF00; | 375 | if (speed >= XFER_SW_DMA_0) { |
390 | id[ATA_ID_MWDMA_MODES] &= ~0x0F00; | 376 | id[ATA_ID_UDMA_MODES] &= ~0xFF00; |
391 | id[ATA_ID_SWDMA_MODES] &= ~0x0F00; | 377 | id[ATA_ID_MWDMA_MODES] &= ~0x0700; |
378 | id[ATA_ID_SWDMA_MODES] &= ~0x0700; | ||
379 | if (ata_id_is_cfa(id)) | ||
380 | id[ATA_ID_CFA_MODES] &= ~0x0E00; | ||
381 | } else if (ata_id_is_cfa(id)) | ||
382 | id[ATA_ID_CFA_MODES] &= ~0x01C0; | ||
392 | 383 | ||
393 | skip: | 384 | skip: |
394 | #ifdef CONFIG_BLK_DEV_IDEDMA | 385 | #ifdef CONFIG_BLK_DEV_IDEDMA |
@@ -401,12 +392,18 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed) | |||
401 | if (speed >= XFER_UDMA_0) { | 392 | if (speed >= XFER_UDMA_0) { |
402 | i = 1 << (speed - XFER_UDMA_0); | 393 | i = 1 << (speed - XFER_UDMA_0); |
403 | id[ATA_ID_UDMA_MODES] |= (i << 8 | i); | 394 | id[ATA_ID_UDMA_MODES] |= (i << 8 | i); |
395 | } else if (ata_id_is_cfa(id) && speed >= XFER_MW_DMA_3) { | ||
396 | i = speed - XFER_MW_DMA_2; | ||
397 | id[ATA_ID_CFA_MODES] |= i << 9; | ||
404 | } else if (speed >= XFER_MW_DMA_0) { | 398 | } else if (speed >= XFER_MW_DMA_0) { |
405 | i = 1 << (speed - XFER_MW_DMA_0); | 399 | i = 1 << (speed - XFER_MW_DMA_0); |
406 | id[ATA_ID_MWDMA_MODES] |= (i << 8 | i); | 400 | id[ATA_ID_MWDMA_MODES] |= (i << 8 | i); |
407 | } else if (speed >= XFER_SW_DMA_0) { | 401 | } else if (speed >= XFER_SW_DMA_0) { |
408 | i = 1 << (speed - XFER_SW_DMA_0); | 402 | i = 1 << (speed - XFER_SW_DMA_0); |
409 | id[ATA_ID_SWDMA_MODES] |= (i << 8 | i); | 403 | id[ATA_ID_SWDMA_MODES] |= (i << 8 | i); |
404 | } else if (ata_id_is_cfa(id) && speed >= XFER_PIO_5) { | ||
405 | i = speed - XFER_PIO_4; | ||
406 | id[ATA_ID_CFA_MODES] |= i << 6; | ||
410 | } | 407 | } |
411 | 408 | ||
412 | if (!drive->init_speed) | 409 | if (!drive->init_speed) |