diff options
Diffstat (limited to 'include/linux/libata.h')
| -rw-r--r-- | include/linux/libata.h | 35 | 
1 files changed, 33 insertions, 2 deletions
| diff --git a/include/linux/libata.h b/include/linux/libata.h index 2c4ebef79d0c..d15c19e331d1 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -180,6 +180,8 @@ enum {  	ATA_DFLAG_DA		= (1 << 26), /* device supports Device Attention */  	ATA_DFLAG_DEVSLP	= (1 << 27), /* device supports Device Sleep */  	ATA_DFLAG_ACPI_DISABLED = (1 << 28), /* ACPI for the device is disabled */ +	ATA_DFLAG_D_SENSE	= (1 << 29), /* Descriptor sense requested */ +	ATA_DFLAG_ZAC		= (1 << 30), /* ZAC device */  	ATA_DEV_UNKNOWN		= 0,	/* unknown device */  	ATA_DEV_ATA		= 1,	/* ATA device */ @@ -191,7 +193,8 @@ enum {  	ATA_DEV_SEMB		= 7,	/* SEMB */  	ATA_DEV_SEMB_UNSUP	= 8,	/* SEMB (unsupported) */  	ATA_DEV_ZAC		= 9,	/* ZAC device */ -	ATA_DEV_NONE		= 10,	/* no device */ +	ATA_DEV_ZAC_UNSUP	= 10,	/* ZAC device (unsupported) */ +	ATA_DEV_NONE		= 11,	/* no device */  	/* struct ata_link flags */  	ATA_LFLAG_NO_HRST	= (1 << 1), /* avoid hardreset */ @@ -727,6 +730,13 @@ struct ata_device {  	/* NCQ send and receive log subcommand support */  	u8			ncq_send_recv_cmds[ATA_LOG_NCQ_SEND_RECV_SIZE]; +	u8			ncq_non_data_cmds[ATA_LOG_NCQ_NON_DATA_SIZE]; + +	/* ZAC zone configuration */ +	u32			zac_zoned_cap; +	u32			zac_zones_optimal_open; +	u32			zac_zones_optimal_nonseq; +	u32			zac_zones_max_open;  	/* error history */  	int			spdn_cnt; @@ -1523,7 +1533,8 @@ static inline unsigned int ata_class_enabled(unsigned int class)  static inline unsigned int ata_class_disabled(unsigned int class)  {  	return class == ATA_DEV_ATA_UNSUP || class == ATA_DEV_ATAPI_UNSUP || -		class == ATA_DEV_PMP_UNSUP || class == ATA_DEV_SEMB_UNSUP; +		class == ATA_DEV_PMP_UNSUP || class == ATA_DEV_SEMB_UNSUP || +		class == ATA_DEV_ZAC_UNSUP;  }  static inline unsigned int ata_class_absent(unsigned int class) @@ -1641,6 +1652,26 @@ static inline bool ata_fpdma_dsm_supported(struct ata_device *dev)  		 ATA_LOG_NCQ_SEND_RECV_DSM_TRIM);  } +static inline bool ata_fpdma_read_log_supported(struct ata_device *dev) +{ +	return (dev->flags & ATA_DFLAG_NCQ_SEND_RECV) && +		(dev->ncq_send_recv_cmds[ATA_LOG_NCQ_SEND_RECV_RD_LOG_OFFSET] & +		 ATA_LOG_NCQ_SEND_RECV_RD_LOG_SUPPORTED); +} + +static inline bool ata_fpdma_zac_mgmt_in_supported(struct ata_device *dev) +{ +	return (dev->flags & ATA_DFLAG_NCQ_SEND_RECV) && +		(dev->ncq_send_recv_cmds[ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OFFSET] & +		ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_IN_SUPPORTED); +} + +static inline bool ata_fpdma_zac_mgmt_out_supported(struct ata_device *dev) +{ +	return (dev->ncq_non_data_cmds[ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OFFSET] & +		ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OUT); +} +  static inline void ata_qc_set_polling(struct ata_queued_cmd *qc)  {  	qc->tf.ctl |= ATA_NIEN; |