diff options
37 files changed, 186 insertions, 502 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index dacb3ef0c3e6..3efa9904f7a0 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -252,9 +252,18 @@ static void ahci_freeze(struct ata_port *ap); | |||
252 | static void ahci_thaw(struct ata_port *ap); | 252 | static void ahci_thaw(struct ata_port *ap); |
253 | static void ahci_pmp_attach(struct ata_port *ap); | 253 | static void ahci_pmp_attach(struct ata_port *ap); |
254 | static void ahci_pmp_detach(struct ata_port *ap); | 254 | static void ahci_pmp_detach(struct ata_port *ap); |
255 | static int ahci_softreset(struct ata_link *link, unsigned int *class, | ||
256 | unsigned long deadline); | ||
257 | static int ahci_hardreset(struct ata_link *link, unsigned int *class, | ||
258 | unsigned long deadline); | ||
259 | static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class, | ||
260 | unsigned long deadline); | ||
261 | static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class, | ||
262 | unsigned long deadline); | ||
263 | static void ahci_postreset(struct ata_link *link, unsigned int *class); | ||
264 | static int ahci_pmp_softreset(struct ata_link *link, unsigned int *class, | ||
265 | unsigned long deadline); | ||
255 | static void ahci_error_handler(struct ata_port *ap); | 266 | static void ahci_error_handler(struct ata_port *ap); |
256 | static void ahci_vt8251_error_handler(struct ata_port *ap); | ||
257 | static void ahci_p5wdh_error_handler(struct ata_port *ap); | ||
258 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); | 267 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); |
259 | static int ahci_port_resume(struct ata_port *ap); | 268 | static int ahci_port_resume(struct ata_port *ap); |
260 | static void ahci_dev_config(struct ata_device *dev); | 269 | static void ahci_dev_config(struct ata_device *dev); |
@@ -293,6 +302,10 @@ static struct ata_port_operations ahci_ops = { | |||
293 | 302 | ||
294 | .freeze = ahci_freeze, | 303 | .freeze = ahci_freeze, |
295 | .thaw = ahci_thaw, | 304 | .thaw = ahci_thaw, |
305 | .softreset = ahci_softreset, | ||
306 | .hardreset = ahci_hardreset, | ||
307 | .postreset = ahci_postreset, | ||
308 | .pmp_softreset = ahci_pmp_softreset, | ||
296 | .error_handler = ahci_error_handler, | 309 | .error_handler = ahci_error_handler, |
297 | .post_internal_cmd = ahci_post_internal_cmd, | 310 | .post_internal_cmd = ahci_post_internal_cmd, |
298 | .dev_config = ahci_dev_config, | 311 | .dev_config = ahci_dev_config, |
@@ -314,12 +327,12 @@ static struct ata_port_operations ahci_ops = { | |||
314 | 327 | ||
315 | static struct ata_port_operations ahci_vt8251_ops = { | 328 | static struct ata_port_operations ahci_vt8251_ops = { |
316 | .inherits = &ahci_ops, | 329 | .inherits = &ahci_ops, |
317 | .error_handler = ahci_vt8251_error_handler, | 330 | .hardreset = ahci_vt8251_hardreset, |
318 | }; | 331 | }; |
319 | 332 | ||
320 | static struct ata_port_operations ahci_p5wdh_ops = { | 333 | static struct ata_port_operations ahci_p5wdh_ops = { |
321 | .inherits = &ahci_ops, | 334 | .inherits = &ahci_ops, |
322 | .error_handler = ahci_p5wdh_error_handler, | 335 | .hardreset = ahci_p5wdh_hardreset, |
323 | }; | 336 | }; |
324 | 337 | ||
325 | #define AHCI_HFLAGS(flags) .private_data = (void *)(flags) | 338 | #define AHCI_HFLAGS(flags) .private_data = (void *)(flags) |
@@ -1796,37 +1809,7 @@ static void ahci_error_handler(struct ata_port *ap) | |||
1796 | ahci_start_engine(ap); | 1809 | ahci_start_engine(ap); |
1797 | } | 1810 | } |
1798 | 1811 | ||
1799 | /* perform recovery */ | 1812 | sata_pmp_error_handler(ap); |
1800 | sata_pmp_do_eh(ap, ata_std_prereset, ahci_softreset, | ||
1801 | ahci_hardreset, ahci_postreset, | ||
1802 | sata_pmp_std_prereset, ahci_pmp_softreset, | ||
1803 | sata_pmp_std_hardreset, sata_pmp_std_postreset); | ||
1804 | } | ||
1805 | |||
1806 | static void ahci_vt8251_error_handler(struct ata_port *ap) | ||
1807 | { | ||
1808 | if (!(ap->pflags & ATA_PFLAG_FROZEN)) { | ||
1809 | /* restart engine */ | ||
1810 | ahci_stop_engine(ap); | ||
1811 | ahci_start_engine(ap); | ||
1812 | } | ||
1813 | |||
1814 | /* perform recovery */ | ||
1815 | ata_do_eh(ap, ata_std_prereset, ahci_softreset, ahci_vt8251_hardreset, | ||
1816 | ahci_postreset); | ||
1817 | } | ||
1818 | |||
1819 | static void ahci_p5wdh_error_handler(struct ata_port *ap) | ||
1820 | { | ||
1821 | if (!(ap->pflags & ATA_PFLAG_FROZEN)) { | ||
1822 | /* restart engine */ | ||
1823 | ahci_stop_engine(ap); | ||
1824 | ahci_start_engine(ap); | ||
1825 | } | ||
1826 | |||
1827 | /* perform recovery */ | ||
1828 | ata_do_eh(ap, ata_std_prereset, ahci_softreset, ahci_p5wdh_hardreset, | ||
1829 | ahci_postreset); | ||
1830 | } | 1813 | } |
1831 | 1814 | ||
1832 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc) | 1815 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc) |
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index bb46b61a7c6b..eafb984313f6 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
@@ -162,15 +162,16 @@ struct piix_host_priv { | |||
162 | 162 | ||
163 | static int piix_init_one(struct pci_dev *pdev, | 163 | static int piix_init_one(struct pci_dev *pdev, |
164 | const struct pci_device_id *ent); | 164 | const struct pci_device_id *ent); |
165 | static void piix_pata_error_handler(struct ata_port *ap); | 165 | static int piix_pata_prereset(struct ata_link *link, unsigned long deadline); |
166 | static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev); | 166 | static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev); |
167 | static void piix_set_dmamode(struct ata_port *ap, struct ata_device *adev); | 167 | static void piix_set_dmamode(struct ata_port *ap, struct ata_device *adev); |
168 | static void ich_set_dmamode(struct ata_port *ap, struct ata_device *adev); | 168 | static void ich_set_dmamode(struct ata_port *ap, struct ata_device *adev); |
169 | static int ich_pata_cable_detect(struct ata_port *ap); | 169 | static int ich_pata_cable_detect(struct ata_port *ap); |
170 | static u8 piix_vmw_bmdma_status(struct ata_port *ap); | 170 | static u8 piix_vmw_bmdma_status(struct ata_port *ap); |
171 | static int piix_sidpr_hardreset(struct ata_link *link, unsigned int *class, | ||
172 | unsigned long deadline); | ||
171 | static int piix_sidpr_scr_read(struct ata_port *ap, unsigned int reg, u32 *val); | 173 | static int piix_sidpr_scr_read(struct ata_port *ap, unsigned int reg, u32 *val); |
172 | static int piix_sidpr_scr_write(struct ata_port *ap, unsigned int reg, u32 val); | 174 | static int piix_sidpr_scr_write(struct ata_port *ap, unsigned int reg, u32 val); |
173 | static void piix_sidpr_error_handler(struct ata_port *ap); | ||
174 | #ifdef CONFIG_PM | 175 | #ifdef CONFIG_PM |
175 | static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); | 176 | static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); |
176 | static int piix_pci_device_resume(struct pci_dev *pdev); | 177 | static int piix_pci_device_resume(struct pci_dev *pdev); |
@@ -299,7 +300,7 @@ static struct ata_port_operations piix_pata_ops = { | |||
299 | .cable_detect = ata_cable_40wire, | 300 | .cable_detect = ata_cable_40wire, |
300 | .set_piomode = piix_set_piomode, | 301 | .set_piomode = piix_set_piomode, |
301 | .set_dmamode = piix_set_dmamode, | 302 | .set_dmamode = piix_set_dmamode, |
302 | .error_handler = piix_pata_error_handler, | 303 | .prereset = piix_pata_prereset, |
303 | }; | 304 | }; |
304 | 305 | ||
305 | static struct ata_port_operations piix_vmw_ops = { | 306 | static struct ata_port_operations piix_vmw_ops = { |
@@ -319,9 +320,9 @@ static struct ata_port_operations piix_sata_ops = { | |||
319 | 320 | ||
320 | static struct ata_port_operations piix_sidpr_sata_ops = { | 321 | static struct ata_port_operations piix_sidpr_sata_ops = { |
321 | .inherits = &piix_sata_ops, | 322 | .inherits = &piix_sata_ops, |
323 | .hardreset = piix_sidpr_hardreset, | ||
322 | .scr_read = piix_sidpr_scr_read, | 324 | .scr_read = piix_sidpr_scr_read, |
323 | .scr_write = piix_sidpr_scr_write, | 325 | .scr_write = piix_sidpr_scr_write, |
324 | .error_handler = piix_sidpr_error_handler, | ||
325 | }; | 326 | }; |
326 | 327 | ||
327 | static const struct piix_map_db ich5_map_db = { | 328 | static const struct piix_map_db ich5_map_db = { |
@@ -645,12 +646,6 @@ static int piix_pata_prereset(struct ata_link *link, unsigned long deadline) | |||
645 | return ata_std_prereset(link, deadline); | 646 | return ata_std_prereset(link, deadline); |
646 | } | 647 | } |
647 | 648 | ||
648 | static void piix_pata_error_handler(struct ata_port *ap) | ||
649 | { | ||
650 | ata_bmdma_drive_eh(ap, piix_pata_prereset, ata_std_softreset, NULL, | ||
651 | ata_std_postreset); | ||
652 | } | ||
653 | |||
654 | /** | 649 | /** |
655 | * piix_set_piomode - Initialize host controller PATA PIO timings | 650 | * piix_set_piomode - Initialize host controller PATA PIO timings |
656 | * @ap: Port whose timings we are configuring | 651 | * @ap: Port whose timings we are configuring |
@@ -1057,12 +1052,6 @@ static int piix_sidpr_hardreset(struct ata_link *link, unsigned int *class, | |||
1057 | return -EAGAIN; | 1052 | return -EAGAIN; |
1058 | } | 1053 | } |
1059 | 1054 | ||
1060 | static void piix_sidpr_error_handler(struct ata_port *ap) | ||
1061 | { | ||
1062 | ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset, | ||
1063 | piix_sidpr_hardreset, ata_std_postreset); | ||
1064 | } | ||
1065 | |||
1066 | #ifdef CONFIG_PM | 1055 | #ifdef CONFIG_PM |
1067 | static int piix_broken_suspend(void) | 1056 | static int piix_broken_suspend(void) |
1068 | { | 1057 | { |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index aa6bcd79d60a..345f4a6865a8 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -76,6 +76,10 @@ const unsigned long sata_deb_timing_long[] = { 100, 2000, 5000 }; | |||
76 | 76 | ||
77 | const struct ata_port_operations ata_base_port_ops = { | 77 | const struct ata_port_operations ata_base_port_ops = { |
78 | .irq_clear = ata_noop_irq_clear, | 78 | .irq_clear = ata_noop_irq_clear, |
79 | .prereset = ata_std_prereset, | ||
80 | .hardreset = sata_std_hardreset, | ||
81 | .postreset = ata_std_postreset, | ||
82 | .error_handler = ata_std_error_handler, | ||
79 | }; | 83 | }; |
80 | 84 | ||
81 | const struct ata_port_operations sata_port_ops = { | 85 | const struct ata_port_operations sata_port_ops = { |
@@ -87,6 +91,11 @@ const struct ata_port_operations sata_port_ops = { | |||
87 | 91 | ||
88 | const struct ata_port_operations sata_pmp_port_ops = { | 92 | const struct ata_port_operations sata_pmp_port_ops = { |
89 | .inherits = &sata_port_ops, | 93 | .inherits = &sata_port_ops, |
94 | |||
95 | .pmp_prereset = sata_pmp_std_prereset, | ||
96 | .pmp_hardreset = sata_pmp_std_hardreset, | ||
97 | .pmp_postreset = sata_pmp_std_postreset, | ||
98 | .error_handler = sata_pmp_error_handler, | ||
90 | }; | 99 | }; |
91 | 100 | ||
92 | const struct ata_port_operations ata_sff_port_ops = { | 101 | const struct ata_port_operations ata_sff_port_ops = { |
@@ -97,6 +106,7 @@ const struct ata_port_operations ata_sff_port_ops = { | |||
97 | 106 | ||
98 | .freeze = ata_bmdma_freeze, | 107 | .freeze = ata_bmdma_freeze, |
99 | .thaw = ata_bmdma_thaw, | 108 | .thaw = ata_bmdma_thaw, |
109 | .softreset = ata_std_softreset, | ||
100 | .error_handler = ata_bmdma_error_handler, | 110 | .error_handler = ata_bmdma_error_handler, |
101 | .post_internal_cmd = ata_bmdma_post_internal_cmd, | 111 | .post_internal_cmd = ata_bmdma_post_internal_cmd, |
102 | 112 | ||
@@ -7935,7 +7945,6 @@ EXPORT_SYMBOL_GPL(ata_bmdma_status); | |||
7935 | EXPORT_SYMBOL_GPL(ata_bmdma_stop); | 7945 | EXPORT_SYMBOL_GPL(ata_bmdma_stop); |
7936 | EXPORT_SYMBOL_GPL(ata_bmdma_freeze); | 7946 | EXPORT_SYMBOL_GPL(ata_bmdma_freeze); |
7937 | EXPORT_SYMBOL_GPL(ata_bmdma_thaw); | 7947 | EXPORT_SYMBOL_GPL(ata_bmdma_thaw); |
7938 | EXPORT_SYMBOL_GPL(ata_bmdma_drive_eh); | ||
7939 | EXPORT_SYMBOL_GPL(ata_bmdma_error_handler); | 7948 | EXPORT_SYMBOL_GPL(ata_bmdma_error_handler); |
7940 | EXPORT_SYMBOL_GPL(ata_bmdma_post_internal_cmd); | 7949 | EXPORT_SYMBOL_GPL(ata_bmdma_post_internal_cmd); |
7941 | EXPORT_SYMBOL_GPL(ata_port_probe); | 7950 | EXPORT_SYMBOL_GPL(ata_port_probe); |
@@ -8005,7 +8014,7 @@ EXPORT_SYMBOL_GPL(sata_pmp_qc_defer_cmd_switch); | |||
8005 | EXPORT_SYMBOL_GPL(sata_pmp_std_prereset); | 8014 | EXPORT_SYMBOL_GPL(sata_pmp_std_prereset); |
8006 | EXPORT_SYMBOL_GPL(sata_pmp_std_hardreset); | 8015 | EXPORT_SYMBOL_GPL(sata_pmp_std_hardreset); |
8007 | EXPORT_SYMBOL_GPL(sata_pmp_std_postreset); | 8016 | EXPORT_SYMBOL_GPL(sata_pmp_std_postreset); |
8008 | EXPORT_SYMBOL_GPL(sata_pmp_do_eh); | 8017 | EXPORT_SYMBOL_GPL(sata_pmp_error_handler); |
8009 | 8018 | ||
8010 | EXPORT_SYMBOL_GPL(__ata_ehi_push_desc); | 8019 | EXPORT_SYMBOL_GPL(__ata_ehi_push_desc); |
8011 | EXPORT_SYMBOL_GPL(ata_ehi_push_desc); | 8020 | EXPORT_SYMBOL_GPL(ata_ehi_push_desc); |
@@ -8024,6 +8033,7 @@ EXPORT_SYMBOL_GPL(ata_eh_thaw_port); | |||
8024 | EXPORT_SYMBOL_GPL(ata_eh_qc_complete); | 8033 | EXPORT_SYMBOL_GPL(ata_eh_qc_complete); |
8025 | EXPORT_SYMBOL_GPL(ata_eh_qc_retry); | 8034 | EXPORT_SYMBOL_GPL(ata_eh_qc_retry); |
8026 | EXPORT_SYMBOL_GPL(ata_do_eh); | 8035 | EXPORT_SYMBOL_GPL(ata_do_eh); |
8036 | EXPORT_SYMBOL_GPL(ata_std_error_handler); | ||
8027 | EXPORT_SYMBOL_GPL(ata_irq_on); | 8037 | EXPORT_SYMBOL_GPL(ata_irq_on); |
8028 | EXPORT_SYMBOL_GPL(ata_dev_try_classify); | 8038 | EXPORT_SYMBOL_GPL(ata_dev_try_classify); |
8029 | 8039 | ||
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 0d0a2c0ab9e7..ec32082356cb 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -2814,6 +2814,7 @@ void ata_eh_finish(struct ata_port *ap) | |||
2814 | /** | 2814 | /** |
2815 | * ata_do_eh - do standard error handling | 2815 | * ata_do_eh - do standard error handling |
2816 | * @ap: host port to handle error for | 2816 | * @ap: host port to handle error for |
2817 | * | ||
2817 | * @prereset: prereset method (can be NULL) | 2818 | * @prereset: prereset method (can be NULL) |
2818 | * @softreset: softreset method (can be NULL) | 2819 | * @softreset: softreset method (can be NULL) |
2819 | * @hardreset: hardreset method (can be NULL) | 2820 | * @hardreset: hardreset method (can be NULL) |
@@ -2844,6 +2845,30 @@ void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset, | |||
2844 | ata_eh_finish(ap); | 2845 | ata_eh_finish(ap); |
2845 | } | 2846 | } |
2846 | 2847 | ||
2848 | /** | ||
2849 | * ata_std_error_handler - standard error handler | ||
2850 | * @ap: host port to handle error for | ||
2851 | * | ||
2852 | * Standard error handler | ||
2853 | * | ||
2854 | * LOCKING: | ||
2855 | * Kernel thread context (may sleep). | ||
2856 | */ | ||
2857 | void ata_std_error_handler(struct ata_port *ap) | ||
2858 | { | ||
2859 | struct ata_port_operations *ops = ap->ops; | ||
2860 | ata_reset_fn_t hardreset = ops->hardreset; | ||
2861 | |||
2862 | /* sata_std_hardreset is inherited to all drivers from | ||
2863 | * ata_base_port_ops. Ignore it if SCR access is not | ||
2864 | * available. | ||
2865 | */ | ||
2866 | if (hardreset == sata_std_hardreset && !sata_scr_valid(&ap->link)) | ||
2867 | hardreset = NULL; | ||
2868 | |||
2869 | ata_do_eh(ap, ops->prereset, ops->softreset, hardreset, ops->postreset); | ||
2870 | } | ||
2871 | |||
2847 | #ifdef CONFIG_PM | 2872 | #ifdef CONFIG_PM |
2848 | /** | 2873 | /** |
2849 | * ata_eh_handle_port_suspend - perform port suspend operation | 2874 | * ata_eh_handle_port_suspend - perform port suspend operation |
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c index 39e036c8a2bc..a7cb1498c9b2 100644 --- a/drivers/ata/libata-pmp.c +++ b/drivers/ata/libata-pmp.c | |||
@@ -962,14 +962,6 @@ static int sata_pmp_handle_link_fail(struct ata_link *link, int *link_tries) | |||
962 | /** | 962 | /** |
963 | * sata_pmp_eh_recover - recover PMP-enabled port | 963 | * sata_pmp_eh_recover - recover PMP-enabled port |
964 | * @ap: ATA port to recover | 964 | * @ap: ATA port to recover |
965 | * @prereset: prereset method (can be NULL) | ||
966 | * @softreset: softreset method | ||
967 | * @hardreset: hardreset method | ||
968 | * @postreset: postreset method (can be NULL) | ||
969 | * @pmp_prereset: PMP prereset method (can be NULL) | ||
970 | * @pmp_softreset: PMP softreset method (can be NULL) | ||
971 | * @pmp_hardreset: PMP hardreset method (can be NULL) | ||
972 | * @pmp_postreset: PMP postreset method (can be NULL) | ||
973 | * | 965 | * |
974 | * Drive EH recovery operation for PMP enabled port @ap. This | 966 | * Drive EH recovery operation for PMP enabled port @ap. This |
975 | * function recovers host and PMP ports with proper retrials and | 967 | * function recovers host and PMP ports with proper retrials and |
@@ -982,12 +974,9 @@ static int sata_pmp_handle_link_fail(struct ata_link *link, int *link_tries) | |||
982 | * RETURNS: | 974 | * RETURNS: |
983 | * 0 on success, -errno on failure. | 975 | * 0 on success, -errno on failure. |
984 | */ | 976 | */ |
985 | static int sata_pmp_eh_recover(struct ata_port *ap, | 977 | static int sata_pmp_eh_recover(struct ata_port *ap) |
986 | ata_prereset_fn_t prereset, ata_reset_fn_t softreset, | ||
987 | ata_reset_fn_t hardreset, ata_postreset_fn_t postreset, | ||
988 | ata_prereset_fn_t pmp_prereset, ata_reset_fn_t pmp_softreset, | ||
989 | ata_reset_fn_t pmp_hardreset, ata_postreset_fn_t pmp_postreset) | ||
990 | { | 978 | { |
979 | struct ata_port_operations *ops = ap->ops; | ||
991 | int pmp_tries, link_tries[SATA_PMP_MAX_PORTS]; | 980 | int pmp_tries, link_tries[SATA_PMP_MAX_PORTS]; |
992 | struct ata_link *pmp_link = &ap->link; | 981 | struct ata_link *pmp_link = &ap->link; |
993 | struct ata_device *pmp_dev = pmp_link->device; | 982 | struct ata_device *pmp_dev = pmp_link->device; |
@@ -1005,8 +994,8 @@ static int sata_pmp_eh_recover(struct ata_port *ap, | |||
1005 | retry: | 994 | retry: |
1006 | /* PMP attached? */ | 995 | /* PMP attached? */ |
1007 | if (!ap->nr_pmp_links) { | 996 | if (!ap->nr_pmp_links) { |
1008 | rc = ata_eh_recover(ap, prereset, softreset, hardreset, | 997 | rc = ata_eh_recover(ap, ops->prereset, ops->softreset, |
1009 | postreset, NULL); | 998 | ops->hardreset, ops->postreset, NULL); |
1010 | if (rc) { | 999 | if (rc) { |
1011 | ata_link_for_each_dev(dev, &ap->link) | 1000 | ata_link_for_each_dev(dev, &ap->link) |
1012 | ata_dev_disable(dev); | 1001 | ata_dev_disable(dev); |
@@ -1024,8 +1013,8 @@ static int sata_pmp_eh_recover(struct ata_port *ap, | |||
1024 | } | 1013 | } |
1025 | 1014 | ||
1026 | /* recover pmp */ | 1015 | /* recover pmp */ |
1027 | rc = sata_pmp_eh_recover_pmp(ap, prereset, softreset, hardreset, | 1016 | rc = sata_pmp_eh_recover_pmp(ap, ops->prereset, ops->softreset, |
1028 | postreset); | 1017 | ops->hardreset, ops->postreset); |
1029 | if (rc) | 1018 | if (rc) |
1030 | goto pmp_fail; | 1019 | goto pmp_fail; |
1031 | 1020 | ||
@@ -1035,8 +1024,8 @@ static int sata_pmp_eh_recover(struct ata_port *ap, | |||
1035 | goto pmp_fail; | 1024 | goto pmp_fail; |
1036 | 1025 | ||
1037 | /* recover links */ | 1026 | /* recover links */ |
1038 | rc = ata_eh_recover(ap, pmp_prereset, pmp_softreset, pmp_hardreset, | 1027 | rc = ata_eh_recover(ap, ops->pmp_prereset, ops->pmp_softreset, |
1039 | pmp_postreset, &link); | 1028 | ops->pmp_hardreset, ops->pmp_postreset, &link); |
1040 | if (rc) | 1029 | if (rc) |
1041 | goto link_fail; | 1030 | goto link_fail; |
1042 | 1031 | ||
@@ -1132,16 +1121,8 @@ static int sata_pmp_eh_recover(struct ata_port *ap, | |||
1132 | } | 1121 | } |
1133 | 1122 | ||
1134 | /** | 1123 | /** |
1135 | * sata_pmp_do_eh - do standard error handling for PMP-enabled host | 1124 | * sata_pmp_error_handler - do standard error handling for PMP-enabled host |
1136 | * @ap: host port to handle error for | 1125 | * @ap: host port to handle error for |
1137 | * @prereset: prereset method (can be NULL) | ||
1138 | * @softreset: softreset method | ||
1139 | * @hardreset: hardreset method | ||
1140 | * @postreset: postreset method (can be NULL) | ||
1141 | * @pmp_prereset: PMP prereset method (can be NULL) | ||
1142 | * @pmp_softreset: PMP softreset method (can be NULL) | ||
1143 | * @pmp_hardreset: PMP hardreset method (can be NULL) | ||
1144 | * @pmp_postreset: PMP postreset method (can be NULL) | ||
1145 | * | 1126 | * |
1146 | * Perform standard error handling sequence for PMP-enabled host | 1127 | * Perform standard error handling sequence for PMP-enabled host |
1147 | * @ap. | 1128 | * @ap. |
@@ -1149,16 +1130,10 @@ static int sata_pmp_eh_recover(struct ata_port *ap, | |||
1149 | * LOCKING: | 1130 | * LOCKING: |
1150 | * Kernel thread context (may sleep). | 1131 | * Kernel thread context (may sleep). |
1151 | */ | 1132 | */ |
1152 | void sata_pmp_do_eh(struct ata_port *ap, | 1133 | void sata_pmp_error_handler(struct ata_port *ap) |
1153 | ata_prereset_fn_t prereset, ata_reset_fn_t softreset, | ||
1154 | ata_reset_fn_t hardreset, ata_postreset_fn_t postreset, | ||
1155 | ata_prereset_fn_t pmp_prereset, ata_reset_fn_t pmp_softreset, | ||
1156 | ata_reset_fn_t pmp_hardreset, ata_postreset_fn_t pmp_postreset) | ||
1157 | { | 1134 | { |
1158 | ata_eh_autopsy(ap); | 1135 | ata_eh_autopsy(ap); |
1159 | ata_eh_report(ap); | 1136 | ata_eh_report(ap); |
1160 | sata_pmp_eh_recover(ap, prereset, softreset, hardreset, postreset, | 1137 | sata_pmp_eh_recover(ap); |
1161 | pmp_prereset, pmp_softreset, pmp_hardreset, | ||
1162 | pmp_postreset); | ||
1163 | ata_eh_finish(ap); | 1138 | ata_eh_finish(ap); |
1164 | } | 1139 | } |
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 6223ec042c80..2a229a1d3211 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -396,28 +396,21 @@ void ata_bmdma_thaw(struct ata_port *ap) | |||
396 | } | 396 | } |
397 | 397 | ||
398 | /** | 398 | /** |
399 | * ata_bmdma_drive_eh - Perform EH with given methods for BMDMA controller | 399 | * ata_bmdma_error_handler - Stock error handler for BMDMA controller |
400 | * @ap: port to handle error for | 400 | * @ap: port to handle error for |
401 | * @prereset: prereset method (can be NULL) | ||
402 | * @softreset: softreset method (can be NULL) | ||
403 | * @hardreset: hardreset method (can be NULL) | ||
404 | * @postreset: postreset method (can be NULL) | ||
405 | * | 401 | * |
406 | * Handle error for ATA BMDMA controller. It can handle both | 402 | * Stock error handler for BMDMA controller. It can handle both |
407 | * PATA and SATA controllers. Many controllers should be able to | 403 | * PATA and SATA controllers. Many controllers should be able to |
408 | * use this EH as-is or with some added handling before and | 404 | * use this EH as-is or with some added handling before and |
409 | * after. | 405 | * after. |
410 | * | 406 | * |
411 | * This function is intended to be used for constructing | ||
412 | * ->error_handler callback by low level drivers. | ||
413 | * | ||
414 | * LOCKING: | 407 | * LOCKING: |
415 | * Kernel thread context (may sleep) | 408 | * Kernel thread context (may sleep) |
416 | */ | 409 | */ |
417 | void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset, | 410 | void ata_bmdma_error_handler(struct ata_port *ap) |
418 | ata_reset_fn_t softreset, ata_reset_fn_t hardreset, | ||
419 | ata_postreset_fn_t postreset) | ||
420 | { | 411 | { |
412 | ata_reset_fn_t softreset = ap->ops->softreset; | ||
413 | ata_reset_fn_t hardreset = ap->ops->hardreset; | ||
421 | struct ata_queued_cmd *qc; | 414 | struct ata_queued_cmd *qc; |
422 | unsigned long flags; | 415 | unsigned long flags; |
423 | int thaw = 0; | 416 | int thaw = 0; |
@@ -460,29 +453,19 @@ void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset, | |||
460 | ata_eh_thaw_port(ap); | 453 | ata_eh_thaw_port(ap); |
461 | 454 | ||
462 | /* PIO and DMA engines have been stopped, perform recovery */ | 455 | /* PIO and DMA engines have been stopped, perform recovery */ |
463 | ata_do_eh(ap, prereset, softreset, hardreset, postreset); | ||
464 | } | ||
465 | |||
466 | /** | ||
467 | * ata_bmdma_error_handler - Stock error handler for BMDMA controller | ||
468 | * @ap: port to handle error for | ||
469 | * | ||
470 | * Stock error handler for BMDMA controller. | ||
471 | * | ||
472 | * LOCKING: | ||
473 | * Kernel thread context (may sleep) | ||
474 | */ | ||
475 | void ata_bmdma_error_handler(struct ata_port *ap) | ||
476 | { | ||
477 | ata_reset_fn_t softreset = NULL, hardreset = NULL; | ||
478 | 456 | ||
479 | if (ap->ioaddr.ctl_addr) | 457 | /* ata_std_softreset and sata_std_hardreset are inherited to |
480 | softreset = ata_std_softreset; | 458 | * all SFF drivers from ata_sff_port_ops. Ignore softreset if |
481 | if (sata_scr_valid(&ap->link)) | 459 | * ctl isn't accessible. Ignore hardreset if SCR access isn't |
482 | hardreset = sata_std_hardreset; | 460 | * available. |
461 | */ | ||
462 | if (softreset == ata_std_softreset && !ap->ioaddr.ctl_addr) | ||
463 | softreset = NULL; | ||
464 | if (hardreset == sata_std_hardreset && !sata_scr_valid(&ap->link)) | ||
465 | hardreset = NULL; | ||
483 | 466 | ||
484 | ata_bmdma_drive_eh(ap, ata_std_prereset, softreset, hardreset, | 467 | ata_do_eh(ap, ap->ops->prereset, softreset, hardreset, |
485 | ata_std_postreset); | 468 | ap->ops->postreset); |
486 | } | 469 | } |
487 | 470 | ||
488 | /** | 471 | /** |
diff --git a/drivers/ata/pata_artop.c b/drivers/ata/pata_artop.c index ebd15cadf15f..b6d8c4d0e6c2 100644 --- a/drivers/ata/pata_artop.c +++ b/drivers/ata/pata_artop.c | |||
@@ -56,21 +56,6 @@ static int artop6210_pre_reset(struct ata_link *link, unsigned long deadline) | |||
56 | } | 56 | } |
57 | 57 | ||
58 | /** | 58 | /** |
59 | * artop6210_error_handler - Probe specified port on PATA host controller | ||
60 | * @ap: Port to probe | ||
61 | * | ||
62 | * LOCKING: | ||
63 | * None (inherited from caller). | ||
64 | */ | ||
65 | |||
66 | static void artop6210_error_handler(struct ata_port *ap) | ||
67 | { | ||
68 | ata_bmdma_drive_eh(ap, artop6210_pre_reset, | ||
69 | ata_std_softreset, NULL, | ||
70 | ata_std_postreset); | ||
71 | } | ||
72 | |||
73 | /** | ||
74 | * artop6260_pre_reset - check for 40/80 pin | 59 | * artop6260_pre_reset - check for 40/80 pin |
75 | * @link: link | 60 | * @link: link |
76 | * @deadline: deadline jiffies for the operation | 61 | * @deadline: deadline jiffies for the operation |
@@ -114,21 +99,6 @@ static int artop6260_cable_detect(struct ata_port *ap) | |||
114 | } | 99 | } |
115 | 100 | ||
116 | /** | 101 | /** |
117 | * artop6260_error_handler - Probe specified port on PATA host controller | ||
118 | * @ap: Port to probe | ||
119 | * | ||
120 | * LOCKING: | ||
121 | * None (inherited from caller). | ||
122 | */ | ||
123 | |||
124 | static void artop6260_error_handler(struct ata_port *ap) | ||
125 | { | ||
126 | ata_bmdma_drive_eh(ap, artop6260_pre_reset, | ||
127 | ata_std_softreset, NULL, | ||
128 | ata_std_postreset); | ||
129 | } | ||
130 | |||
131 | /** | ||
132 | * artop6210_load_piomode - Load a set of PATA PIO timings | 102 | * artop6210_load_piomode - Load a set of PATA PIO timings |
133 | * @ap: Port whose timings we are configuring | 103 | * @ap: Port whose timings we are configuring |
134 | * @adev: Device | 104 | * @adev: Device |
@@ -322,7 +292,7 @@ static struct ata_port_operations artop6210_ops = { | |||
322 | .cable_detect = ata_cable_40wire, | 292 | .cable_detect = ata_cable_40wire, |
323 | .set_piomode = artop6210_set_piomode, | 293 | .set_piomode = artop6210_set_piomode, |
324 | .set_dmamode = artop6210_set_dmamode, | 294 | .set_dmamode = artop6210_set_dmamode, |
325 | .error_handler = artop6210_error_handler, | 295 | .prereset = artop6210_pre_reset, |
326 | }; | 296 | }; |
327 | 297 | ||
328 | static struct ata_port_operations artop6260_ops = { | 298 | static struct ata_port_operations artop6260_ops = { |
@@ -330,7 +300,7 @@ static struct ata_port_operations artop6260_ops = { | |||
330 | .cable_detect = artop6260_cable_detect, | 300 | .cable_detect = artop6260_cable_detect, |
331 | .set_piomode = artop6260_set_piomode, | 301 | .set_piomode = artop6260_set_piomode, |
332 | .set_dmamode = artop6260_set_dmamode, | 302 | .set_dmamode = artop6260_set_dmamode, |
333 | .error_handler = artop6260_error_handler, | 303 | .prereset = artop6260_pre_reset, |
334 | }; | 304 | }; |
335 | 305 | ||
336 | 306 | ||
diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c index 0bea7e75d2d6..56a65baddd4a 100644 --- a/drivers/ata/pata_atiixp.c +++ b/drivers/ata/pata_atiixp.c | |||
@@ -48,11 +48,6 @@ static int atiixp_pre_reset(struct ata_link *link, unsigned long deadline) | |||
48 | return ata_std_prereset(link, deadline); | 48 | return ata_std_prereset(link, deadline); |
49 | } | 49 | } |
50 | 50 | ||
51 | static void atiixp_error_handler(struct ata_port *ap) | ||
52 | { | ||
53 | ata_bmdma_drive_eh(ap, atiixp_pre_reset, ata_std_softreset, NULL, ata_std_postreset); | ||
54 | } | ||
55 | |||
56 | static int atiixp_cable_detect(struct ata_port *ap) | 51 | static int atiixp_cable_detect(struct ata_port *ap) |
57 | { | 52 | { |
58 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 53 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
@@ -235,7 +230,7 @@ static struct ata_port_operations atiixp_port_ops = { | |||
235 | .cable_detect = atiixp_cable_detect, | 230 | .cable_detect = atiixp_cable_detect, |
236 | .set_piomode = atiixp_set_piomode, | 231 | .set_piomode = atiixp_set_piomode, |
237 | .set_dmamode = atiixp_set_dmamode, | 232 | .set_dmamode = atiixp_set_dmamode, |
238 | .error_handler = atiixp_error_handler, | 233 | .prereset = atiixp_pre_reset, |
239 | }; | 234 | }; |
240 | 235 | ||
241 | static int atiixp_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 236 | static int atiixp_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
diff --git a/drivers/ata/pata_bf54x.c b/drivers/ata/pata_bf54x.c index 7a22ef483061..eea275acb2a8 100644 --- a/drivers/ata/pata_bf54x.c +++ b/drivers/ata/pata_bf54x.c | |||
@@ -1314,17 +1314,6 @@ static void bfin_std_postreset(struct ata_link *link, unsigned int *classes) | |||
1314 | write_atapi_register(base, ATA_REG_CTRL, ap->ctl); | 1314 | write_atapi_register(base, ATA_REG_CTRL, ap->ctl); |
1315 | } | 1315 | } |
1316 | 1316 | ||
1317 | /** | ||
1318 | * bfin_error_handler - Stock error handler for DMA controller | ||
1319 | * @ap: port to handle error for | ||
1320 | */ | ||
1321 | |||
1322 | static void bfin_error_handler(struct ata_port *ap) | ||
1323 | { | ||
1324 | ata_bmdma_drive_eh(ap, ata_std_prereset, bfin_std_softreset, NULL, | ||
1325 | bfin_std_postreset); | ||
1326 | } | ||
1327 | |||
1328 | static void bfin_port_stop(struct ata_port *ap) | 1317 | static void bfin_port_stop(struct ata_port *ap) |
1329 | { | 1318 | { |
1330 | dev_dbg(ap->dev, "in atapi port stop\n"); | 1319 | dev_dbg(ap->dev, "in atapi port stop\n"); |
@@ -1385,7 +1374,8 @@ static const struct ata_port_operations bfin_pata_ops = { | |||
1385 | 1374 | ||
1386 | .freeze = bfin_bmdma_freeze, | 1375 | .freeze = bfin_bmdma_freeze, |
1387 | .thaw = bfin_bmdma_thaw, | 1376 | .thaw = bfin_bmdma_thaw, |
1388 | .error_handler = bfin_error_handler, | 1377 | .softreset = bfin_std_softreset, |
1378 | .postreset = bfin_std_postreset, | ||
1389 | .post_internal_cmd = bfin_bmdma_stop, | 1379 | .post_internal_cmd = bfin_bmdma_stop, |
1390 | 1380 | ||
1391 | .irq_clear = bfin_irq_clear, | 1381 | .irq_clear = bfin_irq_clear, |
diff --git a/drivers/ata/pata_efar.c b/drivers/ata/pata_efar.c index 2f5b4848456a..1d839a57068e 100644 --- a/drivers/ata/pata_efar.c +++ b/drivers/ata/pata_efar.c | |||
@@ -49,19 +49,6 @@ static int efar_pre_reset(struct ata_link *link, unsigned long deadline) | |||
49 | } | 49 | } |
50 | 50 | ||
51 | /** | 51 | /** |
52 | * efar_probe_reset - Probe specified port on PATA host controller | ||
53 | * @ap: Port to probe | ||
54 | * | ||
55 | * LOCKING: | ||
56 | * None (inherited from caller). | ||
57 | */ | ||
58 | |||
59 | static void efar_error_handler(struct ata_port *ap) | ||
60 | { | ||
61 | ata_bmdma_drive_eh(ap, efar_pre_reset, ata_std_softreset, NULL, ata_std_postreset); | ||
62 | } | ||
63 | |||
64 | /** | ||
65 | * efar_cable_detect - check for 40/80 pin | 52 | * efar_cable_detect - check for 40/80 pin |
66 | * @ap: Port | 53 | * @ap: Port |
67 | * | 54 | * |
@@ -241,7 +228,7 @@ static struct ata_port_operations efar_ops = { | |||
241 | .cable_detect = efar_cable_detect, | 228 | .cable_detect = efar_cable_detect, |
242 | .set_piomode = efar_set_piomode, | 229 | .set_piomode = efar_set_piomode, |
243 | .set_dmamode = efar_set_dmamode, | 230 | .set_dmamode = efar_set_dmamode, |
244 | .error_handler = efar_error_handler, | 231 | .prereset = efar_pre_reset, |
245 | }; | 232 | }; |
246 | 233 | ||
247 | 234 | ||
diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c index fb37e3a161fc..c10fcd31418d 100644 --- a/drivers/ata/pata_hpt37x.c +++ b/drivers/ata/pata_hpt37x.c | |||
@@ -341,19 +341,7 @@ static int hpt37x_pre_reset(struct ata_link *link, unsigned long deadline) | |||
341 | return ata_std_prereset(link, deadline); | 341 | return ata_std_prereset(link, deadline); |
342 | } | 342 | } |
343 | 343 | ||
344 | /** | 344 | static int hpt374_fn1_pre_reset(struct ata_link *link, unsigned long deadline) |
345 | * hpt37x_error_handler - reset the hpt374 | ||
346 | * @ap: ATA port to reset | ||
347 | * | ||
348 | * Perform probe for HPT37x, except for HPT374 channel 2 | ||
349 | */ | ||
350 | |||
351 | static void hpt37x_error_handler(struct ata_port *ap) | ||
352 | { | ||
353 | ata_bmdma_drive_eh(ap, hpt37x_pre_reset, ata_std_softreset, NULL, ata_std_postreset); | ||
354 | } | ||
355 | |||
356 | static int hpt374_pre_reset(struct ata_link *link, unsigned long deadline) | ||
357 | { | 345 | { |
358 | static const struct pci_bits hpt37x_enable_bits[] = { | 346 | static const struct pci_bits hpt37x_enable_bits[] = { |
359 | { 0x50, 1, 0x04, 0x04 }, | 347 | { 0x50, 1, 0x04, 0x04 }, |
@@ -390,25 +378,6 @@ static int hpt374_pre_reset(struct ata_link *link, unsigned long deadline) | |||
390 | } | 378 | } |
391 | 379 | ||
392 | /** | 380 | /** |
393 | * hpt374_error_handler - reset the hpt374 | ||
394 | * @classes: | ||
395 | * | ||
396 | * The 374 cable detect is a little different due to the extra | ||
397 | * channels. The function 0 channels work like usual but function 1 | ||
398 | * is special | ||
399 | */ | ||
400 | |||
401 | static void hpt374_error_handler(struct ata_port *ap) | ||
402 | { | ||
403 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | ||
404 | |||
405 | if (!(PCI_FUNC(pdev->devfn) & 1)) | ||
406 | hpt37x_error_handler(ap); | ||
407 | else | ||
408 | ata_bmdma_drive_eh(ap, hpt374_pre_reset, ata_std_softreset, NULL, ata_std_postreset); | ||
409 | } | ||
410 | |||
411 | /** | ||
412 | * hpt370_set_piomode - PIO setup | 381 | * hpt370_set_piomode - PIO setup |
413 | * @ap: ATA interface | 382 | * @ap: ATA interface |
414 | * @adev: device on the interface | 383 | * @adev: device on the interface |
@@ -635,7 +604,7 @@ static struct ata_port_operations hpt370_port_ops = { | |||
635 | .mode_filter = hpt370_filter, | 604 | .mode_filter = hpt370_filter, |
636 | .set_piomode = hpt370_set_piomode, | 605 | .set_piomode = hpt370_set_piomode, |
637 | .set_dmamode = hpt370_set_dmamode, | 606 | .set_dmamode = hpt370_set_dmamode, |
638 | .error_handler = hpt37x_error_handler, | 607 | .prereset = hpt37x_pre_reset, |
639 | }; | 608 | }; |
640 | 609 | ||
641 | /* | 610 | /* |
@@ -659,17 +628,17 @@ static struct ata_port_operations hpt372_port_ops = { | |||
659 | 628 | ||
660 | .set_piomode = hpt372_set_piomode, | 629 | .set_piomode = hpt372_set_piomode, |
661 | .set_dmamode = hpt372_set_dmamode, | 630 | .set_dmamode = hpt372_set_dmamode, |
662 | .error_handler = hpt37x_error_handler, | 631 | .prereset = hpt37x_pre_reset, |
663 | }; | 632 | }; |
664 | 633 | ||
665 | /* | 634 | /* |
666 | * Configuration for HPT374. Mode setting works like 372 and friends | 635 | * Configuration for HPT374. Mode setting works like 372 and friends |
667 | * but we have a different cable detection procedure. | 636 | * but we have a different cable detection procedure for function 1. |
668 | */ | 637 | */ |
669 | 638 | ||
670 | static struct ata_port_operations hpt374_port_ops = { | 639 | static struct ata_port_operations hpt374_fn1_port_ops = { |
671 | .inherits = &hpt372_port_ops, | 640 | .inherits = &hpt372_port_ops, |
672 | .error_handler = hpt374_error_handler, | 641 | .prereset = hpt374_fn1_pre_reset, |
673 | }; | 642 | }; |
674 | 643 | ||
675 | /** | 644 | /** |
@@ -821,13 +790,20 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id) | |||
821 | .udma_mask = ATA_UDMA6, | 790 | .udma_mask = ATA_UDMA6, |
822 | .port_ops = &hpt372_port_ops | 791 | .port_ops = &hpt372_port_ops |
823 | }; | 792 | }; |
824 | /* HPT374 - UDMA100 */ | 793 | /* HPT374 - UDMA100, function 1 uses different prereset method */ |
825 | static const struct ata_port_info info_hpt374 = { | 794 | static const struct ata_port_info info_hpt374_fn0 = { |
795 | .flags = ATA_FLAG_SLAVE_POSS, | ||
796 | .pio_mask = 0x1f, | ||
797 | .mwdma_mask = 0x07, | ||
798 | .udma_mask = ATA_UDMA5, | ||
799 | .port_ops = &hpt372_port_ops | ||
800 | }; | ||
801 | static const struct ata_port_info info_hpt374_fn1 = { | ||
826 | .flags = ATA_FLAG_SLAVE_POSS, | 802 | .flags = ATA_FLAG_SLAVE_POSS, |
827 | .pio_mask = 0x1f, | 803 | .pio_mask = 0x1f, |
828 | .mwdma_mask = 0x07, | 804 | .mwdma_mask = 0x07, |
829 | .udma_mask = ATA_UDMA5, | 805 | .udma_mask = ATA_UDMA5, |
830 | .port_ops = &hpt374_port_ops | 806 | .port_ops = &hpt374_fn1_port_ops |
831 | }; | 807 | }; |
832 | 808 | ||
833 | static const int MHz[4] = { 33, 40, 50, 66 }; | 809 | static const int MHz[4] = { 33, 40, 50, 66 }; |
@@ -912,7 +888,10 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id) | |||
912 | break; | 888 | break; |
913 | case PCI_DEVICE_ID_TTI_HPT374: | 889 | case PCI_DEVICE_ID_TTI_HPT374: |
914 | chip_table = &hpt374; | 890 | chip_table = &hpt374; |
915 | ppi[0] = &info_hpt374; | 891 | if (!(PCI_FUNC(dev->devfn) & 1)) |
892 | *ppi = &info_hpt374_fn0; | ||
893 | else | ||
894 | *ppi = &info_hpt374_fn1; | ||
916 | break; | 895 | break; |
917 | default: | 896 | default: |
918 | printk(KERN_ERR "pata_hpt37x: PCI table is bogus please report (%d).\n", dev->device); | 897 | printk(KERN_ERR "pata_hpt37x: PCI table is bogus please report (%d).\n", dev->device); |
diff --git a/drivers/ata/pata_hpt3x2n.c b/drivers/ata/pata_hpt3x2n.c index c774be93ae04..cd44ee3d3cc1 100644 --- a/drivers/ata/pata_hpt3x2n.c +++ b/drivers/ata/pata_hpt3x2n.c | |||
@@ -148,7 +148,7 @@ static int hpt3x2n_cable_detect(struct ata_port *ap) | |||
148 | * Reset the hardware and state machine, | 148 | * Reset the hardware and state machine, |
149 | */ | 149 | */ |
150 | 150 | ||
151 | static int hpt3xn_pre_reset(struct ata_link *link, unsigned long deadline) | 151 | static int hpt3x2n_pre_reset(struct ata_link *link, unsigned long deadline) |
152 | { | 152 | { |
153 | struct ata_port *ap = link->ap; | 153 | struct ata_port *ap = link->ap; |
154 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 154 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
@@ -160,18 +160,6 @@ static int hpt3xn_pre_reset(struct ata_link *link, unsigned long deadline) | |||
160 | } | 160 | } |
161 | 161 | ||
162 | /** | 162 | /** |
163 | * hpt3x2n_error_handler - probe the hpt3x2n bus | ||
164 | * @ap: ATA port to reset | ||
165 | * | ||
166 | * Perform the probe reset handling for the 3x2N | ||
167 | */ | ||
168 | |||
169 | static void hpt3x2n_error_handler(struct ata_port *ap) | ||
170 | { | ||
171 | ata_bmdma_drive_eh(ap, hpt3xn_pre_reset, ata_std_softreset, NULL, ata_std_postreset); | ||
172 | } | ||
173 | |||
174 | /** | ||
175 | * hpt3x2n_set_piomode - PIO setup | 163 | * hpt3x2n_set_piomode - PIO setup |
176 | * @ap: ATA interface | 164 | * @ap: ATA interface |
177 | * @adev: device on the interface | 165 | * @adev: device on the interface |
@@ -355,7 +343,7 @@ static struct ata_port_operations hpt3x2n_port_ops = { | |||
355 | .cable_detect = hpt3x2n_cable_detect, | 343 | .cable_detect = hpt3x2n_cable_detect, |
356 | .set_piomode = hpt3x2n_set_piomode, | 344 | .set_piomode = hpt3x2n_set_piomode, |
357 | .set_dmamode = hpt3x2n_set_dmamode, | 345 | .set_dmamode = hpt3x2n_set_dmamode, |
358 | .error_handler = hpt3x2n_error_handler, | 346 | .prereset = hpt3x2n_pre_reset, |
359 | }; | 347 | }; |
360 | 348 | ||
361 | /** | 349 | /** |
diff --git a/drivers/ata/pata_icside.c b/drivers/ata/pata_icside.c index ff16b0eaa2c2..13d43e9dd279 100644 --- a/drivers/ata/pata_icside.c +++ b/drivers/ata/pata_icside.c | |||
@@ -332,12 +332,6 @@ static void pata_icside_postreset(struct ata_link *link, unsigned int *classes) | |||
332 | } | 332 | } |
333 | } | 333 | } |
334 | 334 | ||
335 | static void pata_icside_error_handler(struct ata_port *ap) | ||
336 | { | ||
337 | ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset, NULL, | ||
338 | pata_icside_postreset); | ||
339 | } | ||
340 | |||
341 | static struct ata_port_operations pata_icside_port_ops = { | 335 | static struct ata_port_operations pata_icside_port_ops = { |
342 | .inherits = &ata_sff_port_ops, | 336 | .inherits = &ata_sff_port_ops, |
343 | /* no need to build any PRD tables for DMA */ | 337 | /* no need to build any PRD tables for DMA */ |
@@ -350,7 +344,7 @@ static struct ata_port_operations pata_icside_port_ops = { | |||
350 | 344 | ||
351 | .cable_detect = ata_cable_40wire, | 345 | .cable_detect = ata_cable_40wire, |
352 | .set_dmamode = pata_icside_set_dmamode, | 346 | .set_dmamode = pata_icside_set_dmamode, |
353 | .error_handler = pata_icside_error_handler, | 347 | .postreset = pata_icside_postreset, |
354 | .post_internal_cmd = pata_icside_bmdma_stop, | 348 | .post_internal_cmd = pata_icside_bmdma_stop, |
355 | }; | 349 | }; |
356 | 350 | ||
diff --git a/drivers/ata/pata_it8213.c b/drivers/ata/pata_it8213.c index d23a46b75028..84ab89e8a247 100644 --- a/drivers/ata/pata_it8213.c +++ b/drivers/ata/pata_it8213.c | |||
@@ -44,19 +44,6 @@ static int it8213_pre_reset(struct ata_link *link, unsigned long deadline) | |||
44 | } | 44 | } |
45 | 45 | ||
46 | /** | 46 | /** |
47 | * it8213_error_handler - Probe specified port on PATA host controller | ||
48 | * @ap: Port to probe | ||
49 | * | ||
50 | * LOCKING: | ||
51 | * None (inherited from caller). | ||
52 | */ | ||
53 | |||
54 | static void it8213_error_handler(struct ata_port *ap) | ||
55 | { | ||
56 | ata_bmdma_drive_eh(ap, it8213_pre_reset, ata_std_softreset, NULL, ata_std_postreset); | ||
57 | } | ||
58 | |||
59 | /** | ||
60 | * it8213_cable_detect - check for 40/80 pin | 47 | * it8213_cable_detect - check for 40/80 pin |
61 | * @ap: Port | 48 | * @ap: Port |
62 | * | 49 | * |
@@ -252,7 +239,7 @@ static struct ata_port_operations it8213_ops = { | |||
252 | .cable_detect = it8213_cable_detect, | 239 | .cable_detect = it8213_cable_detect, |
253 | .set_piomode = it8213_set_piomode, | 240 | .set_piomode = it8213_set_piomode, |
254 | .set_dmamode = it8213_set_dmamode, | 241 | .set_dmamode = it8213_set_dmamode, |
255 | .error_handler = it8213_error_handler, | 242 | .prereset = it8213_pre_reset, |
256 | }; | 243 | }; |
257 | 244 | ||
258 | 245 | ||
diff --git a/drivers/ata/pata_mpc52xx.c b/drivers/ata/pata_mpc52xx.c index ac7c0822b1a7..fec93196710e 100644 --- a/drivers/ata/pata_mpc52xx.c +++ b/drivers/ata/pata_mpc52xx.c | |||
@@ -255,15 +255,6 @@ mpc52xx_ata_dev_select(struct ata_port *ap, unsigned int device) | |||
255 | ata_std_dev_select(ap,device); | 255 | ata_std_dev_select(ap,device); |
256 | } | 256 | } |
257 | 257 | ||
258 | static void | ||
259 | mpc52xx_ata_error_handler(struct ata_port *ap) | ||
260 | { | ||
261 | ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset, NULL, | ||
262 | ata_std_postreset); | ||
263 | } | ||
264 | |||
265 | |||
266 | |||
267 | static struct scsi_host_template mpc52xx_ata_sht = { | 258 | static struct scsi_host_template mpc52xx_ata_sht = { |
268 | ATA_PIO_SHT(DRV_NAME), | 259 | ATA_PIO_SHT(DRV_NAME), |
269 | }; | 260 | }; |
@@ -273,7 +264,6 @@ static struct ata_port_operations mpc52xx_ata_port_ops = { | |||
273 | .dev_select = mpc52xx_ata_dev_select, | 264 | .dev_select = mpc52xx_ata_dev_select, |
274 | .cable_detect = ata_cable_40wire, | 265 | .cable_detect = ata_cable_40wire, |
275 | .set_piomode = mpc52xx_ata_set_piomode, | 266 | .set_piomode = mpc52xx_ata_set_piomode, |
276 | .error_handler = mpc52xx_ata_error_handler, | ||
277 | .post_internal_cmd = ATA_OP_NULL, | 267 | .post_internal_cmd = ATA_OP_NULL, |
278 | }; | 268 | }; |
279 | 269 | ||
diff --git a/drivers/ata/pata_mpiix.c b/drivers/ata/pata_mpiix.c index dab54f8a272d..1b9d0d412ebf 100644 --- a/drivers/ata/pata_mpiix.c +++ b/drivers/ata/pata_mpiix.c | |||
@@ -59,20 +59,6 @@ static int mpiix_pre_reset(struct ata_link *link, unsigned long deadline) | |||
59 | } | 59 | } |
60 | 60 | ||
61 | /** | 61 | /** |
62 | * mpiix_error_handler - probe reset | ||
63 | * @ap: ATA port | ||
64 | * | ||
65 | * Perform the ATA probe and bus reset sequence plus specific handling | ||
66 | * for this hardware. The MPIIX has the enable bits in a different place | ||
67 | * to PIIX4 and friends. As a pure PIO device it has no cable detect | ||
68 | */ | ||
69 | |||
70 | static void mpiix_error_handler(struct ata_port *ap) | ||
71 | { | ||
72 | ata_bmdma_drive_eh(ap, mpiix_pre_reset, ata_std_softreset, NULL, ata_std_postreset); | ||
73 | } | ||
74 | |||
75 | /** | ||
76 | * mpiix_set_piomode - set initial PIO mode data | 62 | * mpiix_set_piomode - set initial PIO mode data |
77 | * @ap: ATA interface | 63 | * @ap: ATA interface |
78 | * @adev: ATA device | 64 | * @adev: ATA device |
@@ -159,7 +145,7 @@ static struct ata_port_operations mpiix_port_ops = { | |||
159 | .qc_issue = mpiix_qc_issue_prot, | 145 | .qc_issue = mpiix_qc_issue_prot, |
160 | .cable_detect = ata_cable_40wire, | 146 | .cable_detect = ata_cable_40wire, |
161 | .set_piomode = mpiix_set_piomode, | 147 | .set_piomode = mpiix_set_piomode, |
162 | .error_handler = mpiix_error_handler, | 148 | .prereset = mpiix_pre_reset, |
163 | }; | 149 | }; |
164 | 150 | ||
165 | static int mpiix_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 151 | static int mpiix_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
diff --git a/drivers/ata/pata_ns87410.c b/drivers/ata/pata_ns87410.c index 5a043e426480..4d2eefee7387 100644 --- a/drivers/ata/pata_ns87410.c +++ b/drivers/ata/pata_ns87410.c | |||
@@ -54,20 +54,6 @@ static int ns87410_pre_reset(struct ata_link *link, unsigned long deadline) | |||
54 | } | 54 | } |
55 | 55 | ||
56 | /** | 56 | /** |
57 | * ns87410_error_handler - probe reset | ||
58 | * @ap: ATA port | ||
59 | * | ||
60 | * Perform the ATA probe and bus reset sequence plus specific handling | ||
61 | * for this hardware. The MPIIX has the enable bits in a different place | ||
62 | * to PIIX4 and friends. As a pure PIO device it has no cable detect | ||
63 | */ | ||
64 | |||
65 | static void ns87410_error_handler(struct ata_port *ap) | ||
66 | { | ||
67 | ata_bmdma_drive_eh(ap, ns87410_pre_reset, ata_std_softreset, NULL, ata_std_postreset); | ||
68 | } | ||
69 | |||
70 | /** | ||
71 | * ns87410_set_piomode - set initial PIO mode data | 57 | * ns87410_set_piomode - set initial PIO mode data |
72 | * @ap: ATA interface | 58 | * @ap: ATA interface |
73 | * @adev: ATA device | 59 | * @adev: ATA device |
@@ -152,7 +138,7 @@ static struct ata_port_operations ns87410_port_ops = { | |||
152 | .qc_issue = ns87410_qc_issue_prot, | 138 | .qc_issue = ns87410_qc_issue_prot, |
153 | .cable_detect = ata_cable_40wire, | 139 | .cable_detect = ata_cable_40wire, |
154 | .set_piomode = ns87410_set_piomode, | 140 | .set_piomode = ns87410_set_piomode, |
155 | .error_handler = ns87410_error_handler, | 141 | .prereset = ns87410_pre_reset, |
156 | }; | 142 | }; |
157 | 143 | ||
158 | static int ns87410_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 144 | static int ns87410_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
diff --git a/drivers/ata/pata_oldpiix.c b/drivers/ata/pata_oldpiix.c index 7001b756819e..c1da79a76439 100644 --- a/drivers/ata/pata_oldpiix.c +++ b/drivers/ata/pata_oldpiix.c | |||
@@ -51,20 +51,6 @@ static int oldpiix_pre_reset(struct ata_link *link, unsigned long deadline) | |||
51 | } | 51 | } |
52 | 52 | ||
53 | /** | 53 | /** |
54 | * oldpiix_pata_error_handler - Probe specified port on PATA host controller | ||
55 | * @ap: Port to probe | ||
56 | * @classes: | ||
57 | * | ||
58 | * LOCKING: | ||
59 | * None (inherited from caller). | ||
60 | */ | ||
61 | |||
62 | static void oldpiix_pata_error_handler(struct ata_port *ap) | ||
63 | { | ||
64 | ata_bmdma_drive_eh(ap, oldpiix_pre_reset, ata_std_softreset, NULL, ata_std_postreset); | ||
65 | } | ||
66 | |||
67 | /** | ||
68 | * oldpiix_set_piomode - Initialize host controller PATA PIO timings | 54 | * oldpiix_set_piomode - Initialize host controller PATA PIO timings |
69 | * @ap: Port whose timings we are configuring | 55 | * @ap: Port whose timings we are configuring |
70 | * @adev: Device whose timings we are configuring | 56 | * @adev: Device whose timings we are configuring |
@@ -229,7 +215,7 @@ static struct ata_port_operations oldpiix_pata_ops = { | |||
229 | .cable_detect = ata_cable_40wire, | 215 | .cable_detect = ata_cable_40wire, |
230 | .set_piomode = oldpiix_set_piomode, | 216 | .set_piomode = oldpiix_set_piomode, |
231 | .set_dmamode = oldpiix_set_dmamode, | 217 | .set_dmamode = oldpiix_set_dmamode, |
232 | .error_handler = oldpiix_pata_error_handler, | 218 | .prereset = oldpiix_pre_reset, |
233 | }; | 219 | }; |
234 | 220 | ||
235 | 221 | ||
diff --git a/drivers/ata/pata_opti.c b/drivers/ata/pata_opti.c index 5a5f20e03fc0..4ddd03a67775 100644 --- a/drivers/ata/pata_opti.c +++ b/drivers/ata/pata_opti.c | |||
@@ -68,21 +68,6 @@ static int opti_pre_reset(struct ata_link *link, unsigned long deadline) | |||
68 | } | 68 | } |
69 | 69 | ||
70 | /** | 70 | /** |
71 | * opti_probe_reset - probe reset | ||
72 | * @ap: ATA port | ||
73 | * | ||
74 | * Perform the ATA probe and bus reset sequence plus specific handling | ||
75 | * for this hardware. The Opti needs little handling - we have no UDMA66 | ||
76 | * capability that needs cable detection. All we must do is check the port | ||
77 | * is enabled. | ||
78 | */ | ||
79 | |||
80 | static void opti_error_handler(struct ata_port *ap) | ||
81 | { | ||
82 | ata_bmdma_drive_eh(ap, opti_pre_reset, ata_std_softreset, NULL, ata_std_postreset); | ||
83 | } | ||
84 | |||
85 | /** | ||
86 | * opti_write_reg - control register setup | 71 | * opti_write_reg - control register setup |
87 | * @ap: ATA port | 72 | * @ap: ATA port |
88 | * @value: value | 73 | * @value: value |
@@ -172,7 +157,7 @@ static struct ata_port_operations opti_port_ops = { | |||
172 | .inherits = &ata_sff_port_ops, | 157 | .inherits = &ata_sff_port_ops, |
173 | .cable_detect = ata_cable_40wire, | 158 | .cable_detect = ata_cable_40wire, |
174 | .set_piomode = opti_set_piomode, | 159 | .set_piomode = opti_set_piomode, |
175 | .error_handler = opti_error_handler, | 160 | .prereset = opti_pre_reset, |
176 | }; | 161 | }; |
177 | 162 | ||
178 | static int opti_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 163 | static int opti_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
diff --git a/drivers/ata/pata_optidma.c b/drivers/ata/pata_optidma.c index ba2819ff964b..36ac147de178 100644 --- a/drivers/ata/pata_optidma.c +++ b/drivers/ata/pata_optidma.c | |||
@@ -68,21 +68,6 @@ static int optidma_pre_reset(struct ata_link *link, unsigned long deadline) | |||
68 | } | 68 | } |
69 | 69 | ||
70 | /** | 70 | /** |
71 | * optidma_probe_reset - probe reset | ||
72 | * @ap: ATA port | ||
73 | * | ||
74 | * Perform the ATA probe and bus reset sequence plus specific handling | ||
75 | * for this hardware. The Opti needs little handling - we have no UDMA66 | ||
76 | * capability that needs cable detection. All we must do is check the port | ||
77 | * is enabled. | ||
78 | */ | ||
79 | |||
80 | static void optidma_error_handler(struct ata_port *ap) | ||
81 | { | ||
82 | ata_bmdma_drive_eh(ap, optidma_pre_reset, ata_std_softreset, NULL, ata_std_postreset); | ||
83 | } | ||
84 | |||
85 | /** | ||
86 | * optidma_unlock - unlock control registers | 71 | * optidma_unlock - unlock control registers |
87 | * @ap: ATA port | 72 | * @ap: ATA port |
88 | * | 73 | * |
@@ -359,7 +344,7 @@ static struct ata_port_operations optidma_port_ops = { | |||
359 | .set_piomode = optidma_set_pio_mode, | 344 | .set_piomode = optidma_set_pio_mode, |
360 | .set_dmamode = optidma_set_dma_mode, | 345 | .set_dmamode = optidma_set_dma_mode, |
361 | .set_mode = optidma_set_mode, | 346 | .set_mode = optidma_set_mode, |
362 | .error_handler = optidma_error_handler, | 347 | .prereset = optidma_pre_reset, |
363 | }; | 348 | }; |
364 | 349 | ||
365 | static struct ata_port_operations optiplus_port_ops = { | 350 | static struct ata_port_operations optiplus_port_ops = { |
diff --git a/drivers/ata/pata_pdc2027x.c b/drivers/ata/pata_pdc2027x.c index f619c20dd192..d235c9f92d09 100644 --- a/drivers/ata/pata_pdc2027x.c +++ b/drivers/ata/pata_pdc2027x.c | |||
@@ -63,7 +63,7 @@ enum { | |||
63 | }; | 63 | }; |
64 | 64 | ||
65 | static int pdc2027x_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 65 | static int pdc2027x_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); |
66 | static void pdc2027x_error_handler(struct ata_port *ap); | 66 | static int pdc2027x_prereset(struct ata_link *link, unsigned long deadline); |
67 | static void pdc2027x_set_piomode(struct ata_port *ap, struct ata_device *adev); | 67 | static void pdc2027x_set_piomode(struct ata_port *ap, struct ata_device *adev); |
68 | static void pdc2027x_set_dmamode(struct ata_port *ap, struct ata_device *adev); | 68 | static void pdc2027x_set_dmamode(struct ata_port *ap, struct ata_device *adev); |
69 | static int pdc2027x_check_atapi_dma(struct ata_queued_cmd *qc); | 69 | static int pdc2027x_check_atapi_dma(struct ata_queued_cmd *qc); |
@@ -136,7 +136,7 @@ static struct ata_port_operations pdc2027x_pata100_ops = { | |||
136 | .inherits = &ata_bmdma_port_ops, | 136 | .inherits = &ata_bmdma_port_ops, |
137 | .check_atapi_dma = pdc2027x_check_atapi_dma, | 137 | .check_atapi_dma = pdc2027x_check_atapi_dma, |
138 | .cable_detect = pdc2027x_cable_detect, | 138 | .cable_detect = pdc2027x_cable_detect, |
139 | .error_handler = pdc2027x_error_handler, | 139 | .prereset = pdc2027x_prereset, |
140 | }; | 140 | }; |
141 | 141 | ||
142 | static struct ata_port_operations pdc2027x_pata133_ops = { | 142 | static struct ata_port_operations pdc2027x_pata133_ops = { |
@@ -252,21 +252,6 @@ static int pdc2027x_prereset(struct ata_link *link, unsigned long deadline) | |||
252 | } | 252 | } |
253 | 253 | ||
254 | /** | 254 | /** |
255 | * pdc2027x_error_handler - Perform reset on PATA port and classify | ||
256 | * @ap: Port to reset | ||
257 | * | ||
258 | * Reset PATA phy and classify attached devices. | ||
259 | * | ||
260 | * LOCKING: | ||
261 | * None (inherited from caller). | ||
262 | */ | ||
263 | |||
264 | static void pdc2027x_error_handler(struct ata_port *ap) | ||
265 | { | ||
266 | ata_bmdma_drive_eh(ap, pdc2027x_prereset, ata_std_softreset, NULL, ata_std_postreset); | ||
267 | } | ||
268 | |||
269 | /** | ||
270 | * pdc2720x_mode_filter - mode selection filter | 255 | * pdc2720x_mode_filter - mode selection filter |
271 | * @adev: ATA device | 256 | * @adev: ATA device |
272 | * @mask: list of modes proposed | 257 | * @mask: list of modes proposed |
diff --git a/drivers/ata/pata_scc.c b/drivers/ata/pata_scc.c index 033d1f3a82de..07f2d7a6f1a8 100644 --- a/drivers/ata/pata_scc.c +++ b/drivers/ata/pata_scc.c | |||
@@ -905,17 +905,6 @@ static void scc_std_postreset(struct ata_link *link, unsigned int *classes) | |||
905 | } | 905 | } |
906 | 906 | ||
907 | /** | 907 | /** |
908 | * scc_error_handler - Stock error handler for BMDMA controller | ||
909 | * @ap: port to handle error for | ||
910 | */ | ||
911 | |||
912 | static void scc_error_handler (struct ata_port *ap) | ||
913 | { | ||
914 | ata_bmdma_drive_eh(ap, scc_pata_prereset, scc_std_softreset, NULL, | ||
915 | scc_std_postreset); | ||
916 | } | ||
917 | |||
918 | /** | ||
919 | * scc_bmdma_irq_clear - Clear PCI IDE BMDMA interrupt. | 908 | * scc_bmdma_irq_clear - Clear PCI IDE BMDMA interrupt. |
920 | * @ap: Port associated with this ATA transaction. | 909 | * @ap: Port associated with this ATA transaction. |
921 | * | 910 | * |
@@ -992,7 +981,9 @@ static const struct ata_port_operations scc_pata_ops = { | |||
992 | .data_xfer = scc_data_xfer, | 981 | .data_xfer = scc_data_xfer, |
993 | 982 | ||
994 | .freeze = scc_bmdma_freeze, | 983 | .freeze = scc_bmdma_freeze, |
995 | .error_handler = scc_error_handler, | 984 | .prereset = scc_pata_prereset, |
985 | .softreset = scc_std_softreset, | ||
986 | .postreset = scc_std_postreset, | ||
996 | .post_internal_cmd = scc_bmdma_stop, | 987 | .post_internal_cmd = scc_bmdma_stop, |
997 | 988 | ||
998 | .irq_clear = scc_bmdma_irq_clear, | 989 | .irq_clear = scc_bmdma_irq_clear, |
diff --git a/drivers/ata/pata_sis.c b/drivers/ata/pata_sis.c index 28abfc26e7a4..793e6714df8c 100644 --- a/drivers/ata/pata_sis.c +++ b/drivers/ata/pata_sis.c | |||
@@ -161,19 +161,6 @@ static int sis_pre_reset(struct ata_link *link, unsigned long deadline) | |||
161 | 161 | ||
162 | 162 | ||
163 | /** | 163 | /** |
164 | * sis_error_handler - Probe specified port on PATA host controller | ||
165 | * @ap: Port to probe | ||
166 | * | ||
167 | * LOCKING: | ||
168 | * None (inherited from caller). | ||
169 | */ | ||
170 | |||
171 | static void sis_error_handler(struct ata_port *ap) | ||
172 | { | ||
173 | ata_bmdma_drive_eh(ap, sis_pre_reset, ata_std_softreset, NULL, ata_std_postreset); | ||
174 | } | ||
175 | |||
176 | /** | ||
177 | * sis_set_fifo - Set RWP fifo bits for this device | 164 | * sis_set_fifo - Set RWP fifo bits for this device |
178 | * @ap: Port | 165 | * @ap: Port |
179 | * @adev: Device | 166 | * @adev: Device |
@@ -526,7 +513,7 @@ static struct ata_port_operations sis_133_for_sata_ops = { | |||
526 | 513 | ||
527 | static struct ata_port_operations sis_base_ops = { | 514 | static struct ata_port_operations sis_base_ops = { |
528 | .inherits = &ata_bmdma_port_ops, | 515 | .inherits = &ata_bmdma_port_ops, |
529 | .error_handler = sis_error_handler, | 516 | .prereset = sis_pre_reset, |
530 | }; | 517 | }; |
531 | 518 | ||
532 | static struct ata_port_operations sis_133_ops = { | 519 | static struct ata_port_operations sis_133_ops = { |
diff --git a/drivers/ata/pata_sl82c105.c b/drivers/ata/pata_sl82c105.c index 1d97f920bd2b..bee11ca8f55a 100644 --- a/drivers/ata/pata_sl82c105.c +++ b/drivers/ata/pata_sl82c105.c | |||
@@ -64,12 +64,6 @@ static int sl82c105_pre_reset(struct ata_link *link, unsigned long deadline) | |||
64 | } | 64 | } |
65 | 65 | ||
66 | 66 | ||
67 | static void sl82c105_error_handler(struct ata_port *ap) | ||
68 | { | ||
69 | ata_bmdma_drive_eh(ap, sl82c105_pre_reset, ata_std_softreset, NULL, ata_std_postreset); | ||
70 | } | ||
71 | |||
72 | |||
73 | /** | 67 | /** |
74 | * sl82c105_configure_piomode - set chip PIO timing | 68 | * sl82c105_configure_piomode - set chip PIO timing |
75 | * @ap: ATA interface | 69 | * @ap: ATA interface |
@@ -245,7 +239,7 @@ static struct ata_port_operations sl82c105_port_ops = { | |||
245 | .bmdma_stop = sl82c105_bmdma_stop, | 239 | .bmdma_stop = sl82c105_bmdma_stop, |
246 | .cable_detect = ata_cable_40wire, | 240 | .cable_detect = ata_cable_40wire, |
247 | .set_piomode = sl82c105_set_piomode, | 241 | .set_piomode = sl82c105_set_piomode, |
248 | .error_handler = sl82c105_error_handler, | 242 | .prereset = sl82c105_pre_reset, |
249 | }; | 243 | }; |
250 | 244 | ||
251 | /** | 245 | /** |
diff --git a/drivers/ata/pata_triflex.c b/drivers/ata/pata_triflex.c index f07b0e5df222..bd546a389ce1 100644 --- a/drivers/ata/pata_triflex.c +++ b/drivers/ata/pata_triflex.c | |||
@@ -71,11 +71,6 @@ static int triflex_prereset(struct ata_link *link, unsigned long deadline) | |||
71 | 71 | ||
72 | 72 | ||
73 | 73 | ||
74 | static void triflex_error_handler(struct ata_port *ap) | ||
75 | { | ||
76 | ata_bmdma_drive_eh(ap, triflex_prereset, ata_std_softreset, NULL, ata_std_postreset); | ||
77 | } | ||
78 | |||
79 | /** | 74 | /** |
80 | * triflex_load_timing - timing configuration | 75 | * triflex_load_timing - timing configuration |
81 | * @ap: ATA interface | 76 | * @ap: ATA interface |
@@ -189,7 +184,7 @@ static struct ata_port_operations triflex_port_ops = { | |||
189 | .bmdma_stop = triflex_bmdma_stop, | 184 | .bmdma_stop = triflex_bmdma_stop, |
190 | .cable_detect = ata_cable_40wire, | 185 | .cable_detect = ata_cable_40wire, |
191 | .set_piomode = triflex_set_piomode, | 186 | .set_piomode = triflex_set_piomode, |
192 | .error_handler = triflex_error_handler, | 187 | .prereset = triflex_prereset, |
193 | }; | 188 | }; |
194 | 189 | ||
195 | static int triflex_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 190 | static int triflex_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c index f4092cbd566f..2928fa173132 100644 --- a/drivers/ata/pata_via.c +++ b/drivers/ata/pata_via.c | |||
@@ -215,18 +215,6 @@ static int via_pre_reset(struct ata_link *link, unsigned long deadline) | |||
215 | 215 | ||
216 | 216 | ||
217 | /** | 217 | /** |
218 | * via_error_handler - reset for VIA chips | ||
219 | * @ap: ATA port | ||
220 | * | ||
221 | * Handle the reset callback for the later chips with cable detect | ||
222 | */ | ||
223 | |||
224 | static void via_error_handler(struct ata_port *ap) | ||
225 | { | ||
226 | ata_bmdma_drive_eh(ap, via_pre_reset, ata_std_softreset, NULL, ata_std_postreset); | ||
227 | } | ||
228 | |||
229 | /** | ||
230 | * via_do_set_mode - set initial PIO mode data | 218 | * via_do_set_mode - set initial PIO mode data |
231 | * @ap: ATA interface | 219 | * @ap: ATA interface |
232 | * @adev: ATA device | 220 | * @adev: ATA device |
@@ -343,7 +331,7 @@ static struct ata_port_operations via_port_ops = { | |||
343 | .cable_detect = via_cable_detect, | 331 | .cable_detect = via_cable_detect, |
344 | .set_piomode = via_set_piomode, | 332 | .set_piomode = via_set_piomode, |
345 | .set_dmamode = via_set_dmamode, | 333 | .set_dmamode = via_set_dmamode, |
346 | .error_handler = via_error_handler, | 334 | .prereset = via_pre_reset, |
347 | }; | 335 | }; |
348 | 336 | ||
349 | static struct ata_port_operations via_port_ops_noirq = { | 337 | static struct ata_port_operations via_port_ops_noirq = { |
diff --git a/drivers/ata/pdc_adma.c b/drivers/ata/pdc_adma.c index a5706149af6b..5ed065d0ab4c 100644 --- a/drivers/ata/pdc_adma.c +++ b/drivers/ata/pdc_adma.c | |||
@@ -140,7 +140,7 @@ static void adma_bmdma_stop(struct ata_queued_cmd *qc); | |||
140 | static u8 adma_bmdma_status(struct ata_port *ap); | 140 | static u8 adma_bmdma_status(struct ata_port *ap); |
141 | static void adma_freeze(struct ata_port *ap); | 141 | static void adma_freeze(struct ata_port *ap); |
142 | static void adma_thaw(struct ata_port *ap); | 142 | static void adma_thaw(struct ata_port *ap); |
143 | static void adma_error_handler(struct ata_port *ap); | 143 | static int adma_prereset(struct ata_link *link, unsigned long deadline); |
144 | 144 | ||
145 | static struct scsi_host_template adma_ata_sht = { | 145 | static struct scsi_host_template adma_ata_sht = { |
146 | ATA_BASE_SHT(DRV_NAME), | 146 | ATA_BASE_SHT(DRV_NAME), |
@@ -166,7 +166,8 @@ static struct ata_port_operations adma_ata_ops = { | |||
166 | 166 | ||
167 | .freeze = adma_freeze, | 167 | .freeze = adma_freeze, |
168 | .thaw = adma_thaw, | 168 | .thaw = adma_thaw, |
169 | .error_handler = adma_error_handler, | 169 | .prereset = adma_prereset, |
170 | .softreset = ata_std_softreset, | ||
170 | 171 | ||
171 | .port_start = adma_port_start, | 172 | .port_start = adma_port_start, |
172 | .port_stop = adma_port_stop, | 173 | .port_stop = adma_port_stop, |
@@ -292,12 +293,6 @@ static int adma_prereset(struct ata_link *link, unsigned long deadline) | |||
292 | return ata_std_prereset(link, deadline); | 293 | return ata_std_prereset(link, deadline); |
293 | } | 294 | } |
294 | 295 | ||
295 | static void adma_error_handler(struct ata_port *ap) | ||
296 | { | ||
297 | ata_do_eh(ap, adma_prereset, ata_std_softreset, NULL, | ||
298 | ata_std_postreset); | ||
299 | } | ||
300 | |||
301 | static int adma_fill_sg(struct ata_queued_cmd *qc) | 296 | static int adma_fill_sg(struct ata_queued_cmd *qc) |
302 | { | 297 | { |
303 | struct scatterlist *sg; | 298 | struct scatterlist *sg; |
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c index 865030ae8f8a..676302fdaa97 100644 --- a/drivers/ata/sata_fsl.c +++ b/drivers/ata/sata_fsl.c | |||
@@ -912,16 +912,6 @@ err: | |||
912 | return -EIO; | 912 | return -EIO; |
913 | } | 913 | } |
914 | 914 | ||
915 | static void sata_fsl_error_handler(struct ata_port *ap) | ||
916 | { | ||
917 | |||
918 | DPRINTK("in xx_error_handler\n"); | ||
919 | |||
920 | /* perform recovery */ | ||
921 | ata_do_eh(ap, ata_std_prereset, sata_fsl_softreset, sata_std_hardreset, | ||
922 | ata_std_postreset); | ||
923 | } | ||
924 | |||
925 | static void sata_fsl_post_internal_cmd(struct ata_queued_cmd *qc) | 915 | static void sata_fsl_post_internal_cmd(struct ata_queued_cmd *qc) |
926 | { | 916 | { |
927 | if (qc->flags & ATA_QCFLAG_FAILED) | 917 | if (qc->flags & ATA_QCFLAG_FAILED) |
@@ -1213,7 +1203,7 @@ static const struct ata_port_operations sata_fsl_ops = { | |||
1213 | 1203 | ||
1214 | .freeze = sata_fsl_freeze, | 1204 | .freeze = sata_fsl_freeze, |
1215 | .thaw = sata_fsl_thaw, | 1205 | .thaw = sata_fsl_thaw, |
1216 | .error_handler = sata_fsl_error_handler, | 1206 | .softreset = sata_fsl_softreset, |
1217 | .post_internal_cmd = sata_fsl_post_internal_cmd, | 1207 | .post_internal_cmd = sata_fsl_post_internal_cmd, |
1218 | 1208 | ||
1219 | .port_start = sata_fsl_port_start, | 1209 | .port_start = sata_fsl_port_start, |
diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c index 047f80f5825c..ba1c09953517 100644 --- a/drivers/ata/sata_inic162x.c +++ b/drivers/ata/sata_inic162x.c | |||
@@ -452,8 +452,7 @@ static void inic_error_handler(struct ata_port *ap) | |||
452 | spin_unlock_irqrestore(ap->lock, flags); | 452 | spin_unlock_irqrestore(ap->lock, flags); |
453 | 453 | ||
454 | /* PIO and DMA engines have been stopped, perform recovery */ | 454 | /* PIO and DMA engines have been stopped, perform recovery */ |
455 | ata_do_eh(ap, ata_std_prereset, NULL, inic_hardreset, | 455 | ata_std_error_handler(ap); |
456 | ata_std_postreset); | ||
457 | } | 456 | } |
458 | 457 | ||
459 | static void inic_post_internal_cmd(struct ata_queued_cmd *qc) | 458 | static void inic_post_internal_cmd(struct ata_queued_cmd *qc) |
@@ -532,6 +531,8 @@ static struct ata_port_operations inic_port_ops = { | |||
532 | 531 | ||
533 | .freeze = inic_freeze, | 532 | .freeze = inic_freeze, |
534 | .thaw = inic_thaw, | 533 | .thaw = inic_thaw, |
534 | .softreset = ATA_OP_NULL, /* softreset is broken */ | ||
535 | .hardreset = inic_hardreset, | ||
535 | .error_handler = inic_error_handler, | 536 | .error_handler = inic_error_handler, |
536 | .post_internal_cmd = inic_post_internal_cmd, | 537 | .post_internal_cmd = inic_post_internal_cmd, |
537 | .dev_config = inic_dev_config, | 538 | .dev_config = inic_dev_config, |
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index f341a82d27bf..9a89390531b1 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
@@ -470,7 +470,10 @@ static void mv_port_stop(struct ata_port *ap); | |||
470 | static void mv_qc_prep(struct ata_queued_cmd *qc); | 470 | static void mv_qc_prep(struct ata_queued_cmd *qc); |
471 | static void mv_qc_prep_iie(struct ata_queued_cmd *qc); | 471 | static void mv_qc_prep_iie(struct ata_queued_cmd *qc); |
472 | static unsigned int mv_qc_issue(struct ata_queued_cmd *qc); | 472 | static unsigned int mv_qc_issue(struct ata_queued_cmd *qc); |
473 | static void mv_error_handler(struct ata_port *ap); | 473 | static int mv_prereset(struct ata_link *link, unsigned long deadline); |
474 | static int mv_hardreset(struct ata_link *link, unsigned int *class, | ||
475 | unsigned long deadline); | ||
476 | static void mv_postreset(struct ata_link *link, unsigned int *classes); | ||
474 | static void mv_eh_freeze(struct ata_port *ap); | 477 | static void mv_eh_freeze(struct ata_port *ap); |
475 | static void mv_eh_thaw(struct ata_port *ap); | 478 | static void mv_eh_thaw(struct ata_port *ap); |
476 | static void mv6_dev_config(struct ata_device *dev); | 479 | static void mv6_dev_config(struct ata_device *dev); |
@@ -534,7 +537,10 @@ static struct ata_port_operations mv5_ops = { | |||
534 | 537 | ||
535 | .freeze = mv_eh_freeze, | 538 | .freeze = mv_eh_freeze, |
536 | .thaw = mv_eh_thaw, | 539 | .thaw = mv_eh_thaw, |
537 | .error_handler = mv_error_handler, | 540 | .prereset = mv_prereset, |
541 | .hardreset = mv_hardreset, | ||
542 | .postreset = mv_postreset, | ||
543 | .error_handler = ata_std_error_handler, /* avoid SFF EH */ | ||
538 | .post_internal_cmd = ATA_OP_NULL, | 544 | .post_internal_cmd = ATA_OP_NULL, |
539 | 545 | ||
540 | .scr_read = mv5_scr_read, | 546 | .scr_read = mv5_scr_read, |
@@ -2415,12 +2421,6 @@ static void mv_postreset(struct ata_link *link, unsigned int *classes) | |||
2415 | iowrite8(ap->ctl, ap->ioaddr.ctl_addr); | 2421 | iowrite8(ap->ctl, ap->ioaddr.ctl_addr); |
2416 | } | 2422 | } |
2417 | 2423 | ||
2418 | static void mv_error_handler(struct ata_port *ap) | ||
2419 | { | ||
2420 | ata_do_eh(ap, mv_prereset, ata_std_softreset, | ||
2421 | mv_hardreset, mv_postreset); | ||
2422 | } | ||
2423 | |||
2424 | static void mv_eh_freeze(struct ata_port *ap) | 2424 | static void mv_eh_freeze(struct ata_port *ap) |
2425 | { | 2425 | { |
2426 | struct mv_host_priv *hpriv = ap->host->private_data; | 2426 | struct mv_host_priv *hpriv = ap->host->private_data; |
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index 5637b082bc85..b2eb5724cf85 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c | |||
@@ -309,7 +309,8 @@ static void nv_nf2_freeze(struct ata_port *ap); | |||
309 | static void nv_nf2_thaw(struct ata_port *ap); | 309 | static void nv_nf2_thaw(struct ata_port *ap); |
310 | static void nv_ck804_freeze(struct ata_port *ap); | 310 | static void nv_ck804_freeze(struct ata_port *ap); |
311 | static void nv_ck804_thaw(struct ata_port *ap); | 311 | static void nv_ck804_thaw(struct ata_port *ap); |
312 | static void nv_error_handler(struct ata_port *ap); | 312 | static int nv_hardreset(struct ata_link *link, unsigned int *class, |
313 | unsigned long deadline); | ||
313 | static int nv_adma_slave_config(struct scsi_device *sdev); | 314 | static int nv_adma_slave_config(struct scsi_device *sdev); |
314 | static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc); | 315 | static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc); |
315 | static void nv_adma_qc_prep(struct ata_queued_cmd *qc); | 316 | static void nv_adma_qc_prep(struct ata_queued_cmd *qc); |
@@ -406,7 +407,7 @@ static struct scsi_host_template nv_swncq_sht = { | |||
406 | 407 | ||
407 | static struct ata_port_operations nv_generic_ops = { | 408 | static struct ata_port_operations nv_generic_ops = { |
408 | .inherits = &ata_bmdma_port_ops, | 409 | .inherits = &ata_bmdma_port_ops, |
409 | .error_handler = nv_error_handler, | 410 | .hardreset = nv_hardreset, |
410 | .scr_read = nv_scr_read, | 411 | .scr_read = nv_scr_read, |
411 | .scr_write = nv_scr_write, | 412 | .scr_write = nv_scr_write, |
412 | }; | 413 | }; |
@@ -1599,12 +1600,6 @@ static int nv_hardreset(struct ata_link *link, unsigned int *class, | |||
1599 | return sata_std_hardreset(link, &dummy, deadline); | 1600 | return sata_std_hardreset(link, &dummy, deadline); |
1600 | } | 1601 | } |
1601 | 1602 | ||
1602 | static void nv_error_handler(struct ata_port *ap) | ||
1603 | { | ||
1604 | ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset, | ||
1605 | nv_hardreset, ata_std_postreset); | ||
1606 | } | ||
1607 | |||
1608 | static void nv_adma_error_handler(struct ata_port *ap) | 1603 | static void nv_adma_error_handler(struct ata_port *ap) |
1609 | { | 1604 | { |
1610 | struct nv_adma_port_priv *pp = ap->private_data; | 1605 | struct nv_adma_port_priv *pp = ap->private_data; |
@@ -1658,8 +1653,7 @@ static void nv_adma_error_handler(struct ata_port *ap) | |||
1658 | readw(mmio + NV_ADMA_CTL); /* flush posted write */ | 1653 | readw(mmio + NV_ADMA_CTL); /* flush posted write */ |
1659 | } | 1654 | } |
1660 | 1655 | ||
1661 | ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset, | 1656 | ata_bmdma_error_handler(ap); |
1662 | nv_hardreset, ata_std_postreset); | ||
1663 | } | 1657 | } |
1664 | 1658 | ||
1665 | static void nv_swncq_qc_to_dq(struct ata_port *ap, struct ata_queued_cmd *qc) | 1659 | static void nv_swncq_qc_to_dq(struct ata_port *ap, struct ata_queued_cmd *qc) |
@@ -1785,8 +1779,7 @@ static void nv_swncq_error_handler(struct ata_port *ap) | |||
1785 | ehc->i.action |= ATA_EH_RESET; | 1779 | ehc->i.action |= ATA_EH_RESET; |
1786 | } | 1780 | } |
1787 | 1781 | ||
1788 | ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset, | 1782 | ata_bmdma_error_handler(ap); |
1789 | nv_hardreset, ata_std_postreset); | ||
1790 | } | 1783 | } |
1791 | 1784 | ||
1792 | #ifdef CONFIG_PM | 1785 | #ifdef CONFIG_PM |
diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c index e09b975c973d..91659dc15caf 100644 --- a/drivers/ata/sata_promise.c +++ b/drivers/ata/sata_promise.c | |||
@@ -148,8 +148,7 @@ static void pdc_freeze(struct ata_port *ap); | |||
148 | static void pdc_sata_freeze(struct ata_port *ap); | 148 | static void pdc_sata_freeze(struct ata_port *ap); |
149 | static void pdc_thaw(struct ata_port *ap); | 149 | static void pdc_thaw(struct ata_port *ap); |
150 | static void pdc_sata_thaw(struct ata_port *ap); | 150 | static void pdc_sata_thaw(struct ata_port *ap); |
151 | static void pdc_pata_error_handler(struct ata_port *ap); | 151 | static void pdc_error_handler(struct ata_port *ap); |
152 | static void pdc_sata_error_handler(struct ata_port *ap); | ||
153 | static void pdc_post_internal_cmd(struct ata_queued_cmd *qc); | 152 | static void pdc_post_internal_cmd(struct ata_queued_cmd *qc); |
154 | static int pdc_pata_cable_detect(struct ata_port *ap); | 153 | static int pdc_pata_cable_detect(struct ata_port *ap); |
155 | static int pdc_sata_cable_detect(struct ata_port *ap); | 154 | static int pdc_sata_cable_detect(struct ata_port *ap); |
@@ -171,6 +170,7 @@ static const struct ata_port_operations pdc_common_ops = { | |||
171 | .irq_clear = pdc_irq_clear, | 170 | .irq_clear = pdc_irq_clear, |
172 | 171 | ||
173 | .post_internal_cmd = pdc_post_internal_cmd, | 172 | .post_internal_cmd = pdc_post_internal_cmd, |
173 | .error_handler = pdc_error_handler, | ||
174 | }; | 174 | }; |
175 | 175 | ||
176 | static struct ata_port_operations pdc_sata_ops = { | 176 | static struct ata_port_operations pdc_sata_ops = { |
@@ -178,7 +178,6 @@ static struct ata_port_operations pdc_sata_ops = { | |||
178 | .cable_detect = pdc_sata_cable_detect, | 178 | .cable_detect = pdc_sata_cable_detect, |
179 | .freeze = pdc_sata_freeze, | 179 | .freeze = pdc_sata_freeze, |
180 | .thaw = pdc_sata_thaw, | 180 | .thaw = pdc_sata_thaw, |
181 | .error_handler = pdc_sata_error_handler, | ||
182 | .scr_read = pdc_sata_scr_read, | 181 | .scr_read = pdc_sata_scr_read, |
183 | .scr_write = pdc_sata_scr_write, | 182 | .scr_write = pdc_sata_scr_write, |
184 | .port_start = pdc_sata_port_start, | 183 | .port_start = pdc_sata_port_start, |
@@ -195,7 +194,6 @@ static struct ata_port_operations pdc_pata_ops = { | |||
195 | .cable_detect = pdc_pata_cable_detect, | 194 | .cable_detect = pdc_pata_cable_detect, |
196 | .freeze = pdc_freeze, | 195 | .freeze = pdc_freeze, |
197 | .thaw = pdc_thaw, | 196 | .thaw = pdc_thaw, |
198 | .error_handler = pdc_pata_error_handler, | ||
199 | .port_start = pdc_common_port_start, | 197 | .port_start = pdc_common_port_start, |
200 | }; | 198 | }; |
201 | 199 | ||
@@ -694,24 +692,12 @@ static void pdc_sata_thaw(struct ata_port *ap) | |||
694 | readl(host_mmio + hotplug_offset); /* flush */ | 692 | readl(host_mmio + hotplug_offset); /* flush */ |
695 | } | 693 | } |
696 | 694 | ||
697 | static void pdc_common_error_handler(struct ata_port *ap, ata_reset_fn_t hardreset) | 695 | static void pdc_error_handler(struct ata_port *ap) |
698 | { | 696 | { |
699 | if (!(ap->pflags & ATA_PFLAG_FROZEN)) | 697 | if (!(ap->pflags & ATA_PFLAG_FROZEN)) |
700 | pdc_reset_port(ap); | 698 | pdc_reset_port(ap); |
701 | 699 | ||
702 | /* perform recovery */ | 700 | ata_std_error_handler(ap); |
703 | ata_do_eh(ap, ata_std_prereset, ata_std_softreset, hardreset, | ||
704 | ata_std_postreset); | ||
705 | } | ||
706 | |||
707 | static void pdc_pata_error_handler(struct ata_port *ap) | ||
708 | { | ||
709 | pdc_common_error_handler(ap, NULL); | ||
710 | } | ||
711 | |||
712 | static void pdc_sata_error_handler(struct ata_port *ap) | ||
713 | { | ||
714 | pdc_common_error_handler(ap, sata_std_hardreset); | ||
715 | } | 701 | } |
716 | 702 | ||
717 | static void pdc_post_internal_cmd(struct ata_queued_cmd *qc) | 703 | static void pdc_post_internal_cmd(struct ata_queued_cmd *qc) |
diff --git a/drivers/ata/sata_qstor.c b/drivers/ata/sata_qstor.c index 107ef09814de..2ceb0990bcd8 100644 --- a/drivers/ata/sata_qstor.c +++ b/drivers/ata/sata_qstor.c | |||
@@ -123,6 +123,7 @@ static void qs_bmdma_stop(struct ata_queued_cmd *qc); | |||
123 | static u8 qs_bmdma_status(struct ata_port *ap); | 123 | static u8 qs_bmdma_status(struct ata_port *ap); |
124 | static void qs_freeze(struct ata_port *ap); | 124 | static void qs_freeze(struct ata_port *ap); |
125 | static void qs_thaw(struct ata_port *ap); | 125 | static void qs_thaw(struct ata_port *ap); |
126 | static int qs_prereset(struct ata_link *link, unsigned long deadline); | ||
126 | static void qs_error_handler(struct ata_port *ap); | 127 | static void qs_error_handler(struct ata_port *ap); |
127 | 128 | ||
128 | static struct scsi_host_template qs_ata_sht = { | 129 | static struct scsi_host_template qs_ata_sht = { |
@@ -142,6 +143,8 @@ static struct ata_port_operations qs_ata_ops = { | |||
142 | 143 | ||
143 | .freeze = qs_freeze, | 144 | .freeze = qs_freeze, |
144 | .thaw = qs_thaw, | 145 | .thaw = qs_thaw, |
146 | .prereset = qs_prereset, | ||
147 | .softreset = ATA_OP_NULL, | ||
145 | .error_handler = qs_error_handler, | 148 | .error_handler = qs_error_handler, |
146 | .post_internal_cmd = ATA_OP_NULL, | 149 | .post_internal_cmd = ATA_OP_NULL, |
147 | 150 | ||
@@ -250,8 +253,7 @@ static int qs_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | |||
250 | static void qs_error_handler(struct ata_port *ap) | 253 | static void qs_error_handler(struct ata_port *ap) |
251 | { | 254 | { |
252 | qs_enter_reg_mode(ap); | 255 | qs_enter_reg_mode(ap); |
253 | ata_do_eh(ap, qs_prereset, NULL, sata_std_hardreset, | 256 | ata_std_error_handler(ap); |
254 | ata_std_postreset); | ||
255 | } | 257 | } |
256 | 258 | ||
257 | static int qs_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) | 259 | static int qs_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val) |
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index 363fb90e1047..67df1d753305 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
@@ -352,6 +352,14 @@ static void sil24_pmp_attach(struct ata_port *ap); | |||
352 | static void sil24_pmp_detach(struct ata_port *ap); | 352 | static void sil24_pmp_detach(struct ata_port *ap); |
353 | static void sil24_freeze(struct ata_port *ap); | 353 | static void sil24_freeze(struct ata_port *ap); |
354 | static void sil24_thaw(struct ata_port *ap); | 354 | static void sil24_thaw(struct ata_port *ap); |
355 | static int sil24_softreset(struct ata_link *link, unsigned int *class, | ||
356 | unsigned long deadline); | ||
357 | static int sil24_hardreset(struct ata_link *link, unsigned int *class, | ||
358 | unsigned long deadline); | ||
359 | static int sil24_pmp_softreset(struct ata_link *link, unsigned int *class, | ||
360 | unsigned long deadline); | ||
361 | static int sil24_pmp_hardreset(struct ata_link *link, unsigned int *class, | ||
362 | unsigned long deadline); | ||
355 | static void sil24_error_handler(struct ata_port *ap); | 363 | static void sil24_error_handler(struct ata_port *ap); |
356 | static void sil24_post_internal_cmd(struct ata_queued_cmd *qc); | 364 | static void sil24_post_internal_cmd(struct ata_queued_cmd *qc); |
357 | static int sil24_port_start(struct ata_port *ap); | 365 | static int sil24_port_start(struct ata_port *ap); |
@@ -402,6 +410,10 @@ static struct ata_port_operations sil24_ops = { | |||
402 | 410 | ||
403 | .freeze = sil24_freeze, | 411 | .freeze = sil24_freeze, |
404 | .thaw = sil24_thaw, | 412 | .thaw = sil24_thaw, |
413 | .softreset = sil24_softreset, | ||
414 | .hardreset = sil24_hardreset, | ||
415 | .pmp_softreset = sil24_pmp_softreset, | ||
416 | .pmp_hardreset = sil24_pmp_hardreset, | ||
405 | .error_handler = sil24_error_handler, | 417 | .error_handler = sil24_error_handler, |
406 | .post_internal_cmd = sil24_post_internal_cmd, | 418 | .post_internal_cmd = sil24_post_internal_cmd, |
407 | .dev_config = sil24_dev_config, | 419 | .dev_config = sil24_dev_config, |
@@ -1181,11 +1193,7 @@ static void sil24_error_handler(struct ata_port *ap) | |||
1181 | if (sil24_init_port(ap)) | 1193 | if (sil24_init_port(ap)) |
1182 | ata_eh_freeze_port(ap); | 1194 | ata_eh_freeze_port(ap); |
1183 | 1195 | ||
1184 | /* perform recovery */ | 1196 | sata_pmp_error_handler(ap); |
1185 | sata_pmp_do_eh(ap, ata_std_prereset, sil24_softreset, sil24_hardreset, | ||
1186 | ata_std_postreset, sata_pmp_std_prereset, | ||
1187 | sil24_pmp_softreset, sil24_pmp_hardreset, | ||
1188 | sata_pmp_std_postreset); | ||
1189 | 1197 | ||
1190 | pp->do_port_rst = 0; | 1198 | pp->do_port_rst = 0; |
1191 | } | 1199 | } |
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index 6326bcf8ea5d..402fd7333d48 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c | |||
@@ -71,7 +71,7 @@ static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | |||
71 | static int svia_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val); | 71 | static int svia_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val); |
72 | static int svia_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val); | 72 | static int svia_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val); |
73 | static void svia_noop_freeze(struct ata_port *ap); | 73 | static void svia_noop_freeze(struct ata_port *ap); |
74 | static void vt6420_error_handler(struct ata_port *ap); | 74 | static int vt6420_prereset(struct ata_link *link, unsigned long deadline); |
75 | static int vt6421_pata_cable_detect(struct ata_port *ap); | 75 | static int vt6421_pata_cable_detect(struct ata_port *ap); |
76 | static void vt6421_set_pio_mode(struct ata_port *ap, struct ata_device *adev); | 76 | static void vt6421_set_pio_mode(struct ata_port *ap, struct ata_device *adev); |
77 | static void vt6421_set_dma_mode(struct ata_port *ap, struct ata_device *adev); | 77 | static void vt6421_set_dma_mode(struct ata_port *ap, struct ata_device *adev); |
@@ -106,7 +106,7 @@ static struct scsi_host_template svia_sht = { | |||
106 | static struct ata_port_operations vt6420_sata_ops = { | 106 | static struct ata_port_operations vt6420_sata_ops = { |
107 | .inherits = &ata_bmdma_port_ops, | 107 | .inherits = &ata_bmdma_port_ops, |
108 | .freeze = svia_noop_freeze, | 108 | .freeze = svia_noop_freeze, |
109 | .error_handler = vt6420_error_handler, | 109 | .prereset = vt6420_prereset, |
110 | }; | 110 | }; |
111 | 111 | ||
112 | static struct ata_port_operations vt6421_pata_ops = { | 112 | static struct ata_port_operations vt6421_pata_ops = { |
@@ -247,12 +247,6 @@ static int vt6420_prereset(struct ata_link *link, unsigned long deadline) | |||
247 | return 0; | 247 | return 0; |
248 | } | 248 | } |
249 | 249 | ||
250 | static void vt6420_error_handler(struct ata_port *ap) | ||
251 | { | ||
252 | ata_bmdma_drive_eh(ap, vt6420_prereset, ata_std_softreset, NULL, | ||
253 | ata_std_postreset); | ||
254 | } | ||
255 | |||
256 | static int vt6421_pata_cable_detect(struct ata_port *ap) | 250 | static int vt6421_pata_cable_detect(struct ata_port *ap) |
257 | { | 251 | { |
258 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 252 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index c72014a3e7d4..79fd2436bd70 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
@@ -3937,7 +3937,7 @@ static int __ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd) | |||
3937 | if (ipr_is_gata(res) && res->sata_port) { | 3937 | if (ipr_is_gata(res) && res->sata_port) { |
3938 | ap = res->sata_port->ap; | 3938 | ap = res->sata_port->ap; |
3939 | spin_unlock_irq(scsi_cmd->device->host->host_lock); | 3939 | spin_unlock_irq(scsi_cmd->device->host->host_lock); |
3940 | ata_do_eh(ap, NULL, NULL, ipr_sata_reset, NULL); | 3940 | ata_std_error_handler(ap); |
3941 | spin_lock_irq(scsi_cmd->device->host->host_lock); | 3941 | spin_lock_irq(scsi_cmd->device->host->host_lock); |
3942 | 3942 | ||
3943 | list_for_each_entry(ipr_cmd, &ioa_cfg->pending_q, queue) { | 3943 | list_for_each_entry(ipr_cmd, &ioa_cfg->pending_q, queue) { |
@@ -5275,6 +5275,7 @@ static struct ata_port_operations ipr_sata_ops = { | |||
5275 | .check_altstatus = ipr_ata_check_altstatus, | 5275 | .check_altstatus = ipr_ata_check_altstatus, |
5276 | .dev_select = ata_noop_dev_select, | 5276 | .dev_select = ata_noop_dev_select, |
5277 | .phy_reset = ipr_ata_phy_reset, | 5277 | .phy_reset = ipr_ata_phy_reset, |
5278 | .hardreset = ipr_sata_reset, | ||
5278 | .post_internal_cmd = ipr_ata_post_internal, | 5279 | .post_internal_cmd = ipr_ata_post_internal, |
5279 | .tf_read = ipr_tf_read, | 5280 | .tf_read = ipr_tf_read, |
5280 | .qc_prep = ata_noop_qc_prep, | 5281 | .qc_prep = ata_noop_qc_prep, |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 88c6fa84ed74..01c233303aee 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -693,6 +693,14 @@ struct ata_port_operations { | |||
693 | 693 | ||
694 | void (*freeze)(struct ata_port *ap); | 694 | void (*freeze)(struct ata_port *ap); |
695 | void (*thaw)(struct ata_port *ap); | 695 | void (*thaw)(struct ata_port *ap); |
696 | ata_prereset_fn_t prereset; | ||
697 | ata_reset_fn_t softreset; | ||
698 | ata_reset_fn_t hardreset; | ||
699 | ata_postreset_fn_t postreset; | ||
700 | ata_prereset_fn_t pmp_prereset; | ||
701 | ata_reset_fn_t pmp_softreset; | ||
702 | ata_reset_fn_t pmp_hardreset; | ||
703 | ata_postreset_fn_t pmp_postreset; | ||
696 | void (*error_handler)(struct ata_port *ap); | 704 | void (*error_handler)(struct ata_port *ap); |
697 | void (*post_internal_cmd)(struct ata_queued_cmd *qc); | 705 | void (*post_internal_cmd)(struct ata_queued_cmd *qc); |
698 | 706 | ||
@@ -909,10 +917,6 @@ extern void ata_bmdma_irq_clear(struct ata_port *ap); | |||
909 | extern void ata_noop_irq_clear(struct ata_port *ap); | 917 | extern void ata_noop_irq_clear(struct ata_port *ap); |
910 | extern void ata_bmdma_freeze(struct ata_port *ap); | 918 | extern void ata_bmdma_freeze(struct ata_port *ap); |
911 | extern void ata_bmdma_thaw(struct ata_port *ap); | 919 | extern void ata_bmdma_thaw(struct ata_port *ap); |
912 | extern void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset, | ||
913 | ata_reset_fn_t softreset, | ||
914 | ata_reset_fn_t hardreset, | ||
915 | ata_postreset_fn_t postreset); | ||
916 | extern void ata_bmdma_error_handler(struct ata_port *ap); | 920 | extern void ata_bmdma_error_handler(struct ata_port *ap); |
917 | extern void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc); | 921 | extern void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc); |
918 | extern int ata_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, | 922 | extern int ata_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc, |
@@ -1056,11 +1060,7 @@ extern int sata_pmp_std_prereset(struct ata_link *link, unsigned long deadline); | |||
1056 | extern int sata_pmp_std_hardreset(struct ata_link *link, unsigned int *class, | 1060 | extern int sata_pmp_std_hardreset(struct ata_link *link, unsigned int *class, |
1057 | unsigned long deadline); | 1061 | unsigned long deadline); |
1058 | extern void sata_pmp_std_postreset(struct ata_link *link, unsigned int *class); | 1062 | extern void sata_pmp_std_postreset(struct ata_link *link, unsigned int *class); |
1059 | extern void sata_pmp_do_eh(struct ata_port *ap, | 1063 | extern void sata_pmp_error_handler(struct ata_port *ap); |
1060 | ata_prereset_fn_t prereset, ata_reset_fn_t softreset, | ||
1061 | ata_reset_fn_t hardreset, ata_postreset_fn_t postreset, | ||
1062 | ata_prereset_fn_t pmp_prereset, ata_reset_fn_t pmp_softreset, | ||
1063 | ata_reset_fn_t pmp_hardreset, ata_postreset_fn_t pmp_postreset); | ||
1064 | 1064 | ||
1065 | /* | 1065 | /* |
1066 | * EH | 1066 | * EH |
@@ -1080,6 +1080,7 @@ extern void ata_eh_qc_retry(struct ata_queued_cmd *qc); | |||
1080 | extern void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset, | 1080 | extern void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset, |
1081 | ata_reset_fn_t softreset, ata_reset_fn_t hardreset, | 1081 | ata_reset_fn_t softreset, ata_reset_fn_t hardreset, |
1082 | ata_postreset_fn_t postreset); | 1082 | ata_postreset_fn_t postreset); |
1083 | extern void ata_std_error_handler(struct ata_port *ap); | ||
1083 | 1084 | ||
1084 | /* | 1085 | /* |
1085 | * Base operations to inherit from and initializers for sht | 1086 | * Base operations to inherit from and initializers for sht |