diff options
Diffstat (limited to 'drivers/net/jme.c')
| -rw-r--r-- | drivers/net/jme.c | 42 | 
1 files changed, 39 insertions, 3 deletions
| diff --git a/drivers/net/jme.c b/drivers/net/jme.c index 0f31497833df..4e868eeac89e 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); | 
| @@ -2007,12 +2010,12 @@ jme_set_multi(struct net_device *netdev) | |||
| 2007 | } else if (netdev->flags & IFF_ALLMULTI) { | 2010 | } else if (netdev->flags & IFF_ALLMULTI) { | 
| 2008 | jme->reg_rxmcs |= RXMCS_ALLMULFRAME; | 2011 | jme->reg_rxmcs |= RXMCS_ALLMULFRAME; | 
| 2009 | } else if (netdev->flags & IFF_MULTICAST) { | 2012 | } else if (netdev->flags & IFF_MULTICAST) { | 
| 2010 | struct dev_mc_list *mclist; | 2013 | struct netdev_hw_addr *ha; | 
| 2011 | int bit_nr; | 2014 | int bit_nr; | 
| 2012 | 2015 | ||
| 2013 | jme->reg_rxmcs |= RXMCS_MULFRAME | RXMCS_MULFILTERED; | 2016 | jme->reg_rxmcs |= RXMCS_MULFRAME | RXMCS_MULFILTERED; | 
| 2014 | netdev_for_each_mc_addr(mclist, netdev) { | 2017 | netdev_for_each_mc_addr(ha, netdev) { | 
| 2015 | bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) & 0x3F; | 2018 | bit_nr = ether_crc(ETH_ALEN, ha->addr) & 0x3F; | 
| 2016 | mc_hash[bit_nr >> 5] |= 1 << (bit_nr & 0x1F); | 2019 | mc_hash[bit_nr >> 5] |= 1 << (bit_nr & 0x1F); | 
| 2017 | } | 2020 | } | 
| 2018 | 2021 | ||
| @@ -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 | 
