[PATCH] libata: implement ATA_EHI_NO_AUTOPSY and QUIET
[platform/kernel/linux-starfive.git] / include / linux / libata.h
index f03b866..36938ae 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/interrupt.h>
 #include <linux/pci.h>
 #include <linux/dma-mapping.h>
+#include <asm/scatterlist.h>
 #include <asm/io.h>
 #include <linux/ata.h>
 #include <linux/workqueue.h>
@@ -159,22 +160,27 @@ enum {
        ATA_FLAG_HRST_TO_RESUME = (1 << 11), /* hardreset to resume phy */
        ATA_FLAG_SKIP_D2H_BSY   = (1 << 12), /* can't wait for the first D2H
                                              * Register FIS clearing BSY */
-
        ATA_FLAG_DEBUGMSG       = (1 << 13),
-       ATA_FLAG_FLUSH_PORT_TASK = (1 << 14), /* flush port task */
 
-       ATA_FLAG_EH_PENDING     = (1 << 15), /* EH pending */
-       ATA_FLAG_EH_IN_PROGRESS = (1 << 16), /* EH in progress */
-       ATA_FLAG_FROZEN         = (1 << 17), /* port is frozen */
-       ATA_FLAG_RECOVERED      = (1 << 18), /* recovery action performed */
-       ATA_FLAG_LOADING        = (1 << 19), /* boot/loading probe */
-       ATA_FLAG_UNLOADING      = (1 << 20), /* module is unloading */
-       ATA_FLAG_SCSI_HOTPLUG   = (1 << 21), /* SCSI hotplug scheduled */
+       /* The following flag belongs to ap->pflags but is kept in
+        * ap->flags because it's referenced in many LLDs and will be
+        * removed in not-too-distant future.
+        */
+       ATA_FLAG_DISABLED       = (1 << 23), /* port is disabled, ignore it */
+
+       /* bits 24:31 of ap->flags are reserved for LLD specific flags */
 
-       ATA_FLAG_DISABLED       = (1 << 22), /* port is disabled, ignore it */
-       ATA_FLAG_SUSPENDED      = (1 << 23), /* port is suspended (power) */
+       /* struct ata_port pflags */
+       ATA_PFLAG_EH_PENDING    = (1 << 0), /* EH pending */
+       ATA_PFLAG_EH_IN_PROGRESS = (1 << 1), /* EH in progress */
+       ATA_PFLAG_FROZEN        = (1 << 2), /* port is frozen */
+       ATA_PFLAG_RECOVERED     = (1 << 3), /* recovery action performed */
+       ATA_PFLAG_LOADING       = (1 << 4), /* boot/loading probe */
+       ATA_PFLAG_UNLOADING     = (1 << 5), /* module is unloading */
+       ATA_PFLAG_SCSI_HOTPLUG  = (1 << 6), /* SCSI hotplug scheduled */
 
-       /* bits 24:31 of ap->flags are reserved for LLDD specific flags */
+       ATA_PFLAG_FLUSH_PORT_TASK = (1 << 16), /* flush port task */
+       ATA_PFLAG_SUSPENDED     = (1 << 17), /* port is suspended (power) */
 
        /* struct ata_queued_cmd flags */
        ATA_QCFLAG_ACTIVE       = (1 << 0), /* cmd not yet ack'd to scsi lyer */
@@ -249,9 +255,13 @@ enum {
        ATA_EH_HARDRESET        = (1 << 2),
 
        ATA_EH_RESET_MASK       = ATA_EH_SOFTRESET | ATA_EH_HARDRESET,
+       ATA_EH_PERDEV_MASK      = ATA_EH_REVALIDATE,
 
        /* ata_eh_info->flags */
        ATA_EHI_HOTPLUGGED      = (1 << 0),  /* could have been hotplugged */
+       ATA_EHI_RESUME_LINK     = (1 << 1),  /* need to resume link */
+       ATA_EHI_NO_AUTOPSY      = (1 << 2),  /* no autopsy */
+       ATA_EHI_QUIET           = (1 << 3),  /* be quiet */
 
        ATA_EHI_DID_RESET       = (1 << 16), /* already reset this port */
 
@@ -462,6 +472,7 @@ struct ata_eh_info {
        u32                     serror;         /* SError from LLDD */
        unsigned int            err_mask;       /* port-wide err_mask */
        unsigned int            action;         /* ATA_EH_* action mask */
+       unsigned int            dev_action[ATA_MAX_DEVICES]; /* dev EH action */
        unsigned int            flags;          /* ATA_EHI_* flags */
 
        unsigned long           hotplug_timestamp;
@@ -481,7 +492,9 @@ struct ata_eh_context {
 struct ata_port {
        struct Scsi_Host        *host;  /* our co-allocated scsi host */
        const struct ata_port_operations *ops;
+       spinlock_t              *lock;
        unsigned long           flags;  /* ATA_FLAG_xxx */
+       unsigned int            pflags; /* ATA_PFLAG_xxx */
        unsigned int            id;     /* unique id req'd by scsi midlyr */
        unsigned int            port_no; /* unique port #; from zero */
        unsigned int            hard_port_no;   /* hardware port #; from zero */
@@ -618,9 +631,18 @@ struct ata_timing {
 
 #define FIT(v,vmin,vmax)       max_t(short,min_t(short,v,vmax),vmin)
 
-extern const unsigned long sata_deb_timing_boot[];
-extern const unsigned long sata_deb_timing_eh[];
-extern const unsigned long sata_deb_timing_before_fsrst[];
+extern const unsigned long sata_deb_timing_normal[];
+extern const unsigned long sata_deb_timing_hotplug[];
+extern const unsigned long sata_deb_timing_long[];
+
+static inline const unsigned long *
+sata_ehc_deb_timing(struct ata_eh_context *ehc)
+{
+       if (ehc->i.flags & ATA_EHI_HOTPLUGGED)
+               return sata_deb_timing_hotplug;
+       else
+               return sata_deb_timing_normal;
+}
 
 extern void ata_port_probe(struct ata_port *);
 extern void __sata_phy_reset(struct ata_port *ap);
@@ -826,7 +848,7 @@ static inline void ata_ehi_hotplugged(struct ata_eh_info *ehi)
        if (ehi->flags & ATA_EHI_HOTPLUGGED)
                return;
 
-       ehi->flags |= ATA_EHI_HOTPLUGGED;
+       ehi->flags |= ATA_EHI_HOTPLUGGED | ATA_EHI_RESUME_LINK;
        ehi->hotplug_timestamp = jiffies;
 
        ehi->err_mask |= AC_ERR_ATA_BUS;
@@ -884,6 +906,9 @@ static inline unsigned int ata_tag_internal(unsigned int tag)
        return tag == ATA_MAX_QUEUE - 1;
 }
 
+/*
+ * device helpers
+ */
 static inline unsigned int ata_class_enabled(unsigned int class)
 {
        return class == ATA_DEV_ATA || class == ATA_DEV_ATAPI;
@@ -914,6 +939,17 @@ static inline unsigned int ata_dev_absent(const struct ata_device *dev)
        return ata_class_absent(dev->class);
 }
 
+/*
+ * port helpers
+ */
+static inline int ata_port_max_devices(const struct ata_port *ap)
+{
+       if (ap->flags & ATA_FLAG_SLAVE_POSS)
+               return 2;
+       return 1;
+}
+
+
 static inline u8 ata_chk_status(struct ata_port *ap)
 {
        return ap->ops->check_status(ap);