Fix rt_mutex_lock_interruptible for Kernel < 3.17.0

This commit is contained in:
Bjarne von Horn 2024-06-06 16:26:36 +02:00
parent 0cb7cfd973
commit 6f928c6fe8
2 changed files with 19 additions and 6 deletions

View File

@ -62,8 +62,13 @@
#else #else
# define ec_ioctl_lock(lock) rt_mutex_lock(lock) # define ec_ioctl_lock(lock) rt_mutex_lock(lock)
# define ec_ioctl_unlock(lock) rt_mutex_unlock(lock) # define ec_ioctl_unlock(lock) rt_mutex_unlock(lock)
# define ec_ioctl_lock_interruptible(lock) \ # if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
rt_mutex_lock_interruptible(lock) # define ec_ioctl_lock_interruptible(lock) \
rt_mutex_lock_interruptible(lock)
# else
# define ec_ioctl_lock_interruptible(lock) \
rt_mutex_lock_interruptible(lock, 0)
# endif
# define ec_copy_to_user(to, from, n, ctx) copy_to_user(to, from, n) # define ec_copy_to_user(to, from, n, ctx) copy_to_user(to, from, n)
# define ec_copy_from_user(to, from, n, ctx) copy_from_user(to, from, n) # define ec_copy_from_user(to, from, n, ctx) copy_from_user(to, from, n)
#endif // EC_IOCTL_RTDM #endif // EC_IOCTL_RTDM

View File

@ -52,6 +52,14 @@
#include "ethernet.h" #include "ethernet.h"
#endif #endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
# define ec_rt_lock_interruptible(lock) \
rt_mutex_lock_interruptible(lock)
#else
# define ec_rt_lock_interruptible(lock) \
rt_mutex_lock_interruptible(lock, 0)
#endif
#include "master.h" #include "master.h"
/****************************************************************************/ /****************************************************************************/
@ -542,7 +550,7 @@ void ec_master_internal_send_cb(
) )
{ {
ec_master_t *master = (ec_master_t *) cb_data; ec_master_t *master = (ec_master_t *) cb_data;
if (rt_mutex_lock_interruptible(&master->io_mutex)) if (ec_rt_lock_interruptible(&master->io_mutex))
return; return;
ecrt_master_send_ext(master); ecrt_master_send_ext(master);
rt_mutex_unlock(&master->io_mutex); rt_mutex_unlock(&master->io_mutex);
@ -557,7 +565,7 @@ void ec_master_internal_receive_cb(
) )
{ {
ec_master_t *master = (ec_master_t *) cb_data; ec_master_t *master = (ec_master_t *) cb_data;
if (rt_mutex_lock_interruptible(&master->io_mutex)) if (ec_rt_lock_interruptible(&master->io_mutex))
return; return;
ecrt_master_receive(master); ecrt_master_receive(master);
rt_mutex_unlock(&master->io_mutex); rt_mutex_unlock(&master->io_mutex);
@ -1538,7 +1546,7 @@ static int ec_master_idle_thread(void *priv_data)
ec_datagram_output_stats(&master->fsm_datagram); ec_datagram_output_stats(&master->fsm_datagram);
// receive // receive
if (rt_mutex_lock_interruptible(&master->io_mutex)) if (ec_rt_lock_interruptible(&master->io_mutex))
break; break;
ecrt_master_receive(master); ecrt_master_receive(master);
rt_mutex_unlock(&master->io_mutex); rt_mutex_unlock(&master->io_mutex);
@ -1555,7 +1563,7 @@ static int ec_master_idle_thread(void *priv_data)
up(&master->master_sem); up(&master->master_sem);
// queue and send // queue and send
if (rt_mutex_lock_interruptible(&master->io_mutex)) if (ec_rt_lock_interruptible(&master->io_mutex))
break; break;
if (fsm_exec) { if (fsm_exec) {
ec_master_queue_datagram(master, &master->fsm_datagram); ec_master_queue_datagram(master, &master->fsm_datagram);