Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorDavid S. Miller <davem@davemloft.net>
Thu, 15 Jun 2017 15:31:37 +0000 (11:31 -0400)
committerDavid S. Miller <davem@davemloft.net>
Thu, 15 Jun 2017 15:59:32 +0000 (11:59 -0400)
The conflicts were two cases of overlapping changes in
batman-adv and the qed driver.

Signed-off-by: David S. Miller <davem@davemloft.net>
52 files changed:
1  2 
MAINTAINERS
arch/arm64/configs/defconfig
arch/arm64/net/bpf_jit_comp.c
drivers/net/bonding/bond_3ad.c
drivers/net/bonding/bond_main.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
drivers/net/ethernet/ibm/ibmvnic.c
drivers/net/ethernet/intel/i40e/i40e.h
drivers/net/ethernet/intel/i40e/i40e_ethtool.c
drivers/net/ethernet/intel/i40e/i40e_main.c
drivers/net/ethernet/intel/i40e/i40e_txrx.c
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
drivers/net/ethernet/marvell/mvpp2.c
drivers/net/ethernet/mellanox/mlx5/core/en.h
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
drivers/net/ethernet/mellanox/mlx5/core/health.c
drivers/net/ethernet/mellanox/mlx5/core/main.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/geneve.c
drivers/net/hyperv/hyperv_net.h
drivers/net/hyperv/netvsc_drv.c
drivers/net/ipvlan/ipvlan_main.c
drivers/net/macsec.c
drivers/net/macvlan.c
drivers/net/phy/Kconfig
drivers/net/phy/phy.c
drivers/net/team/team.c
drivers/net/tun.c
drivers/net/usb/r8152.c
drivers/net/vxlan.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
drivers/net/wireless/marvell/mwifiex/main.c
drivers/net/wireless/quantenna/qtnfmac/core.c
drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
include/linux/netdevice.h
kernel/events/core.c
net/8021q/vlan_dev.c
net/batman-adv/distributed-arp-table.c
net/batman-adv/routing.c
net/caif/caif_socket.c
net/core/dev.c
net/core/rtnetlink.c
net/ipv4/icmp.c
net/ipv4/ipmr.c
net/ipv6/route.c
net/mac80211/cfg.c
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/mlme.c
net/mac80211/rx.c
net/sctp/socket.c

diff --cc MAINTAINERS
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -312,8 -293,17 +308,11 @@@ static void poll_health(unsigned long d
        if (in_fatal(dev) && !health->sick) {
                health->sick = true;
                print_health_info(dev);
 -              spin_lock(&health->wq_lock);
 -              if (!test_bit(MLX5_DROP_NEW_HEALTH_WORK, &health->flags))
 -                      queue_work(health->wq, &health->work);
 -              else
 -                      dev_err(&dev->pdev->dev,
 -                              "new health works are not permitted at this stage\n");
 -              spin_unlock(&health->wq_lock);
 +              mlx5_trigger_health_work(dev);
        }
+ out:
+       mod_timer(&health->timer, get_next_poll_jiffies());
  }
  
  void mlx5_start_health_poll(struct mlx5_core_dev *dev)
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index c5ac252,0000000..f053532
mode 100644,000000..100644
--- /dev/null
@@@ -1,618 -1,0 +1,618 @@@
-       dev->destructor = free_netdev;
 +/*
 + * Copyright (c) 2015-2016 Quantenna Communications, Inc.
 + * All rights reserved.
 + *
 + * This program is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU General Public License
 + * as published by the Free Software Foundation; either version 2
 + * of the License, or (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + */
 +
 +#include <linux/kernel.h>
 +#include <linux/module.h>
 +#include <linux/if_ether.h>
 +
 +#include "core.h"
 +#include "bus.h"
 +#include "trans.h"
 +#include "commands.h"
 +#include "cfg80211.h"
 +#include "event.h"
 +#include "util.h"
 +
 +#define QTNF_DMP_MAX_LEN 48
 +#define QTNF_PRIMARY_VIF_IDX  0
 +
 +struct qtnf_frame_meta_info {
 +      u8 magic_s;
 +      u8 ifidx;
 +      u8 macid;
 +      u8 magic_e;
 +} __packed;
 +
 +struct qtnf_wmac *qtnf_core_get_mac(const struct qtnf_bus *bus, u8 macid)
 +{
 +      struct qtnf_wmac *mac = NULL;
 +
 +      if (unlikely(macid >= QTNF_MAX_MAC)) {
 +              pr_err("invalid MAC index %u\n", macid);
 +              return NULL;
 +      }
 +
 +      mac = bus->mac[macid];
 +
 +      if (unlikely(!mac)) {
 +              pr_err("MAC%u: not initialized\n", macid);
 +              return NULL;
 +      }
 +
 +      return mac;
 +}
 +
 +/* Netdev handler for open.
 + */
 +static int qtnf_netdev_open(struct net_device *ndev)
 +{
 +      netif_carrier_off(ndev);
 +      qtnf_netdev_updown(ndev, 1);
 +      return 0;
 +}
 +
 +/* Netdev handler for close.
 + */
 +static int qtnf_netdev_close(struct net_device *ndev)
 +{
 +      netif_carrier_off(ndev);
 +      qtnf_virtual_intf_cleanup(ndev);
 +      qtnf_netdev_updown(ndev, 0);
 +      return 0;
 +}
 +
 +/* Netdev handler for data transmission.
 + */
 +static int
 +qtnf_netdev_hard_start_xmit(struct sk_buff *skb, struct net_device *ndev)
 +{
 +      struct qtnf_vif *vif;
 +      struct qtnf_wmac *mac;
 +
 +      vif = qtnf_netdev_get_priv(ndev);
 +
 +      if (unlikely(skb->dev != ndev)) {
 +              pr_err_ratelimited("invalid skb->dev");
 +              dev_kfree_skb_any(skb);
 +              return 0;
 +      }
 +
 +      if (unlikely(vif->wdev.iftype == NL80211_IFTYPE_UNSPECIFIED)) {
 +              pr_err_ratelimited("%s: VIF not initialized\n", ndev->name);
 +              dev_kfree_skb_any(skb);
 +              return 0;
 +      }
 +
 +      mac = vif->mac;
 +      if (unlikely(!mac)) {
 +              pr_err_ratelimited("%s: NULL mac pointer", ndev->name);
 +              dev_kfree_skb_any(skb);
 +              return 0;
 +      }
 +
 +      if (!skb->len || (skb->len > ETH_FRAME_LEN)) {
 +              pr_err_ratelimited("%s: invalid skb len %d\n", ndev->name,
 +                                 skb->len);
 +              dev_kfree_skb_any(skb);
 +              ndev->stats.tx_dropped++;
 +              return 0;
 +      }
 +
 +      /* tx path is enabled: reset vif timeout */
 +      vif->cons_tx_timeout_cnt = 0;
 +
 +      return qtnf_bus_data_tx(mac->bus, skb);
 +}
 +
 +/* Netdev handler for getting stats.
 + */
 +static struct net_device_stats *qtnf_netdev_get_stats(struct net_device *dev)
 +{
 +      return &dev->stats;
 +}
 +
 +/* Netdev handler for transmission timeout.
 + */
 +static void qtnf_netdev_tx_timeout(struct net_device *ndev)
 +{
 +      struct qtnf_vif *vif = qtnf_netdev_get_priv(ndev);
 +      struct qtnf_wmac *mac;
 +      struct qtnf_bus *bus;
 +
 +      if (unlikely(!vif || !vif->mac || !vif->mac->bus))
 +              return;
 +
 +      mac = vif->mac;
 +      bus = mac->bus;
 +
 +      pr_warn("VIF%u.%u: Tx timeout- %lu\n", mac->macid, vif->vifid, jiffies);
 +
 +      qtnf_bus_data_tx_timeout(bus, ndev);
 +      ndev->stats.tx_errors++;
 +
 +      if (++vif->cons_tx_timeout_cnt > QTNF_TX_TIMEOUT_TRSHLD) {
 +              pr_err("Tx timeout threshold exceeded !\n");
 +              pr_err("schedule interface %s reset !\n", netdev_name(ndev));
 +              queue_work(bus->workqueue, &vif->reset_work);
 +      }
 +}
 +
 +/* Network device ops handlers */
 +const struct net_device_ops qtnf_netdev_ops = {
 +      .ndo_open = qtnf_netdev_open,
 +      .ndo_stop = qtnf_netdev_close,
 +      .ndo_start_xmit = qtnf_netdev_hard_start_xmit,
 +      .ndo_tx_timeout = qtnf_netdev_tx_timeout,
 +      .ndo_get_stats = qtnf_netdev_get_stats,
 +};
 +
 +static int qtnf_mac_init_single_band(struct wiphy *wiphy,
 +                                   struct qtnf_wmac *mac,
 +                                   enum nl80211_band band)
 +{
 +      int ret;
 +
 +      wiphy->bands[band] = kzalloc(sizeof(*wiphy->bands[band]), GFP_KERNEL);
 +      if (!wiphy->bands[band])
 +              return -ENOMEM;
 +
 +      wiphy->bands[band]->band = band;
 +
 +      ret = qtnf_cmd_get_mac_chan_info(mac, wiphy->bands[band]);
 +      if (ret) {
 +              pr_err("MAC%u: band %u: failed to get chans info: %d\n",
 +                     mac->macid, band, ret);
 +              return ret;
 +      }
 +
 +      qtnf_band_init_rates(wiphy->bands[band]);
 +      qtnf_band_setup_htvht_caps(&mac->macinfo, wiphy->bands[band]);
 +
 +      return 0;
 +}
 +
 +static int qtnf_mac_init_bands(struct qtnf_wmac *mac)
 +{
 +      struct wiphy *wiphy = priv_to_wiphy(mac);
 +      int ret = 0;
 +
 +      if (mac->macinfo.bands_cap & QLINK_BAND_2GHZ) {
 +              ret = qtnf_mac_init_single_band(wiphy, mac, NL80211_BAND_2GHZ);
 +              if (ret)
 +                      goto out;
 +      }
 +
 +      if (mac->macinfo.bands_cap & QLINK_BAND_5GHZ) {
 +              ret = qtnf_mac_init_single_band(wiphy, mac, NL80211_BAND_5GHZ);
 +              if (ret)
 +                      goto out;
 +      }
 +
 +      if (mac->macinfo.bands_cap & QLINK_BAND_60GHZ)
 +              ret = qtnf_mac_init_single_band(wiphy, mac, NL80211_BAND_60GHZ);
 +
 +out:
 +      return ret;
 +}
 +
 +struct qtnf_vif *qtnf_mac_get_free_vif(struct qtnf_wmac *mac)
 +{
 +      struct qtnf_vif *vif;
 +      int i;
 +
 +      for (i = 0; i < QTNF_MAX_INTF; i++) {
 +              vif = &mac->iflist[i];
 +              if (vif->wdev.iftype == NL80211_IFTYPE_UNSPECIFIED)
 +                      return vif;
 +      }
 +
 +      return NULL;
 +}
 +
 +struct qtnf_vif *qtnf_mac_get_base_vif(struct qtnf_wmac *mac)
 +{
 +      struct qtnf_vif *vif;
 +
 +      vif = &mac->iflist[QTNF_PRIMARY_VIF_IDX];
 +
 +      if (vif->wdev.iftype == NL80211_IFTYPE_UNSPECIFIED)
 +              return NULL;
 +
 +      return vif;
 +}
 +
 +static void qtnf_vif_reset_handler(struct work_struct *work)
 +{
 +      struct qtnf_vif *vif = container_of(work, struct qtnf_vif, reset_work);
 +
 +      rtnl_lock();
 +
 +      if (vif->wdev.iftype == NL80211_IFTYPE_UNSPECIFIED) {
 +              rtnl_unlock();
 +              return;
 +      }
 +
 +      /* stop tx completely */
 +      netif_tx_stop_all_queues(vif->netdev);
 +      if (netif_carrier_ok(vif->netdev))
 +              netif_carrier_off(vif->netdev);
 +
 +      qtnf_cfg80211_vif_reset(vif);
 +
 +      rtnl_unlock();
 +}
 +
 +static void qtnf_mac_init_primary_intf(struct qtnf_wmac *mac)
 +{
 +      struct qtnf_vif *vif = &mac->iflist[QTNF_PRIMARY_VIF_IDX];
 +
 +      vif->wdev.iftype = NL80211_IFTYPE_AP;
 +      vif->bss_priority = QTNF_DEF_BSS_PRIORITY;
 +      vif->wdev.wiphy = priv_to_wiphy(mac);
 +      INIT_WORK(&vif->reset_work, qtnf_vif_reset_handler);
 +      vif->cons_tx_timeout_cnt = 0;
 +}
 +
 +static struct qtnf_wmac *qtnf_core_mac_alloc(struct qtnf_bus *bus,
 +                                           unsigned int macid)
 +{
 +      struct wiphy *wiphy;
 +      struct qtnf_wmac *mac;
 +      unsigned int i;
 +
 +      wiphy = qtnf_wiphy_allocate(bus);
 +      if (!wiphy)
 +              return ERR_PTR(-ENOMEM);
 +
 +      mac = wiphy_priv(wiphy);
 +
 +      mac->macid = macid;
 +      mac->bus = bus;
 +
 +      for (i = 0; i < QTNF_MAX_INTF; i++) {
 +              memset(&mac->iflist[i], 0, sizeof(struct qtnf_vif));
 +              mac->iflist[i].wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
 +              mac->iflist[i].mac = mac;
 +              mac->iflist[i].vifid = i;
 +              qtnf_sta_list_init(&mac->iflist[i].sta_list);
 +      }
 +
 +      qtnf_mac_init_primary_intf(mac);
 +      bus->mac[macid] = mac;
 +
 +      return mac;
 +}
 +
 +int qtnf_core_net_attach(struct qtnf_wmac *mac, struct qtnf_vif *vif,
 +                       const char *name, unsigned char name_assign_type,
 +                       enum nl80211_iftype iftype)
 +{
 +      struct wiphy *wiphy = priv_to_wiphy(mac);
 +      struct net_device *dev;
 +      void *qdev_vif;
 +      int ret;
 +
 +      dev = alloc_netdev_mqs(sizeof(struct qtnf_vif *), name,
 +                             name_assign_type, ether_setup, 1, 1);
 +      if (!dev) {
 +              memset(&vif->wdev, 0, sizeof(vif->wdev));
 +              vif->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
 +              return -ENOMEM;
 +      }
 +
 +      vif->netdev = dev;
 +
 +      dev->netdev_ops = &qtnf_netdev_ops;
++      dev->needs_free_netdev = true;
 +      dev_net_set(dev, wiphy_net(wiphy));
 +      dev->ieee80211_ptr = &vif->wdev;
 +      dev->ieee80211_ptr->iftype = iftype;
 +      ether_addr_copy(dev->dev_addr, vif->mac_addr);
 +      SET_NETDEV_DEV(dev, wiphy_dev(wiphy));
 +      dev->flags |= IFF_BROADCAST | IFF_MULTICAST;
 +      dev->watchdog_timeo = QTNF_DEF_WDOG_TIMEOUT;
 +      dev->tx_queue_len = 100;
 +
 +      qdev_vif = netdev_priv(dev);
 +      *((void **)qdev_vif) = vif;
 +
 +      SET_NETDEV_DEV(dev, mac->bus->dev);
 +
 +      ret = register_netdevice(dev);
 +      if (ret) {
 +              free_netdev(dev);
 +              vif->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
 +      }
 +
 +      return ret;
 +}
 +
 +static void qtnf_core_mac_detach(struct qtnf_bus *bus, unsigned int macid)
 +{
 +      struct qtnf_wmac *mac;
 +      struct wiphy *wiphy;
 +      struct qtnf_vif *vif;
 +      unsigned int i;
 +      enum nl80211_band band;
 +
 +      mac = bus->mac[macid];
 +
 +      if (!mac)
 +              return;
 +
 +      wiphy = priv_to_wiphy(mac);
 +
 +      for (i = 0; i < QTNF_MAX_INTF; i++) {
 +              vif = &mac->iflist[i];
 +              rtnl_lock();
 +              if (vif->netdev &&
 +                  vif->wdev.iftype != NL80211_IFTYPE_UNSPECIFIED) {
 +                      qtnf_virtual_intf_cleanup(vif->netdev);
 +                      qtnf_del_virtual_intf(wiphy, &vif->wdev);
 +              }
 +              rtnl_unlock();
 +              qtnf_sta_list_free(&vif->sta_list);
 +      }
 +
 +      if (mac->wiphy_registered)
 +              wiphy_unregister(wiphy);
 +
 +      for (band = NL80211_BAND_2GHZ; band < NUM_NL80211_BANDS; ++band) {
 +              if (!wiphy->bands[band])
 +                      continue;
 +
 +              kfree(wiphy->bands[band]->channels);
 +              wiphy->bands[band]->n_channels = 0;
 +
 +              kfree(wiphy->bands[band]);
 +              wiphy->bands[band] = NULL;
 +      }
 +
 +      kfree(mac->macinfo.limits);
 +      kfree(wiphy->iface_combinations);
 +      wiphy_free(wiphy);
 +      bus->mac[macid] = NULL;
 +}
 +
 +static int qtnf_core_mac_attach(struct qtnf_bus *bus, unsigned int macid)
 +{
 +      struct qtnf_wmac *mac;
 +      struct qtnf_vif *vif;
 +      int ret;
 +
 +      if (!(bus->hw_info.mac_bitmap & BIT(macid))) {
 +              pr_info("MAC%u is not active in FW\n", macid);
 +              return 0;
 +      }
 +
 +      mac = qtnf_core_mac_alloc(bus, macid);
 +      if (IS_ERR(mac)) {
 +              pr_err("MAC%u allocation failed\n", macid);
 +              return PTR_ERR(mac);
 +      }
 +
 +      ret = qtnf_cmd_get_mac_info(mac);
 +      if (ret) {
 +              pr_err("MAC%u: failed to get info\n", macid);
 +              goto error;
 +      }
 +
 +      vif = qtnf_mac_get_base_vif(mac);
 +      if (!vif) {
 +              pr_err("MAC%u: primary VIF is not ready\n", macid);
 +              ret = -EFAULT;
 +              goto error;
 +      }
 +
 +      ret = qtnf_cmd_send_add_intf(vif, NL80211_IFTYPE_AP, vif->mac_addr);
 +      if (ret) {
 +              pr_err("MAC%u: failed to add VIF\n", macid);
 +              goto error;
 +      }
 +
 +      ret = qtnf_cmd_send_get_phy_params(mac);
 +      if (ret) {
 +              pr_err("MAC%u: failed to get PHY settings\n", macid);
 +              goto error;
 +      }
 +
 +      ret = qtnf_mac_init_bands(mac);
 +      if (ret) {
 +              pr_err("MAC%u: failed to init bands\n", macid);
 +              goto error;
 +      }
 +
 +      ret = qtnf_wiphy_register(&bus->hw_info, mac);
 +      if (ret) {
 +              pr_err("MAC%u: wiphy registration failed\n", macid);
 +              goto error;
 +      }
 +
 +      mac->wiphy_registered = 1;
 +
 +      rtnl_lock();
 +
 +      ret = qtnf_core_net_attach(mac, vif, "wlan%d", NET_NAME_ENUM,
 +                                 NL80211_IFTYPE_AP);
 +      rtnl_unlock();
 +
 +      if (ret) {
 +              pr_err("MAC%u: failed to attach netdev\n", macid);
 +              vif->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
 +              vif->netdev = NULL;
 +              goto error;
 +      }
 +
 +      pr_debug("MAC%u initialized\n", macid);
 +
 +      return 0;
 +
 +error:
 +      qtnf_core_mac_detach(bus, macid);
 +      return ret;
 +}
 +
 +int qtnf_core_attach(struct qtnf_bus *bus)
 +{
 +      unsigned int i;
 +      int ret;
 +
 +      qtnf_trans_init(bus);
 +
 +      bus->fw_state = QTNF_FW_STATE_BOOT_DONE;
 +      qtnf_bus_data_rx_start(bus);
 +
 +      bus->workqueue = alloc_ordered_workqueue("QTNF_BUS", 0);
 +      if (!bus->workqueue) {
 +              pr_err("failed to alloc main workqueue\n");
 +              ret = -ENOMEM;
 +              goto error;
 +      }
 +
 +      INIT_WORK(&bus->event_work, qtnf_event_work_handler);
 +
 +      ret = qtnf_cmd_send_init_fw(bus);
 +      if (ret) {
 +              pr_err("failed to init FW: %d\n", ret);
 +              goto error;
 +      }
 +
 +      bus->fw_state = QTNF_FW_STATE_ACTIVE;
 +
 +      ret = qtnf_cmd_get_hw_info(bus);
 +      if (ret) {
 +              pr_err("failed to get HW info: %d\n", ret);
 +              goto error;
 +      }
 +
 +      if (bus->hw_info.ql_proto_ver != QLINK_PROTO_VER) {
 +              pr_err("qlink version mismatch %u != %u\n",
 +                     QLINK_PROTO_VER, bus->hw_info.ql_proto_ver);
 +              ret = -EPROTONOSUPPORT;
 +              goto error;
 +      }
 +
 +      if (bus->hw_info.num_mac > QTNF_MAX_MAC) {
 +              pr_err("no support for number of MACs=%u\n",
 +                     bus->hw_info.num_mac);
 +              ret = -ERANGE;
 +              goto error;
 +      }
 +
 +      for (i = 0; i < bus->hw_info.num_mac; i++) {
 +              ret = qtnf_core_mac_attach(bus, i);
 +
 +              if (ret) {
 +                      pr_err("MAC%u: attach failed: %d\n", i, ret);
 +                      goto error;
 +              }
 +      }
 +
 +      return 0;
 +
 +error:
 +      qtnf_core_detach(bus);
 +
 +      return ret;
 +}
 +EXPORT_SYMBOL_GPL(qtnf_core_attach);
 +
 +void qtnf_core_detach(struct qtnf_bus *bus)
 +{
 +      unsigned int macid;
 +
 +      qtnf_bus_data_rx_stop(bus);
 +
 +      for (macid = 0; macid < QTNF_MAX_MAC; macid++)
 +              qtnf_core_mac_detach(bus, macid);
 +
 +      if (bus->fw_state == QTNF_FW_STATE_ACTIVE)
 +              qtnf_cmd_send_deinit_fw(bus);
 +
 +      bus->fw_state = QTNF_FW_STATE_DEAD;
 +
 +      if (bus->workqueue) {
 +              flush_workqueue(bus->workqueue);
 +              destroy_workqueue(bus->workqueue);
 +      }
 +
 +      qtnf_trans_free(bus);
 +}
 +EXPORT_SYMBOL_GPL(qtnf_core_detach);
 +
 +static inline int qtnf_is_frame_meta_magic_valid(struct qtnf_frame_meta_info *m)
 +{
 +      return m->magic_s == 0xAB && m->magic_e == 0xBA;
 +}
 +
 +struct net_device *qtnf_classify_skb(struct qtnf_bus *bus, struct sk_buff *skb)
 +{
 +      struct qtnf_frame_meta_info *meta;
 +      struct net_device *ndev = NULL;
 +      struct qtnf_wmac *mac;
 +      struct qtnf_vif *vif;
 +
 +      meta = (struct qtnf_frame_meta_info *)
 +              (skb_tail_pointer(skb) - sizeof(*meta));
 +
 +      if (unlikely(!qtnf_is_frame_meta_magic_valid(meta))) {
 +              pr_err_ratelimited("invalid magic 0x%x:0x%x\n",
 +                                 meta->magic_s, meta->magic_e);
 +              goto out;
 +      }
 +
 +      if (unlikely(meta->macid >= QTNF_MAX_MAC)) {
 +              pr_err_ratelimited("invalid mac(%u)\n", meta->macid);
 +              goto out;
 +      }
 +
 +      if (unlikely(meta->ifidx >= QTNF_MAX_INTF)) {
 +              pr_err_ratelimited("invalid vif(%u)\n", meta->ifidx);
 +              goto out;
 +      }
 +
 +      mac = bus->mac[meta->macid];
 +
 +      if (unlikely(!mac)) {
 +              pr_err_ratelimited("mac(%d) does not exist\n", meta->macid);
 +              goto out;
 +      }
 +
 +      vif = &mac->iflist[meta->ifidx];
 +
 +      if (unlikely(vif->wdev.iftype == NL80211_IFTYPE_UNSPECIFIED)) {
 +              pr_err_ratelimited("vif(%u) does not exists\n", meta->ifidx);
 +              goto out;
 +      }
 +
 +      ndev = vif->netdev;
 +
 +      if (unlikely(!ndev)) {
 +              pr_err_ratelimited("netdev for wlan%u.%u does not exists\n",
 +                                 meta->macid, meta->ifidx);
 +              goto out;
 +      }
 +
 +      __skb_trim(skb, skb->len - sizeof(*meta));
 +
 +out:
 +      return ndev;
 +}
 +EXPORT_SYMBOL_GPL(qtnf_classify_skb);
 +
 +MODULE_AUTHOR("Quantenna Communications");
 +MODULE_DESCRIPTION("Quantenna 802.11 wireless LAN FullMAC driver.");
 +MODULE_LICENSE("GPL");
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -985,9 -985,9 +985,9 @@@ int batadv_recv_unicast_packet(struct s
                        batadv_orig_node_put(orig_node_gw);
                        if (is_gw) {
                                batadv_dbg(BATADV_DBG_BLA, bat_priv,
 -                                         "recv_unicast_packet(): Dropped unicast pkt received from another backbone gw %pM.\n",
 -                                         orig_addr_gw);
 +                                         "%s(): Dropped unicast pkt received from another backbone gw %pM.\n",
 +                                         __func__, orig_addr_gw);
-                               return NET_RX_DROP;
+                               goto free_skb;
                        }
                }
  
Simple merge
diff --cc net/core/dev.c
Simple merge
Simple merge
diff --cc net/ipv4/icmp.c
Simple merge
diff --cc net/ipv4/ipmr.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge