Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorDavid S. Miller <davem@davemloft.net>
Tue, 8 Mar 2016 17:34:12 +0000 (12:34 -0500)
committerDavid S. Miller <davem@davemloft.net>
Tue, 8 Mar 2016 17:34:12 +0000 (12:34 -0500)
Several cases of overlapping changes, as well as one instance
(vxlan) of a bug fix in 'net' overlapping with code movement
in 'net-next'.

Signed-off-by: David S. Miller <davem@davemloft.net>
56 files changed:
1  2 
MAINTAINERS
drivers/net/ethernet/3com/3c59x.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/cavium/thunder/nic.h
drivers/net/ethernet/emulex/benet/be.h
drivers/net/ethernet/emulex/benet/be_cmds.h
drivers/net/ethernet/emulex/benet/be_main.c
drivers/net/ethernet/freescale/gianfar.c
drivers/net/ethernet/mellanox/mlx4/en_netdev.c
drivers/net/ethernet/mellanox/mlx4/main.c
drivers/net/ethernet/mellanox/mlx5/core/en.h
drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
drivers/net/ethernet/renesas/ravb_main.c
drivers/net/ethernet/renesas/sh_eth.c
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
drivers/net/phy/micrel.c
drivers/net/ppp/ppp_generic.c
drivers/net/vrf.c
drivers/net/vxlan.c
drivers/net/wireless/intel/iwlwifi/mvm/fw.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
drivers/net/wireless/intel/iwlwifi/mvm/ops.c
drivers/net/wireless/intel/iwlwifi/mvm/tx.c
drivers/of/of_mdio.c
include/linux/mlx5/mlx5_ifc.h
include/linux/perf_event.h
include/linux/skbuff.h
include/linux/stmmac.h
include/uapi/linux/bpf.h
net/core/filter.c
net/core/rtnetlink.c
net/core/skbuff.c
net/ipv4/igmp.c
net/ipv4/ip_output.c
net/ipv4/ip_tunnel.c
net/ipv4/tcp_metrics.c
net/ipv4/tcp_minisocks.c
net/ipv6/ip6_gre.c
net/ipv6/ip6_tunnel.c
net/ipv6/udp.c
net/mac80211/agg-rx.c
net/mac80211/ieee80211_i.h
net/mac80211/rx.c
net/sched/act_ipt.c
net/sctp/proc.c
net/tipc/socket.c
net/tipc/subscr.c
net/wireless/core.c
net/wireless/nl80211.c
net/wireless/sme.c

diff --cc MAINTAINERS
Simple merge
Simple merge
@@@ -543,8 -530,8 +543,9 @@@ struct be_adapter 
        u16 work_counter;
  
        struct delayed_work be_err_detection_work;
 +      u8 recovery_retries;
        u8 err_flags;
+       bool pcicfg_mapped;     /* pcicfg obtained via pci_iomap() */
        u32 flags;
        u32 cmd_privileges;
        /* Ethtool knobs and info */
@@@ -256,12 -244,9 +258,13 @@@ struct mlx5e_rq_stats 
  
  static const char sq_stats_strings[][ETH_GSTRING_LEN] = {
        "packets",
+       "bytes",
        "tso_packets",
        "tso_bytes",
 +      "tso_inner_packets",
 +      "tso_inner_bytes",
 +      "csum_offload_inner",
 +      "nop",
        "csum_offload_none",
        "stopped",
        "wake",
  };
  
  struct mlx5e_sq_stats {
 +      /* commonly accessed in data path */
        u64 packets;
+       u64 bytes;
        u64 tso_packets;
        u64 tso_bytes;
 +      u64 tso_inner_packets;
 +      u64 tso_inner_bytes;
 +      u64 csum_offload_inner;
 +      u64 nop;
 +      /* less likely accessed in data path */
        u64 csum_offload_none;
        u64 stopped;
        u64 wake;
        u64 dropped;
- #define NUM_SQ_STATS 11
 -      u64 nop;
 -#define NUM_SQ_STATS 9
++#define NUM_SQ_STATS 12
  };
  
  struct mlx5e_stats {
@@@ -143,10 -141,12 +143,14 @@@ void mlx5e_update_stats(struct mlx5e_pr
                return;
  
        /* Collect firts the SW counters and then HW for consistency */
+       s->rx_packets           = 0;
+       s->rx_bytes             = 0;
+       s->tx_packets           = 0;
+       s->tx_bytes             = 0;
        s->tso_packets          = 0;
        s->tso_bytes            = 0;
 +      s->tso_inner_packets    = 0;
 +      s->tso_inner_bytes      = 0;
        s->tx_queue_stopped     = 0;
        s->tx_queue_wake        = 0;
        s->tx_queue_dropped     = 0;
                for (j = 0; j < priv->params.num_tc; j++) {
                        sq_stats = &priv->channel[i]->sq[j].stats;
  
+                       s->tx_packets           += sq_stats->packets;
+                       s->tx_bytes             += sq_stats->bytes;
                        s->tso_packets          += sq_stats->tso_packets;
                        s->tso_bytes            += sq_stats->tso_bytes;
 +                      s->tso_inner_packets    += sq_stats->tso_inner_packets;
 +                      s->tso_inner_bytes      += sq_stats->tso_inner_bytes;
                        s->tx_queue_stopped     += sq_stats->stopped;
                        s->tx_queue_wake        += sq_stats->wake;
                        s->tx_queue_dropped     += sq_stats->dropped;
        s->tx_broadcast_bytes   =
                MLX5_GET_CTR(out, transmitted_eth_broadcast.octets);
  
-       s->rx_packets =
-               s->rx_unicast_packets +
-               s->rx_multicast_packets +
-               s->rx_broadcast_packets;
-       s->rx_bytes =
-               s->rx_unicast_bytes +
-               s->rx_multicast_bytes +
-               s->rx_broadcast_bytes;
-       s->tx_packets =
-               s->tx_unicast_packets +
-               s->tx_multicast_packets +
-               s->tx_broadcast_packets;
-       s->tx_bytes =
-               s->tx_unicast_bytes +
-               s->tx_multicast_bytes +
-               s->tx_broadcast_bytes;
        /* Update calculated offload counters */
 -      s->tx_csum_offload = s->tx_packets - tx_offload_none;
 +      s->tx_csum_offload = s->tx_packets - tx_offload_none - s->tx_csum_inner;
        s->rx_csum_good    = s->rx_packets - s->rx_csum_none -
                               s->rx_csum_sw;
  
@@@ -2235,24 -2091,15 +2237,33 @@@ u16 mlx5e_get_max_inline_cap(struct mlx
               2 /*sizeof(mlx5e_tx_wqe.inline_hdr_start)*/;
  }
  
 +#ifdef CONFIG_MLX5_CORE_EN_DCB
 +static void mlx5e_ets_init(struct mlx5e_priv *priv)
 +{
 +      int i;
 +
 +      priv->params.ets.ets_cap = mlx5_max_tc(priv->mdev) + 1;
 +      for (i = 0; i < priv->params.ets.ets_cap; i++) {
 +              priv->params.ets.tc_tx_bw[i] = MLX5E_MAX_BW_ALLOC;
 +              priv->params.ets.tc_tsa[i] = IEEE_8021QAZ_TSA_VENDOR;
 +              priv->params.ets.prio_tc[i] = i;
 +      }
 +
 +      /* tclass[prio=0]=1, tclass[prio=1]=0, tclass[prio=i]=i (for i>1) */
 +      priv->params.ets.prio_tc[0] = 1;
 +      priv->params.ets.prio_tc[1] = 0;
 +}
 +#endif
 +
+ void mlx5e_build_default_indir_rqt(u32 *indirection_rqt, int len,
+                                  int num_channels)
+ {
+       int i;
+       for (i = 0; i < len; i++)
+               indirection_rqt[i] = i % num_channels;
+ }
  static void mlx5e_build_netdev_priv(struct mlx5_core_dev *mdev,
                                    struct net_device *netdev,
                                    int num_channels)
@@@ -203,21 -199,15 +204,20 @@@ static netdev_tx_t mlx5e_sq_xmit(struc
        }
  
        if (skb_is_gso(skb)) {
 -              u32 payload_len;
 -
                eseg->mss    = cpu_to_be16(skb_shinfo(skb)->gso_size);
                opcode       = MLX5_OPCODE_LSO;
 -              ihs          = skb_transport_offset(skb) + tcp_hdrlen(skb);
 -              payload_len  = skb->len - ihs;
 +
 +              if (skb->encapsulation) {
 +                      ihs = skb_inner_transport_offset(skb) + inner_tcp_hdrlen(skb);
 +                      sq->stats.tso_inner_packets++;
 +                      sq->stats.tso_inner_bytes += skb->len - ihs;
 +              } else {
 +                      ihs = skb_transport_offset(skb) + tcp_hdrlen(skb);
 +                      sq->stats.tso_packets++;
 +                      sq->stats.tso_bytes += skb->len - ihs;
 +              }
 +
-               wi->num_bytes = skb->len +
-                               (skb_shinfo(skb)->gso_segs - 1) * ihs;
+               num_bytes = skb->len + (skb_shinfo(skb)->gso_segs - 1) * ihs;
 -              sq->stats.tso_packets++;
 -              sq->stats.tso_bytes += payload_len;
        } else {
                bf = sq->bf_budget &&
                     !skb->xmit_more &&
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1144,61 -1129,49 +1146,62 @@@ static bool vxlan_remcsum(struct vxlanh
  {
        size_t start, offset, plen;
  
 -      if (skb->remcsum_offload)
 -              return vh;
 +      if (!(unparsed->vx_flags & VXLAN_HF_RCO) || skb->remcsum_offload)
 +              goto out;
  
 -      start = (data & VXLAN_RCO_MASK) << VXLAN_RCO_SHIFT;
 -      offset = start + ((data & VXLAN_RCO_UDP) ?
 -                        offsetof(struct udphdr, check) :
 -                        offsetof(struct tcphdr, check));
 +      start = vxlan_rco_start(unparsed->vx_vni);
 +      offset = start + vxlan_rco_offset(unparsed->vx_vni);
  
 -      plen = hdrlen + offset + sizeof(u16);
 +      plen = sizeof(struct vxlanhdr) + offset + sizeof(u16);
  
        if (!pskb_may_pull(skb, plen))
 -              return NULL;
 +              return false;
 +
 +      skb_remcsum_process(skb, (void *)(vxlan_hdr(skb) + 1), start, offset,
 +                          !!(vxflags & VXLAN_F_REMCSUM_NOPARTIAL));
 +out:
 +      unparsed->vx_flags &= ~VXLAN_HF_RCO;
 +      unparsed->vx_vni &= VXLAN_VNI_MASK;
 +      return true;
 +}
 +
 +static void vxlan_parse_gbp_hdr(struct vxlanhdr *unparsed,
 +                              struct sk_buff *skb, u32 vxflags,
 +                              struct vxlan_metadata *md)
 +{
 +      struct vxlanhdr_gbp *gbp = (struct vxlanhdr_gbp *)unparsed;
 +      struct metadata_dst *tun_dst;
  
 -      vh = (struct vxlanhdr *)(udp_hdr(skb) + 1);
 +      if (!(unparsed->vx_flags & VXLAN_HF_GBP))
 +              goto out;
  
 -      skb_remcsum_process(skb, (void *)vh + hdrlen, start, offset,
 -                          nopartial);
 +      md->gbp = ntohs(gbp->policy_id);
  
 -      return vh;
 +      tun_dst = (struct metadata_dst *)skb_dst(skb);
-       if (tun_dst)
++      if (tun_dst) {
 +              tun_dst->u.tun_info.key.tun_flags |= TUNNEL_VXLAN_OPT;
++              tun_dst->u.tun_info.options_len = sizeof(*md);
++      }
 +      if (gbp->dont_learn)
 +              md->gbp |= VXLAN_GBP_DONT_LEARN;
 +
 +      if (gbp->policy_applied)
 +              md->gbp |= VXLAN_GBP_POLICY_APPLIED;
 +
 +      /* In flow-based mode, GBP is carried in dst_metadata */
 +      if (!(vxflags & VXLAN_F_COLLECT_METADATA))
 +              skb->mark = md->gbp;
 +out:
 +      unparsed->vx_flags &= ~VXLAN_GBP_USED_BITS;
  }
  
 -static void vxlan_rcv(struct vxlan_sock *vs, struct sk_buff *skb,
 -                    struct vxlan_metadata *md, u32 vni,
 -                    struct metadata_dst *tun_dst)
 +static bool vxlan_set_mac(struct vxlan_dev *vxlan,
 +                        struct vxlan_sock *vs,
 +                        struct sk_buff *skb)
  {
 -      struct iphdr *oip = NULL;
 -      struct ipv6hdr *oip6 = NULL;
 -      struct vxlan_dev *vxlan;
 -      struct pcpu_sw_netstats *stats;
        union vxlan_addr saddr;
 -      int err = 0;
 -
 -      /* For flow based devices, map all packets to VNI 0 */
 -      if (vs->flags & VXLAN_F_COLLECT_METADATA)
 -              vni = 0;
 -
 -      /* Is this VNI defined? */
 -      vxlan = vxlan_vs_find_vni(vs, vni);
 -      if (!vxlan)
 -              goto drop;
  
        skb_reset_mac_header(skb);
 -      skb_scrub_packet(skb, !net_eq(vxlan->net, dev_net(vxlan->dev)));
        skb->protocol = eth_type_trans(skb, vxlan->dev);
        skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
  
@@@ -108,25 -107,7 +108,25 @@@ static int iwl_send_tx_ant_cfg(struct i
                                    sizeof(tx_ant_cmd), &tx_ant_cmd);
  }
  
- static void iwl_free_fw_paging(struct iwl_mvm *mvm)
 +static int iwl_send_rss_cfg_cmd(struct iwl_mvm *mvm)
 +{
 +      int i;
 +      struct iwl_rss_config_cmd cmd = {
 +              .flags = cpu_to_le32(IWL_RSS_ENABLE),
 +              .hash_mask = IWL_RSS_HASH_TYPE_IPV4_TCP |
 +                           IWL_RSS_HASH_TYPE_IPV4_PAYLOAD |
 +                           IWL_RSS_HASH_TYPE_IPV6_TCP |
 +                           IWL_RSS_HASH_TYPE_IPV6_PAYLOAD,
 +      };
 +
 +      for (i = 0; i < ARRAY_SIZE(cmd.indirection_table); i++)
 +              cmd.indirection_table[i] = i % mvm->trans->num_rx_queues;
 +      memcpy(cmd.secret_key, mvm->secret_key, ARRAY_SIZE(cmd.secret_key));
 +
 +      return iwl_mvm_send_cmd_pdu(mvm, RSS_CONFIG_CMD, 0, sizeof(cmd), &cmd);
 +}
 +
+ void iwl_free_fw_paging(struct iwl_mvm *mvm)
  {
        int i;
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -321,12 -292,9 +321,15 @@@ enum bpf_func_id 
  /* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */
  #define BPF_F_TUNINFO_IPV6            (1ULL << 0)
  
 +/* BPF_FUNC_get_stackid flags. */
 +#define BPF_F_SKIP_FIELD_MASK         0xffULL
 +#define BPF_F_USER_STACK              (1ULL << 8)
 +#define BPF_F_FAST_STACK_CMP          (1ULL << 9)
 +#define BPF_F_REUSE_STACKID           (1ULL << 10)
 +
+ /* BPF_FUNC_skb_set_tunnel_key flags. */
+ #define BPF_F_ZERO_CSUM_TX            (1ULL << 1)
  /* user accessible mirror of in-kernel sk_buff.
   * new fields can only be added to the end of this structure
   */
Simple merge
Simple merge
Simple merge
diff --cc net/ipv4/igmp.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc net/ipv6/udp.c
Simple merge
@@@ -316,18 -290,8 +316,18 @@@ void __ieee80211_start_rx_ba_session(st
                                                false);
        }
  
 +      if (ieee80211_hw_check(&local->hw, SUPPORTS_REORDERING_BUFFER)) {
 +              ret = drv_ampdu_action(local, sta->sdata, &params);
 +              ht_dbg(sta->sdata,
 +                     "Rx A-MPDU request on %pM tid %d result %d\n",
 +                     sta->sta.addr, tid, ret);
 +              if (!ret)
 +                      status = WLAN_STATUS_SUCCESS;
 +              goto end;
 +      }
 +
        /* prepare A-MPDU MLME for Rx aggregation */
-       tid_agg_rx = kmalloc(sizeof(struct tid_ampdu_rx), GFP_KERNEL);
+       tid_agg_rx = kzalloc(sizeof(*tid_agg_rx), GFP_KERNEL);
        if (!tid_agg_rx)
                goto end;
  
Simple merge
Simple merge
Simple merge
diff --cc net/sctp/proc.c
Simple merge
Simple merge
@@@ -312,21 -289,15 +312,22 @@@ static void tipc_subscrb_rcv_cb(struct 
                                struct sockaddr_tipc *addr, void *usr_data,
                                void *buf, size_t len)
  {
 -      struct tipc_subscriber *subscrb = usr_data;
 -      struct tipc_subscription *sub = NULL;
 -      struct tipc_net *tn = net_generic(net, tipc_net_id);
 +      struct tipc_subscriber *subscriber = usr_data;
 +      struct tipc_subscr *s = (struct tipc_subscr *)buf;
 +      int swap;
  
 -      if (tipc_subscrp_create(net, (struct tipc_subscr *)buf, subscrb, &sub))
 -              return tipc_conn_terminate(tn->topsrv, subscrb->conid);
 +      /* Determine subscriber's endianness */
 +      swap = !(s->filter & (TIPC_SUB_PORTS | TIPC_SUB_SERVICE |
 +                            TIPC_SUB_CANCEL));
 +
 +      /* Detect & process a subscription cancellation request */
 +      if (s->filter & htohl(TIPC_SUB_CANCEL, swap)) {
 +              s->filter &= ~htohl(TIPC_SUB_CANCEL, swap);
 +              return tipc_subscrp_cancel(s, subscriber);
 +      }
  
-       tipc_subscrp_subscribe(net, s, subscriber, swap);
 -      if (sub)
 -              tipc_nametbl_subscribe(sub);
++      if (s)
++              tipc_subscrp_subscribe(net, s, subscriber, swap);
  }
  
  /* Handle one request to establish a new subscriber */
Simple merge
Simple merge
Simple merge