diff options
Diffstat (limited to 'include/linux/libata.h')
| -rw-r--r-- | include/linux/libata.h | 174 | 
1 files changed, 116 insertions, 58 deletions
diff --git a/include/linux/libata.h b/include/linux/libata.h index 2ca9b7056a82..cffa4714bfa8 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -57,8 +57,6 @@  #define VPRINTK(fmt, args...)  #endif	/* ATA_DEBUG */ -#define BPRINTK(fmt, args...) if (ap->flags & ATA_FLAG_DEBUGMSG) printk(KERN_ERR "%s: " fmt, __func__, ## args) -  #define ata_print_version_once(dev, version)			\  ({								\  	static bool __print_once;				\ @@ -176,6 +174,7 @@ enum {  	ATA_DEV_NONE		= 11,	/* no device */  	/* struct ata_link flags */ +	/* NOTE: struct ata_force_param currently stores lflags in u16 */  	ATA_LFLAG_NO_HRST	= (1 << 1), /* avoid hardreset */  	ATA_LFLAG_NO_SRST	= (1 << 2), /* avoid softreset */  	ATA_LFLAG_ASSUME_ATA	= (1 << 3), /* assume ATA class */ @@ -531,12 +530,14 @@ typedef int (*ata_reset_fn_t)(struct ata_link *link, unsigned int *classes,  			      unsigned long deadline);  typedef void (*ata_postreset_fn_t)(struct ata_link *link, unsigned int *classes); -extern struct device_attribute dev_attr_link_power_management_policy;  extern struct device_attribute dev_attr_unload_heads; +#ifdef CONFIG_SATA_HOST +extern struct device_attribute dev_attr_link_power_management_policy;  extern struct device_attribute dev_attr_ncq_prio_enable;  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; +#endif  enum sw_activity {  	OFF, @@ -1020,10 +1021,6 @@ struct ata_timing {  /*   * Core layer - drivers/ata/libata-core.c   */ -extern const unsigned long sata_deb_timing_normal[]; -extern const unsigned long sata_deb_timing_hotplug[]; -extern const unsigned long sata_deb_timing_long[]; -  extern struct ata_port_operations ata_dummy_port_ops;  extern const struct ata_port_info ata_dummy_port_info; @@ -1061,33 +1058,14 @@ static inline int is_multi_taskfile(struct ata_taskfile *tf)  	       (tf->command == ATA_CMD_WRITE_MULTI_FUA_EXT);  } -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; -} -  static inline int ata_port_is_dummy(struct ata_port *ap)  {  	return ap->ops == &ata_dummy_port_ops;  } -extern int sata_set_spd(struct ata_link *link);  extern int ata_std_prereset(struct ata_link *link, unsigned long deadline);  extern int ata_wait_after_reset(struct ata_link *link, unsigned long deadline,  				int (*check_ready)(struct ata_link *link)); -extern int sata_link_debounce(struct ata_link *link, -			const unsigned long *params, unsigned long deadline); -extern int sata_link_resume(struct ata_link *link, const unsigned long *params, -			    unsigned long deadline); -extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy, -			     bool spm_wakeup); -extern int sata_link_hardreset(struct ata_link *link, -			const unsigned long *timing, unsigned long deadline, -			bool *online, int (*check_ready)(struct ata_link *));  extern int sata_std_hardreset(struct ata_link *link, unsigned int *class,  			      unsigned long deadline);  extern void ata_std_postreset(struct ata_link *link, unsigned int *classes); @@ -1095,7 +1073,6 @@ extern void ata_std_postreset(struct ata_link *link, unsigned int *classes);  extern struct ata_host *ata_host_alloc(struct device *dev, int max_ports);  extern struct ata_host *ata_host_alloc_pinfo(struct device *dev,  			const struct ata_port_info * const * ppi, int n_ports); -extern int ata_slave_link_init(struct ata_port *ap);  extern void ata_host_get(struct ata_host *host);  extern void ata_host_put(struct ata_host *host);  extern int ata_host_start(struct ata_host *host); @@ -1117,22 +1094,6 @@ extern int ata_scsi_ioctl(struct scsi_device *dev, unsigned int cmd,  extern int ata_scsi_queuecmd(struct Scsi_Host *h, struct scsi_cmnd *cmd);  extern int ata_sas_scsi_ioctl(struct ata_port *ap, struct scsi_device *dev,  			    unsigned int cmd, void __user *arg); -extern void ata_sas_port_destroy(struct ata_port *); -extern struct ata_port *ata_sas_port_alloc(struct ata_host *, -					   struct ata_port_info *, struct Scsi_Host *); -extern void ata_sas_async_probe(struct ata_port *ap); -extern int ata_sas_sync_probe(struct ata_port *ap); -extern int ata_sas_port_init(struct ata_port *); -extern int ata_sas_port_start(struct ata_port *ap); -extern int ata_sas_tport_add(struct device *parent, struct ata_port *ap); -extern void ata_sas_tport_delete(struct ata_port *ap); -extern void ata_sas_port_stop(struct ata_port *ap); -extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *); -extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap); -extern int sata_scr_valid(struct ata_link *link); -extern int sata_scr_read(struct ata_link *link, int reg, u32 *val); -extern int sata_scr_write(struct ata_link *link, int reg, u32 val); -extern int sata_scr_write_flush(struct ata_link *link, int reg, u32 val);  extern bool ata_link_online(struct ata_link *link);  extern bool ata_link_offline(struct ata_link *link);  #ifdef CONFIG_PM @@ -1153,9 +1114,6 @@ extern void ata_msleep(struct ata_port *ap, unsigned int msecs);  extern u32 ata_wait_register(struct ata_port *ap, void __iomem *reg, u32 mask,  			u32 val, 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); -extern void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf);  extern unsigned long ata_pack_xfermask(unsigned long pio_mask,  			unsigned long mwdma_mask, unsigned long udma_mask);  extern void ata_unpack_xfermask(unsigned long xfer_mask, @@ -1179,7 +1137,6 @@ extern void ata_id_c_string(const u16 *id, unsigned char *s,  extern unsigned int ata_do_dev_read_id(struct ata_device *dev,  					struct ata_taskfile *tf, u16 *id);  extern void ata_qc_complete(struct ata_queued_cmd *qc); -extern int ata_qc_complete_multiple(struct ata_port *ap, u64 qc_active);  extern u64 ata_qc_get_active(struct ata_port *ap);  extern void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd);  extern int ata_std_bios_param(struct scsi_device *sdev, @@ -1196,7 +1153,96 @@ extern struct ata_device *ata_dev_pair(struct ata_device *adev);  extern int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev);  extern void ata_scsi_port_error_handler(struct Scsi_Host *host, struct ata_port *ap);  extern void ata_scsi_cmd_error_handler(struct Scsi_Host *host, struct ata_port *ap, struct list_head *eh_q); + +/* + * SATA specific code - drivers/ata/libata-sata.c + */ +#ifdef CONFIG_SATA_HOST +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 int sata_scr_valid(struct ata_link *link); +extern int sata_scr_read(struct ata_link *link, int reg, u32 *val); +extern int sata_scr_write(struct ata_link *link, int reg, u32 val); +extern int sata_scr_write_flush(struct ata_link *link, int reg, u32 val); +extern int sata_set_spd(struct ata_link *link); +extern int sata_link_hardreset(struct ata_link *link, +			const unsigned long *timing, unsigned long deadline, +			bool *online, int (*check_ready)(struct ata_link *)); +extern int sata_link_resume(struct ata_link *link, const unsigned long *params, +			    unsigned long deadline); +extern void ata_eh_analyze_ncq_error(struct ata_link *link); +#else +static inline const unsigned long * +sata_ehc_deb_timing(struct ata_eh_context *ehc) +{ +	return NULL; +} +static inline int sata_scr_valid(struct ata_link *link) { return 0; } +static inline int sata_scr_read(struct ata_link *link, int reg, u32 *val) +{ +	return -EOPNOTSUPP; +} +static inline int sata_scr_write(struct ata_link *link, int reg, u32 val) +{ +	return -EOPNOTSUPP; +} +static inline int sata_scr_write_flush(struct ata_link *link, int reg, u32 val) +{ +	return -EOPNOTSUPP; +} +static inline int sata_set_spd(struct ata_link *link) { return -EOPNOTSUPP; } +static inline int sata_link_hardreset(struct ata_link *link, +				      const unsigned long *timing, +				      unsigned long deadline, +				      bool *online, +				      int (*check_ready)(struct ata_link *)) +{ +	if (online) +		*online = false; +	return -EOPNOTSUPP; +} +static inline int sata_link_resume(struct ata_link *link, +				   const unsigned long *params, +				   unsigned long deadline) +{ +	return -EOPNOTSUPP; +} +static inline void ata_eh_analyze_ncq_error(struct ata_link *link) { } +#endif +extern int sata_link_debounce(struct ata_link *link, +			const unsigned long *params, unsigned long deadline); +extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy, +			     bool spm_wakeup); +extern int ata_slave_link_init(struct ata_port *ap); +extern void ata_sas_port_destroy(struct ata_port *); +extern struct ata_port *ata_sas_port_alloc(struct ata_host *, +					   struct ata_port_info *, struct Scsi_Host *); +extern void ata_sas_async_probe(struct ata_port *ap); +extern int ata_sas_sync_probe(struct ata_port *ap); +extern int ata_sas_port_init(struct ata_port *); +extern int ata_sas_port_start(struct ata_port *ap); +extern int ata_sas_tport_add(struct device *parent, struct ata_port *ap); +extern void ata_sas_tport_delete(struct ata_port *ap); +extern void ata_sas_port_stop(struct ata_port *ap); +extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *); +extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap); +extern void ata_tf_to_fis(const struct ata_taskfile *tf, +			  u8 pmp, int is_cmd, u8 *fis); +extern void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf); +extern int ata_qc_complete_multiple(struct ata_port *ap, u64 qc_active);  extern bool sata_lpm_ignore_phy_events(struct ata_link *link); +extern int sata_async_notification(struct ata_port *ap);  extern int ata_cable_40wire(struct ata_port *ap);  extern int ata_cable_80wire(struct ata_port *ap); @@ -1206,12 +1252,6 @@ extern int ata_cable_unknown(struct ata_port *ap);  /* Timing helpers */  extern unsigned int ata_pio_need_iordy(const struct ata_device *); -extern const struct ata_timing *ata_timing_find_mode(u8 xfer_mode); -extern int ata_timing_compute(struct ata_device *, unsigned short, -			      struct ata_timing *, int, int); -extern void ata_timing_merge(const struct ata_timing *, -			     const struct ata_timing *, struct ata_timing *, -			     unsigned int);  extern u8 ata_timing_cycle2mode(unsigned int xfer_shift, int cycle);  /* PCI */ @@ -1295,14 +1335,12 @@ extern void ata_port_wait_eh(struct ata_port *ap);  extern int ata_link_abort(struct ata_link *link);  extern int ata_port_abort(struct ata_port *ap);  extern int ata_port_freeze(struct ata_port *ap); -extern int sata_async_notification(struct ata_port *ap);  extern void ata_eh_freeze_port(struct ata_port *ap);  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, @@ -1343,7 +1381,7 @@ extern struct device_attribute *ata_common_sdev_attrs[];   * edge driver's module reference, otherwise the driver can be unloaded   * even if the scsi_device is being accessed.   */ -#define ATA_BASE_SHT(drv_name)					\ +#define __ATA_BASE_SHT(drv_name)				\  	.module			= THIS_MODULE,			\  	.name			= drv_name,			\  	.ioctl			= ata_scsi_ioctl,		\ @@ -1357,12 +1395,20 @@ extern struct device_attribute *ata_common_sdev_attrs[];  	.slave_configure	= ata_scsi_slave_config,	\  	.slave_destroy		= ata_scsi_slave_destroy,	\  	.bios_param		= ata_std_bios_param,		\ -	.unlock_native_capacity	= ata_scsi_unlock_native_capacity, \ +	.unlock_native_capacity	= ata_scsi_unlock_native_capacity + +#define ATA_BASE_SHT(drv_name)					\ +	__ATA_BASE_SHT(drv_name),				\  	.sdev_attrs		= ata_common_sdev_attrs +#ifdef CONFIG_SATA_HOST +extern struct device_attribute *ata_ncq_sdev_attrs[]; +  #define ATA_NCQ_SHT(drv_name)					\ -	ATA_BASE_SHT(drv_name),					\ +	__ATA_BASE_SHT(drv_name),				\ +	.sdev_attrs		= ata_ncq_sdev_attrs,		\  	.change_queue_depth	= ata_scsi_change_queue_depth +#endif  /*   * PMP helpers @@ -1635,6 +1681,8 @@ extern struct ata_device *ata_dev_next(struct ata_device *dev,   */  static inline int ata_ncq_enabled(struct ata_device *dev)  { +	if (!IS_ENABLED(CONFIG_SATA_HOST)) +		return 0;  	return (dev->flags & (ATA_DFLAG_PIO | ATA_DFLAG_NCQ_OFF |  			      ATA_DFLAG_NCQ)) == ATA_DFLAG_NCQ;  } @@ -1804,6 +1852,16 @@ static inline int ata_dma_enabled(struct ata_device *adev)  }  /************************************************************************** + * PATA timings - drivers/ata/libata-pata-timings.c + */ +extern const struct ata_timing *ata_timing_find_mode(u8 xfer_mode); +extern int ata_timing_compute(struct ata_device *, unsigned short, +			      struct ata_timing *, int, int); +extern void ata_timing_merge(const struct ata_timing *, +			     const struct ata_timing *, struct ata_timing *, +			     unsigned int); + +/**************************************************************************   * PMP - drivers/ata/libata-pmp.c   */  #ifdef CONFIG_SATA_PMP  |