summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSolomon Peachy <pizza@shaftnet.org>2022-11-27 00:57:57 -0500
committerSolomon Peachy <pizza@shaftnet.org>2022-11-27 09:15:29 -0500
commit0c7394e39a8c2767ea1329ed8ed222805468ec72 (patch)
tree026cf990965bd83705e9b21559f54b491cc234dd
parent3f4e55a8722fef13b6f5dd3996fb082c7de2fc57 (diff)
downloadrockbox-0c7394e39a8c2767ea1329ed8ed222805468ec72.tar.gz
rockbox-0c7394e39a8c2767ea1329ed8ed222805468ec72.zip
ata: Improve heuristics for detecting SSDs
mSATA devices should be new enough to report their form factor proprerly Change-Id: I2605c8ee0c97432e6e03bd78719e12bb14837f8d
-rw-r--r--firmware/drivers/ata.c29
1 files changed, 16 insertions, 13 deletions
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c
index ec99239169..910d42d3b5 100644
--- a/firmware/drivers/ata.c
+++ b/firmware/drivers/ata.c
@@ -389,25 +389,28 @@ static ICODE_ATTR void copy_write_sectors(const unsigned char* buf,
389int ata_disk_isssd(void) 389int ata_disk_isssd(void)
390{ 390{
391 /* 391 /*
392 offset 217 is "Nominal Rotation rate" 392 Offset 217 is "Nominal Rotation rate"
393 0x0000 == Not reported 393 0x0000 == Not reported
394 0x0001 == Solid State 394 0x0001 == Solid State
395 0x0401 -> 0xffe == RPM 395 0x0401 -> 0xffe == RPM
396 All others reserved 396 All others reserved
397 397
398 Some CF cards return 0x0100 (ie byteswapped 0x0001) so accept either. 398 Some CF cards return 0x0100 (ie byteswapped 0x0001) so accept either.
399 However, this is a relatively recent change, and we can't rely on it,
400 especially for the FC1307A CF->SD adapters!
399 401
400 However, this is a very recent change, and we can't rely on it, 402 Offset 167 is "Nominal Form Factor"
401 especially for the FC1307A CF->SD adapters. 403 all values >= 0x06 are guaranteed to be solid State.
402 404
403 So we have to resort to other heuristics. 405 Offset 83 b2 and/or 86 b2 is set to show device implementes CFA commands
404 406
405 offset 83 b2 is set to show device implementes CFA commands 407 Offset 169 b0 is set to show device implements TRIM.
406 offset 0 is 0x848a for CF, but that's not guaranteed, because reasons.
407 408
408 These don't guarantee this is an SSD but it's better than nothing. 409 Offset 0 is 0x848a for CF, but that's not guaranteed, because reasons.
409 */ 410 */
410 return (identify_info[83] & (1<<2) || 411 return (identify_info[83] & (1<<2) || identify_info[86] & (1<<2) ||
412 (identify_info[168] & 0x0f) >= 0x06 ||
413 identify_info[169] & (1<<0) ||
411 identify_info[217] == 0x0001 || identify_info[217] == 0x0100); 414 identify_info[217] == 0x0001 || identify_info[217] == 0x0100);
412} 415}
413 416