aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-iops.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/ide-iops.c')
-rw-r--r--drivers/ide/ide-iops.c41
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
30void 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
45void SELECT_MASK(ide_drive_t *drive, int mask) 30void 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)