aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/libata-core.c187
-rw-r--r--include/linux/libata.h8
2 files changed, 13 insertions, 182 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
index 01f2c59536bc..30a6020c5121 100644
--- a/drivers/scsi/libata-core.c
+++ b/drivers/scsi/libata-core.c
@@ -1479,31 +1479,21 @@ static int ata_bus_probe(struct ata_port *ap)
1479 down_xfermask = 0; 1479 down_xfermask = 0;
1480 1480
1481 /* reset and determine device classes */ 1481 /* reset and determine device classes */
1482 for (i = 0; i < ATA_MAX_DEVICES; i++) 1482 ap->ops->phy_reset(ap);
1483 classes[i] = ATA_DEV_UNKNOWN;
1484 1483
1485 if (ap->ops->probe_reset) { 1484 for (i = 0; i < ATA_MAX_DEVICES; i++) {
1486 rc = ap->ops->probe_reset(ap, classes); 1485 dev = &ap->device[i];
1487 if (rc) {
1488 ata_port_printk(ap, KERN_ERR,
1489 "reset failed (errno=%d)\n", rc);
1490 return rc;
1491 }
1492 } else {
1493 ap->ops->phy_reset(ap);
1494 1486
1495 for (i = 0; i < ATA_MAX_DEVICES; i++) { 1487 if (!(ap->flags & ATA_FLAG_DISABLED) &&
1496 if (!(ap->flags & ATA_FLAG_DISABLED)) 1488 dev->class != ATA_DEV_UNKNOWN)
1497 classes[i] = ap->device[i].class; 1489 classes[dev->devno] = dev->class;
1498 ap->device[i].class = ATA_DEV_UNKNOWN; 1490 else
1499 } 1491 classes[dev->devno] = ATA_DEV_NONE;
1500 1492
1501 ata_port_probe(ap); 1493 dev->class = ATA_DEV_UNKNOWN;
1502 } 1494 }
1503 1495
1504 for (i = 0; i < ATA_MAX_DEVICES; i++) 1496 ata_port_probe(ap);
1505 if (classes[i] == ATA_DEV_UNKNOWN)
1506 classes[i] = ATA_DEV_NONE;
1507 1497
1508 /* after the reset the device state is PIO 0 and the controller 1498 /* after the reset the device state is PIO 0 and the controller
1509 state is undefined. Record the mode */ 1499 state is undefined. Record the mode */
@@ -2610,37 +2600,11 @@ int ata_std_prereset(struct ata_port *ap)
2610} 2600}
2611 2601
2612/** 2602/**
2613 * ata_std_probeinit - initialize probing
2614 * @ap: port to be probed
2615 *
2616 * @ap is about to be probed. Initialize it. This function is
2617 * to be used as standard callback for ata_drive_probe_reset().
2618 *
2619 * NOTE!!! Do not use this function as probeinit if a low level
2620 * driver implements only hardreset. Just pass NULL as probeinit
2621 * in that case. Using this function is probably okay but doing
2622 * so makes reset sequence different from the original
2623 * ->phy_reset implementation and Jeff nervous. :-P
2624 */
2625void ata_std_probeinit(struct ata_port *ap)
2626{
2627 static const unsigned long deb_timing[] = { 5, 100, 5000 };
2628
2629 /* resume link */
2630 sata_phy_resume(ap, deb_timing);
2631
2632 /* wait for device */
2633 if (ata_port_online(ap))
2634 ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT);
2635}
2636
2637/**
2638 * ata_std_softreset - reset host port via ATA SRST 2603 * ata_std_softreset - reset host port via ATA SRST
2639 * @ap: port to reset 2604 * @ap: port to reset
2640 * @classes: resulting classes of attached devices 2605 * @classes: resulting classes of attached devices
2641 * 2606 *
2642 * Reset host port using ATA SRST. This function is to be used 2607 * Reset host port using ATA SRST.
2643 * as standard callback for ata_drive_*_reset() functions.
2644 * 2608 *
2645 * LOCKING: 2609 * LOCKING:
2646 * Kernel thread context (may sleep) 2610 * Kernel thread context (may sleep)
@@ -2695,8 +2659,6 @@ int ata_std_softreset(struct ata_port *ap, unsigned int *classes)
2695 * @class: resulting class of attached device 2659 * @class: resulting class of attached device
2696 * 2660 *
2697 * SATA phy-reset host port using DET bits of SControl register. 2661 * SATA phy-reset host port using DET bits of SControl register.
2698 * This function is to be used as standard callback for
2699 * ata_drive_*_reset().
2700 * 2662 *
2701 * LOCKING: 2663 * LOCKING:
2702 * Kernel thread context (may sleep) 2664 * Kernel thread context (may sleep)
@@ -2775,9 +2737,6 @@ int sata_std_hardreset(struct ata_port *ap, unsigned int *class)
2775 * the device might have been reset more than once using 2737 * the device might have been reset more than once using
2776 * different reset methods before postreset is invoked. 2738 * different reset methods before postreset is invoked.
2777 * 2739 *
2778 * This function is to be used as standard callback for
2779 * ata_drive_*_reset().
2780 *
2781 * LOCKING: 2740 * LOCKING:
2782 * Kernel thread context (may sleep) 2741 * Kernel thread context (may sleep)
2783 */ 2742 */
@@ -2824,32 +2783,6 @@ void ata_std_postreset(struct ata_port *ap, unsigned int *classes)
2824 DPRINTK("EXIT\n"); 2783 DPRINTK("EXIT\n");
2825} 2784}
2826 2785
2827/**
2828 * ata_std_probe_reset - standard probe reset method
2829 * @ap: prot to perform probe-reset
2830 * @classes: resulting classes of attached devices
2831 *
2832 * The stock off-the-shelf ->probe_reset method.
2833 *
2834 * LOCKING:
2835 * Kernel thread context (may sleep)
2836 *
2837 * RETURNS:
2838 * 0 on success, -errno otherwise.
2839 */
2840int ata_std_probe_reset(struct ata_port *ap, unsigned int *classes)
2841{
2842 ata_reset_fn_t hardreset;
2843
2844 hardreset = NULL;
2845 if (sata_scr_valid(ap))
2846 hardreset = sata_std_hardreset;
2847
2848 return ata_drive_probe_reset(ap, ata_std_probeinit,
2849 ata_std_softreset, hardreset,
2850 ata_std_postreset, classes);
2851}
2852
2853int ata_do_reset(struct ata_port *ap, ata_reset_fn_t reset, 2786int ata_do_reset(struct ata_port *ap, ata_reset_fn_t reset,
2854 unsigned int *classes) 2787 unsigned int *classes)
2855{ 2788{
@@ -2879,97 +2812,6 @@ int ata_do_reset(struct ata_port *ap, ata_reset_fn_t reset,
2879} 2812}
2880 2813
2881/** 2814/**
2882 * ata_drive_probe_reset - Perform probe reset with given methods
2883 * @ap: port to reset
2884 * @probeinit: probeinit method (can be NULL)
2885 * @softreset: softreset method (can be NULL)
2886 * @hardreset: hardreset method (can be NULL)
2887 * @postreset: postreset method (can be NULL)
2888 * @classes: resulting classes of attached devices
2889 *
2890 * Reset the specified port and classify attached devices using
2891 * given methods. This function prefers softreset but tries all
2892 * possible reset sequences to reset and classify devices. This
2893 * function is intended to be used for constructing ->probe_reset
2894 * callback by low level drivers.
2895 *
2896 * Reset methods should follow the following rules.
2897 *
2898 * - Return 0 on sucess, -errno on failure.
2899 * - If classification is supported, fill classes[] with
2900 * recognized class codes.
2901 * - If classification is not supported, leave classes[] alone.
2902 *
2903 * LOCKING:
2904 * Kernel thread context (may sleep)
2905 *
2906 * RETURNS:
2907 * 0 on success, -EINVAL if no reset method is avaliable, -ENODEV
2908 * if classification fails, and any error code from reset
2909 * methods.
2910 */
2911int ata_drive_probe_reset(struct ata_port *ap, ata_probeinit_fn_t probeinit,
2912 ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
2913 ata_postreset_fn_t postreset, unsigned int *classes)
2914{
2915 int rc = -EINVAL;
2916
2917 ata_eh_freeze_port(ap);
2918
2919 if (probeinit)
2920 probeinit(ap);
2921
2922 if (softreset && !sata_set_spd_needed(ap)) {
2923 rc = ata_do_reset(ap, softreset, classes);
2924 if (rc == 0 && classes[0] != ATA_DEV_UNKNOWN)
2925 goto done;
2926 ata_port_printk(ap, KERN_INFO, "softreset failed, "
2927 "will try hardreset in 5 secs\n");
2928 ssleep(5);
2929 }
2930
2931 if (!hardreset)
2932 goto done;
2933
2934 while (1) {
2935 rc = ata_do_reset(ap, hardreset, classes);
2936 if (rc == 0) {
2937 if (classes[0] != ATA_DEV_UNKNOWN)
2938 goto done;
2939 break;
2940 }
2941
2942 if (sata_down_spd_limit(ap))
2943 goto done;
2944
2945 ata_port_printk(ap, KERN_INFO, "hardreset failed, "
2946 "will retry in 5 secs\n");
2947 ssleep(5);
2948 }
2949
2950 if (softreset) {
2951 ata_port_printk(ap, KERN_INFO,
2952 "hardreset succeeded without classification, "
2953 "will retry softreset in 5 secs\n");
2954 ssleep(5);
2955
2956 rc = ata_do_reset(ap, softreset, classes);
2957 }
2958
2959 done:
2960 if (rc == 0) {
2961 if (postreset)
2962 postreset(ap, classes);
2963
2964 ata_eh_thaw_port(ap);
2965
2966 if (classes[0] == ATA_DEV_UNKNOWN)
2967 rc = -ENODEV;
2968 }
2969 return rc;
2970}
2971
2972/**
2973 * ata_dev_same_device - Determine whether new ID matches configured device 2815 * ata_dev_same_device - Determine whether new ID matches configured device
2974 * @dev: device to compare against 2816 * @dev: device to compare against
2975 * @new_class: class of the new device 2817 * @new_class: class of the new device
@@ -5419,7 +5261,7 @@ static struct ata_port * ata_host_add(const struct ata_probe_ent *ent,
5419 5261
5420 DPRINTK("ENTER\n"); 5262 DPRINTK("ENTER\n");
5421 5263
5422 if (!ent->port_ops->probe_reset && !ent->port_ops->error_handler && 5264 if (!ent->port_ops->error_handler &&
5423 !(ent->host_flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST))) { 5265 !(ent->host_flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST))) {
5424 printk(KERN_ERR "ata%u: no reset mechanism available\n", 5266 printk(KERN_ERR "ata%u: no reset mechanism available\n",
5425 port_no); 5267 port_no);
@@ -5551,7 +5393,7 @@ int ata_device_add(const struct ata_probe_ent *ent)
5551 */ 5393 */
5552 } 5394 }
5553 5395
5554 if (!ap->ops->probe_reset) { 5396 if (ap->ops->error_handler) {
5555 unsigned long flags; 5397 unsigned long flags;
5556 5398
5557 ata_port_probe(ap); 5399 ata_port_probe(ap);
@@ -5998,13 +5840,10 @@ EXPORT_SYMBOL_GPL(sata_phy_resume);
5998EXPORT_SYMBOL_GPL(sata_phy_reset); 5840EXPORT_SYMBOL_GPL(sata_phy_reset);
5999EXPORT_SYMBOL_GPL(__sata_phy_reset); 5841EXPORT_SYMBOL_GPL(__sata_phy_reset);
6000EXPORT_SYMBOL_GPL(ata_bus_reset); 5842EXPORT_SYMBOL_GPL(ata_bus_reset);
6001EXPORT_SYMBOL_GPL(ata_std_probeinit);
6002EXPORT_SYMBOL_GPL(ata_std_prereset); 5843EXPORT_SYMBOL_GPL(ata_std_prereset);
6003EXPORT_SYMBOL_GPL(ata_std_softreset); 5844EXPORT_SYMBOL_GPL(ata_std_softreset);
6004EXPORT_SYMBOL_GPL(sata_std_hardreset); 5845EXPORT_SYMBOL_GPL(sata_std_hardreset);
6005EXPORT_SYMBOL_GPL(ata_std_postreset); 5846EXPORT_SYMBOL_GPL(ata_std_postreset);
6006EXPORT_SYMBOL_GPL(ata_std_probe_reset);
6007EXPORT_SYMBOL_GPL(ata_drive_probe_reset);
6008EXPORT_SYMBOL_GPL(ata_dev_revalidate); 5847EXPORT_SYMBOL_GPL(ata_dev_revalidate);
6009EXPORT_SYMBOL_GPL(ata_dev_classify); 5848EXPORT_SYMBOL_GPL(ata_dev_classify);
6010EXPORT_SYMBOL_GPL(ata_dev_pair); 5849EXPORT_SYMBOL_GPL(ata_dev_pair);
diff --git a/include/linux/libata.h b/include/linux/libata.h
index f11ba2715bef..a2a33a902917 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -303,7 +303,6 @@ struct ata_queued_cmd;
303 303
304/* typedefs */ 304/* typedefs */
305typedef void (*ata_qc_cb_t) (struct ata_queued_cmd *qc); 305typedef void (*ata_qc_cb_t) (struct ata_queued_cmd *qc);
306typedef void (*ata_probeinit_fn_t)(struct ata_port *ap);
307typedef int (*ata_prereset_fn_t)(struct ata_port *ap); 306typedef int (*ata_prereset_fn_t)(struct ata_port *ap);
308typedef int (*ata_reset_fn_t)(struct ata_port *ap, unsigned int *classes); 307typedef int (*ata_reset_fn_t)(struct ata_port *ap, unsigned int *classes);
309typedef void (*ata_postreset_fn_t)(struct ata_port *ap, unsigned int *classes); 308typedef void (*ata_postreset_fn_t)(struct ata_port *ap, unsigned int *classes);
@@ -553,7 +552,6 @@ struct ata_port_operations {
553 552
554 void (*phy_reset) (struct ata_port *ap); /* obsolete */ 553 void (*phy_reset) (struct ata_port *ap); /* obsolete */
555 void (*set_mode) (struct ata_port *ap); 554 void (*set_mode) (struct ata_port *ap);
556 int (*probe_reset) (struct ata_port *ap, unsigned int *classes);
557 555
558 void (*post_set_mode) (struct ata_port *ap); 556 void (*post_set_mode) (struct ata_port *ap);
559 557
@@ -628,11 +626,6 @@ extern void ata_bus_reset(struct ata_port *ap);
628extern int sata_set_spd(struct ata_port *ap); 626extern int sata_set_spd(struct ata_port *ap);
629extern int sata_phy_debounce(struct ata_port *ap, const unsigned long *param); 627extern int sata_phy_debounce(struct ata_port *ap, const unsigned long *param);
630extern int sata_phy_resume(struct ata_port *ap, const unsigned long *param); 628extern int sata_phy_resume(struct ata_port *ap, const unsigned long *param);
631extern int ata_drive_probe_reset(struct ata_port *ap,
632 ata_probeinit_fn_t probeinit,
633 ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
634 ata_postreset_fn_t postreset, unsigned int *classes);
635extern void ata_std_probeinit(struct ata_port *ap);
636extern int ata_std_prereset(struct ata_port *ap); 629extern int ata_std_prereset(struct ata_port *ap);
637extern int ata_std_softreset(struct ata_port *ap, unsigned int *classes); 630extern int ata_std_softreset(struct ata_port *ap, unsigned int *classes);
638extern int sata_std_hardreset(struct ata_port *ap, unsigned int *class); 631extern int sata_std_hardreset(struct ata_port *ap, unsigned int *class);
@@ -688,7 +681,6 @@ extern void ata_std_dev_select (struct ata_port *ap, unsigned int device);
688extern u8 ata_check_status(struct ata_port *ap); 681extern u8 ata_check_status(struct ata_port *ap);
689extern u8 ata_altstatus(struct ata_port *ap); 682extern u8 ata_altstatus(struct ata_port *ap);
690extern void ata_exec_command(struct ata_port *ap, const struct ata_taskfile *tf); 683extern void ata_exec_command(struct ata_port *ap, const struct ata_taskfile *tf);
691extern int ata_std_probe_reset(struct ata_port *ap, unsigned int *classes);
692extern int ata_port_start (struct ata_port *ap); 684extern int ata_port_start (struct ata_port *ap);
693extern void ata_port_stop (struct ata_port *ap); 685extern void ata_port_stop (struct ata_port *ap);
694extern void ata_host_stop (struct ata_host_set *host_set); 686extern void ata_host_stop (struct ata_host_set *host_set);