Module: xenomai-3
Branch: master
Commit: f2f8376b082ac73ea96f126daa262b9bdeab9f2e
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=f2f8376b082ac73ea96f126daa262b9bdeab9f2e

Author: Philippe Gerum <r...@xenomai.org>
Date:   Wed Sep  9 09:27:10 2015 +0200

drivers/can/raw: force all ioctl handling in secondary mode

RTDM/ioctl is defined as a "probing" syscall by Xenomai 3, which means
that we don't want to provide a rt-specific handler for routing to
rtcan_raw_ioctl(), as some CAN drivers have to execute their ioctl
helpers from secondary mode exclusively (e.g. flexscan's set_mode).

All CAN ioctl helpers are deemed compatible with secondary mode
already, so we may safely route all requests to rtcan_raw_ioctl() from
this context.

---

 kernel/drivers/can/rtcan_flexcan.c |   15 ++++++++++++++-
 kernel/drivers/can/rtcan_raw.c     |    1 -
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/kernel/drivers/can/rtcan_flexcan.c 
b/kernel/drivers/can/rtcan_flexcan.c
index adfbef8..27c856d 100644
--- a/kernel/drivers/can/rtcan_flexcan.c
+++ b/kernel/drivers/can/rtcan_flexcan.c
@@ -836,6 +836,13 @@ static int flexcan_mode_stop(struct rtcan_device *dev, 
rtdm_lockctx_t *lock_ctx)
        if (!CAN_STATE_OPERATING(state))
                goto out;
 
+       /*
+        * Drop the device lock early, we should not need it and we
+        * may not hold it for calling the regular kernel
+        * infrastructure.
+        */
+       rtdm_lock_put_irqrestore(&dev->device_lock, *lock_ctx);
+
        flexcan_chip_stop(dev);
 
        /* Wake up waiting senders */
@@ -845,6 +852,7 @@ static int flexcan_mode_stop(struct rtcan_device *dev, 
rtdm_lockctx_t *lock_ctx)
 
        flexcan_clk_disable(priv);
 
+       rtdm_lock_get_irqsave(&dev->device_lock, *lock_ctx);
 out:
        return 0;
 }
@@ -855,6 +863,8 @@ static int flexcan_mode_start(struct rtcan_device *dev,
        struct flexcan_priv *priv = rtcan_priv(dev);
        int err = 0;
 
+       rtdm_lock_put_irqrestore(&dev->device_lock, *lock_ctx);
+
        switch (dev->state) {
 
        case CAN_STATE_ACTIVE:
@@ -897,16 +907,19 @@ static int flexcan_mode_start(struct rtcan_device *dev,
        case CAN_STATE_SLEEPING:
        default:
                /* Never reached, but we don't want nasty compiler warnings ... 
*/
+               err = 0;
                break;
        }
 
-       return 0;
+       goto out;
 
 out_irq_free:
        rtdm_irq_free(&dev->irq_handle);
 out_clk_disable:
        flexcan_clk_disable(priv);
 out:
+       rtdm_lock_get_irqsave(&dev->device_lock, *lock_ctx);
+
        return err;
 }
 
diff --git a/kernel/drivers/can/rtcan_raw.c b/kernel/drivers/can/rtcan_raw.c
index 20e554c..9eb8531 100644
--- a/kernel/drivers/can/rtcan_raw.c
+++ b/kernel/drivers/can/rtcan_raw.c
@@ -978,7 +978,6 @@ static struct rtdm_driver rtcan_driver = {
        .ops = {
                .socket         = rtcan_raw_socket,
                .close          = rtcan_raw_close,
-               .ioctl_rt       = rtcan_raw_ioctl,
                .ioctl_nrt      = rtcan_raw_ioctl,
                .recvmsg_rt     = rtcan_raw_recvmsg,
                .sendmsg_rt     = rtcan_raw_sendmsg,


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git

Reply via email to