From: Arnd Bergmann <a...@arndb.de>

The private ioctls in eql pass the arguments correctly through ifr_data,
but the slaving_request_t and slave_config_t structures are incompatible
with compat mode and need special conversion code in the driver.

Convert to siocdevprivate for now, and return an error when called
in compat mode.

Signed-off-by: Arnd Bergmann <a...@arndb.de>
---
 drivers/net/eql.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/drivers/net/eql.c b/drivers/net/eql.c
index 74263f8efe1a..b8707559a0f5 100644
--- a/drivers/net/eql.c
+++ b/drivers/net/eql.c
@@ -131,7 +131,8 @@
 
 static int eql_open(struct net_device *dev);
 static int eql_close(struct net_device *dev);
-static int eql_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
+static int eql_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
+                             void __user *data, int cmd);
 static netdev_tx_t eql_slave_xmit(struct sk_buff *skb, struct net_device *dev);
 
 #define eql_is_slave(dev)      ((dev->flags & IFF_SLAVE) == IFF_SLAVE)
@@ -170,7 +171,7 @@ static const char version[] __initconst =
 static const struct net_device_ops eql_netdev_ops = {
        .ndo_open       = eql_open,
        .ndo_stop       = eql_close,
-       .ndo_do_ioctl   = eql_ioctl,
+       .ndo_siocdevprivate = eql_siocdevprivate,
        .ndo_start_xmit = eql_slave_xmit,
 };
 
@@ -268,25 +269,29 @@ static int eql_s_slave_cfg(struct net_device *dev, 
slave_config_t __user *sc);
 static int eql_g_master_cfg(struct net_device *dev, master_config_t __user 
*mc);
 static int eql_s_master_cfg(struct net_device *dev, master_config_t __user 
*mc);
 
-static int eql_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+static int eql_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
+                             void __user *data, int cmd)
 {
        if (cmd != EQL_GETMASTRCFG && cmd != EQL_GETSLAVECFG &&
            !capable(CAP_NET_ADMIN))
                return -EPERM;
 
+       if (in_compat_syscall()) /* to be implemented */
+               return -EOPNOTSUPP;
+
        switch (cmd) {
                case EQL_ENSLAVE:
-                       return eql_enslave(dev, ifr->ifr_data);
+                       return eql_enslave(dev, data);
                case EQL_EMANCIPATE:
-                       return eql_emancipate(dev, ifr->ifr_data);
+                       return eql_emancipate(dev, data);
                case EQL_GETSLAVECFG:
-                       return eql_g_slave_cfg(dev, ifr->ifr_data);
+                       return eql_g_slave_cfg(dev, data);
                case EQL_SETSLAVECFG:
-                       return eql_s_slave_cfg(dev, ifr->ifr_data);
+                       return eql_s_slave_cfg(dev, data);
                case EQL_GETMASTRCFG:
-                       return eql_g_master_cfg(dev, ifr->ifr_data);
+                       return eql_g_master_cfg(dev, data);
                case EQL_SETMASTRCFG:
-                       return eql_s_master_cfg(dev, ifr->ifr_data);
+                       return eql_s_master_cfg(dev, data);
                default:
                        return -EOPNOTSUPP;
        }
-- 
2.27.0

Reply via email to