diff options
Diffstat (limited to 'include/linux/libata.h')
| -rw-r--r-- | include/linux/libata.h | 66 | 
1 files changed, 31 insertions, 35 deletions
| diff --git a/include/linux/libata.h b/include/linux/libata.h index 225bfc5bd9ec..947cf84e555d 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
| @@ -146,6 +146,7 @@ enum { | |||
| 146 | ATA_DFLAG_SPUNDOWN = (1 << 14), /* XXX: for spindown_compat */ | 146 | ATA_DFLAG_SPUNDOWN = (1 << 14), /* XXX: for spindown_compat */ | 
| 147 | ATA_DFLAG_SLEEPING = (1 << 15), /* device is sleeping */ | 147 | ATA_DFLAG_SLEEPING = (1 << 15), /* device is sleeping */ | 
| 148 | ATA_DFLAG_DUBIOUS_XFER = (1 << 16), /* data transfer not verified */ | 148 | ATA_DFLAG_DUBIOUS_XFER = (1 << 16), /* data transfer not verified */ | 
| 149 | ATA_DFLAG_NO_UNLOAD = (1 << 17), /* device doesn't support unload */ | ||
| 149 | ATA_DFLAG_INIT_MASK = (1 << 24) - 1, | 150 | ATA_DFLAG_INIT_MASK = (1 << 24) - 1, | 
| 150 | 151 | ||
| 151 | ATA_DFLAG_DETACH = (1 << 24), | 152 | ATA_DFLAG_DETACH = (1 << 24), | 
| @@ -244,6 +245,7 @@ enum { | |||
| 244 | ATA_TMOUT_BOOT = 30000, /* heuristic */ | 245 | ATA_TMOUT_BOOT = 30000, /* heuristic */ | 
| 245 | ATA_TMOUT_BOOT_QUICK = 7000, /* heuristic */ | 246 | ATA_TMOUT_BOOT_QUICK = 7000, /* heuristic */ | 
| 246 | ATA_TMOUT_INTERNAL_QUICK = 5000, | 247 | ATA_TMOUT_INTERNAL_QUICK = 5000, | 
| 248 | ATA_TMOUT_MAX_PARK = 30000, | ||
| 247 | 249 | ||
| 248 | /* FIXME: GoVault needs 2s but we can't afford that without | 250 | /* FIXME: GoVault needs 2s but we can't afford that without | 
| 249 | * parallel probing. 800ms is enough for iVDR disk | 251 | * parallel probing. 800ms is enough for iVDR disk | 
| @@ -319,8 +321,11 @@ enum { | |||
| 319 | ATA_EH_RESET = ATA_EH_SOFTRESET | ATA_EH_HARDRESET, | 321 | ATA_EH_RESET = ATA_EH_SOFTRESET | ATA_EH_HARDRESET, | 
| 320 | ATA_EH_ENABLE_LINK = (1 << 3), | 322 | ATA_EH_ENABLE_LINK = (1 << 3), | 
| 321 | ATA_EH_LPM = (1 << 4), /* link power management action */ | 323 | ATA_EH_LPM = (1 << 4), /* link power management action */ | 
| 324 | ATA_EH_PARK = (1 << 5), /* unload heads and stop I/O */ | ||
| 322 | 325 | ||
| 323 | ATA_EH_PERDEV_MASK = ATA_EH_REVALIDATE, | 326 | ATA_EH_PERDEV_MASK = ATA_EH_REVALIDATE | ATA_EH_PARK, | 
| 327 | ATA_EH_ALL_ACTIONS = ATA_EH_REVALIDATE | ATA_EH_RESET | | ||
| 328 | ATA_EH_ENABLE_LINK | ATA_EH_LPM, | ||
| 324 | 329 | ||
| 325 | /* ata_eh_info->flags */ | 330 | /* ata_eh_info->flags */ | 
| 326 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ | 331 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ | 
| @@ -452,6 +457,7 @@ enum link_pm { | |||
| 452 | MEDIUM_POWER, | 457 | MEDIUM_POWER, | 
| 453 | }; | 458 | }; | 
| 454 | extern struct device_attribute dev_attr_link_power_management_policy; | 459 | extern struct device_attribute dev_attr_link_power_management_policy; | 
| 460 | extern struct device_attribute dev_attr_unload_heads; | ||
| 455 | extern struct device_attribute dev_attr_em_message_type; | 461 | extern struct device_attribute dev_attr_em_message_type; | 
| 456 | extern struct device_attribute dev_attr_em_message; | 462 | extern struct device_attribute dev_attr_em_message; | 
| 457 | extern struct device_attribute dev_attr_sw_activity; | 463 | extern struct device_attribute dev_attr_sw_activity; | 
| @@ -554,8 +560,8 @@ struct ata_ering { | |||
| 554 | struct ata_device { | 560 | struct ata_device { | 
| 555 | struct ata_link *link; | 561 | struct ata_link *link; | 
| 556 | unsigned int devno; /* 0 or 1 */ | 562 | unsigned int devno; /* 0 or 1 */ | 
| 557 | unsigned long flags; /* ATA_DFLAG_xxx */ | ||
| 558 | unsigned int horkage; /* List of broken features */ | 563 | unsigned int horkage; /* List of broken features */ | 
| 564 | unsigned long flags; /* ATA_DFLAG_xxx */ | ||
| 559 | struct scsi_device *sdev; /* attached SCSI device */ | 565 | struct scsi_device *sdev; /* attached SCSI device */ | 
| 560 | #ifdef CONFIG_ATA_ACPI | 566 | #ifdef CONFIG_ATA_ACPI | 
| 561 | acpi_handle acpi_handle; | 567 | acpi_handle acpi_handle; | 
| @@ -564,6 +570,7 @@ struct ata_device { | |||
| 564 | /* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */ | 570 | /* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */ | 
| 565 | u64 n_sectors; /* size of device, if ATA */ | 571 | u64 n_sectors; /* size of device, if ATA */ | 
| 566 | unsigned int class; /* ATA_DEV_xxx */ | 572 | unsigned int class; /* ATA_DEV_xxx */ | 
| 573 | unsigned long unpark_deadline; | ||
| 567 | 574 | ||
| 568 | u8 pio_mode; | 575 | u8 pio_mode; | 
| 569 | u8 dma_mode; | 576 | u8 dma_mode; | 
| @@ -621,6 +628,7 @@ struct ata_eh_context { | |||
| 621 | [ATA_EH_CMD_TIMEOUT_TABLE_SIZE]; | 628 | [ATA_EH_CMD_TIMEOUT_TABLE_SIZE]; | 
| 622 | unsigned int classes[ATA_MAX_DEVICES]; | 629 | unsigned int classes[ATA_MAX_DEVICES]; | 
| 623 | unsigned int did_probe_mask; | 630 | unsigned int did_probe_mask; | 
| 631 | unsigned int unloaded_mask; | ||
| 624 | unsigned int saved_ncq_enabled; | 632 | unsigned int saved_ncq_enabled; | 
| 625 | u8 saved_xfer_mode[ATA_MAX_DEVICES]; | 633 | u8 saved_xfer_mode[ATA_MAX_DEVICES]; | 
| 626 | /* timestamp for the last reset attempt or success */ | 634 | /* timestamp for the last reset attempt or success */ | 
| @@ -688,7 +696,8 @@ struct ata_port { | |||
| 688 | unsigned int qc_active; | 696 | unsigned int qc_active; | 
| 689 | int nr_active_links; /* #links with active qcs */ | 697 | int nr_active_links; /* #links with active qcs */ | 
| 690 | 698 | ||
| 691 | struct ata_link link; /* host default link */ | 699 | struct ata_link link; /* host default link */ | 
| 700 | struct ata_link *slave_link; /* see ata_slave_link_init() */ | ||
| 692 | 701 | ||
| 693 | int nr_pmp_links; /* nr of available PMP links */ | 702 | int nr_pmp_links; /* nr of available PMP links */ | 
| 694 | struct ata_link *pmp_link; /* array of PMP links */ | 703 | struct ata_link *pmp_link; /* array of PMP links */ | 
| @@ -709,6 +718,7 @@ struct ata_port { | |||
| 709 | struct list_head eh_done_q; | 718 | struct list_head eh_done_q; | 
| 710 | wait_queue_head_t eh_wait_q; | 719 | wait_queue_head_t eh_wait_q; | 
| 711 | int eh_tries; | 720 | int eh_tries; | 
| 721 | struct completion park_req_pending; | ||
| 712 | 722 | ||
| 713 | pm_message_t pm_mesg; | 723 | pm_message_t pm_mesg; | 
| 714 | int *pm_result; | 724 | int *pm_result; | 
| @@ -772,8 +782,8 @@ struct ata_port_operations { | |||
| 772 | /* | 782 | /* | 
| 773 | * Optional features | 783 | * Optional features | 
| 774 | */ | 784 | */ | 
| 775 | int (*scr_read)(struct ata_port *ap, unsigned int sc_reg, u32 *val); | 785 | int (*scr_read)(struct ata_link *link, unsigned int sc_reg, u32 *val); | 
| 776 | int (*scr_write)(struct ata_port *ap, unsigned int sc_reg, u32 val); | 786 | int (*scr_write)(struct ata_link *link, unsigned int sc_reg, u32 val); | 
| 777 | void (*pmp_attach)(struct ata_port *ap); | 787 | void (*pmp_attach)(struct ata_port *ap); | 
| 778 | void (*pmp_detach)(struct ata_port *ap); | 788 | void (*pmp_detach)(struct ata_port *ap); | 
| 779 | int (*enable_pm)(struct ata_port *ap, enum link_pm policy); | 789 | int (*enable_pm)(struct ata_port *ap, enum link_pm policy); | 
| @@ -895,6 +905,7 @@ extern void ata_port_disable(struct ata_port *); | |||
| 895 | extern struct ata_host *ata_host_alloc(struct device *dev, int max_ports); | 905 | extern struct ata_host *ata_host_alloc(struct device *dev, int max_ports); | 
| 896 | extern struct ata_host *ata_host_alloc_pinfo(struct device *dev, | 906 | extern struct ata_host *ata_host_alloc_pinfo(struct device *dev, | 
| 897 | const struct ata_port_info * const * ppi, int n_ports); | 907 | const struct ata_port_info * const * ppi, int n_ports); | 
| 908 | extern int ata_slave_link_init(struct ata_port *ap); | ||
| 898 | extern int ata_host_start(struct ata_host *host); | 909 | extern int ata_host_start(struct ata_host *host); | 
| 899 | extern int ata_host_register(struct ata_host *host, | 910 | extern int ata_host_register(struct ata_host *host, | 
| 900 | struct scsi_host_template *sht); | 911 | struct scsi_host_template *sht); | 
| @@ -920,8 +931,8 @@ extern int sata_scr_valid(struct ata_link *link); | |||
| 920 | extern int sata_scr_read(struct ata_link *link, int reg, u32 *val); | 931 | extern int sata_scr_read(struct ata_link *link, int reg, u32 *val); | 
| 921 | extern int sata_scr_write(struct ata_link *link, int reg, u32 val); | 932 | extern int sata_scr_write(struct ata_link *link, int reg, u32 val); | 
| 922 | extern int sata_scr_write_flush(struct ata_link *link, int reg, u32 val); | 933 | extern int sata_scr_write_flush(struct ata_link *link, int reg, u32 val); | 
| 923 | extern int ata_link_online(struct ata_link *link); | 934 | extern bool ata_link_online(struct ata_link *link); | 
| 924 | extern int ata_link_offline(struct ata_link *link); | 935 | extern bool ata_link_offline(struct ata_link *link); | 
| 925 | #ifdef CONFIG_PM | 936 | #ifdef CONFIG_PM | 
| 926 | extern int ata_host_suspend(struct ata_host *host, pm_message_t mesg); | 937 | extern int ata_host_suspend(struct ata_host *host, pm_message_t mesg); | 
| 927 | extern void ata_host_resume(struct ata_host *host); | 938 | extern void ata_host_resume(struct ata_host *host); | 
| @@ -1098,6 +1109,7 @@ extern void ata_std_error_handler(struct ata_port *ap); | |||
| 1098 | */ | 1109 | */ | 
| 1099 | extern const struct ata_port_operations ata_base_port_ops; | 1110 | extern const struct ata_port_operations ata_base_port_ops; | 
| 1100 | extern const struct ata_port_operations sata_port_ops; | 1111 | extern const struct ata_port_operations sata_port_ops; | 
| 1112 | extern struct device_attribute *ata_common_sdev_attrs[]; | ||
| 1101 | 1113 | ||
| 1102 | #define ATA_BASE_SHT(drv_name) \ | 1114 | #define ATA_BASE_SHT(drv_name) \ | 
| 1103 | .module = THIS_MODULE, \ | 1115 | .module = THIS_MODULE, \ | 
| @@ -1112,7 +1124,8 @@ extern const struct ata_port_operations sata_port_ops; | |||
| 1112 | .proc_name = drv_name, \ | 1124 | .proc_name = drv_name, \ | 
| 1113 | .slave_configure = ata_scsi_slave_config, \ | 1125 | .slave_configure = ata_scsi_slave_config, \ | 
| 1114 | .slave_destroy = ata_scsi_slave_destroy, \ | 1126 | .slave_destroy = ata_scsi_slave_destroy, \ | 
| 1115 | .bios_param = ata_std_bios_param | 1127 | .bios_param = ata_std_bios_param, \ | 
| 1128 | .sdev_attrs = ata_common_sdev_attrs | ||
| 1116 | 1129 | ||
| 1117 | #define ATA_NCQ_SHT(drv_name) \ | 1130 | #define ATA_NCQ_SHT(drv_name) \ | 
| 1118 | ATA_BASE_SHT(drv_name), \ | 1131 | ATA_BASE_SHT(drv_name), \ | 
| @@ -1134,7 +1147,7 @@ static inline bool sata_pmp_attached(struct ata_port *ap) | |||
| 1134 | 1147 | ||
| 1135 | static inline int ata_is_host_link(const struct ata_link *link) | 1148 | static inline int ata_is_host_link(const struct ata_link *link) | 
| 1136 | { | 1149 | { | 
| 1137 | return link == &link->ap->link; | 1150 | return link == &link->ap->link || link == link->ap->slave_link; | 
| 1138 | } | 1151 | } | 
| 1139 | #else /* CONFIG_SATA_PMP */ | 1152 | #else /* CONFIG_SATA_PMP */ | 
| 1140 | static inline bool sata_pmp_supported(struct ata_port *ap) | 1153 | static inline bool sata_pmp_supported(struct ata_port *ap) | 
| @@ -1167,7 +1180,7 @@ static inline int sata_srst_pmp(struct ata_link *link) | |||
| 1167 | printk("%sata%u: "fmt, lv, (ap)->print_id , ##args) | 1180 | printk("%sata%u: "fmt, lv, (ap)->print_id , ##args) | 
| 1168 | 1181 | ||
| 1169 | #define ata_link_printk(link, lv, fmt, args...) do { \ | 1182 | #define ata_link_printk(link, lv, fmt, args...) do { \ | 
| 1170 | if (sata_pmp_attached((link)->ap)) \ | 1183 | if (sata_pmp_attached((link)->ap) || (link)->ap->slave_link) \ | 
| 1171 | printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id, \ | 1184 | printk("%sata%u.%02u: "fmt, lv, (link)->ap->print_id, \ | 
| 1172 | (link)->pmp , ##args); \ | 1185 | (link)->pmp , ##args); \ | 
| 1173 | else \ | 1186 | else \ | 
| @@ -1265,34 +1278,17 @@ static inline int ata_link_active(struct ata_link *link) | |||
| 1265 | return ata_tag_valid(link->active_tag) || link->sactive; | 1278 | return ata_tag_valid(link->active_tag) || link->sactive; | 
| 1266 | } | 1279 | } | 
| 1267 | 1280 | ||
| 1268 | static inline struct ata_link *ata_port_first_link(struct ata_port *ap) | 1281 | extern struct ata_link *__ata_port_next_link(struct ata_port *ap, | 
| 1269 | { | 1282 | struct ata_link *link, | 
| 1270 | if (sata_pmp_attached(ap)) | 1283 | bool dev_only); | 
| 1271 | return ap->pmp_link; | ||
| 1272 | return &ap->link; | ||
| 1273 | } | ||
| 1274 | |||
| 1275 | static inline struct ata_link *ata_port_next_link(struct ata_link *link) | ||
| 1276 | { | ||
| 1277 | struct ata_port *ap = link->ap; | ||
| 1278 | |||
| 1279 | if (ata_is_host_link(link)) { | ||
| 1280 | if (!sata_pmp_attached(ap)) | ||
| 1281 | return NULL; | ||
| 1282 | return ap->pmp_link; | ||
| 1283 | } | ||
| 1284 | |||
| 1285 | if (++link < ap->nr_pmp_links + ap->pmp_link) | ||
| 1286 | return link; | ||
| 1287 | return NULL; | ||
| 1288 | } | ||
| 1289 | 1284 | ||
| 1290 | #define __ata_port_for_each_link(lk, ap) \ | 1285 | #define __ata_port_for_each_link(link, ap) \ | 
| 1291 | for ((lk) = &(ap)->link; (lk); (lk) = ata_port_next_link(lk)) | 1286 | for ((link) = __ata_port_next_link((ap), NULL, false); (link); \ | 
| 1287 | (link) = __ata_port_next_link((ap), (link), false)) | ||
| 1292 | 1288 | ||
| 1293 | #define ata_port_for_each_link(link, ap) \ | 1289 | #define ata_port_for_each_link(link, ap) \ | 
| 1294 | for ((link) = ata_port_first_link(ap); (link); \ | 1290 | for ((link) = __ata_port_next_link((ap), NULL, true); (link); \ | 
| 1295 | (link) = ata_port_next_link(link)) | 1291 | (link) = __ata_port_next_link((ap), (link), true)) | 
| 1296 | 1292 | ||
| 1297 | #define ata_link_for_each_dev(dev, link) \ | 1293 | #define ata_link_for_each_dev(dev, link) \ | 
| 1298 | for ((dev) = (link)->device; \ | 1294 | for ((dev) = (link)->device; \ | 
