示例#1
0
int __init rtcfg_init_frames(void)
{
    int ret;


    if (rtskb_pool_init(&rtcfg_pool, num_rtskbs) < num_rtskbs)
        return -ENOMEM;

    rtskb_queue_init(&rx_queue);
    rtos_event_sem_init(&rx_event);

    ret = rtos_task_init(&rx_task, rtcfg_rx_task, 0,
                         RTOS_LOWEST_RT_PRIORITY);
    if (ret < 0) {
        rtos_event_sem_delete(&rx_event);
        goto error1;
    }

    ret = rtdev_add_pack(&rtcfg_packet_type);
    if (ret < 0)
        goto error2;

    return 0;

  error2:
    rtos_event_sem_delete(&rx_event);
    rtos_task_delete(&rx_task);

  error1:
    rtskb_pool_release(&rtcfg_pool);

    return ret;
}
示例#2
0
/***
 *  rt_socket_cleanup - releases resources allocated for the socket
 */
int rt_socket_cleanup(struct rtdm_dev_context *context)
{
    struct rtsocket *sock  = (struct rtsocket *)&context->dev_private;
    unsigned int    rtskbs;
    unsigned long   flags;


    rtos_event_sem_delete(&sock->wakeup_event);

    rtos_spin_lock_irqsave(&sock->param_lock, flags);

    set_bit(SKB_POOL_CLOSED, &context->context_flags);
    rtskbs = atomic_read(&sock->pool_size);

    rtos_spin_unlock_irqrestore(&sock->param_lock, flags);

    if (rtskbs > 0) {
        if (test_bit(RTDM_CREATED_IN_NRT, &context->context_flags)) {
            rtskbs = rtskb_pool_shrink(&sock->skb_pool, rtskbs);
            atomic_sub(rtskbs, &sock->pool_size);
            if (atomic_read(&sock->pool_size) > 0)
                return -EAGAIN;
            rtskb_pool_release(&sock->skb_pool);
        } else {
            rtskbs = rtskb_pool_shrink_rt(&sock->skb_pool, rtskbs);
            atomic_sub(rtskbs, &sock->pool_size);
            if (atomic_read(&sock->pool_size) > 0)
                return -EAGAIN;
            rtskb_pool_release_rt(&sock->skb_pool);
        }
    }

    return 0;
}
示例#3
0
void nomac_proto_cleanup(void)
{
    shutdown = 1;
    rtos_event_sem_signal(&wakeup_sem);

    rtos_task_delete(&wrapper_task);
    rtos_event_sem_delete(&wakeup_sem);
}
示例#4
0
void cleanup_module(void)
{
    rtos_irq_disable(&irq_handle);
    rtos_irq_free(&irq_handle);

    while (close_rt(sock) == -EAGAIN) {
        set_current_state(TASK_UNINTERRUPTIBLE);
        schedule_timeout(1*HZ); /* wait a second */
    }

    while (close_rt(tdma) == -EAGAIN) {
        set_current_state(TASK_UNINTERRUPTIBLE);
        schedule_timeout(1*HZ); /* wait a second */
    }

    rtos_event_sem_delete(&event_sem);
    rtos_task_delete(&task);
}
示例#5
0
int __init nomac_proto_init(void)
{
    int ret;


    rtskb_queue_init(&nrt_rtskb_queue);
    ret = rtos_event_sem_init(&wakeup_sem);
    if (ret < 0)
        return ret;

    ret = rtos_task_init(&wrapper_task, nrt_xmit_task, 0,
                         RTOS_LOWEST_RT_PRIORITY);
    if (ret < 0) {
        rtos_event_sem_delete(&wakeup_sem);
        return ret;
    }

    return 0;
}
示例#6
0
void rtcfg_cleanup_frames(void)
{
    struct rtskb *rtskb;


    while (rtdev_remove_pack(&rtcfg_packet_type) == -EAGAIN) {
        RTCFG_DEBUG(3, "RTcfg: waiting for protocol unregistration\n");
        set_current_state(TASK_UNINTERRUPTIBLE);
        schedule_timeout(1*HZ); /* wait a second */
    }

    rtos_event_sem_delete(&rx_event);
    rtos_task_delete(&rx_task);

    while ((rtskb = rtskb_dequeue(&rx_queue)) != NULL) {
        rtdev_dereference(rtskb->rtdev);
        kfree_rtskb(rtskb);
    }

    rtskb_pool_release(&rtcfg_pool);
}
示例#7
0
int init_module(void)
{
    unsigned int            nonblock = 1;
    struct sockaddr_in      local_addr;
    struct rtnet_callback   callback = {sync_callback, NULL};


    rtos_print("rt_event is using the following parameters:\n"
           "    mode    = %s\n"
           "    io      = 0x%04X\n"
           "    irq     = %d\n"
           "    my_ip   = %s\n"
           "    dest_ip = %s\n",
           (mode == MODE_PAR) ? "parallel port" : "serial port",
           io, irq, my_ip, dest_ip);


    tdma = open_rt(rtmac_dev, O_RDONLY);
    if (tdma < 0) {
        rtos_print("ERROR: RTmac/TDMA not loaded!\n");
        return -ENODEV;
    }


    sock = socket_rt(AF_INET,SOCK_DGRAM,0);

    memset(&local_addr, 0, sizeof(struct sockaddr_in));
    local_addr.sin_family      = AF_INET;
    local_addr.sin_port        = htons(SYNC_PORT);
    local_addr.sin_addr.s_addr =
        (strlen(my_ip) != 0) ? rt_inet_aton(my_ip) : INADDR_ANY;
    bind_rt(sock, (struct sockaddr*)&local_addr, sizeof(struct sockaddr_in));

    /* switch to non-blocking */
    ioctl_rt(sock, RTNET_RTIOC_NONBLOCK, &nonblock);

    memset(&dest_addr, 0, sizeof(struct sockaddr_in));
    dest_addr.sin_family      = AF_INET;
    dest_addr.sin_port        = htons(REPORT_PORT);
    dest_addr.sin_addr.s_addr = rt_inet_aton(dest_ip);

    ioctl_rt(sock, RTNET_RTIOC_CALLBACK, &callback);


    rtos_event_sem_init(&event_sem);


    if (rtos_irq_request(&irq_handle, irq, irq_handler, NULL) != 0) {
        rtos_print("ERROR: irq not available!\n");
        rtos_event_sem_delete(&event_sem);
        return -EINVAL;
    }

    if (mode == MODE_PAR) {
        /* trigger interrupt on Acknowledge pin (10) */
        outb(0x10, PAR_CONTROL);
    }
    else {
        /* don't forget to specify io and irq (e.g. 0x3F8 / 4) */

        outb(0x00, SER_LCR);
        outb(0x00, SER_IER);

        /* clear irq sources */
        while ((inb(SER_IIR) & 0x01) == 0) {
            rtos_print("Loop init\n");
            inb(SER_LSR);
            inb(SER_DATA);
            inb(SER_MSR);
        }

        /* enable RTS output and set OUT2 */
        outb(0x0A, SER_MCR);

        /* trigger interrupt on modem status line change */
        outb(0x00, SER_LCR);
        outb(0x0D, SER_IER);
    }

    rtos_irq_enable(&irq_handle);


    return rtos_task_init(&task, event_handler, 0, 10);
}
示例#8
0
void rtpc_cleanup(void)
{
    rtos_task_delete(&dispatch_task);
    rtos_event_sem_delete(&dispatch_event);
    rtos_nrt_signal_delete(&rtpc_nrt_signal);
}