diff options
Diffstat (limited to 'drivers/ide/ide-iops.c')
-rw-r--r-- | drivers/ide/ide-iops.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 80ad4f234f3f..96f63eb12092 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
@@ -905,6 +905,14 @@ void ide_execute_pkt_cmd(ide_drive_t *drive) | |||
905 | } | 905 | } |
906 | EXPORT_SYMBOL_GPL(ide_execute_pkt_cmd); | 906 | EXPORT_SYMBOL_GPL(ide_execute_pkt_cmd); |
907 | 907 | ||
908 | static inline void ide_complete_drive_reset(ide_drive_t *drive) | ||
909 | { | ||
910 | struct request *rq = drive->hwif->hwgroup->rq; | ||
911 | |||
912 | if (rq && blk_special_request(rq) && rq->cmd[0] == REQ_DRIVE_RESET) | ||
913 | ide_end_request(drive, 1, 0); | ||
914 | } | ||
915 | |||
908 | /* needed below */ | 916 | /* needed below */ |
909 | static ide_startstop_t do_reset1 (ide_drive_t *, int); | 917 | static ide_startstop_t do_reset1 (ide_drive_t *, int); |
910 | 918 | ||
@@ -940,7 +948,7 @@ static ide_startstop_t atapi_reset_pollfunc (ide_drive_t *drive) | |||
940 | } | 948 | } |
941 | /* done polling */ | 949 | /* done polling */ |
942 | hwgroup->polling = 0; | 950 | hwgroup->polling = 0; |
943 | hwgroup->resetting = 0; | 951 | ide_complete_drive_reset(drive); |
944 | return ide_stopped; | 952 | return ide_stopped; |
945 | } | 953 | } |
946 | 954 | ||
@@ -961,7 +969,7 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive) | |||
961 | if (port_ops->reset_poll(drive)) { | 969 | if (port_ops->reset_poll(drive)) { |
962 | printk(KERN_ERR "%s: host reset_poll failure for %s.\n", | 970 | printk(KERN_ERR "%s: host reset_poll failure for %s.\n", |
963 | hwif->name, drive->name); | 971 | hwif->name, drive->name); |
964 | return ide_stopped; | 972 | goto out; |
965 | } | 973 | } |
966 | } | 974 | } |
967 | 975 | ||
@@ -1004,7 +1012,8 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive) | |||
1004 | } | 1012 | } |
1005 | } | 1013 | } |
1006 | hwgroup->polling = 0; /* done polling */ | 1014 | hwgroup->polling = 0; /* done polling */ |
1007 | hwgroup->resetting = 0; /* done reset attempt */ | 1015 | out: |
1016 | ide_complete_drive_reset(drive); | ||
1008 | return ide_stopped; | 1017 | return ide_stopped; |
1009 | } | 1018 | } |
1010 | 1019 | ||
@@ -1090,7 +1099,6 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi) | |||
1090 | 1099 | ||
1091 | /* For an ATAPI device, first try an ATAPI SRST. */ | 1100 | /* For an ATAPI device, first try an ATAPI SRST. */ |
1092 | if (drive->media != ide_disk && !do_not_try_atapi) { | 1101 | if (drive->media != ide_disk && !do_not_try_atapi) { |
1093 | hwgroup->resetting = 1; | ||
1094 | pre_reset(drive); | 1102 | pre_reset(drive); |
1095 | SELECT_DRIVE(drive); | 1103 | SELECT_DRIVE(drive); |
1096 | udelay (20); | 1104 | udelay (20); |
@@ -1112,10 +1120,10 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi) | |||
1112 | 1120 | ||
1113 | if (io_ports->ctl_addr == 0) { | 1121 | if (io_ports->ctl_addr == 0) { |
1114 | spin_unlock_irqrestore(&ide_lock, flags); | 1122 | spin_unlock_irqrestore(&ide_lock, flags); |
1123 | ide_complete_drive_reset(drive); | ||
1115 | return ide_stopped; | 1124 | return ide_stopped; |
1116 | } | 1125 | } |
1117 | 1126 | ||
1118 | hwgroup->resetting = 1; | ||
1119 | /* | 1127 | /* |
1120 | * Note that we also set nIEN while resetting the device, | 1128 | * Note that we also set nIEN while resetting the device, |
1121 | * to mask unwanted interrupts from the interface during the reset. | 1129 | * to mask unwanted interrupts from the interface during the reset. |