Also remove unneeded last_rx update from Synclink drivers.
Synclink part mostly by Stephen Hemminger.
Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
Signed-off-by: David S. Miller <davem@davemloft.net>
        dev->stats.rx_bytes += size;
 
        netif_rx(skb);
-
-       dev->last_rx = jiffies;
 }
 
+static const struct net_device_ops hdlcdev_ops = {
+       .ndo_open       = hdlcdev_open,
+       .ndo_stop       = hdlcdev_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = hdlcdev_ioctl,
+       .ndo_tx_timeout = hdlcdev_tx_timeout,
+};
+
 /**
  * called by device driver when adding device instance
  * do generic HDLC initialization
        dev->irq       = info->irq_level;
 
        /* network layer callbacks and settings */
-       dev->do_ioctl       = hdlcdev_ioctl;
-       dev->open           = hdlcdev_open;
-       dev->stop           = hdlcdev_close;
-       dev->tx_timeout     = hdlcdev_tx_timeout;
-       dev->watchdog_timeo = 10*HZ;
+       dev->netdev_ops     = &hdlcdev_ops;
+       dev->watchdog_timeo = 10 * HZ;
        dev->tx_queue_len   = 50;
 
        /* generic HDLC layer callbacks and settings */
 
        dev->stats.rx_bytes += size;
 
        netif_rx(skb);
-
-       dev->last_rx = jiffies;
 }
 
+static const struct net_device_ops hdlcdev_ops = {
+       .ndo_open       = hdlcdev_open,
+       .ndo_stop       = hdlcdev_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = hdlcdev_ioctl,
+       .ndo_tx_timeout = hdlcdev_tx_timeout,
+};
+
 /**
  * called by device driver when adding device instance
  * do generic HDLC initialization
        dev->dma       = info->dma_level;
 
        /* network layer callbacks and settings */
-       dev->do_ioctl       = hdlcdev_ioctl;
-       dev->open           = hdlcdev_open;
-       dev->stop           = hdlcdev_close;
-       dev->tx_timeout     = hdlcdev_tx_timeout;
-       dev->watchdog_timeo = 10*HZ;
+       dev->netdev_ops     = &hdlcdev_ops;
+       dev->watchdog_timeo = 10 * HZ;
        dev->tx_queue_len   = 50;
 
        /* generic HDLC layer callbacks and settings */
 
        dev->stats.rx_bytes += size;
 
        netif_rx(skb);
-
-       dev->last_rx = jiffies;
 }
 
+static const struct net_device_ops hdlcdev_ops = {
+       .ndo_open       = hdlcdev_open,
+       .ndo_stop       = hdlcdev_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = hdlcdev_ioctl,
+       .ndo_tx_timeout = hdlcdev_tx_timeout,
+};
+
 /**
  * called by device driver when adding device instance
  * do generic HDLC initialization
        dev->irq       = info->irq_level;
 
        /* network layer callbacks and settings */
-       dev->do_ioctl       = hdlcdev_ioctl;
-       dev->open           = hdlcdev_open;
-       dev->stop           = hdlcdev_close;
-       dev->tx_timeout     = hdlcdev_tx_timeout;
-       dev->watchdog_timeo = 10*HZ;
+       dev->netdev_ops     = &hdlcdev_ops;
+       dev->watchdog_timeo = 10 * HZ;
        dev->tx_queue_len   = 50;
 
        /* generic HDLC layer callbacks and settings */
 
        dev->stats.rx_bytes += size;
 
        netif_rx(skb);
-
-       dev->last_rx = jiffies;
 }
 
+static const struct net_device_ops hdlcdev_ops = {
+       .ndo_open       = hdlcdev_open,
+       .ndo_stop       = hdlcdev_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = hdlcdev_ioctl,
+       .ndo_tx_timeout = hdlcdev_tx_timeout,
+};
+
 /**
  * called by device driver when adding device instance
  * do generic HDLC initialization
        dev->irq       = info->irq_level;
 
        /* network layer callbacks and settings */
-       dev->do_ioctl       = hdlcdev_ioctl;
-       dev->open           = hdlcdev_open;
-       dev->stop           = hdlcdev_close;
-       dev->tx_timeout     = hdlcdev_tx_timeout;
-       dev->watchdog_timeo = 10*HZ;
+       dev->netdev_ops     = &hdlcdev_ops;
+       dev->watchdog_timeo = 10 * HZ;
        dev->tx_queue_len   = 50;
 
        /* generic HDLC layer callbacks and settings */
 
        kfree(card);
 }
 
-
+static const struct net_device_ops c101_ops = {
+       .ndo_open       = c101_open,
+       .ndo_stop       = c101_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = c101_ioctl,
+};
 
 static int __init c101_run(unsigned long irq, unsigned long winbase)
 {
        dev->mem_start = winbase;
        dev->mem_end = winbase + C101_MAPPED_RAM_SIZE - 1;
        dev->tx_queue_len = 50;
-       dev->do_ioctl = c101_ioctl;
-       dev->open = c101_open;
-       dev->stop = c101_close;
+       dev->netdev_ops = &c101_ops;
        hdlc->attach = sca_attach;
        hdlc->xmit = sca_xmit;
        card->settings.clock_type = CLOCK_EXT;
 
 }
 module_exit(cosa_exit);
 
+static const struct net_device_ops cosa_ops = {
+       .ndo_open       = cosa_net_open,
+       .ndo_stop       = cosa_net_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = cosa_net_ioctl,
+       .ndo_tx_timeout = cosa_net_timeout,
+};
+
 static int cosa_probe(int base, int irq, int dma)
 {
        struct cosa_data *cosa = cosa_cards+nr_cards;
                }
                dev_to_hdlc(chan->netdev)->attach = cosa_net_attach;
                dev_to_hdlc(chan->netdev)->xmit = cosa_net_tx;
-               chan->netdev->open = cosa_net_open;
-               chan->netdev->stop = cosa_net_close;
-               chan->netdev->do_ioctl = cosa_net_ioctl;
-               chan->netdev->tx_timeout = cosa_net_timeout;
+               chan->netdev->netdev_ops = &cosa_ops;
                chan->netdev->watchdog_timeo = TX_TIMEOUT;
                chan->netdev->base_addr = chan->cosa->datareg;
                chan->netdev->irq = chan->cosa->irq;
 
        return ret;
 }
 
+static const struct net_device_ops dscc4_ops = {
+       .ndo_open       = dscc4_open,
+       .ndo_stop       = dscc4_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = dscc4_ioctl,
+       .ndo_tx_timeout = dscc4_tx_timeout,
+};
+
 static int dscc4_found1(struct pci_dev *pdev, void __iomem *ioaddr)
 {
        struct dscc4_pci_priv *ppriv;
                hdlc_device *hdlc = dev_to_hdlc(d);
 
                d->base_addr = (unsigned long)ioaddr;
-               d->init = NULL;
                d->irq = pdev->irq;
-               d->open = dscc4_open;
-               d->stop = dscc4_close;
-               d->set_multicast_list = NULL;
-               d->do_ioctl = dscc4_ioctl;
-               d->tx_timeout = dscc4_tx_timeout;
+               d->netdev_ops = &dscc4_ops;
                d->watchdog_timeo = TX_TIMEOUT;
                SET_NETDEV_DEV(d, &pdev->dev);
 
        struct dscc4_pci_priv *ppriv;
        int ret = -EAGAIN;
 
-       if ((dscc4_loopback_check(dpriv) < 0) || !dev->hard_start_xmit)
+       if ((dscc4_loopback_check(dpriv) < 0))
                goto err;
 
        if ((ret = hdlc_open(dev)))
 
               type_strings[card->type], card->irq, card->nports);
 }
 
+static const struct net_device_ops fst_ops = {
+       .ndo_open       = fst_open,
+       .ndo_stop       = fst_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = fst_ioctl,
+       .ndo_tx_timeout = fst_tx_timeout,
+};
+
 /*
  *      Initialise card when detected.
  *      Returns 0 to indicate success, or errno otherwise.
                 dev->base_addr   = card->pci_conf;
                 dev->irq         = card->irq;
 
-                dev->tx_queue_len          = FST_TX_QUEUE_LEN;
-                dev->open                  = fst_open;
-                dev->stop                  = fst_close;
-                dev->do_ioctl              = fst_ioctl;
-                dev->watchdog_timeo        = FST_TX_TIMEOUT;
-                dev->tx_timeout            = fst_tx_timeout;
+               dev->netdev_ops = &fst_ops;
+               dev->tx_queue_len = FST_TX_QUEUE_LEN;
+               dev->watchdog_timeo = FST_TX_TIMEOUT;
                 hdlc->attach = fst_attach;
                 hdlc->xmit   = fst_start_xmit;
        }
 
 
 static struct hdlc_proto *first_proto;
 
-static int hdlc_change_mtu(struct net_device *dev, int new_mtu)
+int hdlc_change_mtu(struct net_device *dev, int new_mtu)
 {
        if ((new_mtu < 68) || (new_mtu > HDLC_MAX_MTU))
                return -EINVAL;
        return hdlc->proto->netif_rx(skb);
 }
 
+int hdlc_start_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+       hdlc_device *hdlc = dev_to_hdlc(dev);
 
+       if (hdlc->proto->xmit)
+               return hdlc->proto->xmit(skb, dev);
+
+       return hdlc->xmit(skb, dev); /* call hardware driver directly */
+}
 
 static inline void hdlc_proto_start(struct net_device *dev)
 {
        dev->hard_header_len     = 16;
        dev->addr_len            = 0;
        dev->header_ops          = &hdlc_null_ops;
-
-       dev->change_mtu          = hdlc_change_mtu;
 }
 
 static void hdlc_setup(struct net_device *dev)
 MODULE_DESCRIPTION("HDLC support module");
 MODULE_LICENSE("GPL v2");
 
+EXPORT_SYMBOL(hdlc_change_mtu);
+EXPORT_SYMBOL(hdlc_start_xmit);
 EXPORT_SYMBOL(hdlc_open);
 EXPORT_SYMBOL(hdlc_close);
 EXPORT_SYMBOL(hdlc_ioctl);
 
 
                memcpy(&state(hdlc)->settings, &new_settings, size);
                spin_lock_init(&state(hdlc)->lock);
-               dev->hard_start_xmit = hdlc->xmit;
                dev->header_ops = &cisco_header_ops;
                dev->type = ARPHRD_CISCO;
                netif_dormant_on(dev);
 
        return 0;
 }
 
-
-
-static int pvc_change_mtu(struct net_device *dev, int new_mtu)
-{
-       if ((new_mtu < 68) || (new_mtu > HDLC_MAX_MTU))
-               return -EINVAL;
-       dev->mtu = new_mtu;
-       return 0;
-}
-
-
-
 static inline void fr_log_dlci_active(pvc_device *pvc)
 {
        printk(KERN_INFO "%s: DLCI %d [%s%s%s]%s %s\n",
        dev->addr_len = 2;
 }
 
+static const struct net_device_ops pvc_ops = {
+       .ndo_open       = pvc_open,
+       .ndo_stop       = pvc_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = pvc_xmit,
+       .ndo_do_ioctl   = pvc_ioctl,
+};
+
 static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type)
 {
        hdlc_device *hdlc = dev_to_hdlc(frad);
                *(__be16*)dev->dev_addr = htons(dlci);
                dlci_to_q922(dev->broadcast, dlci);
        }
-       dev->hard_start_xmit = pvc_xmit;
-       dev->open = pvc_open;
-       dev->stop = pvc_close;
-       dev->do_ioctl = pvc_ioctl;
-       dev->change_mtu = pvc_change_mtu;
+       dev->netdev_ops = &pvc_ops;
        dev->mtu = HDLC_MAX_MTU;
        dev->tx_queue_len = 0;
        dev->ml_priv = pvc;
                        state(hdlc)->dce_pvc_count = 0;
                }
                memcpy(&state(hdlc)->settings, &new_settings, size);
-
-               dev->hard_start_xmit = hdlc->xmit;
                dev->type = ARPHRD_FRAD;
                return 0;
 
 
        return NET_RX_DROP;
 }
 
-
 static void ppp_timer(unsigned long arg)
 {
        struct proto *proto = (struct proto *)arg;
                ppp->keepalive_interval = 10;
                ppp->keepalive_timeout = 60;
 
-               dev->hard_start_xmit = hdlc->xmit;
                dev->hard_header_len = sizeof(struct hdlc_header);
                dev->header_ops = &ppp_header_ops;
                dev->type = ARPHRD_PPP;
 
        return __constant_htons(ETH_P_IP);
 }
 
-
-
 static struct hdlc_proto proto = {
        .type_trans     = raw_type_trans,
        .ioctl          = raw_ioctl,
                if (result)
                        return result;
                memcpy(hdlc->state, &new_settings, size);
-               dev->hard_start_xmit = hdlc->xmit;
                dev->type = ARPHRD_RAWHDLC;
                netif_dormant_off(dev);
                return 0;
 
 
 static struct hdlc_proto proto = {
        .type_trans     = eth_type_trans,
+       .xmit           = eth_tx,
        .ioctl          = raw_eth_ioctl,
        .module         = THIS_MODULE,
 };
        const size_t size = sizeof(raw_hdlc_proto);
        raw_hdlc_proto new_settings;
        hdlc_device *hdlc = dev_to_hdlc(dev);
-       int result;
-       int (*old_ch_mtu)(struct net_device *, int);
-       int old_qlen;
+       int result, old_qlen;
 
        switch (ifr->ifr_settings.type) {
        case IF_GET_PROTO:
                if (result)
                        return result;
                memcpy(hdlc->state, &new_settings, size);
-               dev->hard_start_xmit = eth_tx;
-               old_ch_mtu = dev->change_mtu;
                old_qlen = dev->tx_queue_len;
                ether_setup(dev);
-               dev->change_mtu = old_ch_mtu;
                dev->tx_queue_len = old_qlen;
                random_ether_addr(dev->dev_addr);
                netif_dormant_off(dev);
 
        .close          = x25_close,
        .ioctl          = x25_ioctl,
        .netif_rx       = x25_rx,
+       .xmit           = x25_xmit,
        .module         = THIS_MODULE,
 };
 
 
                if ((result = attach_hdlc_protocol(dev, &proto, 0)))
                        return result;
-               dev->hard_start_xmit = x25_xmit;
                dev->type = ARPHRD_X25;
                netif_dormant_off(dev);
                return 0;
 
  *     Description block for a Comtrol Hostess SV11 card
  */
 
+static const struct net_device_ops hostess_ops = {
+       .ndo_open       = hostess_open,
+       .ndo_stop       = hostess_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = hostess_ioctl,
+};
+
 static struct z8530_dev *sv11_init(int iobase, int irq)
 {
        struct z8530_dev *sv;
 
        dev_to_hdlc(netdev)->attach = hostess_attach;
        dev_to_hdlc(netdev)->xmit = hostess_queue_xmit;
-       netdev->open = hostess_open;
-       netdev->stop = hostess_close;
-       netdev->do_ioctl = hostess_ioctl;
+       netdev->netdev_ops = &hostess_ops;
        netdev->base_addr = iobase;
        netdev->irq = irq;
 
 
  * initialization
  ****************************************************************************/
 
+static const struct net_device_ops hss_hdlc_ops = {
+       .ndo_open       = hss_hdlc_open,
+       .ndo_stop       = hss_hdlc_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = hss_hdlc_ioctl,
+};
+
 static int __devinit hss_init_one(struct platform_device *pdev)
 {
        struct port *port;
        hdlc = dev_to_hdlc(dev);
        hdlc->attach = hss_hdlc_attach;
        hdlc->xmit = hss_hdlc_xmit;
-       dev->open = hss_hdlc_open;
-       dev->stop = hss_hdlc_close;
-       dev->do_ioctl = hss_hdlc_ioctl;
+       dev->netdev_ops = &hss_hdlc_ops;
        dev->tx_queue_len = 100;
        port->clock_type = CLOCK_EXT;
        port->clock_rate = 2048000;
 
        return -EINVAL;
 }
 
+static const struct net_device_ops lmc_ops = {
+       .ndo_open       = lmc_open,
+       .ndo_stop       = lmc_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = lmc_ioctl,
+       .ndo_tx_timeout = lmc_driver_timeout,
+       .ndo_get_stats  = lmc_get_stats,
+};
+
 static int __devinit lmc_init_one(struct pci_dev *pdev,
                                  const struct pci_device_id *ent)
 {
        dev->type = ARPHRD_HDLC;
        dev_to_hdlc(dev)->xmit = lmc_start_xmit;
        dev_to_hdlc(dev)->attach = lmc_attach;
-       dev->open = lmc_open;
-       dev->stop = lmc_close;
-       dev->get_stats = lmc_get_stats;
-       dev->do_ioctl = lmc_ioctl;
-       dev->tx_timeout = lmc_driver_timeout;
+       dev->netdev_ops = &lmc_ops;
        dev->watchdog_timeo = HZ; /* 1 second */
        dev->tx_queue_len = 100;
        sc->lmc_device = dev;
     if ((err = lmc_proto_open(sc)) != 0)
            return err;
 
-    dev->do_ioctl = lmc_ioctl;
-
-
     netif_start_queue(dev);
     sc->extra_stats.tx_tbusy0++;
 
 
 void lmc_proto_attach(lmc_softc_t *sc) /*FOLD00*/
 {
     lmc_trace(sc->lmc_device, "lmc_proto_attach in");
-    switch(sc->if_type){
-    case LMC_PPP:
-        {
-            struct net_device *dev = sc->lmc_device;
-            dev->do_ioctl = lmc_ioctl;
-        }
-        break;
-    case LMC_NET:
-        {
+    if (sc->if_type == LMC_NET) {
             struct net_device *dev = sc->lmc_device;
             /*
             * They set a few basics because they don't use HDLC
              */
             dev->flags |= IFF_POINTOPOINT;
-
             dev->hard_header_len = 0;
             dev->addr_len = 0;
         }
-    case LMC_RAW: /* Setup the task queue, maybe we should notify someone? */
-        {
-        }
-    default:
-        break;
-    }
     lmc_trace(sc->lmc_device, "lmc_proto_attach out");
 }
 
 
        kfree(card);
 }
 
-
+static const struct net_device_ops n2_ops = {
+       .ndo_open       = n2_open,
+       .ndo_stop       = n2_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = n2_ioctl,
+};
 
 static int __init n2_run(unsigned long io, unsigned long irq,
                         unsigned long winbase, long valid0, long valid1)
                dev->mem_start = winbase;
                dev->mem_end = winbase + USE_WINDOWSIZE - 1;
                dev->tx_queue_len = 50;
-               dev->do_ioctl = n2_ioctl;
-               dev->open = n2_open;
-               dev->stop = n2_close;
+               dev->netdev_ops = &n2_ops;
                hdlc->attach = sca_attach;
                hdlc->xmit = sca_xmit;
                port->settings.clock_type = CLOCK_EXT;
 
        kfree(card);
 }
 
-
+static const struct net_device_ops pc300_ops = {
+       .ndo_open       = pc300_open,
+       .ndo_stop       = pc300_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = pc300_ioctl,
+};
 
 static int __devinit pc300_pci_init_one(struct pci_dev *pdev,
                                        const struct pci_device_id *ent)
                dev->mem_start = ramphys;
                dev->mem_end = ramphys + ramsize - 1;
                dev->tx_queue_len = 50;
-               dev->do_ioctl = pc300_ioctl;
-               dev->open = pc300_open;
-               dev->stop = pc300_close;
+               dev->netdev_ops = &pc300_ops;
                hdlc->attach = sca_attach;
                hdlc->xmit = sca_xmit;
                port->settings.clock_type = CLOCK_EXT;
 
        kfree(card);
 }
 
-
+static const struct net_device_ops pci200_ops = {
+       .ndo_open       = pci200_open,
+       .ndo_stop       = pci200_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = pci200_ioctl,
+};
 
 static int __devinit pci200_pci_init_one(struct pci_dev *pdev,
                                         const struct pci_device_id *ent)
                dev->mem_start = ramphys;
                dev->mem_end = ramphys + ramsize - 1;
                dev->tx_queue_len = 50;
-               dev->do_ioctl = pci200_ioctl;
-               dev->open = pci200_open;
-               dev->stop = pci200_close;
+               dev->netdev_ops = &pci200_ops;
                hdlc->attach = sca_attach;
                hdlc->xmit = sca_xmit;
                port->settings.clock_type = CLOCK_EXT;
 
        return -EINVAL;
 }
 
+static const struct net_device_ops sealevel_ops = {
+       .ndo_open       = sealevel_open,
+       .ndo_stop       = sealevel_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = sealevel_ioctl,
+};
+
 static int slvl_setup(struct slvl_device *sv, int iobase, int irq)
 {
        struct net_device *dev = alloc_hdlcdev(sv);
 
        dev_to_hdlc(dev)->attach = sealevel_attach;
        dev_to_hdlc(dev)->xmit = sealevel_queue_xmit;
-       dev->open = sealevel_open;
-       dev->stop = sealevel_close;
-       dev->do_ioctl = sealevel_ioctl;
+       dev->netdev_ops = &sealevel_ops;
        dev->base_addr = iobase;
        dev->irq = irq;
 
 
 
 #include "wanxlfw.inc"
 
+static const struct net_device_ops wanxl_ops = {
+       .ndo_open       = wanxl_open,
+       .ndo_stop       = wanxl_close,
+       .ndo_change_mtu = hdlc_change_mtu,
+       .ndo_start_xmit = hdlc_start_xmit,
+       .ndo_do_ioctl   = wanxl_ioctl,
+       .ndo_get_stats  = wanxl_get_stats,
+};
+
 static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,
                                        const struct pci_device_id *ent)
 {
                hdlc = dev_to_hdlc(dev);
                spin_lock_init(&port->lock);
                dev->tx_queue_len = 50;
-               dev->do_ioctl = wanxl_ioctl;
-               dev->open = wanxl_open;
-               dev->stop = wanxl_close;
+               dev->netdev_ops = &wanxl_ops;
                hdlc->attach = wanxl_attach;
                hdlc->xmit = wanxl_xmit;
-               dev->get_stats = wanxl_get_stats;
                port->card = card;
                port->node = i;
                get_status(port)->clocking = CLOCK_EXT;
 
        int (*ioctl)(struct net_device *dev, struct ifreq *ifr);
        __be16 (*type_trans)(struct sk_buff *skb, struct net_device *dev);
        int (*netif_rx)(struct sk_buff *skb);
+       int (*xmit)(struct sk_buff *skb, struct net_device *dev);
        struct module *module;
        struct hdlc_proto *next; /* next protocol in the list */
 };
 int hdlc_open(struct net_device *dev);
 /* Must be called by hardware driver when HDLC device is being closed */
 void hdlc_close(struct net_device *dev);
+/* May be used by hardware driver */
+int hdlc_change_mtu(struct net_device *dev, int new_mtu);
+/* Must be pointed to by hw driver's dev->netdev_ops->ndo_start_xmit */
+int hdlc_start_xmit(struct sk_buff *skb, struct net_device *dev);
 
 int attach_hdlc_protocol(struct net_device *dev, struct hdlc_proto *proto,
                         size_t size);