return 0;
 }
 
-static int c101_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+static int c101_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
+                              void __user *data, int cmd)
 {
-       const size_t size = sizeof(sync_serial_settings);
-       sync_serial_settings new_line;
-       sync_serial_settings __user *line = ifr->ifr_settings.ifs_ifsu.sync;
+#ifdef DEBUG_RINGS
        port_t *port = dev_to_port(dev);
 
-#ifdef DEBUG_RINGS
        if (cmd == SIOCDEVPRIVATE) {
                sca_dump_rings(dev);
                printk(KERN_DEBUG "MSCI1: ST: %02x %02x %02x %02x\n",
                return 0;
        }
 #endif
+
+       return -EOPNOTSUPP;
+}
+
+static int c101_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+       const size_t size = sizeof(sync_serial_settings);
+       sync_serial_settings new_line;
+       sync_serial_settings __user *line = ifr->ifr_settings.ifs_ifsu.sync;
+       port_t *port = dev_to_port(dev);
+
        if (cmd != SIOCWANDEV)
                return hdlc_ioctl(dev, ifr, cmd);
 
        .ndo_stop       = c101_close,
        .ndo_start_xmit = hdlc_start_xmit,
        .ndo_do_ioctl   = c101_ioctl,
+       .ndo_siocdevprivate = c101_siocdevprivate,
 };
 
 static int __init c101_run(unsigned long irq, unsigned long winbase)
 
 }
 
 static int
-fst_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+fst_siocdevprivate(struct net_device *dev, struct ifreq *ifr, void __user *data, int cmd)
 {
        struct fst_card_info *card;
        struct fst_port_info *port;
        unsigned long flags;
        void *buf;
 
-       dbg(DBG_IOCTL, "ioctl: %x, %p\n", cmd, ifr->ifr_data);
+       dbg(DBG_IOCTL, "ioctl: %x, %p\n", cmd, data);
 
        port = dev_to_port(dev);
        card = port->card;
                /* First copy in the header with the length and offset of data
                 * to write
                 */
-               if (!ifr->ifr_data)
+               if (!data)
                        return -EINVAL;
 
-               if (copy_from_user(&wrthdr, ifr->ifr_data,
-                                  sizeof(struct fstioc_write)))
+               if (copy_from_user(&wrthdr, data, sizeof(struct fstioc_write)))
                        return -EFAULT;
 
                /* Sanity check the parameters. We don't support partial writes
 
                /* Now copy the data to the card. */
 
-               buf = memdup_user(ifr->ifr_data + sizeof(struct fstioc_write),
+               buf = memdup_user(data + sizeof(struct fstioc_write),
                                  wrthdr.size);
                if (IS_ERR(buf))
                        return PTR_ERR(buf);
                        }
                }
 
-               if (!ifr->ifr_data)
+               if (!data)
                        return -EINVAL;
 
                gather_conf_info(card, port, &info);
 
-               if (copy_to_user(ifr->ifr_data, &info, sizeof(info)))
+               if (copy_to_user(data, &info, sizeof(info)))
                        return -EFAULT;
 
                return 0;
                               card->card_no, card->state);
                        return -EIO;
                }
-               if (copy_from_user(&info, ifr->ifr_data, sizeof(info)))
+               if (copy_from_user(&info, data, sizeof(info)))
                        return -EFAULT;
 
                return set_conf_from_info(card, port, &info);
+       default:
+               return -EINVAL;
+       }
+}
 
+static int
+fst_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+       struct fst_card_info *card;
+       struct fst_port_info *port;
+
+       dbg(DBG_IOCTL, "ioctl: %x, %x\n", cmd, ifr->ifr_settings.type);
+
+       port = dev_to_port(dev);
+       card = port->card;
+
+       if (!capable(CAP_NET_ADMIN))
+               return -EPERM;
+
+       switch (cmd) {
        case SIOCWANDEV:
                switch (ifr->ifr_settings.type) {
                case IF_GET_IFACE:
        .ndo_open       = fst_open,
        .ndo_stop       = fst_close,
        .ndo_start_xmit = hdlc_start_xmit,
-       .ndo_do_ioctl   = fst_ioctl,
+       .ndo_do_ioctl   = fst_ioctl,
+       .ndo_siocdevprivate = fst_siocdevprivate,
        .ndo_tx_timeout = fst_tx_timeout,
 };
 
 
        struct pvc_device *pvc = dev->ml_priv;
        fr_proto_pvc_info info;
 
+       if (cmd != SIOCWANDEV)
+               return -EOPNOTSUPP;
+
        if (ifr->ifr_settings.type == IF_GET_PROTO) {
                if (dev->type == ARPHRD_ETHER)
                        ifr->ifr_settings.type = IF_PROTO_FR_ETH_PVC;
 
  * linux reserves 16 device specific IOCTLs.  We call them
  * LMCIOC* to control various bits of our world.
  */
-int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
+static int lmc_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
+                             void __user *data, int cmd) /*fold00*/
 {
     lmc_softc_t *sc = dev_to_sc(dev);
     lmc_ctl_t ctl;
          * To date internally, just copy this out to the user.
          */
     case LMCIOCGINFO: /*fold01*/
-       if (copy_to_user(ifr->ifr_data, &sc->ictl, sizeof(lmc_ctl_t)))
+       if (copy_to_user(data, &sc->ictl, sizeof(lmc_ctl_t)))
                ret = -EFAULT;
        else
                ret = 0;
             break;
         }
 
-       if (copy_from_user(&ctl, ifr->ifr_data, sizeof(lmc_ctl_t))) {
+       if (copy_from_user(&ctl, data, sizeof(lmc_ctl_t))) {
                ret = -EFAULT;
                break;
        }
                break;
            }
 
-           if (copy_from_user(&new_type, ifr->ifr_data, sizeof(u16))) {
+           if (copy_from_user(&new_type, data, sizeof(u16))) {
                ret = -EFAULT;
                break;
            }
 
         sc->lmc_xinfo.Magic1 = 0xDEADBEEF;
 
-        if (copy_to_user(ifr->ifr_data, &sc->lmc_xinfo,
-                        sizeof(struct lmc_xinfo)))
+       if (copy_to_user(data, &sc->lmc_xinfo, sizeof(struct lmc_xinfo)))
                ret = -EFAULT;
        else
                ret = 0;
                            regVal & T1FRAMER_SEF_MASK;
            }
            spin_unlock_irqrestore(&sc->lmc_lock, flags);
-           if (copy_to_user(ifr->ifr_data, &sc->lmc_device->stats,
+           if (copy_to_user(data, &sc->lmc_device->stats,
                             sizeof(sc->lmc_device->stats)) ||
-               copy_to_user(ifr->ifr_data + sizeof(sc->lmc_device->stats),
+               copy_to_user(data + sizeof(sc->lmc_device->stats),
                             &sc->extra_stats, sizeof(sc->extra_stats)))
                    ret = -EFAULT;
            else
             break;
         }
 
-       if (copy_from_user(&ctl, ifr->ifr_data, sizeof(lmc_ctl_t))) {
+       if (copy_from_user(&ctl, data, sizeof(lmc_ctl_t))) {
                ret = -EFAULT;
                break;
        }
 
 #ifdef DEBUG
     case LMCIOCDUMPEVENTLOG:
-       if (copy_to_user(ifr->ifr_data, &lmcEventLogIndex, sizeof(u32))) {
+       if (copy_to_user(data, &lmcEventLogIndex, sizeof(u32))) {
                ret = -EFAULT;
                break;
        }
-       if (copy_to_user(ifr->ifr_data + sizeof(u32), lmcEventLogBuf,
+       if (copy_to_user(data + sizeof(u32), lmcEventLogBuf,
                         sizeof(lmcEventLogBuf)))
                ret = -EFAULT;
        else
              */
             netif_stop_queue(dev);
 
-           if (copy_from_user(&xc, ifr->ifr_data, sizeof(struct lmc_xilinx_control))) {
+           if (copy_from_user(&xc, data, sizeof(struct lmc_xilinx_control))) {
                ret = -EFAULT;
                break;
            }
 
         }
         break;
-    default: /*fold01*/
-        /* If we don't know what to do, give the protocol a shot. */
-        ret = lmc_proto_ioctl (sc, ifr, cmd);
-        break;
+    default:
+       break;
     }
 
     return ret;
 }
 
+int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+       if (cmd != SIOCWANDEV)
+               return -EOPNOTSUPP;
+
+       return lmc_proto_ioctl(dev_to_sc(dev), ifr, cmd);
+}
+
 
 /* the watchdog process that cruises around */
 static void lmc_watchdog(struct timer_list *t) /*fold00*/
        .ndo_stop       = lmc_close,
        .ndo_start_xmit = hdlc_start_xmit,
        .ndo_do_ioctl   = lmc_ioctl,
+       .ndo_siocdevprivate = lmc_siocdevprivate,
        .ndo_tx_timeout = lmc_driver_timeout,
        .ndo_get_stats  = lmc_get_stats,
 };
 
        return 0;
 }
 
-static int n2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+static int n2_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
+                            void __user *data, int cmd)
 {
-       const size_t size = sizeof(sync_serial_settings);
-       sync_serial_settings new_line;
-       sync_serial_settings __user *line = ifr->ifr_settings.ifs_ifsu.sync;
-       port_t *port = dev_to_port(dev);
-
 #ifdef DEBUG_RINGS
        if (cmd == SIOCDEVPRIVATE) {
                sca_dump_rings(dev);
                return 0;
        }
 #endif
+       return -EOPNOTSUPP;
+}
+
+static int n2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+       const size_t size = sizeof(sync_serial_settings);
+       sync_serial_settings new_line;
+       sync_serial_settings __user *line = ifr->ifr_settings.ifs_ifsu.sync;
+       port_t *port = dev_to_port(dev);
+
        if (cmd != SIOCWANDEV)
                return hdlc_ioctl(dev, ifr, cmd);
 
        .ndo_stop       = n2_close,
        .ndo_start_xmit = hdlc_start_xmit,
        .ndo_do_ioctl   = n2_ioctl,
+       .ndo_siocdevprivate = n2_siocdevprivate,
 };
 
 static int __init n2_run(unsigned long io, unsigned long irq,
 
        return 0;
 }
 
+static int pc300_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
+                               void __user *data, int cmd)
+{
+#ifdef DEBUG_RINGS
+       if (cmd == SIOCDEVPRIVATE) {
+               sca_dump_rings(dev);
+               return 0;
+       }
+#endif
+       return -EOPNOTSUPP;
+}
+
 static int pc300_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 {
        const size_t size = sizeof(sync_serial_settings);
        int new_type;
        port_t *port = dev_to_port(dev);
 
-#ifdef DEBUG_RINGS
-       if (cmd == SIOCDEVPRIVATE) {
-               sca_dump_rings(dev);
-               return 0;
-       }
-#endif
        if (cmd != SIOCWANDEV)
                return hdlc_ioctl(dev, ifr, cmd);
 
        .ndo_stop       = pc300_close,
        .ndo_start_xmit = hdlc_start_xmit,
        .ndo_do_ioctl   = pc300_ioctl,
+       .ndo_siocdevprivate = pc300_siocdevprivate,
 };
 
 static int pc300_pci_init_one(struct pci_dev *pdev,
 
        return 0;
 }
 
-static int pci200_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+static int pci200_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
+                                void __user *data, int cmd)
 {
-       const size_t size = sizeof(sync_serial_settings);
-       sync_serial_settings new_line;
-       sync_serial_settings __user *line = ifr->ifr_settings.ifs_ifsu.sync;
-       port_t *port = dev_to_port(dev);
-
 #ifdef DEBUG_RINGS
        if (cmd == SIOCDEVPRIVATE) {
                sca_dump_rings(dev);
                return 0;
        }
 #endif
+       return -EOPNOTSUPP;
+}
+
+static int pci200_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+       const size_t size = sizeof(sync_serial_settings);
+       sync_serial_settings new_line;
+       sync_serial_settings __user *line = ifr->ifr_settings.ifs_ifsu.sync;
+       port_t *port = dev_to_port(dev);
+
        if (cmd != SIOCWANDEV)
                return hdlc_ioctl(dev, ifr, cmd);
 
        .ndo_stop       = pci200_close,
        .ndo_start_xmit = hdlc_start_xmit,
        .ndo_do_ioctl   = pci200_ioctl,
+       .ndo_siocdevprivate = pci200_siocdevprivate,
 };
 
 static int pci200_pci_init_one(struct pci_dev *pdev,
 
 static int  sbni_close( struct net_device * );
 static netdev_tx_t sbni_start_xmit(struct sk_buff *,
                                         struct net_device * );
-static int  sbni_ioctl( struct net_device *, struct ifreq *, int );
+static int  sbni_siocdevprivate(struct net_device *, struct ifreq *,
+                               void __user *, int);
 static void  set_multicast_list( struct net_device * );
 
 static irqreturn_t sbni_interrupt( int, void * );
        .ndo_stop               = sbni_close,
        .ndo_start_xmit         = sbni_start_xmit,
        .ndo_set_rx_mode        = set_multicast_list,
-       .ndo_do_ioctl           = sbni_ioctl,
+       .ndo_siocdevprivate     = sbni_siocdevprivate,
        .ndo_set_mac_address    = eth_mac_addr,
        .ndo_validate_addr      = eth_validate_addr,
 };
 /* -------------------------------------------------------------------------- */
 
 static int
-sbni_ioctl( struct net_device  *dev,  struct ifreq  *ifr,  int  cmd )
+sbni_siocdevprivate(struct net_device  *dev,  struct ifreq  *ifr, void __user *data, int  cmd)
 {
        struct net_local  *nl = netdev_priv(dev);
        struct sbni_flags  flags;
   
        switch( cmd ) {
        case  SIOCDEVGETINSTATS :
-               if (copy_to_user( ifr->ifr_data, &nl->in_stats,
-                                       sizeof(struct sbni_in_stats) ))
+               if (copy_to_user(data, &nl->in_stats,
+                                sizeof(struct sbni_in_stats)))
                        error = -EFAULT;
                break;
 
                flags.rxl       = nl->cur_rxl_index;
                flags.fixed_rxl = nl->delta_rxl == 0;
 
-               if (copy_to_user( ifr->ifr_data, &flags, sizeof flags ))
+               if (copy_to_user(data, &flags, sizeof(flags)))
                        error = -EFAULT;
                break;
 
                if (!capable(CAP_NET_ADMIN))
                        return  -EPERM;
 
-               if (copy_from_user( slave_name, ifr->ifr_data, sizeof slave_name ))
+               if (copy_from_user(slave_name, data, sizeof(slave_name)))
                        return -EFAULT;
                slave_dev = dev_get_by_name(&init_net, slave_name );
                if( !slave_dev  ||  !(slave_dev->flags & IFF_UP) ) {