]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/isdn/i4l/isdn_net.c
Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-omap-h63xx.git] / drivers / isdn / i4l / isdn_net.c
index 023ea11d2f9e399dfb5161e27721f3104a8d204d..cb8943da4f122f8c3fdf2703d405160ddad309b5 100644 (file)
@@ -292,7 +292,9 @@ isdn_net_unbind_channel(isdn_net_local * lp)
        lp->dialstate = 0;
        dev->rx_netdev[isdn_dc2minor(lp->isdn_device, lp->isdn_channel)] = NULL;
        dev->st_netdev[isdn_dc2minor(lp->isdn_device, lp->isdn_channel)] = NULL;
-       isdn_free_channel(lp->isdn_device, lp->isdn_channel, ISDN_USAGE_NET);
+       if (lp->isdn_device != -1 && lp->isdn_channel != -1)
+               isdn_free_channel(lp->isdn_device, lp->isdn_channel,
+                                 ISDN_USAGE_NET);
        lp->flags &= ~ISDN_NET_CONNECTED;
        lp->isdn_device = -1;
        lp->isdn_channel = -1;
@@ -1485,6 +1487,24 @@ isdn_ciscohdlck_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
        return (rc);
 }
 
+
+static int isdn_net_ioctl(struct net_device *dev,
+                         struct ifreq *ifr, int cmd)
+{
+       isdn_net_local *lp = (isdn_net_local *) netdev_priv(dev);
+
+       switch (lp->p_encap) {
+#ifdef CONFIG_ISDN_PPP
+       case ISDN_NET_ENCAP_SYNCPPP:
+               return isdn_ppp_dev_ioctl(dev, ifr, cmd);
+#endif
+       case ISDN_NET_ENCAP_CISCOHDLCK:
+               return isdn_ciscohdlck_dev_ioctl(dev, ifr, cmd);
+       default:
+               return -EINVAL;
+       }
+}
+
 /* called via cisco_timer.function */
 static void
 isdn_net_ciscohdlck_slarp_send_keepalive(unsigned long data)
@@ -1998,23 +2018,6 @@ isdn_net_init(struct net_device *ndev)
        ushort max_hlhdr_len = 0;
        int drvidx;
 
-       ether_setup(ndev);
-       ndev->header_ops = NULL;
-
-       /* Setup the generic properties */
-       ndev->mtu = 1500;
-       ndev->flags = IFF_NOARP|IFF_POINTOPOINT;
-       ndev->type = ARPHRD_ETHER;
-       ndev->addr_len = ETH_ALEN;
-       ndev->validate_addr = NULL;
-
-       /* for clients with MPPP maybe higher values better */
-       ndev->tx_queue_len = 30;
-
-       /* The ISDN-specific entries in the device structure. */
-       ndev->open = &isdn_net_open;
-       ndev->hard_start_xmit = &isdn_net_start_xmit;
-
        /*
         *  up till binding we ask the protocol layer to reserve as much
         *  as we might need for HL layer
@@ -2026,9 +2029,6 @@ isdn_net_init(struct net_device *ndev)
                                max_hlhdr_len = dev->drv[drvidx]->interface->hl_hdrlen;
 
        ndev->hard_header_len = ETH_HLEN + max_hlhdr_len;
-       ndev->stop = &isdn_net_close;
-       ndev->get_stats = &isdn_net_get_stats;
-       ndev->do_ioctl = NULL;
        return 0;
 }
 
@@ -2508,6 +2508,18 @@ isdn_net_force_dial(char *name)
        return (isdn_net_force_dial_lp(p->local));
 }
 
+/* The ISDN-specific entries in the device structure. */
+static const struct net_device_ops isdn_netdev_ops = {
+       .ndo_init             = isdn_net_init,
+       .ndo_open             = isdn_net_open,
+       .ndo_stop             = isdn_net_close,
+       .ndo_do_ioctl         = isdn_net_ioctl,
+
+       .ndo_start_xmit       = isdn_net_start_xmit,
+       .ndo_get_stats        = isdn_net_get_stats,
+       .ndo_tx_timeout       = isdn_net_tx_timeout,
+};
+
 /*
  * Helper for alloc_netdev()
  */
@@ -2515,7 +2527,16 @@ static void _isdn_setup(struct net_device *dev)
 {
        isdn_net_local *lp = netdev_priv(dev);
 
-       dev->flags = IFF_NOARP | IFF_POINTOPOINT;
+       ether_setup(dev);
+
+       /* Setup the generic properties */
+       dev->flags = IFF_NOARP|IFF_POINTOPOINT;
+       dev->header_ops = NULL;
+       dev->netdev_ops = &isdn_netdev_ops;
+
+       /* for clients with MPPP maybe higher values better */
+       dev->tx_queue_len = 30;
+
        lp->p_encap = ISDN_NET_ENCAP_RAWIP;
        lp->magic = ISDN_NET_MAGIC;
        lp->last = lp;
@@ -2570,7 +2591,7 @@ isdn_net_new(char *name, struct net_device *master)
                return NULL;
        }
        netdev->local = netdev_priv(netdev->dev);
-       netdev->dev->init = isdn_net_init;
+
        if (master) {
                /* Device shall be a slave */
                struct net_device *p = MASTER_TO_SLAVE(master);
@@ -2588,7 +2609,6 @@ isdn_net_new(char *name, struct net_device *master)
                /*
                 * Watchdog timer (currently) for master only.
                 */
-               netdev->dev->tx_timeout = isdn_net_tx_timeout;
                netdev->dev->watchdog_timeo = ISDN_NET_TX_TIMEOUT;
                if (register_netdev(netdev->dev) != 0) {
                        printk(KERN_WARNING "isdn_net: Could not register net-device\n");
@@ -2704,7 +2724,6 @@ isdn_net_setcfg(isdn_net_ioctl_cfg * cfg)
 #else
                        p->dev->type = ARPHRD_PPP;      /* change ARP type */
                        p->dev->addr_len = 0;
-                       p->dev->do_ioctl = isdn_ppp_dev_ioctl;
 #endif
                        break;
                case ISDN_NET_ENCAP_X25IFACE:
@@ -2718,7 +2737,6 @@ isdn_net_setcfg(isdn_net_ioctl_cfg * cfg)
 #endif
                        break;
                case ISDN_NET_ENCAP_CISCOHDLCK:
-                       p->dev->do_ioctl = isdn_ciscohdlck_dev_ioctl;
                        break;
                default:
                        if( cfg->p_encap >= 0 &&