Skip to content
Snippets Groups Projects
Commit 5a93e5d0 authored by Laura Marilena Rientsma's avatar Laura Marilena Rientsma
Browse files

changed send receive thread to add peer and remove peer

parent f548eef3
No related branches found
No related tags found
1 merge request!3Flx 1886 flxnet driver wupper
......@@ -16,7 +16,6 @@ struct flxnet_peer {
unsigned int reg_recv;
unsigned int reg_status;
unsigned char mac_addr[ETH_ALEN];
unsigned int role;
struct net_device *flxnet;
struct tx_queue tx_queue;
};
......
......@@ -226,6 +226,15 @@ void flxnet_remove_peer(struct flxnet_peer *peer) {
list_del(&peer->peer_entry);
kfree(peer);
mutex_unlock(&peer_mutex);
if (list_empty(&peer_list)) {
// disable RX side when all peers are removed
if (message_level & NETIF_MSG_IFDOWN)
pr_info("flxnet_dev: stop RX thread\n");
wake_up_interruptible(&recv_queue);
kthread_stop(recv_task);
del_timer_sync(&recv_timer);
}
}
static bool tx_queue_is_full(struct flxnet_peer *peer) {
......@@ -971,6 +980,19 @@ struct flxnet_peer * flxnet_add_peer(void* __iomem base_address) {
struct flxnet_peer *peer;
pr_info("flxnet_dev: flxnet_add_peer %lX\n", (long unsigned int)base_address);
if (list_empty(&peer_list)) {
// enable RX side when the first peer is added
if (message_level & NETIF_MSG_IFUP)
pr_info("flxnet_dev: initialize RX thread and timer\n");
recv_task = kthread_create(send_recv_thread, NULL, "flxnet RX thread");
if (IS_ERR(recv_task)) {
pr_err("flxnet_dev: failed to create RX thread in %s\n", __FUNCTION__);
return -1;
}
wake_up_process(recv_task);
mod_timer(&recv_timer, jiffies + msecs_to_jiffies(POLL_PERIOD_MS));
}
mutex_lock(&peer_mutex);
peer = kzalloc(sizeof(struct flxnet_peer), GFP_KERNEL);
if (IS_ERR(peer)) {
......@@ -1015,32 +1037,12 @@ int __init flxnet_dev_init(void) {
init_waitqueue_head(&recv_queue);
timer_setup(&recv_timer, recv_timer_function, 0);
INIT_LIST_HEAD(&peer_list);
// enable RX side
if (message_level & NETIF_MSG_IFUP)
pr_info("flxnet_dev: initialize RX thread and timer\n");
recv_task = kthread_create(send_recv_thread, NULL, "flxnet RX thread");
if (IS_ERR(recv_task)) {
pr_err("flxnet_dev: failed to create RX thread in %s\n", __FUNCTION__);
return -1;
}
wake_up_process(recv_task);
mod_timer(&recv_timer, jiffies + msecs_to_jiffies(POLL_PERIOD_MS));
return 0;
}
void __exit flxnet_dev_exit(void) {
pr_info("flxnet_dev: removing %s driver\n", DRV_NAME);
// disable RX side
if (message_level & NETIF_MSG_IFDOWN)
pr_info("flxnet_dev: stop RX thread\n");
wake_up_interruptible(&recv_queue);
kthread_stop(recv_task);
del_timer_sync(&recv_timer);
mutex_destroy(&peer_mutex);
mutex_destroy(&flxnet_mutex);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment