/* * callouts are scheduled after connections have been lost, in order * to clean up and reconnect. */ static void bthidev_timeout(void *arg) { struct bthidev_softc *sc = arg; mutex_enter(bt_lock); callout_ack(&sc->sc_reconnect); switch (sc->sc_state) { case BTHID_CLOSED: if (sc->sc_int != NULL) { l2cap_disconnect(sc->sc_int, 0); break; } if (sc->sc_ctl != NULL) { l2cap_disconnect(sc->sc_ctl, 0); break; } if (sc->sc_flags & BTHID_RECONNECT) { sc->sc_flags |= BTHID_CONNECTING; bthidev_connect(sc); break; } break; case BTHID_WAIT_CTL: break; case BTHID_WAIT_INT: break; case BTHID_OPEN: break; default: break; } mutex_exit(bt_lock); }
/* * Timer API */ static void run_timer(void *arg) { struct timer_list *t = (struct timer_list *) arg; void (*function)(unsigned long); spin_lock(&t->mtx); if (callout_pending(&t->callout)) { /* callout was reset */ spin_unlock(&t->mtx); return; } if (!callout_active(&t->callout)) { /* callout was stopped */ spin_unlock(&t->mtx); return; } callout_ack(&t->callout); function = t->function; spin_unlock(&t->mtx); function(t->data); }