Commit d92f7b59 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by David S. Miller

eql: use ndo_siocdevprivate

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: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 32d05468
...@@ -113,6 +113,7 @@ ...@@ -113,6 +113,7 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/compat.h>
#include <linux/capability.h> #include <linux/capability.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -131,7 +132,8 @@ ...@@ -131,7 +132,8 @@
static int eql_open(struct net_device *dev); static int eql_open(struct net_device *dev);
static int eql_close(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); 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) #define eql_is_slave(dev) ((dev->flags & IFF_SLAVE) == IFF_SLAVE)
...@@ -170,7 +172,7 @@ static const char version[] __initconst = ...@@ -170,7 +172,7 @@ static const char version[] __initconst =
static const struct net_device_ops eql_netdev_ops = { static const struct net_device_ops eql_netdev_ops = {
.ndo_open = eql_open, .ndo_open = eql_open,
.ndo_stop = eql_close, .ndo_stop = eql_close,
.ndo_do_ioctl = eql_ioctl, .ndo_siocdevprivate = eql_siocdevprivate,
.ndo_start_xmit = eql_slave_xmit, .ndo_start_xmit = eql_slave_xmit,
}; };
...@@ -268,25 +270,29 @@ static int eql_s_slave_cfg(struct net_device *dev, slave_config_t __user *sc); ...@@ -268,25 +270,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_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_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 && if (cmd != EQL_GETMASTRCFG && cmd != EQL_GETSLAVECFG &&
!capable(CAP_NET_ADMIN)) !capable(CAP_NET_ADMIN))
return -EPERM; return -EPERM;
if (in_compat_syscall()) /* to be implemented */
return -EOPNOTSUPP;
switch (cmd) { switch (cmd) {
case EQL_ENSLAVE: case EQL_ENSLAVE:
return eql_enslave(dev, ifr->ifr_data); return eql_enslave(dev, data);
case EQL_EMANCIPATE: case EQL_EMANCIPATE:
return eql_emancipate(dev, ifr->ifr_data); return eql_emancipate(dev, data);
case EQL_GETSLAVECFG: case EQL_GETSLAVECFG:
return eql_g_slave_cfg(dev, ifr->ifr_data); return eql_g_slave_cfg(dev, data);
case EQL_SETSLAVECFG: case EQL_SETSLAVECFG:
return eql_s_slave_cfg(dev, ifr->ifr_data); return eql_s_slave_cfg(dev, data);
case EQL_GETMASTRCFG: case EQL_GETMASTRCFG:
return eql_g_master_cfg(dev, ifr->ifr_data); return eql_g_master_cfg(dev, data);
case EQL_SETMASTRCFG: case EQL_SETMASTRCFG:
return eql_s_master_cfg(dev, ifr->ifr_data); return eql_s_master_cfg(dev, data);
default: default:
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment