Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 90eebd37 authored by Martin K. Petersen's avatar Martin K. Petersen Committed by Sasha Levin
Browse files

libata: Expose TRIM capability in sysfs



[ Upstream commit f303074160d3401970ccae082014e1ee5a9a52c5 ]

Create a sysfs "trim" attribute for each ata_device that displays
whether DSM TRIM is "unsupported", "unqueued", "forced_unqueued"
(blacklisted) or "queued".

Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarSasha Levin <sasha.levin@oracle.com>
parent f17728b7
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -90,6 +90,17 @@ gscr
	130:	SATA_PMP_GSCR_SII_GPIO
	Only valid if the device is a PM.

trim

	Shows the DSM TRIM mode currently used by the device. Valid
	values are:
	unsupported:		Drive does not support DSM TRIM
	unqueued:		Drive supports unqueued DSM TRIM only
	queued:			Drive supports queued DSM TRIM
	forced_unqueued:	Drive's unqueued DSM support is known to be
				buggy and only unqueued TRIM commands
				are sent

spdn_cnt

	Number of time libata decided to lower the speed of link due to errors.
+22 −0
Original line number Diff line number Diff line
@@ -559,6 +559,27 @@ show_ata_dev_gscr(struct device *dev,

static DEVICE_ATTR(gscr, S_IRUGO, show_ata_dev_gscr, NULL);

static ssize_t
show_ata_dev_trim(struct device *dev,
		  struct device_attribute *attr, char *buf)
{
	struct ata_device *ata_dev = transport_class_to_dev(dev);
	unsigned char *mode;

	if (!ata_id_has_trim(ata_dev->id))
		mode = "unsupported";
	else if (ata_dev->horkage & ATA_HORKAGE_NO_NCQ_TRIM)
			mode = "forced_unqueued";
	else if (ata_fpdma_dsm_supported(ata_dev))
		mode = "queued";
	else
		mode = "unqueued";

	return snprintf(buf, 20, "%s\n", mode);
}

static DEVICE_ATTR(trim, S_IRUGO, show_ata_dev_trim, NULL);

static DECLARE_TRANSPORT_CLASS(ata_dev_class,
			       "ata_device", NULL, NULL, NULL);

@@ -732,6 +753,7 @@ struct scsi_transport_template *ata_attach_transport(void)
	SETUP_DEV_ATTRIBUTE(ering);
	SETUP_DEV_ATTRIBUTE(id);
	SETUP_DEV_ATTRIBUTE(gscr);
	SETUP_DEV_ATTRIBUTE(trim);
	BUG_ON(count > ATA_DEV_ATTRS);
	i->dev_attrs[count] = NULL;