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

Commit e78db4df authored by Martin K. Petersen's avatar Martin K. Petersen Committed by Jeff Garzik
Browse files

libata: Report zeroed read after TRIM and max discard size



Our current TRIM payload is a single sector that can accommodate 64 *
65535 blocks being unmapped.  Report this value in the Block Limits
Maximum Unmap LBA count field.

If a storage device supports TRIM and the DRAT and RZAT bits are set,
report TPRZ=1 in Read Capacity(16).

Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent d413ff3e
Loading
Loading
Loading
Loading
+9 −3
Original line number Original line Diff line number Diff line
@@ -2115,8 +2115,10 @@ static unsigned int ata_scsiop_inq_b0(struct ata_scsi_args *args, u8 *rbuf)
	 * that we support some form of unmap - in thise case via WRITE SAME
	 * that we support some form of unmap - in thise case via WRITE SAME
	 * with the unmap bit set.
	 * with the unmap bit set.
	 */
	 */
	if (ata_id_has_trim(args->id))
	if (ata_id_has_trim(args->id)) {
		put_unaligned_be32(65535 * 512 / 8, &rbuf[20]);
		put_unaligned_be32(1, &rbuf[28]);
		put_unaligned_be32(1, &rbuf[28]);
	}


	return 0;
	return 0;
}
}
@@ -2411,8 +2413,12 @@ static unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf)
		rbuf[14] = (lowest_aligned >> 8) & 0x3f;
		rbuf[14] = (lowest_aligned >> 8) & 0x3f;
		rbuf[15] = lowest_aligned;
		rbuf[15] = lowest_aligned;


		if (ata_id_has_trim(args->id))
		if (ata_id_has_trim(args->id)) {
			rbuf[14] |= 0x80;
			rbuf[14] |= 0x80; /* TPE */

			if (ata_id_has_zero_after_trim(args->id))
				rbuf[14] |= 0x40; /* TPRZ */
		}
	}
	}


	return 0;
	return 0;
+11 −0
Original line number Original line Diff line number Diff line
@@ -75,6 +75,7 @@ enum {
	ATA_ID_EIDE_DMA_TIME	= 66,
	ATA_ID_EIDE_DMA_TIME	= 66,
	ATA_ID_EIDE_PIO		= 67,
	ATA_ID_EIDE_PIO		= 67,
	ATA_ID_EIDE_PIO_IORDY	= 68,
	ATA_ID_EIDE_PIO_IORDY	= 68,
	ATA_ID_ADDITIONAL_SUPP	= 69,
	ATA_ID_QUEUE_DEPTH	= 75,
	ATA_ID_QUEUE_DEPTH	= 75,
	ATA_ID_MAJOR_VER	= 80,
	ATA_ID_MAJOR_VER	= 80,
	ATA_ID_COMMAND_SET_1	= 82,
	ATA_ID_COMMAND_SET_1	= 82,
@@ -816,6 +817,16 @@ static inline int ata_id_has_trim(const u16 *id)
	return 0;
	return 0;
}
}


static inline int ata_id_has_zero_after_trim(const u16 *id)
{
	/* DSM supported, deterministic read, and read zero after trim set */
	if (ata_id_has_trim(id) &&
	    (id[ATA_ID_ADDITIONAL_SUPP] & 0x4020) == 0x4020)
		return 1;

	return 0;
}

static inline int ata_id_current_chs_valid(const u16 *id)
static inline int ata_id_current_chs_valid(const u16 *id)
{
{
	/* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command
	/* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command