diff options
Diffstat (limited to 'drivers/ide/ide-iops.c')
| -rw-r--r-- | drivers/ide/ide-iops.c | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index a95178f5e1bb..c32e759df208 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
| @@ -430,10 +430,10 @@ int drive_is_ready (ide_drive_t *drive) | |||
| 430 | * about possible isa-pnp and pci-pnp issues yet. | 430 | * about possible isa-pnp and pci-pnp issues yet. |
| 431 | */ | 431 | */ |
| 432 | if (IDE_CONTROL_REG) | 432 | if (IDE_CONTROL_REG) |
| 433 | stat = hwif->INB(IDE_ALTSTATUS_REG); | 433 | stat = ide_read_altstatus(drive); |
| 434 | else | 434 | else |
| 435 | /* Note: this may clear a pending IRQ!! */ | 435 | /* Note: this may clear a pending IRQ!! */ |
| 436 | stat = hwif->INB(IDE_STATUS_REG); | 436 | stat = ide_read_status(drive); |
| 437 | 437 | ||
| 438 | if (stat & BUSY_STAT) | 438 | if (stat & BUSY_STAT) |
| 439 | /* drive busy: definitely not interrupting */ | 439 | /* drive busy: definitely not interrupting */ |
| @@ -458,23 +458,24 @@ EXPORT_SYMBOL(drive_is_ready); | |||
| 458 | */ | 458 | */ |
| 459 | static int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, unsigned long timeout, u8 *rstat) | 459 | static int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, unsigned long timeout, u8 *rstat) |
| 460 | { | 460 | { |
| 461 | ide_hwif_t *hwif = drive->hwif; | ||
| 462 | unsigned long flags; | 461 | unsigned long flags; |
| 463 | int i; | 462 | int i; |
| 464 | u8 stat; | 463 | u8 stat; |
| 465 | 464 | ||
| 466 | udelay(1); /* spec allows drive 400ns to assert "BUSY" */ | 465 | udelay(1); /* spec allows drive 400ns to assert "BUSY" */ |
| 467 | if ((stat = hwif->INB(IDE_STATUS_REG)) & BUSY_STAT) { | 466 | stat = ide_read_status(drive); |
| 467 | |||
| 468 | if (stat & BUSY_STAT) { | ||
| 468 | local_irq_set(flags); | 469 | local_irq_set(flags); |
| 469 | timeout += jiffies; | 470 | timeout += jiffies; |
| 470 | while ((stat = hwif->INB(IDE_STATUS_REG)) & BUSY_STAT) { | 471 | while ((stat = ide_read_status(drive)) & BUSY_STAT) { |
| 471 | if (time_after(jiffies, timeout)) { | 472 | if (time_after(jiffies, timeout)) { |
| 472 | /* | 473 | /* |
| 473 | * One last read after the timeout in case | 474 | * One last read after the timeout in case |
| 474 | * heavy interrupt load made us not make any | 475 | * heavy interrupt load made us not make any |
| 475 | * progress during the timeout.. | 476 | * progress during the timeout.. |
| 476 | */ | 477 | */ |
| 477 | stat = hwif->INB(IDE_STATUS_REG); | 478 | stat = ide_read_status(drive); |
| 478 | if (!(stat & BUSY_STAT)) | 479 | if (!(stat & BUSY_STAT)) |
| 479 | break; | 480 | break; |
| 480 | 481 | ||
| @@ -494,7 +495,9 @@ static int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, unsigned long ti | |||
| 494 | */ | 495 | */ |
| 495 | for (i = 0; i < 10; i++) { | 496 | for (i = 0; i < 10; i++) { |
| 496 | udelay(1); | 497 | udelay(1); |
| 497 | if (OK_STAT((stat = hwif->INB(IDE_STATUS_REG)), good, bad)) { | 498 | stat = ide_read_status(drive); |
| 499 | |||
| 500 | if (OK_STAT(stat, good, bad)) { | ||
| 498 | *rstat = stat; | 501 | *rstat = stat; |
| 499 | return 0; | 502 | return 0; |
| 500 | } | 503 | } |
| @@ -617,6 +620,7 @@ int ide_driveid_update(ide_drive_t *drive) | |||
| 617 | ide_hwif_t *hwif = drive->hwif; | 620 | ide_hwif_t *hwif = drive->hwif; |
| 618 | struct hd_driveid *id; | 621 | struct hd_driveid *id; |
| 619 | unsigned long timeout, flags; | 622 | unsigned long timeout, flags; |
| 623 | u8 stat; | ||
| 620 | 624 | ||
| 621 | /* | 625 | /* |
| 622 | * Re-read drive->id for possible DMA mode | 626 | * Re-read drive->id for possible DMA mode |
| @@ -633,10 +637,15 @@ int ide_driveid_update(ide_drive_t *drive) | |||
| 633 | SELECT_MASK(drive, 0); | 637 | SELECT_MASK(drive, 0); |
| 634 | return 0; /* drive timed-out */ | 638 | return 0; /* drive timed-out */ |
| 635 | } | 639 | } |
| 640 | |||
| 636 | msleep(50); /* give drive a breather */ | 641 | msleep(50); /* give drive a breather */ |
| 637 | } while (hwif->INB(IDE_ALTSTATUS_REG) & BUSY_STAT); | 642 | stat = ide_read_altstatus(drive); |
| 643 | } while (stat & BUSY_STAT); | ||
| 644 | |||
| 638 | msleep(50); /* wait for IRQ and DRQ_STAT */ | 645 | msleep(50); /* wait for IRQ and DRQ_STAT */ |
| 639 | if (!OK_STAT(hwif->INB(IDE_STATUS_REG),DRQ_STAT,BAD_R_STAT)) { | 646 | stat = ide_read_status(drive); |
| 647 | |||
| 648 | if (!OK_STAT(stat, DRQ_STAT, BAD_R_STAT)) { | ||
| 640 | SELECT_MASK(drive, 0); | 649 | SELECT_MASK(drive, 0); |
| 641 | printk("%s: CHECK for good STATUS\n", drive->name); | 650 | printk("%s: CHECK for good STATUS\n", drive->name); |
| 642 | return 0; | 651 | return 0; |
| @@ -649,7 +658,7 @@ int ide_driveid_update(ide_drive_t *drive) | |||
| 649 | return 0; | 658 | return 0; |
| 650 | } | 659 | } |
| 651 | ata_input_data(drive, id, SECTOR_WORDS); | 660 | ata_input_data(drive, id, SECTOR_WORDS); |
| 652 | (void) hwif->INB(IDE_STATUS_REG); /* clear drive IRQ */ | 661 | (void)ide_read_status(drive); /* clear drive IRQ */ |
| 653 | local_irq_enable(); | 662 | local_irq_enable(); |
| 654 | local_irq_restore(flags); | 663 | local_irq_restore(flags); |
| 655 | ide_fix_driveid(id); | 664 | ide_fix_driveid(id); |
| @@ -850,17 +859,16 @@ static ide_startstop_t do_reset1 (ide_drive_t *, int); | |||
| 850 | static ide_startstop_t atapi_reset_pollfunc (ide_drive_t *drive) | 859 | static ide_startstop_t atapi_reset_pollfunc (ide_drive_t *drive) |
| 851 | { | 860 | { |
| 852 | ide_hwgroup_t *hwgroup = HWGROUP(drive); | 861 | ide_hwgroup_t *hwgroup = HWGROUP(drive); |
| 853 | ide_hwif_t *hwif = HWIF(drive); | ||
| 854 | u8 stat; | 862 | u8 stat; |
| 855 | 863 | ||
| 856 | SELECT_DRIVE(drive); | 864 | SELECT_DRIVE(drive); |
| 857 | udelay (10); | 865 | udelay (10); |
| 866 | stat = ide_read_status(drive); | ||
| 858 | 867 | ||
| 859 | if (OK_STAT(stat = hwif->INB(IDE_STATUS_REG), 0, BUSY_STAT)) { | 868 | if (OK_STAT(stat, 0, BUSY_STAT)) |
| 860 | printk("%s: ATAPI reset complete\n", drive->name); | 869 | printk("%s: ATAPI reset complete\n", drive->name); |
| 861 | } else { | 870 | else { |
| 862 | if (time_before(jiffies, hwgroup->poll_timeout)) { | 871 | if (time_before(jiffies, hwgroup->poll_timeout)) { |
| 863 | BUG_ON(HWGROUP(drive)->handler != NULL); | ||
| 864 | ide_set_handler(drive, &atapi_reset_pollfunc, HZ/20, NULL); | 872 | ide_set_handler(drive, &atapi_reset_pollfunc, HZ/20, NULL); |
| 865 | /* continue polling */ | 873 | /* continue polling */ |
| 866 | return ide_started; | 874 | return ide_started; |
| @@ -898,9 +906,10 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive) | |||
| 898 | } | 906 | } |
| 899 | } | 907 | } |
| 900 | 908 | ||
| 901 | if (!OK_STAT(tmp = hwif->INB(IDE_STATUS_REG), 0, BUSY_STAT)) { | 909 | tmp = ide_read_status(drive); |
| 910 | |||
| 911 | if (!OK_STAT(tmp, 0, BUSY_STAT)) { | ||
| 902 | if (time_before(jiffies, hwgroup->poll_timeout)) { | 912 | if (time_before(jiffies, hwgroup->poll_timeout)) { |
| 903 | BUG_ON(HWGROUP(drive)->handler != NULL); | ||
| 904 | ide_set_handler(drive, &reset_pollfunc, HZ/20, NULL); | 913 | ide_set_handler(drive, &reset_pollfunc, HZ/20, NULL); |
| 905 | /* continue polling */ | 914 | /* continue polling */ |
| 906 | return ide_started; | 915 | return ide_started; |
| @@ -909,7 +918,9 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive) | |||
| 909 | drive->failures++; | 918 | drive->failures++; |
| 910 | } else { | 919 | } else { |
| 911 | printk("%s: reset: ", hwif->name); | 920 | printk("%s: reset: ", hwif->name); |
| 912 | if ((tmp = hwif->INB(IDE_ERROR_REG)) == 1) { | 921 | tmp = ide_read_error(drive); |
| 922 | |||
| 923 | if (tmp == 1) { | ||
| 913 | printk("success\n"); | 924 | printk("success\n"); |
| 914 | drive->failures = 0; | 925 | drive->failures = 0; |
| 915 | } else { | 926 | } else { |
