diff options
author | Solomon Peachy <pizza@shaftnet.org> | 2022-11-27 00:57:57 -0500 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2022-11-27 09:15:29 -0500 |
commit | 0c7394e39a8c2767ea1329ed8ed222805468ec72 (patch) | |
tree | 026cf990965bd83705e9b21559f54b491cc234dd | |
parent | 3f4e55a8722fef13b6f5dd3996fb082c7de2fc57 (diff) | |
download | rockbox-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.c | 29 |
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); } |