Merge git://git.kernel.org/pub/scm/linux/kernel/git/agk/linux-2.6-dm
[safe/jmp/linux-2.6] / include / linux / libata.h
index 037db18..5b247b8 100644 (file)
@@ -27,6 +27,7 @@
 #define __LINUX_LIBATA_H__
 
 #include <linux/delay.h>
+#include <linux/jiffies.h>
 #include <linux/interrupt.h>
 #include <linux/dma-mapping.h>
 #include <linux/scatterlist.h>
@@ -111,14 +112,11 @@ enum {
        /* various global constants */
        LIBATA_MAX_PRD          = ATA_MAX_PRD / 2,
        LIBATA_DUMB_MAX_PRD     = ATA_MAX_PRD / 4,      /* Worst case */
-       ATA_MAX_PORTS           = 8,
        ATA_DEF_QUEUE           = 1,
        /* tag ATA_MAX_QUEUE - 1 is reserved for internal commands */
        ATA_MAX_QUEUE           = 32,
        ATA_TAG_INTERNAL        = ATA_MAX_QUEUE - 1,
-       ATA_MAX_BUS             = 2,
-       ATA_DEF_BUSY_WAIT       = 10000,
-       ATA_SHORT_PAUSE         = (HZ >> 6) + 1,
+       ATA_SHORT_PAUSE         = 16,
 
        ATAPI_MAX_DRAIN         = 16 << 10,
 
@@ -171,6 +169,7 @@ enum {
        ATA_LFLAG_ASSUME_CLASS  = ATA_LFLAG_ASSUME_ATA | ATA_LFLAG_ASSUME_SEMB,
        ATA_LFLAG_NO_RETRY      = (1 << 5), /* don't retry this link */
        ATA_LFLAG_DISABLED      = (1 << 6), /* link is disabled */
+       ATA_LFLAG_SW_ACTIVITY   = (1 << 7), /* keep activity stats */
 
        /* struct ata_port flags */
        ATA_FLAG_SLAVE_POSS     = (1 << 0), /* host supports slave dev */
@@ -193,6 +192,10 @@ enum {
        ATA_FLAG_AN             = (1 << 18), /* controller supports AN */
        ATA_FLAG_PMP            = (1 << 19), /* controller supports PMP */
        ATA_FLAG_IPM            = (1 << 20), /* driver can handle IPM */
+       ATA_FLAG_EM             = (1 << 21), /* driver supports enclosure
+                                             * management */
+       ATA_FLAG_SW_ACTIVITY    = (1 << 22), /* driver supports sw activity
+                                             * led */
 
        /* The following flag belongs to ap->pflags but is kept in
         * ap->flags because it's referenced in many LLDs and will be
@@ -237,17 +240,16 @@ enum {
        /* bits 24:31 of host->flags are reserved for LLD specific flags */
 
        /* various lengths of time */
-       ATA_TMOUT_BOOT          = 30 * HZ,      /* heuristic */
-       ATA_TMOUT_BOOT_QUICK    = 7 * HZ,       /* heuristic */
-       ATA_TMOUT_INTERNAL      = 30 * HZ,
-       ATA_TMOUT_INTERNAL_QUICK = 5 * HZ,
+       ATA_TMOUT_BOOT          = 30000,        /* heuristic */
+       ATA_TMOUT_BOOT_QUICK    =  7000,        /* heuristic */
+       ATA_TMOUT_INTERNAL_QUICK = 5000,
 
        /* FIXME: GoVault needs 2s but we can't afford that without
         * parallel probing.  800ms is enough for iVDR disk
         * HHD424020F7SV00.  Increase to 2secs when parallel probing
         * is in place.
         */
-       ATA_TMOUT_FF_WAIT       = 4 * HZ / 5,
+       ATA_TMOUT_FF_WAIT       =  800,
 
        /* Spec mandates to wait for ">= 2ms" before checking status
         * after reset.  We wait 150ms, because that was the magic
@@ -259,14 +261,14 @@ enum {
         *
         * Old drivers/ide uses the 2mS rule and then waits for ready.
         */
-       ATA_WAIT_AFTER_RESET_MSECS = 150,
+       ATA_WAIT_AFTER_RESET    =  150,
 
        /* If PMP is supported, we have to do follow-up SRST.  As some
         * PMPs don't send D2H Reg FIS after hardreset, LLDs are
         * advised to wait only for the following duration before
         * doing SRST.
         */
-       ATA_TMOUT_PMP_SRST_WAIT = 1 * HZ,
+       ATA_TMOUT_PMP_SRST_WAIT = 1000,
 
        /* ATA bus states */
        BUS_UNKNOWN             = 0,
@@ -341,7 +343,12 @@ enum {
        ATA_EH_PMP_TRIES        = 5,
        ATA_EH_PMP_LINK_TRIES   = 3,
 
-       SATA_PMP_SCR_TIMEOUT    = 250,
+       SATA_PMP_RW_TIMEOUT     = 3000,         /* PMP read/write timeout */
+
+       /* This should match the actual table size of
+        * ata_eh_cmd_timeout_table in libata-eh.c.
+        */
+       ATA_EH_CMD_TIMEOUT_TABLE_SIZE = 5,
 
        /* Horkage types. May be set by libata or controller on drives
           (some horkage may be drive/controller pair dependant */
@@ -351,7 +358,7 @@ enum {
        ATA_HORKAGE_NONCQ       = (1 << 2),     /* Don't use NCQ */
        ATA_HORKAGE_MAX_SEC_128 = (1 << 3),     /* Limit max sects to 128 */
        ATA_HORKAGE_BROKEN_HPA  = (1 << 4),     /* Broken HPA */
-       ATA_HORKAGE_SKIP_PM     = (1 << 5),     /* Skip PM operations */
+       ATA_HORKAGE_DISABLE     = (1 << 5),     /* Disable it */
        ATA_HORKAGE_HPA_SIZE    = (1 << 6),     /* native size off by one */
        ATA_HORKAGE_IPM         = (1 << 7),     /* Link PM problems */
        ATA_HORKAGE_IVB         = (1 << 8),     /* cbl det validity bit bugs */
@@ -443,8 +450,18 @@ enum link_pm {
        MAX_PERFORMANCE,
        MEDIUM_POWER,
 };
-extern struct class_device_attribute class_device_attr_link_power_management_policy;
+extern struct device_attribute dev_attr_link_power_management_policy;
+extern struct device_attribute dev_attr_em_message_type;
+extern struct device_attribute dev_attr_em_message;
+extern struct device_attribute dev_attr_sw_activity;
+
+enum sw_activity {
+       OFF,
+       BLINK_ON,
+       BLINK_OFF,
+};
 
+#ifdef CONFIG_ATA_SFF
 struct ata_ioports {
        void __iomem            *cmd_addr;
        void __iomem            *data_addr;
@@ -462,6 +479,7 @@ struct ata_ioports {
        void __iomem            *bmdma_addr;
        void __iomem            *scr_addr;
 };
+#endif /* CONFIG_ATA_SFF */
 
 struct ata_host {
        spinlock_t              lock;
@@ -546,11 +564,6 @@ struct ata_device {
        u64                     n_sectors;      /* size of device, if ATA */
        unsigned int            class;          /* ATA_DEV_xxx */
 
-       union {
-               u16             id[ATA_ID_WORDS]; /* IDENTIFY xxx DEVICE data */
-               u32             gscr[SATA_PMP_GSCR_DWORDS]; /* PMP GSCR block */
-       };
-
        u8                      pio_mode;
        u8                      dma_mode;
        u8                      xfer_mode;
@@ -572,8 +585,13 @@ struct ata_device {
        u16                     sectors;        /* Number of sectors per track */
 
        /* error history */
-       struct ata_ering        ering;
        int                     spdn_cnt;
+       struct ata_ering        ering;
+
+       union {
+               u16             id[ATA_ID_WORDS]; /* IDENTIFY xxx DEVICE data */
+               u32             gscr[SATA_PMP_GSCR_DWORDS]; /* PMP GSCR block */
+       };
 };
 
 /* Offset into struct ata_device.  Fields above it are maintained
@@ -598,10 +616,14 @@ struct ata_eh_info {
 struct ata_eh_context {
        struct ata_eh_info      i;
        int                     tries[ATA_MAX_DEVICES];
+       int                     cmd_timeout_idx[ATA_MAX_DEVICES]
+                                              [ATA_EH_CMD_TIMEOUT_TABLE_SIZE];
        unsigned int            classes[ATA_MAX_DEVICES];
        unsigned int            did_probe_mask;
        unsigned int            saved_ncq_enabled;
        u8                      saved_xfer_mode[ATA_MAX_DEVICES];
+       /* timestamp for the last reset attempt or success */
+       unsigned long           last_reset;
 };
 
 struct ata_acpi_drive
@@ -648,7 +670,9 @@ struct ata_port {
        struct ata_prd          *prd;    /* our SG list */
        dma_addr_t              prd_dma; /* and its DMA mapping */
 
+#ifdef CONFIG_ATA_SFF
        struct ata_ioports      ioaddr; /* ATA cmd/ctl/dma register blocks */
+#endif /* CONFIG_ATA_SFF */
 
        u8                      ctl;    /* cache of ATA control register */
        u8                      last_ctl;       /* Cache last written value */
@@ -691,6 +715,7 @@ struct ata_port {
        struct timer_list       fastdrain_timer;
        unsigned long           fastdrain_cnt;
 
+       int                     em_message_type;
        void                    *private_data;
 
 #ifdef CONFIG_ATA_ACPI
@@ -760,6 +785,7 @@ struct ata_port_operations {
        void (*port_stop)(struct ata_port *ap);
        void (*host_stop)(struct ata_host *host);
 
+#ifdef CONFIG_ATA_SFF
        /*
         * SFF / taskfile oriented ops
         */
@@ -779,7 +805,14 @@ struct ata_port_operations {
        void (*bmdma_start)(struct ata_queued_cmd *qc);
        void (*bmdma_stop)(struct ata_queued_cmd *qc);
        u8   (*bmdma_status)(struct ata_port *ap);
-
+#endif /* CONFIG_ATA_SFF */
+
+       ssize_t (*em_show)(struct ata_port *ap, char *buf);
+       ssize_t (*em_store)(struct ata_port *ap, const char *message,
+                           size_t size);
+       ssize_t (*sw_activity_show)(struct ata_device *dev, char *buf);
+       ssize_t (*sw_activity_store)(struct ata_device *dev,
+                                    enum sw_activity val);
        /*
         * Obsolete
         */
@@ -815,8 +848,6 @@ struct ata_timing {
        unsigned short udma;            /* t2CYCTYP/2 */
 };
 
-#define FIT(v, vmin, vmax)     max_t(short, min_t(short, v, vmax), vmin)
-
 /*
  * Core layer - drivers/ata/libata-core.c
  */
@@ -841,7 +872,6 @@ static inline int ata_port_is_dummy(struct ata_port *ap)
        return ap->ops == &ata_dummy_port_ops;
 }
 
-extern void sata_print_link_status(struct ata_link *link);
 extern void ata_port_probe(struct ata_port *);
 extern int sata_set_spd(struct ata_link *link);
 extern int ata_std_prereset(struct ata_link *link, unsigned long deadline);
@@ -895,8 +925,7 @@ extern void ata_host_resume(struct ata_host *host);
 #endif
 extern int ata_ratelimit(void);
 extern u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val,
-                            unsigned long interval_msec,
-                            unsigned long timeout_msec);
+                            unsigned long interval, unsigned long timeout);
 extern int atapi_cmd_type(u8 opcode);
 extern void ata_tf_to_fis(const struct ata_taskfile *tf,
                          u8 pmp, int is_cmd, u8 *fis);
@@ -1021,12 +1050,6 @@ static inline int ata_acpi_cbl_80wire(struct ata_port *ap,
 #endif
 
 /*
- * PMP - drivers/ata/libata-pmp.c
- */
-extern int sata_pmp_qc_defer_cmd_switch(struct ata_queued_cmd *qc);
-extern void sata_pmp_error_handler(struct ata_port *ap);
-
-/*
  * EH - drivers/ata/libata-eh.c
  */
 extern void ata_port_schedule_eh(struct ata_port *ap);
@@ -1040,6 +1063,7 @@ extern void ata_eh_thaw_port(struct ata_port *ap);
 
 extern void ata_eh_qc_complete(struct ata_queued_cmd *qc);
 extern void ata_eh_qc_retry(struct ata_queued_cmd *qc);
+extern void ata_eh_analyze_ncq_error(struct ata_link *link);
 
 extern void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset,
                      ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
@@ -1069,7 +1093,6 @@ extern void ata_std_error_handler(struct ata_port *ap);
  */
 extern const struct ata_port_operations ata_base_port_ops;
 extern const struct ata_port_operations sata_port_ops;
-extern const struct ata_port_operations sata_pmp_port_ops;
 
 #define ATA_BASE_SHT(drv_name)                                 \
        .module                 = THIS_MODULE,                  \
@@ -1091,13 +1114,55 @@ extern const struct ata_port_operations sata_pmp_port_ops;
        .change_queue_depth     = ata_scsi_change_queue_depth
 
 /*
+ * PMP helpers
+ */
+#ifdef CONFIG_SATA_PMP
+static inline bool sata_pmp_supported(struct ata_port *ap)
+{
+       return ap->flags & ATA_FLAG_PMP;
+}
+
+static inline bool sata_pmp_attached(struct ata_port *ap)
+{
+       return ap->nr_pmp_links != 0;
+}
+
+static inline int ata_is_host_link(const struct ata_link *link)
+{
+       return link == &link->ap->link;
+}
+#else /* CONFIG_SATA_PMP */
+static inline bool sata_pmp_supported(struct ata_port *ap)
+{
+       return false;
+}
+
+static inline bool sata_pmp_attached(struct ata_port *ap)
+{
+       return false;
+}
+
+static inline int ata_is_host_link(const struct ata_link *link)
+{
+       return 1;
+}
+#endif /* CONFIG_SATA_PMP */
+
+static inline int sata_srst_pmp(struct ata_link *link)
+{
+       if (sata_pmp_supported(link->ap) && ata_is_host_link(link))
+               return SATA_PMP_CTRL_PORT;
+       return link->pmp;
+}
+
+/*
  * printk helpers
  */
 #define ata_port_printk(ap, lv, fmt, args...) \
        printk("%sata%u: "fmt, lv, (ap)->print_id , ##args)
 
 #define ata_link_printk(link, lv, fmt, args...) do { \
-       if ((link)->ap->nr_pmp_links) \
+       if (sata_pmp_attached((link)->ap)) \
                printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id,   \
                       (link)->pmp , ##args); \
        else \
@@ -1183,11 +1248,6 @@ static inline unsigned int ata_dev_absent(const struct ata_device *dev)
 /*
  * link helpers
  */
-static inline int ata_is_host_link(const struct ata_link *link)
-{
-       return link == &link->ap->link;
-}
-
 static inline int ata_link_max_devices(const struct ata_link *link)
 {
        if (ata_is_host_link(link) && link->ap->flags & ATA_FLAG_SLAVE_POSS)
@@ -1202,7 +1262,7 @@ static inline int ata_link_active(struct ata_link *link)
 
 static inline struct ata_link *ata_port_first_link(struct ata_port *ap)
 {
-       if (ap->nr_pmp_links)
+       if (sata_pmp_attached(ap))
                return ap->pmp_link;
        return &ap->link;
 }
@@ -1211,8 +1271,8 @@ static inline struct ata_link *ata_port_next_link(struct ata_link *link)
 {
        struct ata_port *ap = link->ap;
 
-       if (link == &ap->link) {
-               if (!ap->nr_pmp_links)
+       if (ata_is_host_link(link)) {
+               if (!sata_pmp_attached(ap))
                        return NULL;
                return ap->pmp_link;
        }
@@ -1346,9 +1406,49 @@ static inline struct ata_port *ata_shost_to_port(struct Scsi_Host *host)
        return *(struct ata_port **)&host->hostdata[0];
 }
 
+static inline int ata_check_ready(u8 status)
+{
+       if (!(status & ATA_BUSY))
+               return 1;
+
+       /* 0xff indicates either no device or device not ready */
+       if (status == 0xff)
+               return -ENODEV;
+
+       return 0;
+}
+
+static inline unsigned long ata_deadline(unsigned long from_jiffies,
+                                        unsigned long timeout_msecs)
+{
+       return from_jiffies + msecs_to_jiffies(timeout_msecs);
+}
+
+
+/**************************************************************************
+ * PMP - drivers/ata/libata-pmp.c
+ */
+#ifdef CONFIG_SATA_PMP
+
+extern const struct ata_port_operations sata_pmp_port_ops;
+
+extern int sata_pmp_qc_defer_cmd_switch(struct ata_queued_cmd *qc);
+extern void sata_pmp_error_handler(struct ata_port *ap);
+
+#else /* CONFIG_SATA_PMP */
+
+#define sata_pmp_port_ops              sata_port_ops
+#define sata_pmp_qc_defer_cmd_switch   ata_std_qc_defer
+#define sata_pmp_error_handler         ata_std_error_handler
+
+#endif /* CONFIG_SATA_PMP */
+
+
 /**************************************************************************
  * SFF - drivers/ata/libata-sff.c
  */
+#ifdef CONFIG_ATA_SFF
+
 extern const struct ata_port_operations ata_sff_port_ops;
 extern const struct ata_port_operations ata_bmdma_port_ops;
 
@@ -1367,7 +1467,8 @@ extern void ata_sff_qc_prep(struct ata_queued_cmd *qc);
 extern void ata_sff_dumb_qc_prep(struct ata_queued_cmd *qc);
 extern void ata_sff_dev_select(struct ata_port *ap, unsigned int device);
 extern u8 ata_sff_check_status(struct ata_port *ap);
-extern u8 ata_sff_altstatus(struct ata_port *ap);
+extern void ata_sff_pause(struct ata_port *ap);
+extern void ata_sff_dma_pause(struct ata_port *ap);
 extern int ata_sff_busy_sleep(struct ata_port *ap,
                              unsigned long timeout_pat, unsigned long timeout);
 extern int ata_sff_wait_ready(struct ata_link *link, unsigned long deadline);
@@ -1428,19 +1529,6 @@ extern int ata_pci_sff_init_one(struct pci_dev *pdev,
 #endif /* CONFIG_PCI */
 
 /**
- *     ata_sff_pause - Flush writes and pause 400 nanoseconds.
- *     @ap: Port to wait for.
- *
- *     LOCKING:
- *     Inherited from caller.
- */
-static inline void ata_sff_pause(struct ata_port *ap)
-{
-       ata_sff_altstatus(ap);
-       ndelay(400);
-}
-
-/**
  *     ata_sff_busy_wait - Wait for a port status register
  *     @ap: Port to wait for.
  *     @bits: bits that must be clear
@@ -1489,5 +1577,6 @@ static inline u8 ata_wait_idle(struct ata_port *ap)
 
        return status;
 }
+#endif /* CONFIG_ATA_SFF */
 
 #endif /* __LINUX_LIBATA_H__ */