---
 kernel/drivers/can/rtcan_raw.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/kernel/drivers/can/rtcan_raw.c b/kernel/drivers/can/rtcan_raw.c
index 693b927..3a49d7c 100644
--- a/kernel/drivers/can/rtcan_raw.c
+++ b/kernel/drivers/can/rtcan_raw.c
@@ -965,6 +965,44 @@ ssize_t rtcan_raw_sendmsg(struct rtdm_fd *fd,
 }
 
 
+static int rtcan_raw_select(struct rtdm_fd *fd,
+                           rtdm_selector_t *selector,
+                           enum rtdm_selecttype type,
+                           unsigned fd_index)
+{
+    struct rtcan_socket *sock = rtdm_fd_to_private(fd);
+
+    switch (type) {
+       case XNSELECT_READ:
+           return rtdm_sem_select(&sock->recv_sem, selector,
+                                  XNSELECT_READ, fd_index);
+       case XNSELECT_WRITE:
+       {
+           struct rtcan_device *dev;
+           int ifindex = 0;
+           int ret;
+
+           if (!(ifindex = atomic_read(&sock->ifindex)))
+               return -ENXIO;
+
+           if ((dev = rtcan_dev_get_by_index(ifindex)) == NULL)
+               return -ENXIO;
+
+           ret = rtdm_sem_select(&dev->tx_sem, selector,
+                                 XNSELECT_WRITE, fd_index);
+
+           rtcan_dev_dereference(dev);
+
+           return ret;
+       }
+       default:
+           return -EBADF;
+    }
+
+    return -EINVAL;
+}
+
+
 static struct rtdm_driver rtcan_driver = {
        .profile_info           = RTDM_PROFILE_INFO(rtcan,
                                                    RTDM_CLASS_CAN,
@@ -981,6 +1019,7 @@ static struct rtdm_driver rtcan_driver = {
                .ioctl_nrt      = rtcan_raw_ioctl,
                .recvmsg_rt     = rtcan_raw_recvmsg,
                .sendmsg_rt     = rtcan_raw_sendmsg,
+               .select         = rtcan_raw_select,
        },
 };
 
-- 
2.1.4


_______________________________________________
Xenomai mailing list
[email protected]
https://xenomai.org/mailman/listinfo/xenomai

Reply via email to