/* * precondition: perimeter lock has been acquired */ void wl_free_timer(struct wl_info *wl, struct wl_timer *t) { struct wl_timer *tmp; /* delete the timer in case it is active */ wl_del_timer(wl, t); if (wl->timers == t) { wl->timers = wl->timers->next; #ifdef BCMDBG kfree(t->name); #endif kfree(t); return; } tmp = wl->timers; while (tmp) { if (tmp->next == t) { tmp->next = t->next; #ifdef BCMDBG kfree(t->name); #endif kfree(t); return; } tmp = tmp->next; } }
int wlc_eventq_detach(wlc_eventq_t *eq) { /* Clean up pending events */ wlc_eventq_down(eq); if (eq->timer) { if (eq->tpending) { wl_del_timer(eq->wl, eq->timer); eq->tpending = false; } wl_free_timer(eq->wl, eq->timer); eq->timer = NULL; } ASSERT(wlc_eventq_avail(eq) == false); kfree(eq); return 0; }
int wlc_eventq_down(wlc_eventq_t *eq) { int callbacks = 0; if (eq->tpending && !eq->workpending) { if (!wl_del_timer(eq->wl, eq->timer)) callbacks++; ASSERT(wlc_eventq_avail(eq) == true); ASSERT(eq->workpending == false); eq->workpending = true; if (eq->cb) eq->cb(eq->wlc); ASSERT(eq->workpending == true); eq->workpending = false; eq->tpending = false; } else { ASSERT(eq->workpending || wlc_eventq_avail(eq) == false); } return callbacks; }
bool wlapi_del_timer(wlc_phy_shim_info_t *physhim, struct wlapi_timer *t) { return wl_del_timer(physhim->wl, (struct wl_timer *)t); }