diff options
-rw-r--r-- | drivers/net/fddi/defza.c | 33 | ||||
-rw-r--r-- | include/linux/netdevice.h | 1 | ||||
-rw-r--r-- | net/core/dev.c | 13 |
3 files changed, 44 insertions, 3 deletions
diff --git a/drivers/net/fddi/defza.c b/drivers/net/fddi/defza.c index 7d01b70f7ed8..3b7f10a5f06a 100644 --- a/drivers/net/fddi/defza.c +++ b/drivers/net/fddi/defza.c | |||
@@ -797,11 +797,40 @@ static void fza_tx_smt(struct net_device *dev) | |||
797 | smt_tx_ptr = fp->mmio + readl_u(&fp->ring_smt_tx[i].buffer); | 797 | smt_tx_ptr = fp->mmio + readl_u(&fp->ring_smt_tx[i].buffer); |
798 | len = readl_u(&fp->ring_smt_tx[i].rmc) & FZA_RING_PBC_MASK; | 798 | len = readl_u(&fp->ring_smt_tx[i].rmc) & FZA_RING_PBC_MASK; |
799 | 799 | ||
800 | /* Queue the frame to the RMC transmit ring. */ | 800 | if (!netif_queue_stopped(dev)) { |
801 | if (!netif_queue_stopped(dev)) | 801 | if (dev_nit_active(dev)) { |
802 | struct sk_buff *skb; | ||
803 | |||
804 | /* Length must be a multiple of 4 as only word | ||
805 | * reads are permitted! | ||
806 | */ | ||
807 | skb = fza_alloc_skb_irq(dev, (len + 3) & ~3); | ||
808 | if (!skb) | ||
809 | goto err_no_skb; /* Drop. */ | ||
810 | |||
811 | skb_data_ptr = (struct fza_buffer_tx *) | ||
812 | skb->data; | ||
813 | |||
814 | fza_reads(smt_tx_ptr, skb_data_ptr, | ||
815 | (len + 3) & ~3); | ||
816 | skb->dev = dev; | ||
817 | skb_reserve(skb, 3); /* Skip over PRH. */ | ||
818 | skb_put(skb, len - 3); | ||
819 | skb_reset_network_header(skb); | ||
820 | |||
821 | dev_queue_xmit_nit(skb, dev); | ||
822 | |||
823 | dev_kfree_skb_irq(skb); | ||
824 | |||
825 | err_no_skb: | ||
826 | ; | ||
827 | } | ||
828 | |||
829 | /* Queue the frame to the RMC transmit ring. */ | ||
802 | fza_do_xmit((union fza_buffer_txp) | 830 | fza_do_xmit((union fza_buffer_txp) |
803 | { .mmio_ptr = smt_tx_ptr }, | 831 | { .mmio_ptr = smt_tx_ptr }, |
804 | len, dev, 1); | 832 | len, dev, 1); |
833 | } | ||
805 | 834 | ||
806 | writel_o(FZA_RING_OWN_FZA, &fp->ring_smt_tx[i].own); | 835 | writel_o(FZA_RING_OWN_FZA, &fp->ring_smt_tx[i].own); |
807 | fp->ring_smt_tx_index = | 836 | fp->ring_smt_tx_index = |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 22e4ef7bb701..dc1d9ed33b31 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -3645,6 +3645,7 @@ static __always_inline int ____dev_forward_skb(struct net_device *dev, | |||
3645 | return 0; | 3645 | return 0; |
3646 | } | 3646 | } |
3647 | 3647 | ||
3648 | bool dev_nit_active(struct net_device *dev); | ||
3648 | void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev); | 3649 | void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev); |
3649 | 3650 | ||
3650 | extern int netdev_budget; | 3651 | extern int netdev_budget; |
diff --git a/net/core/dev.c b/net/core/dev.c index a4d39b87b4e5..8497feea8fb5 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1976,6 +1976,17 @@ static inline bool skb_loop_sk(struct packet_type *ptype, struct sk_buff *skb) | |||
1976 | return false; | 1976 | return false; |
1977 | } | 1977 | } |
1978 | 1978 | ||
1979 | /** | ||
1980 | * dev_nit_active - return true if any network interface taps are in use | ||
1981 | * | ||
1982 | * @dev: network device to check for the presence of taps | ||
1983 | */ | ||
1984 | bool dev_nit_active(struct net_device *dev) | ||
1985 | { | ||
1986 | return !list_empty(&ptype_all) || !list_empty(&dev->ptype_all); | ||
1987 | } | ||
1988 | EXPORT_SYMBOL_GPL(dev_nit_active); | ||
1989 | |||
1979 | /* | 1990 | /* |
1980 | * Support routine. Sends outgoing frames to any network | 1991 | * Support routine. Sends outgoing frames to any network |
1981 | * taps currently in use. | 1992 | * taps currently in use. |
@@ -3233,7 +3244,7 @@ static int xmit_one(struct sk_buff *skb, struct net_device *dev, | |||
3233 | unsigned int len; | 3244 | unsigned int len; |
3234 | int rc; | 3245 | int rc; |
3235 | 3246 | ||
3236 | if (!list_empty(&ptype_all) || !list_empty(&dev->ptype_all)) | 3247 | if (dev_nit_active(dev)) |
3237 | dev_queue_xmit_nit(skb, dev); | 3248 | dev_queue_xmit_nit(skb, dev); |
3238 | 3249 | ||
3239 | len = skb->len; | 3250 | len = skb->len; |