summaryrefslogtreecommitdiffstats
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-0c7394e39a.tar.gz
rockbox-0c7394e39a.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,
int ata_disk_isssd(void)
{
/*
- offset 217 is "Nominal Rotation rate"
- 0x0000 == Not reported
- 0x0001 == Solid State
- 0x0401 -> 0xffe == RPM
- All others reserved
+ Offset 217 is "Nominal Rotation rate"
+ 0x0000 == Not reported
+ 0x0001 == Solid State
+ 0x0401 -> 0xffe == RPM
+ All others reserved
- Some CF cards return 0x0100 (ie byteswapped 0x0001) so accept either.
+ Some CF cards return 0x0100 (ie byteswapped 0x0001) so accept either.
+ However, this is a relatively recent change, and we can't rely on it,
+ especially for the FC1307A CF->SD adapters!
- However, this is a very recent change, and we can't rely on it,
- especially for the FC1307A CF->SD adapters.
+ Offset 167 is "Nominal Form Factor"
+ all values >= 0x06 are guaranteed to be solid State.
- So we have to resort to other heuristics.
+ Offset 83 b2 and/or 86 b2 is set to show device implementes CFA commands
- offset 83 b2 is set to show device implementes CFA commands
- offset 0 is 0x848a for CF, but that's not guaranteed, because reasons.
+ Offset 169 b0 is set to show device implements TRIM.
- These don't guarantee this is an SSD but it's better than nothing.
+ Offset 0 is 0x848a for CF, but that's not guaranteed, because reasons.
*/
- return (identify_info[83] & (1<<2) ||
+ return (identify_info[83] & (1<<2) || identify_info[86] & (1<<2) ||
+ (identify_info[168] & 0x0f) >= 0x06 ||
+ identify_info[169] & (1<<0) ||
identify_info[217] == 0x0001 || identify_info[217] == 0x0100);
}