summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/ata_idle_notify.c16
-rw-r--r--firmware/drivers/ata.c2
-rw-r--r--firmware/export/ata_idle_notify.h4
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];
28static int ata_callback_count = 0; 28static int ata_callback_count = 0;
29#endif 29#endif
30 30
31
31bool register_ata_idle_func(ata_idle_notify function) 32bool 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
72bool call_ata_idle_notifys(bool sleep_after) 75bool 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
45extern void ata_idle_notify_init(void); 45extern void ata_idle_notify_init(void);
46extern void unregister_ata_idle_func(ata_idle_notify function, bool run); 46extern void unregister_ata_idle_func(ata_idle_notify function, bool run);
47extern bool call_ata_idle_notifys(bool sleep_after); 47extern 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