提交 991990a1 编写于 作者: K Krzysztof Hałasa 提交者: David S. Miller

WAN: Convert generic HDLC drivers to netdev_ops.

Also remove unneeded last_rx update from Synclink drivers.
Synclink part mostly by Stephen Hemminger.
Signed-off-by: NKrzysztof Hałasa <khc@pm.waw.pl>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 dff3fde7
...@@ -4311,10 +4311,17 @@ static void hdlcdev_rx(MGSLPC_INFO *info, char *buf, int size) ...@@ -4311,10 +4311,17 @@ static void hdlcdev_rx(MGSLPC_INFO *info, char *buf, int size)
dev->stats.rx_bytes += size; dev->stats.rx_bytes += size;
netif_rx(skb); 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 * called by device driver when adding device instance
* do generic HDLC initialization * do generic HDLC initialization
...@@ -4341,11 +4348,8 @@ static int hdlcdev_init(MGSLPC_INFO *info) ...@@ -4341,11 +4348,8 @@ static int hdlcdev_init(MGSLPC_INFO *info)
dev->irq = info->irq_level; dev->irq = info->irq_level;
/* network layer callbacks and settings */ /* network layer callbacks and settings */
dev->do_ioctl = hdlcdev_ioctl; dev->netdev_ops = &hdlcdev_ops;
dev->open = hdlcdev_open; dev->watchdog_timeo = 10 * HZ;
dev->stop = hdlcdev_close;
dev->tx_timeout = hdlcdev_tx_timeout;
dev->watchdog_timeo = 10*HZ;
dev->tx_queue_len = 50; dev->tx_queue_len = 50;
/* generic HDLC layer callbacks and settings */ /* generic HDLC layer callbacks and settings */
......
...@@ -8007,10 +8007,17 @@ static void hdlcdev_rx(struct mgsl_struct *info, char *buf, int size) ...@@ -8007,10 +8007,17 @@ static void hdlcdev_rx(struct mgsl_struct *info, char *buf, int size)
dev->stats.rx_bytes += size; dev->stats.rx_bytes += size;
netif_rx(skb); 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 * called by device driver when adding device instance
* do generic HDLC initialization * do generic HDLC initialization
...@@ -8038,11 +8045,8 @@ static int hdlcdev_init(struct mgsl_struct *info) ...@@ -8038,11 +8045,8 @@ static int hdlcdev_init(struct mgsl_struct *info)
dev->dma = info->dma_level; dev->dma = info->dma_level;
/* network layer callbacks and settings */ /* network layer callbacks and settings */
dev->do_ioctl = hdlcdev_ioctl; dev->netdev_ops = &hdlcdev_ops;
dev->open = hdlcdev_open; dev->watchdog_timeo = 10 * HZ;
dev->stop = hdlcdev_close;
dev->tx_timeout = hdlcdev_tx_timeout;
dev->watchdog_timeo = 10*HZ;
dev->tx_queue_len = 50; dev->tx_queue_len = 50;
/* generic HDLC layer callbacks and settings */ /* generic HDLC layer callbacks and settings */
......
...@@ -1763,10 +1763,17 @@ static void hdlcdev_rx(struct slgt_info *info, char *buf, int size) ...@@ -1763,10 +1763,17 @@ static void hdlcdev_rx(struct slgt_info *info, char *buf, int size)
dev->stats.rx_bytes += size; dev->stats.rx_bytes += size;
netif_rx(skb); 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 * called by device driver when adding device instance
* do generic HDLC initialization * do generic HDLC initialization
...@@ -1794,11 +1801,8 @@ static int hdlcdev_init(struct slgt_info *info) ...@@ -1794,11 +1801,8 @@ static int hdlcdev_init(struct slgt_info *info)
dev->irq = info->irq_level; dev->irq = info->irq_level;
/* network layer callbacks and settings */ /* network layer callbacks and settings */
dev->do_ioctl = hdlcdev_ioctl; dev->netdev_ops = &hdlcdev_ops;
dev->open = hdlcdev_open; dev->watchdog_timeo = 10 * HZ;
dev->stop = hdlcdev_close;
dev->tx_timeout = hdlcdev_tx_timeout;
dev->watchdog_timeo = 10*HZ;
dev->tx_queue_len = 50; dev->tx_queue_len = 50;
/* generic HDLC layer callbacks and settings */ /* generic HDLC layer callbacks and settings */
......
...@@ -1907,10 +1907,17 @@ static void hdlcdev_rx(SLMP_INFO *info, char *buf, int size) ...@@ -1907,10 +1907,17 @@ static void hdlcdev_rx(SLMP_INFO *info, char *buf, int size)
dev->stats.rx_bytes += size; dev->stats.rx_bytes += size;
netif_rx(skb); 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 * called by device driver when adding device instance
* do generic HDLC initialization * do generic HDLC initialization
...@@ -1938,11 +1945,8 @@ static int hdlcdev_init(SLMP_INFO *info) ...@@ -1938,11 +1945,8 @@ static int hdlcdev_init(SLMP_INFO *info)
dev->irq = info->irq_level; dev->irq = info->irq_level;
/* network layer callbacks and settings */ /* network layer callbacks and settings */
dev->do_ioctl = hdlcdev_ioctl; dev->netdev_ops = &hdlcdev_ops;
dev->open = hdlcdev_open; dev->watchdog_timeo = 10 * HZ;
dev->stop = hdlcdev_close;
dev->tx_timeout = hdlcdev_tx_timeout;
dev->watchdog_timeo = 10*HZ;
dev->tx_queue_len = 50; dev->tx_queue_len = 50;
/* generic HDLC layer callbacks and settings */ /* generic HDLC layer callbacks and settings */
......
...@@ -296,7 +296,13 @@ static void c101_destroy_card(card_t *card) ...@@ -296,7 +296,13 @@ static void c101_destroy_card(card_t *card)
kfree(card); 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) static int __init c101_run(unsigned long irq, unsigned long winbase)
{ {
...@@ -367,9 +373,7 @@ static int __init c101_run(unsigned long irq, unsigned long winbase) ...@@ -367,9 +373,7 @@ static int __init c101_run(unsigned long irq, unsigned long winbase)
dev->mem_start = winbase; dev->mem_start = winbase;
dev->mem_end = winbase + C101_MAPPED_RAM_SIZE - 1; dev->mem_end = winbase + C101_MAPPED_RAM_SIZE - 1;
dev->tx_queue_len = 50; dev->tx_queue_len = 50;
dev->do_ioctl = c101_ioctl; dev->netdev_ops = &c101_ops;
dev->open = c101_open;
dev->stop = c101_close;
hdlc->attach = sca_attach; hdlc->attach = sca_attach;
hdlc->xmit = sca_xmit; hdlc->xmit = sca_xmit;
card->settings.clock_type = CLOCK_EXT; card->settings.clock_type = CLOCK_EXT;
......
...@@ -427,6 +427,15 @@ static void __exit cosa_exit(void) ...@@ -427,6 +427,15 @@ static void __exit cosa_exit(void)
} }
module_exit(cosa_exit); 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) static int cosa_probe(int base, int irq, int dma)
{ {
struct cosa_data *cosa = cosa_cards+nr_cards; struct cosa_data *cosa = cosa_cards+nr_cards;
...@@ -575,10 +584,7 @@ static int cosa_probe(int base, int irq, int dma) ...@@ -575,10 +584,7 @@ static int cosa_probe(int base, int irq, int dma)
} }
dev_to_hdlc(chan->netdev)->attach = cosa_net_attach; dev_to_hdlc(chan->netdev)->attach = cosa_net_attach;
dev_to_hdlc(chan->netdev)->xmit = cosa_net_tx; dev_to_hdlc(chan->netdev)->xmit = cosa_net_tx;
chan->netdev->open = cosa_net_open; chan->netdev->netdev_ops = &cosa_ops;
chan->netdev->stop = cosa_net_close;
chan->netdev->do_ioctl = cosa_net_ioctl;
chan->netdev->tx_timeout = cosa_net_timeout;
chan->netdev->watchdog_timeo = TX_TIMEOUT; chan->netdev->watchdog_timeo = TX_TIMEOUT;
chan->netdev->base_addr = chan->cosa->datareg; chan->netdev->base_addr = chan->cosa->datareg;
chan->netdev->irq = chan->cosa->irq; chan->netdev->irq = chan->cosa->irq;
......
...@@ -883,6 +883,15 @@ static inline int dscc4_set_quartz(struct dscc4_dev_priv *dpriv, int hz) ...@@ -883,6 +883,15 @@ static inline int dscc4_set_quartz(struct dscc4_dev_priv *dpriv, int hz)
return ret; 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) static int dscc4_found1(struct pci_dev *pdev, void __iomem *ioaddr)
{ {
struct dscc4_pci_priv *ppriv; struct dscc4_pci_priv *ppriv;
...@@ -916,13 +925,8 @@ static int dscc4_found1(struct pci_dev *pdev, void __iomem *ioaddr) ...@@ -916,13 +925,8 @@ static int dscc4_found1(struct pci_dev *pdev, void __iomem *ioaddr)
hdlc_device *hdlc = dev_to_hdlc(d); hdlc_device *hdlc = dev_to_hdlc(d);
d->base_addr = (unsigned long)ioaddr; d->base_addr = (unsigned long)ioaddr;
d->init = NULL;
d->irq = pdev->irq; d->irq = pdev->irq;
d->open = dscc4_open; d->netdev_ops = &dscc4_ops;
d->stop = dscc4_close;
d->set_multicast_list = NULL;
d->do_ioctl = dscc4_ioctl;
d->tx_timeout = dscc4_tx_timeout;
d->watchdog_timeo = TX_TIMEOUT; d->watchdog_timeo = TX_TIMEOUT;
SET_NETDEV_DEV(d, &pdev->dev); SET_NETDEV_DEV(d, &pdev->dev);
...@@ -1048,7 +1052,7 @@ static int dscc4_open(struct net_device *dev) ...@@ -1048,7 +1052,7 @@ static int dscc4_open(struct net_device *dev)
struct dscc4_pci_priv *ppriv; struct dscc4_pci_priv *ppriv;
int ret = -EAGAIN; int ret = -EAGAIN;
if ((dscc4_loopback_check(dpriv) < 0) || !dev->hard_start_xmit) if ((dscc4_loopback_check(dpriv) < 0))
goto err; goto err;
if ((ret = hdlc_open(dev))) if ((ret = hdlc_open(dev)))
......
...@@ -2424,6 +2424,15 @@ fst_init_card(struct fst_card_info *card) ...@@ -2424,6 +2424,15 @@ fst_init_card(struct fst_card_info *card)
type_strings[card->type], card->irq, card->nports); 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. * Initialise card when detected.
* Returns 0 to indicate success, or errno otherwise. * Returns 0 to indicate success, or errno otherwise.
...@@ -2565,12 +2574,9 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2565,12 +2574,9 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)
dev->base_addr = card->pci_conf; dev->base_addr = card->pci_conf;
dev->irq = card->irq; dev->irq = card->irq;
dev->tx_queue_len = FST_TX_QUEUE_LEN; dev->netdev_ops = &fst_ops;
dev->open = fst_open; dev->tx_queue_len = FST_TX_QUEUE_LEN;
dev->stop = fst_close; dev->watchdog_timeo = FST_TX_TIMEOUT;
dev->do_ioctl = fst_ioctl;
dev->watchdog_timeo = FST_TX_TIMEOUT;
dev->tx_timeout = fst_tx_timeout;
hdlc->attach = fst_attach; hdlc->attach = fst_attach;
hdlc->xmit = fst_start_xmit; hdlc->xmit = fst_start_xmit;
} }
......
...@@ -44,7 +44,7 @@ static const char* version = "HDLC support module revision 1.22"; ...@@ -44,7 +44,7 @@ static const char* version = "HDLC support module revision 1.22";
static struct hdlc_proto *first_proto; 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)) if ((new_mtu < 68) || (new_mtu > HDLC_MAX_MTU))
return -EINVAL; return -EINVAL;
...@@ -66,7 +66,15 @@ static int hdlc_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -66,7 +66,15 @@ static int hdlc_rcv(struct sk_buff *skb, struct net_device *dev,
return hdlc->proto->netif_rx(skb); 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) static inline void hdlc_proto_start(struct net_device *dev)
{ {
...@@ -231,8 +239,6 @@ static void hdlc_setup_dev(struct net_device *dev) ...@@ -231,8 +239,6 @@ static void hdlc_setup_dev(struct net_device *dev)
dev->hard_header_len = 16; dev->hard_header_len = 16;
dev->addr_len = 0; dev->addr_len = 0;
dev->header_ops = &hdlc_null_ops; dev->header_ops = &hdlc_null_ops;
dev->change_mtu = hdlc_change_mtu;
} }
static void hdlc_setup(struct net_device *dev) static void hdlc_setup(struct net_device *dev)
...@@ -330,6 +336,8 @@ MODULE_AUTHOR("Krzysztof Halasa <khc@pm.waw.pl>"); ...@@ -330,6 +336,8 @@ MODULE_AUTHOR("Krzysztof Halasa <khc@pm.waw.pl>");
MODULE_DESCRIPTION("HDLC support module"); MODULE_DESCRIPTION("HDLC support module");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
EXPORT_SYMBOL(hdlc_change_mtu);
EXPORT_SYMBOL(hdlc_start_xmit);
EXPORT_SYMBOL(hdlc_open); EXPORT_SYMBOL(hdlc_open);
EXPORT_SYMBOL(hdlc_close); EXPORT_SYMBOL(hdlc_close);
EXPORT_SYMBOL(hdlc_ioctl); EXPORT_SYMBOL(hdlc_ioctl);
......
...@@ -382,7 +382,6 @@ static int cisco_ioctl(struct net_device *dev, struct ifreq *ifr) ...@@ -382,7 +382,6 @@ static int cisco_ioctl(struct net_device *dev, struct ifreq *ifr)
memcpy(&state(hdlc)->settings, &new_settings, size); memcpy(&state(hdlc)->settings, &new_settings, size);
spin_lock_init(&state(hdlc)->lock); spin_lock_init(&state(hdlc)->lock);
dev->hard_start_xmit = hdlc->xmit;
dev->header_ops = &cisco_header_ops; dev->header_ops = &cisco_header_ops;
dev->type = ARPHRD_CISCO; dev->type = ARPHRD_CISCO;
netif_dormant_on(dev); netif_dormant_on(dev);
......
...@@ -444,18 +444,6 @@ static int pvc_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -444,18 +444,6 @@ static int pvc_xmit(struct sk_buff *skb, struct net_device *dev)
return 0; 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) static inline void fr_log_dlci_active(pvc_device *pvc)
{ {
printk(KERN_INFO "%s: DLCI %d [%s%s%s]%s %s\n", printk(KERN_INFO "%s: DLCI %d [%s%s%s]%s %s\n",
...@@ -1068,6 +1056,14 @@ static void pvc_setup(struct net_device *dev) ...@@ -1068,6 +1056,14 @@ static void pvc_setup(struct net_device *dev)
dev->addr_len = 2; 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) static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type)
{ {
hdlc_device *hdlc = dev_to_hdlc(frad); hdlc_device *hdlc = dev_to_hdlc(frad);
...@@ -1104,11 +1100,7 @@ static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type) ...@@ -1104,11 +1100,7 @@ static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type)
*(__be16*)dev->dev_addr = htons(dlci); *(__be16*)dev->dev_addr = htons(dlci);
dlci_to_q922(dev->broadcast, dlci); dlci_to_q922(dev->broadcast, dlci);
} }
dev->hard_start_xmit = pvc_xmit; dev->netdev_ops = &pvc_ops;
dev->open = pvc_open;
dev->stop = pvc_close;
dev->do_ioctl = pvc_ioctl;
dev->change_mtu = pvc_change_mtu;
dev->mtu = HDLC_MAX_MTU; dev->mtu = HDLC_MAX_MTU;
dev->tx_queue_len = 0; dev->tx_queue_len = 0;
dev->ml_priv = pvc; dev->ml_priv = pvc;
...@@ -1260,8 +1252,6 @@ static int fr_ioctl(struct net_device *dev, struct ifreq *ifr) ...@@ -1260,8 +1252,6 @@ static int fr_ioctl(struct net_device *dev, struct ifreq *ifr)
state(hdlc)->dce_pvc_count = 0; state(hdlc)->dce_pvc_count = 0;
} }
memcpy(&state(hdlc)->settings, &new_settings, size); memcpy(&state(hdlc)->settings, &new_settings, size);
dev->hard_start_xmit = hdlc->xmit;
dev->type = ARPHRD_FRAD; dev->type = ARPHRD_FRAD;
return 0; return 0;
......
...@@ -558,7 +558,6 @@ static int ppp_rx(struct sk_buff *skb) ...@@ -558,7 +558,6 @@ static int ppp_rx(struct sk_buff *skb)
return NET_RX_DROP; return NET_RX_DROP;
} }
static void ppp_timer(unsigned long arg) static void ppp_timer(unsigned long arg)
{ {
struct proto *proto = (struct proto *)arg; struct proto *proto = (struct proto *)arg;
...@@ -679,7 +678,6 @@ static int ppp_ioctl(struct net_device *dev, struct ifreq *ifr) ...@@ -679,7 +678,6 @@ static int ppp_ioctl(struct net_device *dev, struct ifreq *ifr)
ppp->keepalive_interval = 10; ppp->keepalive_interval = 10;
ppp->keepalive_timeout = 60; ppp->keepalive_timeout = 60;
dev->hard_start_xmit = hdlc->xmit;
dev->hard_header_len = sizeof(struct hdlc_header); dev->hard_header_len = sizeof(struct hdlc_header);
dev->header_ops = &ppp_header_ops; dev->header_ops = &ppp_header_ops;
dev->type = ARPHRD_PPP; dev->type = ARPHRD_PPP;
......
...@@ -30,8 +30,6 @@ static __be16 raw_type_trans(struct sk_buff *skb, struct net_device *dev) ...@@ -30,8 +30,6 @@ static __be16 raw_type_trans(struct sk_buff *skb, struct net_device *dev)
return __constant_htons(ETH_P_IP); return __constant_htons(ETH_P_IP);
} }
static struct hdlc_proto proto = { static struct hdlc_proto proto = {
.type_trans = raw_type_trans, .type_trans = raw_type_trans,
.ioctl = raw_ioctl, .ioctl = raw_ioctl,
...@@ -86,7 +84,6 @@ static int raw_ioctl(struct net_device *dev, struct ifreq *ifr) ...@@ -86,7 +84,6 @@ static int raw_ioctl(struct net_device *dev, struct ifreq *ifr)
if (result) if (result)
return result; return result;
memcpy(hdlc->state, &new_settings, size); memcpy(hdlc->state, &new_settings, size);
dev->hard_start_xmit = hdlc->xmit;
dev->type = ARPHRD_RAWHDLC; dev->type = ARPHRD_RAWHDLC;
netif_dormant_off(dev); netif_dormant_off(dev);
return 0; return 0;
......
...@@ -45,6 +45,7 @@ static int eth_tx(struct sk_buff *skb, struct net_device *dev) ...@@ -45,6 +45,7 @@ static int eth_tx(struct sk_buff *skb, struct net_device *dev)
static struct hdlc_proto proto = { static struct hdlc_proto proto = {
.type_trans = eth_type_trans, .type_trans = eth_type_trans,
.xmit = eth_tx,
.ioctl = raw_eth_ioctl, .ioctl = raw_eth_ioctl,
.module = THIS_MODULE, .module = THIS_MODULE,
}; };
...@@ -56,9 +57,7 @@ static int raw_eth_ioctl(struct net_device *dev, struct ifreq *ifr) ...@@ -56,9 +57,7 @@ static int raw_eth_ioctl(struct net_device *dev, struct ifreq *ifr)
const size_t size = sizeof(raw_hdlc_proto); const size_t size = sizeof(raw_hdlc_proto);
raw_hdlc_proto new_settings; raw_hdlc_proto new_settings;
hdlc_device *hdlc = dev_to_hdlc(dev); hdlc_device *hdlc = dev_to_hdlc(dev);
int result; int result, old_qlen;
int (*old_ch_mtu)(struct net_device *, int);
int old_qlen;
switch (ifr->ifr_settings.type) { switch (ifr->ifr_settings.type) {
case IF_GET_PROTO: case IF_GET_PROTO:
...@@ -99,11 +98,8 @@ static int raw_eth_ioctl(struct net_device *dev, struct ifreq *ifr) ...@@ -99,11 +98,8 @@ static int raw_eth_ioctl(struct net_device *dev, struct ifreq *ifr)
if (result) if (result)
return result; return result;
memcpy(hdlc->state, &new_settings, size); memcpy(hdlc->state, &new_settings, size);
dev->hard_start_xmit = eth_tx;
old_ch_mtu = dev->change_mtu;
old_qlen = dev->tx_queue_len; old_qlen = dev->tx_queue_len;
ether_setup(dev); ether_setup(dev);
dev->change_mtu = old_ch_mtu;
dev->tx_queue_len = old_qlen; dev->tx_queue_len = old_qlen;
random_ether_addr(dev->dev_addr); random_ether_addr(dev->dev_addr);
netif_dormant_off(dev); netif_dormant_off(dev);
......
...@@ -184,6 +184,7 @@ static struct hdlc_proto proto = { ...@@ -184,6 +184,7 @@ static struct hdlc_proto proto = {
.close = x25_close, .close = x25_close,
.ioctl = x25_ioctl, .ioctl = x25_ioctl,
.netif_rx = x25_rx, .netif_rx = x25_rx,
.xmit = x25_xmit,
.module = THIS_MODULE, .module = THIS_MODULE,
}; };
...@@ -213,7 +214,6 @@ static int x25_ioctl(struct net_device *dev, struct ifreq *ifr) ...@@ -213,7 +214,6 @@ static int x25_ioctl(struct net_device *dev, struct ifreq *ifr)
if ((result = attach_hdlc_protocol(dev, &proto, 0))) if ((result = attach_hdlc_protocol(dev, &proto, 0)))
return result; return result;
dev->hard_start_xmit = x25_xmit;
dev->type = ARPHRD_X25; dev->type = ARPHRD_X25;
netif_dormant_off(dev); netif_dormant_off(dev);
return 0; return 0;
......
...@@ -173,6 +173,14 @@ static int hostess_attach(struct net_device *dev, unsigned short encoding, ...@@ -173,6 +173,14 @@ static int hostess_attach(struct net_device *dev, unsigned short encoding,
* Description block for a Comtrol Hostess SV11 card * 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) static struct z8530_dev *sv11_init(int iobase, int irq)
{ {
struct z8530_dev *sv; struct z8530_dev *sv;
...@@ -267,9 +275,7 @@ static struct z8530_dev *sv11_init(int iobase, int irq) ...@@ -267,9 +275,7 @@ static struct z8530_dev *sv11_init(int iobase, int irq)
dev_to_hdlc(netdev)->attach = hostess_attach; dev_to_hdlc(netdev)->attach = hostess_attach;
dev_to_hdlc(netdev)->xmit = hostess_queue_xmit; dev_to_hdlc(netdev)->xmit = hostess_queue_xmit;
netdev->open = hostess_open; netdev->netdev_ops = &hostess_ops;
netdev->stop = hostess_close;
netdev->do_ioctl = hostess_ioctl;
netdev->base_addr = iobase; netdev->base_addr = iobase;
netdev->irq = irq; netdev->irq = irq;
......
...@@ -1230,6 +1230,14 @@ static int hss_hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -1230,6 +1230,14 @@ static int hss_hdlc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
* initialization * 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) static int __devinit hss_init_one(struct platform_device *pdev)
{ {
struct port *port; struct port *port;
...@@ -1254,9 +1262,7 @@ static int __devinit hss_init_one(struct platform_device *pdev) ...@@ -1254,9 +1262,7 @@ static int __devinit hss_init_one(struct platform_device *pdev)
hdlc = dev_to_hdlc(dev); hdlc = dev_to_hdlc(dev);
hdlc->attach = hss_hdlc_attach; hdlc->attach = hss_hdlc_attach;
hdlc->xmit = hss_hdlc_xmit; hdlc->xmit = hss_hdlc_xmit;
dev->open = hss_hdlc_open; dev->netdev_ops = &hss_hdlc_ops;
dev->stop = hss_hdlc_close;
dev->do_ioctl = hss_hdlc_ioctl;
dev->tx_queue_len = 100; dev->tx_queue_len = 100;
port->clock_type = CLOCK_EXT; port->clock_type = CLOCK_EXT;
port->clock_rate = 2048000; port->clock_rate = 2048000;
......
...@@ -806,6 +806,16 @@ static int lmc_attach(struct net_device *dev, unsigned short encoding, ...@@ -806,6 +806,16 @@ static int lmc_attach(struct net_device *dev, unsigned short encoding,
return -EINVAL; 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, static int __devinit lmc_init_one(struct pci_dev *pdev,
const struct pci_device_id *ent) const struct pci_device_id *ent)
{ {
...@@ -849,11 +859,7 @@ static int __devinit lmc_init_one(struct pci_dev *pdev, ...@@ -849,11 +859,7 @@ static int __devinit lmc_init_one(struct pci_dev *pdev,
dev->type = ARPHRD_HDLC; dev->type = ARPHRD_HDLC;
dev_to_hdlc(dev)->xmit = lmc_start_xmit; dev_to_hdlc(dev)->xmit = lmc_start_xmit;
dev_to_hdlc(dev)->attach = lmc_attach; dev_to_hdlc(dev)->attach = lmc_attach;
dev->open = lmc_open; dev->netdev_ops = &lmc_ops;
dev->stop = lmc_close;
dev->get_stats = lmc_get_stats;
dev->do_ioctl = lmc_ioctl;
dev->tx_timeout = lmc_driver_timeout;
dev->watchdog_timeo = HZ; /* 1 second */ dev->watchdog_timeo = HZ; /* 1 second */
dev->tx_queue_len = 100; dev->tx_queue_len = 100;
sc->lmc_device = dev; sc->lmc_device = dev;
...@@ -1059,9 +1065,6 @@ static int lmc_open(struct net_device *dev) ...@@ -1059,9 +1065,6 @@ static int lmc_open(struct net_device *dev)
if ((err = lmc_proto_open(sc)) != 0) if ((err = lmc_proto_open(sc)) != 0)
return err; return err;
dev->do_ioctl = lmc_ioctl;
netif_start_queue(dev); netif_start_queue(dev);
sc->extra_stats.tx_tbusy0++; sc->extra_stats.tx_tbusy0++;
......
...@@ -51,30 +51,15 @@ ...@@ -51,30 +51,15 @@
void lmc_proto_attach(lmc_softc_t *sc) /*FOLD00*/ void lmc_proto_attach(lmc_softc_t *sc) /*FOLD00*/
{ {
lmc_trace(sc->lmc_device, "lmc_proto_attach in"); lmc_trace(sc->lmc_device, "lmc_proto_attach in");
switch(sc->if_type){ if (sc->if_type == LMC_NET) {
case LMC_PPP:
{
struct net_device *dev = sc->lmc_device;
dev->do_ioctl = lmc_ioctl;
}
break;
case LMC_NET:
{
struct net_device *dev = sc->lmc_device; struct net_device *dev = sc->lmc_device;
/* /*
* They set a few basics because they don't use HDLC * They set a few basics because they don't use HDLC
*/ */
dev->flags |= IFF_POINTOPOINT; dev->flags |= IFF_POINTOPOINT;
dev->hard_header_len = 0; dev->hard_header_len = 0;
dev->addr_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"); lmc_trace(sc->lmc_device, "lmc_proto_attach out");
} }
......
...@@ -324,7 +324,13 @@ static void n2_destroy_card(card_t *card) ...@@ -324,7 +324,13 @@ static void n2_destroy_card(card_t *card)
kfree(card); 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, static int __init n2_run(unsigned long io, unsigned long irq,
unsigned long winbase, long valid0, long valid1) unsigned long winbase, long valid0, long valid1)
...@@ -460,9 +466,7 @@ static int __init n2_run(unsigned long io, unsigned long irq, ...@@ -460,9 +466,7 @@ static int __init n2_run(unsigned long io, unsigned long irq,
dev->mem_start = winbase; dev->mem_start = winbase;
dev->mem_end = winbase + USE_WINDOWSIZE - 1; dev->mem_end = winbase + USE_WINDOWSIZE - 1;
dev->tx_queue_len = 50; dev->tx_queue_len = 50;
dev->do_ioctl = n2_ioctl; dev->netdev_ops = &n2_ops;
dev->open = n2_open;
dev->stop = n2_close;
hdlc->attach = sca_attach; hdlc->attach = sca_attach;
hdlc->xmit = sca_xmit; hdlc->xmit = sca_xmit;
port->settings.clock_type = CLOCK_EXT; port->settings.clock_type = CLOCK_EXT;
......
...@@ -287,7 +287,13 @@ static void pc300_pci_remove_one(struct pci_dev *pdev) ...@@ -287,7 +287,13 @@ static void pc300_pci_remove_one(struct pci_dev *pdev)
kfree(card); 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, static int __devinit pc300_pci_init_one(struct pci_dev *pdev,
const struct pci_device_id *ent) const struct pci_device_id *ent)
...@@ -448,9 +454,7 @@ static int __devinit pc300_pci_init_one(struct pci_dev *pdev, ...@@ -448,9 +454,7 @@ static int __devinit pc300_pci_init_one(struct pci_dev *pdev,
dev->mem_start = ramphys; dev->mem_start = ramphys;
dev->mem_end = ramphys + ramsize - 1; dev->mem_end = ramphys + ramsize - 1;
dev->tx_queue_len = 50; dev->tx_queue_len = 50;
dev->do_ioctl = pc300_ioctl; dev->netdev_ops = &pc300_ops;
dev->open = pc300_open;
dev->stop = pc300_close;
hdlc->attach = sca_attach; hdlc->attach = sca_attach;
hdlc->xmit = sca_xmit; hdlc->xmit = sca_xmit;
port->settings.clock_type = CLOCK_EXT; port->settings.clock_type = CLOCK_EXT;
......
...@@ -265,7 +265,13 @@ static void pci200_pci_remove_one(struct pci_dev *pdev) ...@@ -265,7 +265,13 @@ static void pci200_pci_remove_one(struct pci_dev *pdev)
kfree(card); 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, static int __devinit pci200_pci_init_one(struct pci_dev *pdev,
const struct pci_device_id *ent) const struct pci_device_id *ent)
...@@ -395,9 +401,7 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev, ...@@ -395,9 +401,7 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev,
dev->mem_start = ramphys; dev->mem_start = ramphys;
dev->mem_end = ramphys + ramsize - 1; dev->mem_end = ramphys + ramsize - 1;
dev->tx_queue_len = 50; dev->tx_queue_len = 50;
dev->do_ioctl = pci200_ioctl; dev->netdev_ops = &pci200_ops;
dev->open = pci200_open;
dev->stop = pci200_close;
hdlc->attach = sca_attach; hdlc->attach = sca_attach;
hdlc->xmit = sca_xmit; hdlc->xmit = sca_xmit;
port->settings.clock_type = CLOCK_EXT; port->settings.clock_type = CLOCK_EXT;
......
...@@ -169,6 +169,14 @@ static int sealevel_attach(struct net_device *dev, unsigned short encoding, ...@@ -169,6 +169,14 @@ static int sealevel_attach(struct net_device *dev, unsigned short encoding,
return -EINVAL; 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) static int slvl_setup(struct slvl_device *sv, int iobase, int irq)
{ {
struct net_device *dev = alloc_hdlcdev(sv); struct net_device *dev = alloc_hdlcdev(sv);
...@@ -177,9 +185,7 @@ static int slvl_setup(struct slvl_device *sv, int iobase, int irq) ...@@ -177,9 +185,7 @@ static int slvl_setup(struct slvl_device *sv, int iobase, int irq)
dev_to_hdlc(dev)->attach = sealevel_attach; dev_to_hdlc(dev)->attach = sealevel_attach;
dev_to_hdlc(dev)->xmit = sealevel_queue_xmit; dev_to_hdlc(dev)->xmit = sealevel_queue_xmit;
dev->open = sealevel_open; dev->netdev_ops = &sealevel_ops;
dev->stop = sealevel_close;
dev->do_ioctl = sealevel_ioctl;
dev->base_addr = iobase; dev->base_addr = iobase;
dev->irq = irq; dev->irq = irq;
......
...@@ -547,6 +547,15 @@ static void wanxl_pci_remove_one(struct pci_dev *pdev) ...@@ -547,6 +547,15 @@ static void wanxl_pci_remove_one(struct pci_dev *pdev)
#include "wanxlfw.inc" #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, static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,
const struct pci_device_id *ent) const struct pci_device_id *ent)
{ {
...@@ -777,12 +786,9 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev, ...@@ -777,12 +786,9 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,
hdlc = dev_to_hdlc(dev); hdlc = dev_to_hdlc(dev);
spin_lock_init(&port->lock); spin_lock_init(&port->lock);
dev->tx_queue_len = 50; dev->tx_queue_len = 50;
dev->do_ioctl = wanxl_ioctl; dev->netdev_ops = &wanxl_ops;
dev->open = wanxl_open;
dev->stop = wanxl_close;
hdlc->attach = wanxl_attach; hdlc->attach = wanxl_attach;
hdlc->xmit = wanxl_xmit; hdlc->xmit = wanxl_xmit;
dev->get_stats = wanxl_get_stats;
port->card = card; port->card = card;
port->node = i; port->node = i;
get_status(port)->clocking = CLOCK_EXT; get_status(port)->clocking = CLOCK_EXT;
......
...@@ -38,6 +38,7 @@ struct hdlc_proto { ...@@ -38,6 +38,7 @@ struct hdlc_proto {
int (*ioctl)(struct net_device *dev, struct ifreq *ifr); int (*ioctl)(struct net_device *dev, struct ifreq *ifr);
__be16 (*type_trans)(struct sk_buff *skb, struct net_device *dev); __be16 (*type_trans)(struct sk_buff *skb, struct net_device *dev);
int (*netif_rx)(struct sk_buff *skb); int (*netif_rx)(struct sk_buff *skb);
int (*xmit)(struct sk_buff *skb, struct net_device *dev);
struct module *module; struct module *module;
struct hdlc_proto *next; /* next protocol in the list */ struct hdlc_proto *next; /* next protocol in the list */
}; };
...@@ -102,6 +103,10 @@ static __inline__ void debug_frame(const struct sk_buff *skb) ...@@ -102,6 +103,10 @@ static __inline__ void debug_frame(const struct sk_buff *skb)
int hdlc_open(struct net_device *dev); int hdlc_open(struct net_device *dev);
/* Must be called by hardware driver when HDLC device is being closed */ /* Must be called by hardware driver when HDLC device is being closed */
void hdlc_close(struct net_device *dev); 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, int attach_hdlc_protocol(struct net_device *dev, struct hdlc_proto *proto,
size_t size); size_t size);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册