diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/ata_idle_notify.c | 16 | ||||
-rw-r--r-- | firmware/drivers/ata.c | 2 | ||||
-rw-r--r-- | firmware/export/ata_idle_notify.h | 4 |
3 files changed, 13 insertions, 9 deletions
diff --git a/firmware/ata_idle_notify.c b/firmware/ata_idle_notify.c index c51c3800ce..17adbc1192 100644 --- a/firmware/ata_idle_notify.c +++ b/firmware/ata_idle_notify.c | |||
@@ -20,7 +20,7 @@ | |||
20 | #include "system.h" | 20 | #include "system.h" |
21 | #include "ata.h" | 21 | #include "ata.h" |
22 | #include "ata_idle_notify.h" | 22 | #include "ata_idle_notify.h" |
23 | #include "logf.h" | 23 | #include "kernel.h" |
24 | #include "string.h" | 24 | #include "string.h" |
25 | 25 | ||
26 | #if USING_ATA_CALLBACK | 26 | #if USING_ATA_CALLBACK |
@@ -28,10 +28,13 @@ static ata_idle_notify ata_idle_notify_funcs[MAX_ATA_CALLBACKS]; | |||
28 | static int ata_callback_count = 0; | 28 | static int ata_callback_count = 0; |
29 | #endif | 29 | #endif |
30 | 30 | ||
31 | |||
31 | bool register_ata_idle_func(ata_idle_notify function) | 32 | bool register_ata_idle_func(ata_idle_notify function) |
32 | { | 33 | { |
33 | #if USING_ATA_CALLBACK | 34 | #if USING_ATA_CALLBACK |
34 | int i; | 35 | int i; |
36 | if (ata_callback_count >= MAX_ATA_CALLBACKS) | ||
37 | return false; | ||
35 | for (i=0; i<MAX_ATA_CALLBACKS; i++) | 38 | for (i=0; i<MAX_ATA_CALLBACKS; i++) |
36 | { | 39 | { |
37 | if (ata_idle_notify_funcs[i] == NULL) | 40 | if (ata_idle_notify_funcs[i] == NULL) |
@@ -69,13 +72,15 @@ void unregister_ata_idle_func(ata_idle_notify func, bool run) | |||
69 | return; | 72 | return; |
70 | } | 73 | } |
71 | 74 | ||
72 | bool call_ata_idle_notifys(bool sleep_after) | 75 | bool call_ata_idle_notifys(bool force) |
73 | { | 76 | { |
74 | int i; | 77 | int i; |
78 | static int lock_until = 0; | ||
75 | ata_idle_notify function; | 79 | ata_idle_notify function; |
76 | if (ata_callback_count == 0) | 80 | if (!force && TIME_BEFORE(current_tick,lock_until) ) |
77 | return false; | 81 | return false; |
78 | ata_callback_count = 0; /* so we dont re-enter every time the callbacks read/write */ | 82 | lock_until = current_tick + 30*HZ; |
83 | |||
79 | for (i = 0; i < MAX_ATA_CALLBACKS; i++) | 84 | for (i = 0; i < MAX_ATA_CALLBACKS; i++) |
80 | { | 85 | { |
81 | if (ata_idle_notify_funcs[i]) | 86 | if (ata_idle_notify_funcs[i]) |
@@ -83,10 +88,9 @@ bool call_ata_idle_notifys(bool sleep_after) | |||
83 | function = ata_idle_notify_funcs[i]; | 88 | function = ata_idle_notify_funcs[i]; |
84 | ata_idle_notify_funcs[i] = NULL; | 89 | ata_idle_notify_funcs[i] = NULL; |
85 | function(); | 90 | function(); |
91 | ata_callback_count--; | ||
86 | } | 92 | } |
87 | } | 93 | } |
88 | if (sleep_after) | ||
89 | ata_sleep(); | ||
90 | return true; | 94 | return true; |
91 | } | 95 | } |
92 | 96 | ||
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c index bb8eef9dd9..0de2eb1804 100644 --- a/firmware/drivers/ata.c +++ b/firmware/drivers/ata.c | |||
@@ -1285,7 +1285,7 @@ static void ata_thread(void) | |||
1285 | break; | 1285 | break; |
1286 | #endif | 1286 | #endif |
1287 | case Q_SLEEP: | 1287 | case Q_SLEEP: |
1288 | call_ata_idle_notifys(true); | 1288 | call_ata_idle_notifys(false); |
1289 | last_disk_activity = current_tick - sleep_timeout + (HZ/2); | 1289 | last_disk_activity = current_tick - sleep_timeout + (HZ/2); |
1290 | break; | 1290 | break; |
1291 | 1291 | ||
diff --git a/firmware/export/ata_idle_notify.h b/firmware/export/ata_idle_notify.h index 65c181302a..ee825c967e 100644 --- a/firmware/export/ata_idle_notify.h +++ b/firmware/export/ata_idle_notify.h | |||
@@ -44,10 +44,10 @@ extern bool register_ata_idle_func(ata_idle_notify function); | |||
44 | #if USING_ATA_CALLBACK | 44 | #if USING_ATA_CALLBACK |
45 | extern void ata_idle_notify_init(void); | 45 | extern void ata_idle_notify_init(void); |
46 | extern void unregister_ata_idle_func(ata_idle_notify function, bool run); | 46 | extern void unregister_ata_idle_func(ata_idle_notify function, bool run); |
47 | extern bool call_ata_idle_notifys(bool sleep_after); | 47 | extern bool call_ata_idle_notifys(bool force); |
48 | #else | 48 | #else |
49 | #define unregister_ata_idle_func(f,r) | 49 | #define unregister_ata_idle_func(f,r) |
50 | #define call_ata_idle_notifys(s) | 50 | #define call_ata_idle_notifys(f) |
51 | #define ata_idle_notify_init(s) | 51 | #define ata_idle_notify_init(s) |
52 | #endif | 52 | #endif |
53 | 53 | ||