diff options
author | Solomon Peachy <pizza@shaftnet.org> | 2024-10-23 14:16:15 -0400 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2024-10-31 12:51:54 -0400 |
commit | e829ea9a5ea05c6dedd91f741f91cb8723e50b19 (patch) | |
tree | bb554a4ec31b3b5501189993de990d2419306c2f /firmware/export | |
parent | 825e4069655065ffd49bcc9ec64b53f1225e8186 (diff) | |
download | rockbox-e829ea9a5ea05c6dedd91f741f91cb8723e50b19.tar.gz rockbox-e829ea9a5ea05c6dedd91f741f91cb8723e50b19.zip |
ata: Rework how flushing, sleeping, and power off interacts
* FLUSH_EXT is used if featureflag is set and we are using LBA48
(unconditionally used for CE-ATA on ipod6g)
* FLUSH is used if featureflag is set (ATA6+) or if device claims to be ATA5+
* Rename ata_disk_can_power_off() to ata_disk_can_sleep() as that is
what it actually tests for. Only use it to gate issuing the
STANDBY IMMEDIATE command.
* Restore behavior of ata_disk_is_active() to return 1 if drive is
"spinning" or powered up.
* Allow poweroff if drive claims PM support OR we are able to issue
FLUSH/FLUSH_EXT commands.
* Added ata_flush() to explicitly trigger a flush operation, and hook it
up to storage_flush() in the device shutdown path. (Flushes were
only previously used in the storage device power management path)
* After issuing all settings, re-issue IDENTIFY_DEVICE to make sure
it reflects everything we've enabled.
* Update manual section on Flash/SSD mods.
Change-Id: I6770a54ef3a87f4c47120bcb96c944a6652f1bf4
Diffstat (limited to 'firmware/export')
-rw-r--r-- | firmware/export/ata.h | 6 | ||||
-rw-r--r-- | firmware/export/storage.h | 2 |
2 files changed, 5 insertions, 3 deletions
diff --git a/firmware/export/ata.h b/firmware/export/ata.h index 0d84a91524..dfa73eebf5 100644 --- a/firmware/export/ata.h +++ b/firmware/export/ata.h | |||
@@ -208,8 +208,8 @@ static inline int ata_disk_isssd(void) | |||
208 | ); | 208 | ); |
209 | } | 209 | } |
210 | 210 | ||
211 | /* Returns 1 if the drive can be powered off safely */ | 211 | /* Returns 1 if the drive supports power management commands */ |
212 | static inline int ata_disk_can_poweroff(void) | 212 | static inline int ata_disk_can_sleep(void) |
213 | { | 213 | { |
214 | unsigned short *identify_info = ata_get_identify(); | 214 | unsigned short *identify_info = ata_get_identify(); |
215 | /* Only devices that claim to support PM can be safely powered off. | 215 | /* Only devices that claim to support PM can be safely powered off. |
@@ -217,6 +217,8 @@ static inline int ata_disk_can_poweroff(void) | |||
217 | return (identify_info[82] & (1<<3) && identify_info[85] & (1<<3)); | 217 | return (identify_info[82] & (1<<3) && identify_info[85] & (1<<3)); |
218 | } | 218 | } |
219 | 219 | ||
220 | int ata_flush(void); | ||
221 | |||
220 | #ifdef HAVE_ATA_DMA | 222 | #ifdef HAVE_ATA_DMA |
221 | /* Returns current DMA mode */ | 223 | /* Returns current DMA mode */ |
222 | int ata_get_dma_mode(void); | 224 | int ata_get_dma_mode(void); |
diff --git a/firmware/export/storage.h b/firmware/export/storage.h index e2ae4056be..f97cbf34d5 100644 --- a/firmware/export/storage.h +++ b/firmware/export/storage.h | |||
@@ -174,7 +174,7 @@ static inline void storage_sleep(void) {}; | |||
174 | #define storage_disk_is_active() ata_disk_is_active() | 174 | #define storage_disk_is_active() ata_disk_is_active() |
175 | #define storage_soft_reset() ata_soft_reset() | 175 | #define storage_soft_reset() ata_soft_reset() |
176 | #ifdef HAVE_STORAGE_FLUSH | 176 | #ifdef HAVE_STORAGE_FLUSH |
177 | #define storage_flush() (void)0 | 177 | #define storage_flush() ata_flush() |
178 | #endif | 178 | #endif |
179 | #define storage_last_disk_activity() ata_last_disk_activity() | 179 | #define storage_last_disk_activity() ata_last_disk_activity() |
180 | #define storage_spinup_time() ata_spinup_time() | 180 | #define storage_spinup_time() ata_spinup_time() |