diff options
Diffstat (limited to 'net/atm/lec.c')
-rw-r--r-- | net/atm/lec.c | 66 |
1 files changed, 29 insertions, 37 deletions
diff --git a/net/atm/lec.c b/net/atm/lec.c index e5e301550e8a..199b6bb79f42 100644 --- a/net/atm/lec.c +++ b/net/atm/lec.c | |||
@@ -62,7 +62,6 @@ static unsigned char bridge_ula_lec[] = { 0x01, 0x80, 0xc2, 0x00, 0x00 }; | |||
62 | static int lec_open(struct net_device *dev); | 62 | static int lec_open(struct net_device *dev); |
63 | static int lec_start_xmit(struct sk_buff *skb, struct net_device *dev); | 63 | static int lec_start_xmit(struct sk_buff *skb, struct net_device *dev); |
64 | static int lec_close(struct net_device *dev); | 64 | static int lec_close(struct net_device *dev); |
65 | static struct net_device_stats *lec_get_stats(struct net_device *dev); | ||
66 | static void lec_init(struct net_device *dev); | 65 | static void lec_init(struct net_device *dev); |
67 | static struct lec_arp_table *lec_arp_find(struct lec_priv *priv, | 66 | static struct lec_arp_table *lec_arp_find(struct lec_priv *priv, |
68 | const unsigned char *mac_addr); | 67 | const unsigned char *mac_addr); |
@@ -218,28 +217,28 @@ static unsigned char *get_tr_dst(unsigned char *packet, unsigned char *rdesc) | |||
218 | 217 | ||
219 | static int lec_open(struct net_device *dev) | 218 | static int lec_open(struct net_device *dev) |
220 | { | 219 | { |
221 | struct lec_priv *priv = netdev_priv(dev); | ||
222 | |||
223 | netif_start_queue(dev); | 220 | netif_start_queue(dev); |
224 | memset(&priv->stats, 0, sizeof(struct net_device_stats)); | 221 | memset(&dev->stats, 0, sizeof(struct net_device_stats)); |
225 | 222 | ||
226 | return 0; | 223 | return 0; |
227 | } | 224 | } |
228 | 225 | ||
229 | static __inline__ void | 226 | static void |
230 | lec_send(struct atm_vcc *vcc, struct sk_buff *skb, struct lec_priv *priv) | 227 | lec_send(struct atm_vcc *vcc, struct sk_buff *skb) |
231 | { | 228 | { |
229 | struct net_device *dev = skb->dev; | ||
230 | |||
232 | ATM_SKB(skb)->vcc = vcc; | 231 | ATM_SKB(skb)->vcc = vcc; |
233 | ATM_SKB(skb)->atm_options = vcc->atm_options; | 232 | ATM_SKB(skb)->atm_options = vcc->atm_options; |
234 | 233 | ||
235 | atomic_add(skb->truesize, &sk_atm(vcc)->sk_wmem_alloc); | 234 | atomic_add(skb->truesize, &sk_atm(vcc)->sk_wmem_alloc); |
236 | if (vcc->send(vcc, skb) < 0) { | 235 | if (vcc->send(vcc, skb) < 0) { |
237 | priv->stats.tx_dropped++; | 236 | dev->stats.tx_dropped++; |
238 | return; | 237 | return; |
239 | } | 238 | } |
240 | 239 | ||
241 | priv->stats.tx_packets++; | 240 | dev->stats.tx_packets++; |
242 | priv->stats.tx_bytes += skb->len; | 241 | dev->stats.tx_bytes += skb->len; |
243 | } | 242 | } |
244 | 243 | ||
245 | static void lec_tx_timeout(struct net_device *dev) | 244 | static void lec_tx_timeout(struct net_device *dev) |
@@ -270,7 +269,7 @@ static int lec_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
270 | pr_debug("lec_start_xmit called\n"); | 269 | pr_debug("lec_start_xmit called\n"); |
271 | if (!priv->lecd) { | 270 | if (!priv->lecd) { |
272 | printk("%s:No lecd attached\n", dev->name); | 271 | printk("%s:No lecd attached\n", dev->name); |
273 | priv->stats.tx_errors++; | 272 | dev->stats.tx_errors++; |
274 | netif_stop_queue(dev); | 273 | netif_stop_queue(dev); |
275 | return -EUNATCH; | 274 | return -EUNATCH; |
276 | } | 275 | } |
@@ -345,7 +344,7 @@ static int lec_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
345 | GFP_ATOMIC); | 344 | GFP_ATOMIC); |
346 | dev_kfree_skb(skb); | 345 | dev_kfree_skb(skb); |
347 | if (skb2 == NULL) { | 346 | if (skb2 == NULL) { |
348 | priv->stats.tx_dropped++; | 347 | dev->stats.tx_dropped++; |
349 | return 0; | 348 | return 0; |
350 | } | 349 | } |
351 | skb = skb2; | 350 | skb = skb2; |
@@ -380,7 +379,7 @@ static int lec_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
380 | ("%s:lec_start_xmit: tx queue full or no arp entry, dropping, ", | 379 | ("%s:lec_start_xmit: tx queue full or no arp entry, dropping, ", |
381 | dev->name); | 380 | dev->name); |
382 | pr_debug("MAC address %pM\n", lec_h->h_dest); | 381 | pr_debug("MAC address %pM\n", lec_h->h_dest); |
383 | priv->stats.tx_dropped++; | 382 | dev->stats.tx_dropped++; |
384 | dev_kfree_skb(skb); | 383 | dev_kfree_skb(skb); |
385 | } | 384 | } |
386 | goto out; | 385 | goto out; |
@@ -392,10 +391,10 @@ static int lec_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
392 | while (entry && (skb2 = skb_dequeue(&entry->tx_wait))) { | 391 | while (entry && (skb2 = skb_dequeue(&entry->tx_wait))) { |
393 | pr_debug("lec.c: emptying tx queue, "); | 392 | pr_debug("lec.c: emptying tx queue, "); |
394 | pr_debug("MAC address %pM\n", lec_h->h_dest); | 393 | pr_debug("MAC address %pM\n", lec_h->h_dest); |
395 | lec_send(vcc, skb2, priv); | 394 | lec_send(vcc, skb2); |
396 | } | 395 | } |
397 | 396 | ||
398 | lec_send(vcc, skb, priv); | 397 | lec_send(vcc, skb); |
399 | 398 | ||
400 | if (!atm_may_send(vcc, 0)) { | 399 | if (!atm_may_send(vcc, 0)) { |
401 | struct lec_vcc_priv *vpriv = LEC_VCC_PRIV(vcc); | 400 | struct lec_vcc_priv *vpriv = LEC_VCC_PRIV(vcc); |
@@ -427,15 +426,6 @@ static int lec_close(struct net_device *dev) | |||
427 | return 0; | 426 | return 0; |
428 | } | 427 | } |
429 | 428 | ||
430 | /* | ||
431 | * Get the current statistics. | ||
432 | * This may be called with the card open or closed. | ||
433 | */ | ||
434 | static struct net_device_stats *lec_get_stats(struct net_device *dev) | ||
435 | { | ||
436 | return &((struct lec_priv *)netdev_priv(dev))->stats; | ||
437 | } | ||
438 | |||
439 | static int lec_atm_send(struct atm_vcc *vcc, struct sk_buff *skb) | 429 | static int lec_atm_send(struct atm_vcc *vcc, struct sk_buff *skb) |
440 | { | 430 | { |
441 | unsigned long flags; | 431 | unsigned long flags; |
@@ -512,7 +502,7 @@ static int lec_atm_send(struct atm_vcc *vcc, struct sk_buff *skb) | |||
512 | priv->lane2_ops = NULL; | 502 | priv->lane2_ops = NULL; |
513 | if (priv->lane_version > 1) | 503 | if (priv->lane_version > 1) |
514 | priv->lane2_ops = &lane2_ops; | 504 | priv->lane2_ops = &lane2_ops; |
515 | if (dev->change_mtu(dev, mesg->content.config.mtu)) | 505 | if (dev_set_mtu(dev, mesg->content.config.mtu)) |
516 | printk("%s: change_mtu to %d failed\n", dev->name, | 506 | printk("%s: change_mtu to %d failed\n", dev->name, |
517 | mesg->content.config.mtu); | 507 | mesg->content.config.mtu); |
518 | priv->is_proxy = mesg->content.config.is_proxy; | 508 | priv->is_proxy = mesg->content.config.is_proxy; |
@@ -677,17 +667,19 @@ static void lec_set_multicast_list(struct net_device *dev) | |||
677 | return; | 667 | return; |
678 | } | 668 | } |
679 | 669 | ||
670 | static const struct net_device_ops lec_netdev_ops = { | ||
671 | .ndo_open = lec_open, | ||
672 | .ndo_stop = lec_close, | ||
673 | .ndo_start_xmit = lec_start_xmit, | ||
674 | .ndo_change_mtu = lec_change_mtu, | ||
675 | .ndo_tx_timeout = lec_tx_timeout, | ||
676 | .ndo_set_multicast_list = lec_set_multicast_list, | ||
677 | }; | ||
678 | |||
679 | |||
680 | static void lec_init(struct net_device *dev) | 680 | static void lec_init(struct net_device *dev) |
681 | { | 681 | { |
682 | dev->change_mtu = lec_change_mtu; | 682 | dev->netdev_ops = &lec_netdev_ops; |
683 | dev->open = lec_open; | ||
684 | dev->stop = lec_close; | ||
685 | dev->hard_start_xmit = lec_start_xmit; | ||
686 | dev->tx_timeout = lec_tx_timeout; | ||
687 | |||
688 | dev->get_stats = lec_get_stats; | ||
689 | dev->set_multicast_list = lec_set_multicast_list; | ||
690 | dev->do_ioctl = NULL; | ||
691 | printk("%s: Initialized!\n", dev->name); | 683 | printk("%s: Initialized!\n", dev->name); |
692 | } | 684 | } |
693 | 685 | ||
@@ -810,8 +802,8 @@ static void lec_push(struct atm_vcc *vcc, struct sk_buff *skb) | |||
810 | else | 802 | else |
811 | #endif | 803 | #endif |
812 | skb->protocol = eth_type_trans(skb, dev); | 804 | skb->protocol = eth_type_trans(skb, dev); |
813 | priv->stats.rx_packets++; | 805 | dev->stats.rx_packets++; |
814 | priv->stats.rx_bytes += skb->len; | 806 | dev->stats.rx_bytes += skb->len; |
815 | memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data)); | 807 | memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data)); |
816 | netif_rx(skb); | 808 | netif_rx(skb); |
817 | } | 809 | } |
@@ -1887,7 +1879,7 @@ restart: | |||
1887 | lec_arp_hold(entry); | 1879 | lec_arp_hold(entry); |
1888 | spin_unlock_irqrestore(&priv->lec_arp_lock, flags); | 1880 | spin_unlock_irqrestore(&priv->lec_arp_lock, flags); |
1889 | while ((skb = skb_dequeue(&entry->tx_wait)) != NULL) | 1881 | while ((skb = skb_dequeue(&entry->tx_wait)) != NULL) |
1890 | lec_send(vcc, skb, entry->priv); | 1882 | lec_send(vcc, skb); |
1891 | entry->last_used = jiffies; | 1883 | entry->last_used = jiffies; |
1892 | entry->status = ESI_FORWARD_DIRECT; | 1884 | entry->status = ESI_FORWARD_DIRECT; |
1893 | lec_arp_put(entry); | 1885 | lec_arp_put(entry); |
@@ -2305,7 +2297,7 @@ restart: | |||
2305 | lec_arp_hold(entry); | 2297 | lec_arp_hold(entry); |
2306 | spin_unlock_irqrestore(&priv->lec_arp_lock, flags); | 2298 | spin_unlock_irqrestore(&priv->lec_arp_lock, flags); |
2307 | while ((skb = skb_dequeue(&entry->tx_wait)) != NULL) | 2299 | while ((skb = skb_dequeue(&entry->tx_wait)) != NULL) |
2308 | lec_send(vcc, skb, entry->priv); | 2300 | lec_send(vcc, skb); |
2309 | entry->last_used = jiffies; | 2301 | entry->last_used = jiffies; |
2310 | entry->status = ESI_FORWARD_DIRECT; | 2302 | entry->status = ESI_FORWARD_DIRECT; |
2311 | lec_arp_put(entry); | 2303 | lec_arp_put(entry); |