void rtw_cancel_all_timer(struct adapter *padapter);
 
 int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
+int rtw_android_priv_cmd(struct net_device *dev, struct ifreq *rq,
+                        void __user *data, int cmd);
 
 struct net_device *rtw_init_netdev(void);
 u16 rtw_recv_select_queue(struct sk_buff *skb);
 
        ANDROID_WIFI_CMD_MAX
 };
 
-int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd);
+int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr,
+                        void __user *data, int cmd);
 
 #endif /* __RTW_ANDROID_H__ */
 
                ret = rtw_hostapd_ioctl(dev, &wrq->u.data);
                break;
 #endif /*  CONFIG_88EU_AP_MODE */
-       case (SIOCDEVPRIVATE + 1):
-               ret = rtw_android_priv_cmd(dev, rq, cmd);
-               break;
        default:
                ret = -EOPNOTSUPP;
                break;
 
        .ndo_set_mac_address = rtw_net_set_mac_address,
        .ndo_get_stats = rtw_net_get_stats,
        .ndo_do_ioctl = rtw_ioctl,
+       .ndo_siocdevprivate = rtw_android_priv_cmd,
 };
 
 static const struct device_type wlan_type = {
 
  *
  ******************************************************************************/
 
+#include <linux/compat.h>
 #include <linux/module.h>
 #include <linux/netdevice.h>
 
        return ETH_ALEN;
 }
 
-int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
+int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr,
+                        void __user *data, int cmd)
 {
        int ret = 0;
        char *command;
        int bytes_written = 0;
        struct android_wifi_priv_cmd priv_cmd;
 
-       if (!ifr->ifr_data)
+       if (cmd != SIOCDEVPRIVATE)
+               return -EOPNOTSUPP;
+
+       if (in_compat_syscall()) /* to be implemented */
+               return -EOPNOTSUPP;
+
+       if (!data)
                return -EINVAL;
-       if (copy_from_user(&priv_cmd, ifr->ifr_data, sizeof(priv_cmd)))
+       if (copy_from_user(&priv_cmd, data, sizeof(priv_cmd)))
                return -EFAULT;
        if (priv_cmd.total_len < 1)
                return -EINVAL;
 
 void rtw_cancel_all_timer(struct adapter *padapter);
 
 int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
+int rtw_siocdevprivate(struct net_device *dev, struct ifreq *rq,
+                      void __user *data, int cmd);
 
 int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname);
 struct net_device *rtw_init_netdev(struct adapter *padapter);
 
        return err;
 }
 
+int rtw_siocdevprivate(struct net_device *dev, struct ifreq *rq,
+                      void __user *data, int cmd)
+{
+       struct iwreq *wrq = (struct iwreq *)rq;
+
+       /* little hope of fixing this, better remove the whole function */
+       if (in_compat_syscall())
+               return -EOPNOTSUPP;
+
+       if (cmd != SIOCDEVPRIVATE)
+               return -EOPNOTSUPP;
+
+       return rtw_ioctl_wext_private(dev, &wrq->u);
+}
+
 int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 {
        struct iwreq *wrq = (struct iwreq *)rq;
        case RTL_IOCTL_HOSTAPD:
                ret = rtw_hostapd_ioctl(dev, &wrq->u.data);
                break;
-       case SIOCDEVPRIVATE:
-               ret = rtw_ioctl_wext_private(dev, &wrq->u);
-               break;
        default:
                ret = -EOPNOTSUPP;
                break;
 
        .ndo_set_mac_address = rtw_net_set_mac_address,
        .ndo_get_stats = rtw_net_get_stats,
        .ndo_do_ioctl = rtw_ioctl,
+       .ndo_siocdevprivate = rtw_siocdevprivate,
 };
 
 int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname)