svn commit: r251348 - stable/9/sys/cam/ata
Steven Hartland
smh at FreeBSD.org
Mon Jun 3 21:35:05 UTC 2013
Author: smh
Date: Mon Jun 3 21:35:04 2013
New Revision: 251348
URL: http://svnweb.freebsd.org/changeset/base/251348
Log:
MFC r249934:
Updated TRIM calculations in CAM ATA to be based off ATA_DSM_* defines
Modified:
stable/9/sys/cam/ata/ata_da.c
Directory Properties:
stable/9/sys/ (props changed)
Modified: stable/9/sys/cam/ata/ata_da.c
==============================================================================
--- stable/9/sys/cam/ata/ata_da.c Mon Jun 3 20:52:20 2013 (r251347)
+++ stable/9/sys/cam/ata/ata_da.c Mon Jun 3 21:35:04 2013 (r251348)
@@ -118,10 +118,10 @@ struct disk_params {
};
#define TRIM_MAX_BLOCKS 8
-#define TRIM_MAX_RANGES (TRIM_MAX_BLOCKS * 64)
+#define TRIM_MAX_RANGES (TRIM_MAX_BLOCKS * ATA_DSM_BLK_RANGES)
#define TRIM_MAX_BIOS (TRIM_MAX_RANGES * 4)
struct trim_request {
- uint8_t data[TRIM_MAX_RANGES * 8];
+ uint8_t data[TRIM_MAX_RANGES * ATA_DSM_RANGE_SIZE];
struct bio *bps[TRIM_MAX_BIOS];
};
@@ -1113,8 +1113,8 @@ adaregister(struct cam_periph *periph, v
softc->trim_max_ranges = TRIM_MAX_RANGES;
if (cgd->ident_data.max_dsm_blocks != 0) {
softc->trim_max_ranges =
- min(cgd->ident_data.max_dsm_blocks * 64,
- softc->trim_max_ranges);
+ min(cgd->ident_data.max_dsm_blocks *
+ ATA_DSM_BLK_RANGES, softc->trim_max_ranges);
}
}
if (cgd->ident_data.support.command2 & ATA_SUPPORT_CFA)
@@ -1190,10 +1190,12 @@ adaregister(struct cam_periph *periph, v
softc->disk->d_flags = 0;
if (softc->flags & ADA_FLAG_CAN_FLUSHCACHE)
softc->disk->d_flags |= DISKFLAG_CANFLUSHCACHE;
- if ((softc->flags & ADA_FLAG_CAN_TRIM) ||
- ((softc->flags & ADA_FLAG_CAN_CFA) &&
- !(softc->flags & ADA_FLAG_CAN_48BIT)))
+ if (softc->flags & ADA_FLAG_CAN_TRIM) {
softc->disk->d_flags |= DISKFLAG_CANDELETE;
+ } else if ((softc->flags & ADA_FLAG_CAN_CFA) &&
+ !(softc->flags & ADA_FLAG_CAN_48BIT)) {
+ softc->disk->d_flags |= DISKFLAG_CANDELETE;
+ }
strlcpy(softc->disk->d_descr, cgd->ident_data.model,
MIN(sizeof(softc->disk->d_descr), sizeof(cgd->ident_data.model)));
strlcpy(softc->disk->d_ident, cgd->ident_data.serial,
@@ -1360,9 +1362,9 @@ adastart(struct cam_periph *periph, unio
/* Try to extend the previous range. */
if (lba == lastlba) {
- c = min(count, 0xffff - lastcount);
+ c = min(count, ATA_DSM_RANGE_MAX - lastcount);
lastcount += c;
- off = (ranges - 1) * 8;
+ off = (ranges - 1) * ATA_DSM_RANGE_SIZE;
req->data[off + 6] = lastcount & 0xff;
req->data[off + 7] =
(lastcount >> 8) & 0xff;
@@ -1371,8 +1373,8 @@ adastart(struct cam_periph *periph, unio
}
while (count > 0) {
- c = min(count, 0xffff);
- off = ranges * 8;
+ c = min(count, ATA_DSM_RANGE_MAX);
+ off = ranges * ATA_DSM_RANGE_SIZE;
req->data[off + 0] = lba & 0xff;
req->data[off + 1] = (lba >> 8) & 0xff;
req->data[off + 2] = (lba >> 16) & 0xff;
@@ -1385,6 +1387,11 @@ adastart(struct cam_periph *periph, unio
count -= c;
lastcount = c;
ranges++;
+ /*
+ * Its the caller's responsibility to ensure the
+ * request will fit so we don't need to check for
+ * overrun here
+ */
}
lastlba = lba;
req->bps[bps++] = bp1;
@@ -1392,7 +1399,8 @@ adastart(struct cam_periph *periph, unio
if (bps >= TRIM_MAX_BIOS ||
bp1 == NULL ||
bp1->bio_bcount / softc->params.secsize >
- (softc->trim_max_ranges - ranges) * 0xffff)
+ (softc->trim_max_ranges - ranges) *
+ ATA_DSM_RANGE_MAX)
break;
} while (1);
cam_fill_ataio(ataio,
@@ -1401,10 +1409,12 @@ adastart(struct cam_periph *periph, unio
CAM_DIR_OUT,
0,
req->data,
- ((ranges + 63) / 64) * 512,
+ ((ranges + ATA_DSM_BLK_RANGES - 1) /
+ ATA_DSM_BLK_RANGES) * ATA_DSM_BLK_SIZE,
ada_default_timeout * 1000);
ata_48bit_cmd(ataio, ATA_DATA_SET_MANAGEMENT,
- ATA_DSM_TRIM, 0, (ranges + 63) / 64);
+ ATA_DSM_TRIM, 0, (ranges + ATA_DSM_BLK_RANGES -
+ 1) / ATA_DSM_BLK_RANGES);
start_ccb->ccb_h.ccb_state = ADA_CCB_TRIM;
goto out;
}
More information about the svn-src-stable-9
mailing list