|
@@ -146,6 +146,7 @@ enum {
|
|
ATA_DFLAG_SPUNDOWN = (1 << 14), /* XXX: for spindown_compat */
|
|
ATA_DFLAG_SPUNDOWN = (1 << 14), /* XXX: for spindown_compat */
|
|
ATA_DFLAG_SLEEPING = (1 << 15), /* device is sleeping */
|
|
ATA_DFLAG_SLEEPING = (1 << 15), /* device is sleeping */
|
|
ATA_DFLAG_DUBIOUS_XFER = (1 << 16), /* data transfer not verified */
|
|
ATA_DFLAG_DUBIOUS_XFER = (1 << 16), /* data transfer not verified */
|
|
|
|
+ ATA_DFLAG_NO_UNLOAD = (1 << 17), /* device doesn't support unload */
|
|
ATA_DFLAG_INIT_MASK = (1 << 24) - 1,
|
|
ATA_DFLAG_INIT_MASK = (1 << 24) - 1,
|
|
|
|
|
|
ATA_DFLAG_DETACH = (1 << 24),
|
|
ATA_DFLAG_DETACH = (1 << 24),
|
|
@@ -244,6 +245,7 @@ enum {
|
|
ATA_TMOUT_BOOT = 30000, /* heuristic */
|
|
ATA_TMOUT_BOOT = 30000, /* heuristic */
|
|
ATA_TMOUT_BOOT_QUICK = 7000, /* heuristic */
|
|
ATA_TMOUT_BOOT_QUICK = 7000, /* heuristic */
|
|
ATA_TMOUT_INTERNAL_QUICK = 5000,
|
|
ATA_TMOUT_INTERNAL_QUICK = 5000,
|
|
|
|
+ ATA_TMOUT_MAX_PARK = 30000,
|
|
|
|
|
|
/* FIXME: GoVault needs 2s but we can't afford that without
|
|
/* FIXME: GoVault needs 2s but we can't afford that without
|
|
* parallel probing. 800ms is enough for iVDR disk
|
|
* parallel probing. 800ms is enough for iVDR disk
|
|
@@ -319,8 +321,9 @@ enum {
|
|
ATA_EH_RESET = ATA_EH_SOFTRESET | ATA_EH_HARDRESET,
|
|
ATA_EH_RESET = ATA_EH_SOFTRESET | ATA_EH_HARDRESET,
|
|
ATA_EH_ENABLE_LINK = (1 << 3),
|
|
ATA_EH_ENABLE_LINK = (1 << 3),
|
|
ATA_EH_LPM = (1 << 4), /* link power management action */
|
|
ATA_EH_LPM = (1 << 4), /* link power management action */
|
|
|
|
+ ATA_EH_PARK = (1 << 5), /* unload heads and stop I/O */
|
|
|
|
|
|
- ATA_EH_PERDEV_MASK = ATA_EH_REVALIDATE,
|
|
|
|
|
|
+ ATA_EH_PERDEV_MASK = ATA_EH_REVALIDATE | ATA_EH_PARK,
|
|
ATA_EH_ALL_ACTIONS = ATA_EH_REVALIDATE | ATA_EH_RESET |
|
|
ATA_EH_ALL_ACTIONS = ATA_EH_REVALIDATE | ATA_EH_RESET |
|
|
ATA_EH_ENABLE_LINK | ATA_EH_LPM,
|
|
ATA_EH_ENABLE_LINK | ATA_EH_LPM,
|
|
|
|
|
|
@@ -454,6 +457,7 @@ enum link_pm {
|
|
MEDIUM_POWER,
|
|
MEDIUM_POWER,
|
|
};
|
|
};
|
|
extern struct device_attribute dev_attr_link_power_management_policy;
|
|
extern struct device_attribute dev_attr_link_power_management_policy;
|
|
|
|
+extern struct device_attribute dev_attr_unload_heads;
|
|
extern struct device_attribute dev_attr_em_message_type;
|
|
extern struct device_attribute dev_attr_em_message_type;
|
|
extern struct device_attribute dev_attr_em_message;
|
|
extern struct device_attribute dev_attr_em_message;
|
|
extern struct device_attribute dev_attr_sw_activity;
|
|
extern struct device_attribute dev_attr_sw_activity;
|
|
@@ -566,6 +570,7 @@ struct ata_device {
|
|
/* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */
|
|
/* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */
|
|
u64 n_sectors; /* size of device, if ATA */
|
|
u64 n_sectors; /* size of device, if ATA */
|
|
unsigned int class; /* ATA_DEV_xxx */
|
|
unsigned int class; /* ATA_DEV_xxx */
|
|
|
|
+ unsigned long unpark_deadline;
|
|
|
|
|
|
u8 pio_mode;
|
|
u8 pio_mode;
|
|
u8 dma_mode;
|
|
u8 dma_mode;
|
|
@@ -623,6 +628,7 @@ struct ata_eh_context {
|
|
[ATA_EH_CMD_TIMEOUT_TABLE_SIZE];
|
|
[ATA_EH_CMD_TIMEOUT_TABLE_SIZE];
|
|
unsigned int classes[ATA_MAX_DEVICES];
|
|
unsigned int classes[ATA_MAX_DEVICES];
|
|
unsigned int did_probe_mask;
|
|
unsigned int did_probe_mask;
|
|
|
|
+ unsigned int unloaded_mask;
|
|
unsigned int saved_ncq_enabled;
|
|
unsigned int saved_ncq_enabled;
|
|
u8 saved_xfer_mode[ATA_MAX_DEVICES];
|
|
u8 saved_xfer_mode[ATA_MAX_DEVICES];
|
|
/* timestamp for the last reset attempt or success */
|
|
/* timestamp for the last reset attempt or success */
|
|
@@ -712,6 +718,7 @@ struct ata_port {
|
|
struct list_head eh_done_q;
|
|
struct list_head eh_done_q;
|
|
wait_queue_head_t eh_wait_q;
|
|
wait_queue_head_t eh_wait_q;
|
|
int eh_tries;
|
|
int eh_tries;
|
|
|
|
+ struct completion park_req_pending;
|
|
|
|
|
|
pm_message_t pm_mesg;
|
|
pm_message_t pm_mesg;
|
|
int *pm_result;
|
|
int *pm_result;
|
|
@@ -1102,6 +1109,7 @@ 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 ata_base_port_ops;
|
|
extern const struct ata_port_operations sata_port_ops;
|
|
extern const struct ata_port_operations sata_port_ops;
|
|
|
|
+extern struct device_attribute *ata_common_sdev_attrs[];
|
|
|
|
|
|
#define ATA_BASE_SHT(drv_name) \
|
|
#define ATA_BASE_SHT(drv_name) \
|
|
.module = THIS_MODULE, \
|
|
.module = THIS_MODULE, \
|
|
@@ -1116,7 +1124,8 @@ extern const struct ata_port_operations sata_port_ops;
|
|
.proc_name = drv_name, \
|
|
.proc_name = drv_name, \
|
|
.slave_configure = ata_scsi_slave_config, \
|
|
.slave_configure = ata_scsi_slave_config, \
|
|
.slave_destroy = ata_scsi_slave_destroy, \
|
|
.slave_destroy = ata_scsi_slave_destroy, \
|
|
- .bios_param = ata_std_bios_param
|
|
|
|
|
|
+ .bios_param = ata_std_bios_param, \
|
|
|
|
+ .sdev_attrs = ata_common_sdev_attrs
|
|
|
|
|
|
#define ATA_NCQ_SHT(drv_name) \
|
|
#define ATA_NCQ_SHT(drv_name) \
|
|
ATA_BASE_SHT(drv_name), \
|
|
ATA_BASE_SHT(drv_name), \
|