예제 #1
0
void 
cleanuppwm(void)
{
  int i;

  // enable standby
  gpio_set_value(channels[0].stby, 0);

  rtdm_timer_destroy(&up_timer);
  for(i = 0; i < RC_NUM; ++i)
    rtdm_timer_destroy(&down_timer[i]);

  CleanupGPIO(channels, sizeof(channels) / sizeof(channels[0]));
}
예제 #2
0
/* releases rtcfg_dev->dev_mutex on return */
static void rtcfg_client_detach(int ifindex, struct rt_proc_call *call)
{
    struct rtcfg_device *rtcfg_dev = &device[ifindex];
    struct rtcfg_cmd    *cmd_event;


    cmd_event = rtpc_get_priv(call, struct rtcfg_cmd);

    cmd_event->args.detach.station_addr_list =
        rtcfg_dev->spec.clt.station_addr_list;
    cmd_event->args.detach.stage2_chain = rtcfg_dev->spec.clt.stage2_chain;

    while (1) {
        call = rtcfg_dequeue_blocking_call(ifindex);
        if (call == NULL)
            break;

        rtpc_complete_call(call, -ENODEV);
    }

    if (test_and_clear_bit(FLAG_TIMER_STARTED, &rtcfg_dev->flags))
        rtdm_timer_destroy(&rtcfg_dev->timer);
    rtcfg_reset_device(ifindex);

    rtcfg_next_main_state(cmd_event->internal.data.ifindex, RTCFG_MAIN_OFF);

    rtdm_mutex_unlock(&rtcfg_dev->dev_mutex);
}
예제 #3
0
static int rtswitch_close(struct rtdm_dev_context *context,
                          rtdm_user_info_t *user_info)
{
	rtswitch_context_t *ctx = (rtswitch_context_t *) context->dev_private;
	unsigned i;

	if (ctx->tasks) {
		set_cpus_allowed(current, cpumask_of_cpu(ctx->cpu));

		for (i = 0; i < ctx->next_index; i++) {
			rtswitch_task_t *task = &ctx->tasks[i];

			if (task->base.flags & RTSWITCH_KERNEL)
				xnpod_delete_thread(&task->ktask);
			rtdm_event_destroy(&task->rt_synch);
		}
		kfree(ctx->tasks);
	}
	rtdm_timer_destroy(&ctx->wake_up_delay);

	return 0;
}
예제 #4
0
static void rtcfg_client_recv_stage_2_cfg(int ifindex, struct rtskb *rtskb)
{
    struct rtcfg_frm_stage_2_cfg *stage_2_cfg;
    struct rtcfg_device          *rtcfg_dev = &device[ifindex];
    size_t                       data_len;
    int                          ret;


    if (rtskb->len < sizeof(struct rtcfg_frm_stage_2_cfg)) {
        rtdm_mutex_unlock(&rtcfg_dev->dev_mutex);
        RTCFG_DEBUG(1, "RTcfg: received invalid stage_2_cfg frame\n");
        kfree_rtskb(rtskb);
        return;
    }

    stage_2_cfg = (struct rtcfg_frm_stage_2_cfg *)rtskb->data;
    __rtskb_pull(rtskb, sizeof(struct rtcfg_frm_stage_2_cfg));

    if (stage_2_cfg->heartbeat_period) {
	ret = rtdm_timer_init(&rtcfg_dev->timer, rtcfg_timer, "rtcfg-timer");
	if (ret == 0) {
	    ret = rtdm_timer_start(&rtcfg_dev->timer,
				XN_INFINITE,
				(nanosecs_rel_t)ntohs(stage_2_cfg->heartbeat_period) *
				1000000,
				RTDM_TIMERMODE_RELATIVE);
	    if (ret < 0)
		rtdm_timer_destroy(&rtcfg_dev->timer);
	}

        if (ret < 0)
            /*ERRMSG*/rtdm_printk("RTcfg: unable to create timer task\n");
        else
	    set_bit(FLAG_TIMER_STARTED, &rtcfg_dev->flags);
    }

    /* add server to station list */
    if (rtcfg_add_to_station_list(rtcfg_dev,
            rtskb->mac.ethernet->h_source, stage_2_cfg->flags) < 0) {
        rtdm_mutex_unlock(&rtcfg_dev->dev_mutex);
        RTCFG_DEBUG(1, "RTcfg: unable to process stage_2_cfg frage\n");
        kfree_rtskb(rtskb);
        return;
    }

    rtcfg_dev->other_stations   = ntohl(stage_2_cfg->stations);
    rtcfg_dev->spec.clt.cfg_len = ntohl(stage_2_cfg->cfg_len);
    data_len = MIN(rtcfg_dev->spec.clt.cfg_len, rtskb->len);

    if (test_bit(RTCFG_FLAG_STAGE_2_DATA, &rtcfg_dev->flags) &&
        (data_len > 0)) {
        rtcfg_client_queue_frag(ifindex, rtskb, data_len);
        rtskb = NULL;

        if (rtcfg_dev->stations_found == rtcfg_dev->other_stations)
            rtcfg_next_main_state(ifindex, RTCFG_MAIN_CLIENT_ALL_KNOWN);
    } else {
        if (rtcfg_dev->stations_found == rtcfg_dev->other_stations) {
            rtcfg_complete_cmd(ifindex, RTCFG_CMD_ANNOUNCE, 0);

            rtcfg_next_main_state(ifindex,
				test_bit(RTCFG_FLAG_READY, &rtcfg_dev->flags) ?
				RTCFG_MAIN_CLIENT_READY : RTCFG_MAIN_CLIENT_2);
        } else
            rtcfg_next_main_state(ifindex, RTCFG_MAIN_CLIENT_ALL_FRAMES);

        rtcfg_send_ack(ifindex);
    }

    rtdm_mutex_unlock(&rtcfg_dev->dev_mutex);

    if (rtskb != NULL)
        kfree_rtskb(rtskb);
}
예제 #5
0
static void inj1_timer_deinit(void)
{
	rtdm_timer_destroy(&inj1_timer);
}