summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/ata/atascsi.c15
-rw-r--r--sys/dev/ata/atascsi.h10
-rw-r--r--sys/scsi/scsi_disk.h4
3 files changed, 23 insertions, 6 deletions
diff --git a/sys/dev/ata/atascsi.c b/sys/dev/ata/atascsi.c
index b8ae4c31d84..f0ca3666503 100644
--- a/sys/dev/ata/atascsi.c
+++ b/sys/dev/ata/atascsi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: atascsi.c,v 1.83 2010/04/29 22:28:39 krw Exp $ */
+/* $OpenBSD: atascsi.c,v 1.84 2010/05/05 11:33:26 dlg Exp $ */
/*
* Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
@@ -880,6 +880,7 @@ atascsi_disk_capacity16(struct scsi_xfer *xs)
struct atascsi_port *ap = as->as_ports[link->target];
struct scsi_read_cap_data_16 rcd;
u_int align;
+ u_int16_t lowest_aligned = 0;
bzero(&rcd, sizeof(rcd));
@@ -888,7 +889,17 @@ atascsi_disk_capacity16(struct scsi_xfer *xs)
rcd.logical_per_phys = ata_identify_block_l2p_exp(&ap->ap_identify);
align = ata_identify_block_logical_align(&ap->ap_identify);
if (align > 0)
- _lto2b((1 << rcd.logical_per_phys) - align, rcd.lowest_aligned);
+ lowest_aligned = (1 << rcd.logical_per_phys) - align;
+
+ if (ISSET(letoh16(ap->ap_identify.data_set_mgmt),
+ ATA_ID_DATA_SET_MGMT_TRIM)) {
+ SET(lowest_aligned, READ_CAP_16_TPE);
+
+ if (ISSET(letoh16(ap->ap_identify.add_support),
+ ATA_ID_ADD_SUPPORT_DRT))
+ SET(lowest_aligned, READ_CAP_16_TPRZ);
+ }
+ _lto2b(lowest_aligned, rcd.lowest_aligned);
bcopy(&rcd, xs->data, MIN(sizeof(rcd), xs->datalen));
diff --git a/sys/dev/ata/atascsi.h b/sys/dev/ata/atascsi.h
index e9d4be3fd2a..4cb869131fc 100644
--- a/sys/dev/ata/atascsi.h
+++ b/sys/dev/ata/atascsi.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: atascsi.h,v 1.40 2010/04/22 00:58:32 dlg Exp $ */
+/* $OpenBSD: atascsi.h,v 1.41 2010/05/05 11:33:26 dlg Exp $ */
/*
* Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
@@ -79,7 +79,9 @@ struct ata_identify {
u_int16_t recmwdma; /* 66 */
u_int16_t minpio; /* 67 */
u_int16_t minpioflow; /* 68 */
- u_int16_t reserved4[2]; /* 69 */
+ u_int16_t add_support; /* 69 */
+#define ATA_ID_ADD_SUPPORT_DRT 0x4000
+ u_int16_t reserved4; /* 70 */
u_int16_t typtime[2]; /* 71 */
u_int16_t reserved5[2]; /* 73 */
u_int16_t qdepth; /* 75 */
@@ -133,7 +135,9 @@ struct ata_identify {
u_int16_t padding3[8]; /* 160 */
u_int16_t form; /* 168 */
#define ATA_ID_FORM_MASK 0x000f
- u_int16_t padding4[7]; /* 169 */
+ u_int16_t data_set_mgmt; /* 169 */
+#define ATA_ID_DATA_SET_MGMT_TRIM 0x0001
+ u_int16_t padding4[6]; /* 170 */
u_int16_t curmedser[30]; /* 176 */
u_int16_t sctsupport; /* 206 */
u_int16_t rpm; /* 207 */
diff --git a/sys/scsi/scsi_disk.h b/sys/scsi/scsi_disk.h
index 7cc5d2b39e4..81b9f811d29 100644
--- a/sys/scsi/scsi_disk.h
+++ b/sys/scsi/scsi_disk.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: scsi_disk.h,v 1.25 2010/04/03 07:09:29 dlg Exp $ */
+/* $OpenBSD: scsi_disk.h,v 1.26 2010/05/05 11:33:26 dlg Exp $ */
/* $NetBSD: scsi_disk.h,v 1.10 1996/07/05 16:19:05 christos Exp $ */
/*
@@ -266,6 +266,8 @@ struct scsi_read_cap_data_16 {
u_int8_t p_type_prot;
u_int8_t logical_per_phys;
u_int8_t lowest_aligned[2];
+#define READ_CAP_16_TPE 0x8000
+#define READ_CAP_16_TPRZ 0x4000
u_int8_t reserved[16];
};