return true;
}
-static void pm_return(void)
+static void pxe_poll_wakeups(void)
{
static jiffies_t last_jiffies = 0;
jiffies_t now = jiffies();
-
- __schedule_lock++;
if (now != last_jiffies) {
last_jiffies = now;
__thread_process_timeouts();
- __need_schedule = true; /* Switch threads if more than one runnable */
}
-
+
if (pxe_irq_pending) {
pxe_irq_pending = 0;
- if (pxe_receive_thread_sem.count <= 0)
- sem_up(&pxe_receive_thread_sem);
+ sem_up(&pxe_receive_thread_sem);
}
-
- __schedule_lock--;
-
- if (__need_schedule)
- __schedule();
}
-void undiif_input(t_PXENV_UNDI_ISR *);
-
-void pxe_poll(void)
+static void pxe_process_irq(void)
{
static __lowmem t_PXENV_UNDI_ISR isr;
break;
case PXENV_UNDI_ISR_OUT_RECEIVE:
- undiif_input(&isr);
+ undiif_input(&isr);
break;
case PXENV_UNDI_ISR_OUT_BUSY:
for (;;) {
sem_down(&pxe_receive_thread_sem, 0);
- pxe_poll();
+ pxe_process_irq();
}
}
void pxe_init_isr(void)
{
start_idle_thread();
+ sched_hook_func = pxe_poll_wakeups;
/*
* Run the pxe receive thread at elevated priority, since the UNDI
* stack is likely to have very limited memory available; therefore to
* manage, as soon as possible.
*/
pxe_thread = start_thread("pxe receive", 16384, -20, pxe_receive_thread, NULL);
- core_pm_hook = pm_return;
+ core_pm_hook = __schedule;
}
static __lowmem struct s_PXENV_UNDI_CLOSE undi_close;
int err;
+ sched_hook_func = NULL;
core_pm_hook = core_pm_null_hook;
kill_thread(pxe_thread);
/* isr.c */
void pxe_init_isr(void);
void pxe_cleanup_isr(void);
-void pxe_poll(void);
bool install_irq_vector(uint8_t irq, void (*isr)(void), far_ptr_t *old);
bool uninstall_irq_vector(uint8_t irq, void (*isr), far_ptr_t *old);
/* undiif.c */
int undiif_start(uint32_t ip, uint32_t netmask, uint32_t gw);
+void undiif_input(t_PXENV_UNDI_ISR *isr);
/* dhcp_options.c */
void parse_dhcp(int);