11#include "acata_internal.h"
24 Kprintf(
"acata:timer_done\n");
27 iReleaseWaitThread(thid);
30static void ata_thread(
void *arg)
48 q_next = argt->requestq.q_next;
52 atah = (
struct ac_ata_h *)argt->requestq.q_next;
56 argt->requestq.q_prev = 0;
57 argt->requestq.q_next = 0;
61 _next_ = (
struct ac_ata_h *)q_next->q_next;
62 _next_->a_chain.q_prev = q_next->q_prev;
63 argt->requestq.q_next = &_next_->a_chain;
70 tmout = atah->a_tmout;
75 acTimerAdd(&argt->timer, (acTimerDone)ata_timer_done, argt, tmout);
76 v10 = a_ops->ao_command(atah, 32, 78);
77 acTimerRemove(&argt->timer);
78 if ( v10 < 0 && a_ops->ao_error )
80 acTimerAdd(&argt->timer, (acTimerDone)ata_timer_done, argt, 0xF4240u);
81 v10 = a_ops->ao_error(atah, v10);
82 acTimerRemove(&argt->timer);
85 a_ops->ao_done(atah, v10);
86 CancelWakeupThread(0);
92 if ( thid != argt->thid )
97static int ata_intr(
const struct ata_softc *arg)
104 *((
volatile acUint16 *)0xB3000000) = 0;
111int ata_request(
struct ac_ata_h *atah,
int (*wakeup)(
int thid))
120 if ( (atah->a_flag & 0x10) != 0 )
123 if ( (Atac.active & unit) == 0 )
129 if ( Atac.thid == 0 )
135 if ( Atac.requestq.q_next )
141 Atac.requestq.q_prev = (
acQueueT)&Atac;
142 Atac.requestq.q_next = (
acQueueT)&Atac;
144 q_prev = Atac.requestq.q_prev;
145 atah->a_chain.q_next = (
acQueueT)&Atac;
146 atah->a_chain.q_prev = q_prev;
147 q_prev->q_next = &atah->a_chain;
148 Atac.requestq.q_prev = &atah->a_chain;
168static int ata_thread_init(
struct ata_softc *atac,
int priority)
173 param.attr = 0x2000000;
174 param.thread = ata_thread;
175 param.priority = priority;
176 param.stacksize = 0x800;
178 th = CreateThread(¶m);
180 StartThread(th, atac);
184int ata_probe(acAtaReg atareg)
191 while ( (*((
volatile acUint16 *)0xB6070000) & ATA_STAT_BUSY) != 0 )
193 *((
volatile acUint16 *)0xB6020000) = 4660;
195 if ( *((
volatile acUint16 *)0xB6020000) != 52 )
197 *((
volatile acUint16 *)0xB6030000) = 18;
199 if ( *((
volatile acUint16 *)0xB6030000) != 18 )
203 *((
volatile acUint16 *)0xB6160000) = 2;
204 *((
volatile acUint16 *)0xB6010000) = 0;
208 *((
volatile acUint16 *)0xB6060000) = 16 * (unit != 0);
209 *((
volatile acUint16 *)0xB6070000) = 0;
210 *((
volatile acUint16 *)0xB6070000) = 0;
211 while (
count <= 1999999 )
214 if ( (*((
volatile acUint16 *)0xB6070000) & ATA_STAT_BUSY) == 0 )
226static int ata_module_optarg(
const char *str,
int default_value)
231 result = strtol(str, &next, 0);
233 return default_value;
237int acAtaModuleStart(
int argc,
char **argv)
251 if ( acAtaModuleStatus() != 0 )
255 cmdprio = Atac.cprio;
267 while ( index < argc )
275 delay = ata_module_optarg(opt + 2, delay);
277 else if ( v13 >= 101 )
282 prio = ata_module_optarg(opt_v11, prio);
290 cmdprio = ata_module_optarg(opt_v10, cmdprio);
297 if ( prio < cmdprio )
301 Atac.cprio = cmdprio;
303 Atac.requestq.q_prev = 0;
304 Atac.requestq.q_next = 0;
306 ChangeThreadPriority(0, 123);
307 index_v12 = ata_probe((acAtaReg)0xB6000000);
308 Atac.active = index_v12;
309 if ( index_v12 == 0 )
311 msg =
"probe device";
316 index_v12 = acIntrRegister(AC_INTR_NUM_ATA, (acIntrHandler)ata_intr, &Atac);
317 if ( index_v12 < 0 && index_v12 != -11 )
319 msg =
"register intr";
326 v18 = ata_thread_init(&Atac, prio);
330 acIntrRelease(AC_INTR_NUM_ATA);
337 if ( acIntrEnable(AC_INTR_NUM_ATA) < 0 )
348 for ( i = 1000;; i = 1000000 )
353 ret = DeleteThread(thid);
356 printf(
"acata:term_thread: DELETE ret=%d\n", ret);
359 acIntrRelease(AC_INTR_NUM_ATA);
370 printf(
"acata: %s: error %d\n", msg, index_v12);
378 if ( acAtaModuleStatus() == 0 )
389 for ( i = 1000;; i = 1000000 )
394 ret = DeleteThread(thid);
397 printf(
"acata:term_thread: DELETE ret=%d\n", ret);
400 acIntrDisable(AC_INTR_NUM_ATA);
401 acIntrRelease(AC_INTR_NUM_ATA);
406int acAtaModuleRestart(
int argc,
char **argv)
413int acAtaModuleStatus()
423 if ( !Atac.requestq.q_next )
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)
u32 count
start sector of fragmented bd/file