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; }
/*** * 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; }
void nomac_proto_cleanup(void) { shutdown = 1; rtos_event_sem_signal(&wakeup_sem); rtos_task_delete(&wrapper_task); rtos_event_sem_delete(&wakeup_sem); }
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); }
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; }
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); }
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); }
void rtpc_cleanup(void) { rtos_task_delete(&dispatch_task); rtos_event_sem_delete(&dispatch_event); rtos_nrt_signal_delete(&rtpc_nrt_signal); }