diff options
Diffstat (limited to 'drivers/net/jme.c')
-rw-r--r-- | drivers/net/jme.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/net/jme.c b/drivers/net/jme.c index 0f31497833df..b705ad3a53a7 100644 --- a/drivers/net/jme.c +++ b/drivers/net/jme.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/tcp.h> | 37 | #include <linux/tcp.h> |
38 | #include <linux/udp.h> | 38 | #include <linux/udp.h> |
39 | #include <linux/if_vlan.h> | 39 | #include <linux/if_vlan.h> |
40 | #include <linux/slab.h> | ||
40 | #include <net/ip6_checksum.h> | 41 | #include <net/ip6_checksum.h> |
41 | #include "jme.h" | 42 | #include "jme.h" |
42 | 43 | ||
@@ -946,6 +947,8 @@ jme_alloc_and_feed_skb(struct jme_adapter *jme, int idx) | |||
946 | jme->jme_vlan_rx(skb, jme->vlgrp, | 947 | jme->jme_vlan_rx(skb, jme->vlgrp, |
947 | le16_to_cpu(rxdesc->descwb.vlan)); | 948 | le16_to_cpu(rxdesc->descwb.vlan)); |
948 | NET_STAT(jme).rx_bytes += 4; | 949 | NET_STAT(jme).rx_bytes += 4; |
950 | } else { | ||
951 | dev_kfree_skb(skb); | ||
949 | } | 952 | } |
950 | } else { | 953 | } else { |
951 | jme->jme_rx(skb); | 954 | jme->jme_rx(skb); |
@@ -2081,12 +2084,45 @@ jme_tx_timeout(struct net_device *netdev) | |||
2081 | jme_reset_link(jme); | 2084 | jme_reset_link(jme); |
2082 | } | 2085 | } |
2083 | 2086 | ||
2087 | static inline void jme_pause_rx(struct jme_adapter *jme) | ||
2088 | { | ||
2089 | atomic_dec(&jme->link_changing); | ||
2090 | |||
2091 | jme_set_rx_pcc(jme, PCC_OFF); | ||
2092 | if (test_bit(JME_FLAG_POLL, &jme->flags)) { | ||
2093 | JME_NAPI_DISABLE(jme); | ||
2094 | } else { | ||
2095 | tasklet_disable(&jme->rxclean_task); | ||
2096 | tasklet_disable(&jme->rxempty_task); | ||
2097 | } | ||
2098 | } | ||
2099 | |||
2100 | static inline void jme_resume_rx(struct jme_adapter *jme) | ||
2101 | { | ||
2102 | struct dynpcc_info *dpi = &(jme->dpi); | ||
2103 | |||
2104 | if (test_bit(JME_FLAG_POLL, &jme->flags)) { | ||
2105 | JME_NAPI_ENABLE(jme); | ||
2106 | } else { | ||
2107 | tasklet_hi_enable(&jme->rxclean_task); | ||
2108 | tasklet_hi_enable(&jme->rxempty_task); | ||
2109 | } | ||
2110 | dpi->cur = PCC_P1; | ||
2111 | dpi->attempt = PCC_P1; | ||
2112 | dpi->cnt = 0; | ||
2113 | jme_set_rx_pcc(jme, PCC_P1); | ||
2114 | |||
2115 | atomic_inc(&jme->link_changing); | ||
2116 | } | ||
2117 | |||
2084 | static void | 2118 | static void |
2085 | jme_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp) | 2119 | jme_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp) |
2086 | { | 2120 | { |
2087 | struct jme_adapter *jme = netdev_priv(netdev); | 2121 | struct jme_adapter *jme = netdev_priv(netdev); |
2088 | 2122 | ||
2123 | jme_pause_rx(jme); | ||
2089 | jme->vlgrp = grp; | 2124 | jme->vlgrp = grp; |
2125 | jme_resume_rx(jme); | ||
2090 | } | 2126 | } |
2091 | 2127 | ||
2092 | static void | 2128 | static void |