Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorDavid S. Miller <davem@davemloft.net>
Thu, 1 Mar 2012 22:57:40 +0000 (17:57 -0500)
committerDavid S. Miller <davem@davemloft.net>
Thu, 1 Mar 2012 22:57:40 +0000 (17:57 -0500)
Conflicts:
drivers/net/ethernet/broadcom/tg3.c

Conflicts in the statistics regression bug fix from 'net',
but happily Matt Carlson originally posted the fix against
'net-next' so I used that to resolve this.

Signed-off-by: David S. Miller <davem@davemloft.net>
1  2 
drivers/net/ethernet/broadcom/tg3.c
drivers/net/ethernet/cisco/enic/enic.h
drivers/net/ethernet/cisco/enic/enic_main.c
drivers/net/wireless/brcm80211/brcmsmac/ampdu.c
drivers/net/wireless/iwlwifi/iwl-agn-sta.c
drivers/net/wireless/rt2x00/rt2x00dev.c
include/linux/tcp.h
include/net/tcp.h
net/mac80211/iface.c
net/mac80211/rate.c

@@@ -8025,7 -7908,7 +8023,7 @@@ static int tg3_halt(struct tg3 *tp, in
  
        if (tp->hw_stats) {
                /* Save the stats across chip resets... */
-               tg3_get_stats64(tp->dev, &tp->net_stats_prev),
 -              tg3_get_nstats(tp, &tp->net_stats_prev),
++              tg3_get_nstats(tp, &tp->net_stats_prev);
                tg3_get_estats(tp, &tp->estats_prev);
  
                /* And make sure the next sample is new data */
@@@ -10301,10 -10014,107 +10289,8 @@@ static void tg3_get_nstats(struct tg3 *
  
        stats->rx_dropped = tp->rx_dropped;
        stats->tx_dropped = tp->tx_dropped;
-       return stats;
  }
  
 -static inline u32 calc_crc(unsigned char *buf, int len)
 -{
 -      u32 reg;
 -      u32 tmp;
 -      int j, k;
 -
 -      reg = 0xffffffff;
 -
 -      for (j = 0; j < len; j++) {
 -              reg ^= buf[j];
 -
 -              for (k = 0; k < 8; k++) {
 -                      tmp = reg & 0x01;
 -
 -                      reg >>= 1;
 -
 -                      if (tmp)
 -                              reg ^= 0xedb88320;
 -              }
 -      }
 -
 -      return ~reg;
 -}
 -
 -static void tg3_set_multi(struct tg3 *tp, unsigned int accept_all)
 -{
 -      /* accept or reject all multicast frames */
 -      tw32(MAC_HASH_REG_0, accept_all ? 0xffffffff : 0);
 -      tw32(MAC_HASH_REG_1, accept_all ? 0xffffffff : 0);
 -      tw32(MAC_HASH_REG_2, accept_all ? 0xffffffff : 0);
 -      tw32(MAC_HASH_REG_3, accept_all ? 0xffffffff : 0);
 -}
 -
 -static void __tg3_set_rx_mode(struct net_device *dev)
 -{
 -      struct tg3 *tp = netdev_priv(dev);
 -      u32 rx_mode;
 -
 -      rx_mode = tp->rx_mode & ~(RX_MODE_PROMISC |
 -                                RX_MODE_KEEP_VLAN_TAG);
 -
 -#if !defined(CONFIG_VLAN_8021Q) && !defined(CONFIG_VLAN_8021Q_MODULE)
 -      /* When ASF is in use, we always keep the RX_MODE_KEEP_VLAN_TAG
 -       * flag clear.
 -       */
 -      if (!tg3_flag(tp, ENABLE_ASF))
 -              rx_mode |= RX_MODE_KEEP_VLAN_TAG;
 -#endif
 -
 -      if (dev->flags & IFF_PROMISC) {
 -              /* Promiscuous mode. */
 -              rx_mode |= RX_MODE_PROMISC;
 -      } else if (dev->flags & IFF_ALLMULTI) {
 -              /* Accept all multicast. */
 -              tg3_set_multi(tp, 1);
 -      } else if (netdev_mc_empty(dev)) {
 -              /* Reject all multicast. */
 -              tg3_set_multi(tp, 0);
 -      } else {
 -              /* Accept one or more multicast(s). */
 -              struct netdev_hw_addr *ha;
 -              u32 mc_filter[4] = { 0, };
 -              u32 regidx;
 -              u32 bit;
 -              u32 crc;
 -
 -              netdev_for_each_mc_addr(ha, dev) {
 -                      crc = calc_crc(ha->addr, ETH_ALEN);
 -                      bit = ~crc & 0x7f;
 -                      regidx = (bit & 0x60) >> 5;
 -                      bit &= 0x1f;
 -                      mc_filter[regidx] |= (1 << bit);
 -              }
 -
 -              tw32(MAC_HASH_REG_0, mc_filter[0]);
 -              tw32(MAC_HASH_REG_1, mc_filter[1]);
 -              tw32(MAC_HASH_REG_2, mc_filter[2]);
 -              tw32(MAC_HASH_REG_3, mc_filter[3]);
 -      }
 -
 -      if (rx_mode != tp->rx_mode) {
 -              tp->rx_mode = rx_mode;
 -              tw32_f(MAC_RX_MODE, rx_mode);
 -              udelay(10);
 -      }
 -}
 -
 -static void tg3_set_rx_mode(struct net_device *dev)
 -{
 -      struct tg3 *tp = netdev_priv(dev);
 -
 -      if (!netif_running(dev))
 -              return;
 -
 -      tg3_full_lock(tp, 0);
 -      __tg3_set_rx_mode(dev);
 -      tg3_full_unlock(tp);
 -}
 -
  static int tg3_get_regs_len(struct net_device *dev)
  {
        return TG3_REG_BLK_SIZE;
@@@ -12213,96 -12026,6 +12199,111 @@@ static const struct ethtool_ops tg3_eth
        .set_rxfh_indir         = tg3_set_rxfh_indir,
  };
  
++static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,
++                                              struct rtnl_link_stats64 *stats)
++{
++      struct tg3 *tp = netdev_priv(dev);
++
++      if (!tp->hw_stats)
++              return &tp->net_stats_prev;
++
++      spin_lock_bh(&tp->lock);
++      tg3_get_nstats(tp, stats);
++      spin_unlock_bh(&tp->lock);
++
++      return stats;
++}
++
 +static void tg3_set_rx_mode(struct net_device *dev)
 +{
 +      struct tg3 *tp = netdev_priv(dev);
 +
 +      if (!netif_running(dev))
 +              return;
 +
 +      tg3_full_lock(tp, 0);
 +      __tg3_set_rx_mode(dev);
 +      tg3_full_unlock(tp);
 +}
 +
 +static inline void tg3_set_mtu(struct net_device *dev, struct tg3 *tp,
 +                             int new_mtu)
 +{
 +      dev->mtu = new_mtu;
 +
 +      if (new_mtu > ETH_DATA_LEN) {
 +              if (tg3_flag(tp, 5780_CLASS)) {
 +                      netdev_update_features(dev);
 +                      tg3_flag_clear(tp, TSO_CAPABLE);
 +              } else {
 +                      tg3_flag_set(tp, JUMBO_RING_ENABLE);
 +              }
 +      } else {
 +              if (tg3_flag(tp, 5780_CLASS)) {
 +                      tg3_flag_set(tp, TSO_CAPABLE);
 +                      netdev_update_features(dev);
 +              }
 +              tg3_flag_clear(tp, JUMBO_RING_ENABLE);
 +      }
 +}
 +
 +static int tg3_change_mtu(struct net_device *dev, int new_mtu)
 +{
 +      struct tg3 *tp = netdev_priv(dev);
 +      int err;
 +
 +      if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU(tp))
 +              return -EINVAL;
 +
 +      if (!netif_running(dev)) {
 +              /* We'll just catch it later when the
 +               * device is up'd.
 +               */
 +              tg3_set_mtu(dev, tp, new_mtu);
 +              return 0;
 +      }
 +
 +      tg3_phy_stop(tp);
 +
 +      tg3_netif_stop(tp);
 +
 +      tg3_full_lock(tp, 1);
 +
 +      tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
 +
 +      tg3_set_mtu(dev, tp, new_mtu);
 +
 +      err = tg3_restart_hw(tp, 0);
 +
 +      if (!err)
 +              tg3_netif_start(tp);
 +
 +      tg3_full_unlock(tp);
 +
 +      if (!err)
 +              tg3_phy_start(tp);
 +
 +      return err;
 +}
 +
 +static const struct net_device_ops tg3_netdev_ops = {
 +      .ndo_open               = tg3_open,
 +      .ndo_stop               = tg3_close,
 +      .ndo_start_xmit         = tg3_start_xmit,
 +      .ndo_get_stats64        = tg3_get_stats64,
 +      .ndo_validate_addr      = eth_validate_addr,
 +      .ndo_set_rx_mode        = tg3_set_rx_mode,
 +      .ndo_set_mac_address    = tg3_set_mac_addr,
 +      .ndo_do_ioctl           = tg3_ioctl,
 +      .ndo_tx_timeout         = tg3_tx_timeout,
 +      .ndo_change_mtu         = tg3_change_mtu,
 +      .ndo_fix_features       = tg3_fix_features,
 +      .ndo_set_features       = tg3_set_features,
 +#ifdef CONFIG_NET_POLL_CONTROLLER
 +      .ndo_poll_controller    = tg3_poll_controller,
 +#endif
 +};
 +
  static void __devinit tg3_get_eeprom_size(struct tg3 *tp)
  {
        u32 cursize, val, magic;
Simple merge
Simple merge
Simple merge
Simple merge