Netdev List
 help / color / mirror / Atom feed
* [PATCH net-next v3 3/4] enetc: Add ENETC PF level external MDIO support
From: Claudiu Manoil @ 2019-02-22 15:04 UTC (permalink / raw)
  To: Shawn Guo, Li Yang, David S . Miller
  Cc: alexandru.marginean, linux-arm-kernel, devicetree, netdev,
	linux-kernel
In-Reply-To: <1550847859-17346-1-git-send-email-claudiu.manoil@nxp.com>

Each ENETC PF has its own MDIO interface, the corresponding
MDIO registers are mapped in the ENETC's Port register block.
The current patch adds a driver for these PF level MDIO buses,
so that each PF can manage directly its own external link.

Signed-off-by: Alex Marginean <alexandru.marginean@nxp.com>
Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com>
---
v2 - used readx_poll_timeout()
   - added mdio node child to the port node
   - added code comments, removed redundant err messages,
     minor code cleanup
v3 - replaced dev_err w/ dev_dbg for read() issues

 drivers/net/ethernet/freescale/enetc/Makefile     |   3 +-
 drivers/net/ethernet/freescale/enetc/enetc_mdio.c | 199 ++++++++++++++++++++++
 drivers/net/ethernet/freescale/enetc/enetc_pf.c   |  12 ++
 drivers/net/ethernet/freescale/enetc/enetc_pf.h   |   6 +
 4 files changed, 219 insertions(+), 1 deletion(-)
 create mode 100644 drivers/net/ethernet/freescale/enetc/enetc_mdio.c

diff --git a/drivers/net/ethernet/freescale/enetc/Makefile b/drivers/net/ethernet/freescale/enetc/Makefile
index 6976602..7139e41 100644
--- a/drivers/net/ethernet/freescale/enetc/Makefile
+++ b/drivers/net/ethernet/freescale/enetc/Makefile
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 obj-$(CONFIG_FSL_ENETC) += fsl-enetc.o
-fsl-enetc-$(CONFIG_FSL_ENETC) += enetc.o enetc_cbdr.o enetc_ethtool.o
+fsl-enetc-$(CONFIG_FSL_ENETC) += enetc.o enetc_cbdr.o enetc_ethtool.o \
+				 enetc_mdio.o
 fsl-enetc-$(CONFIG_PCI_IOV) += enetc_msg.o
 fsl-enetc-objs := enetc_pf.o $(fsl-enetc-y)
 
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_mdio.c b/drivers/net/ethernet/freescale/enetc/enetc_mdio.c
new file mode 100644
index 0000000..77b9cd1
--- /dev/null
+++ b/drivers/net/ethernet/freescale/enetc/enetc_mdio.c
@@ -0,0 +1,199 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/* Copyright 2019 NXP */
+
+#include <linux/mdio.h>
+#include <linux/of_mdio.h>
+#include <linux/iopoll.h>
+#include <linux/of.h>
+
+#include "enetc_pf.h"
+
+struct enetc_mdio_regs {
+	u32	mdio_cfg;	/* MDIO configuration and status */
+	u32	mdio_ctl;	/* MDIO control */
+	u32	mdio_data;	/* MDIO data */
+	u32	mdio_addr;	/* MDIO address */
+};
+
+#define bus_to_enetc_regs(bus)	(struct enetc_mdio_regs __iomem *)((bus)->priv)
+
+#define ENETC_MDIO_REG_OFFSET	0x1c00
+#define ENETC_MDC_DIV		258
+
+#define MDIO_CFG_CLKDIV(x)	((((x) >> 1) & 0xff) << 8)
+#define MDIO_CFG_BSY		BIT(0)
+#define MDIO_CFG_RD_ER		BIT(1)
+#define MDIO_CFG_ENC45		BIT(6)
+ /* external MDIO only - driven on neg MDC edge */
+#define MDIO_CFG_NEG		BIT(23)
+
+#define MDIO_CTL_DEV_ADDR(x)	((x) & 0x1f)
+#define MDIO_CTL_PORT_ADDR(x)	(((x) & 0x1f) << 5)
+#define MDIO_CTL_READ		BIT(15)
+#define MDIO_DATA(x)		((x) & 0xffff)
+
+#define TIMEOUT	1000
+static int enetc_mdio_wait_complete(struct enetc_mdio_regs __iomem *regs)
+{
+	u32 val;
+
+	return readx_poll_timeout(enetc_rd_reg, &regs->mdio_cfg, val,
+				  !(val & MDIO_CFG_BSY), 10, 10 * TIMEOUT);
+}
+
+static int enetc_mdio_write(struct mii_bus *bus, int phy_id, int regnum,
+			    u16 value)
+{
+	struct enetc_mdio_regs __iomem *regs = bus_to_enetc_regs(bus);
+	u32 mdio_ctl, mdio_cfg;
+	u16 dev_addr;
+	int ret;
+
+	mdio_cfg = MDIO_CFG_CLKDIV(ENETC_MDC_DIV) | MDIO_CFG_NEG;
+	if (regnum & MII_ADDR_C45) {
+		dev_addr = (regnum >> 16) & 0x1f;
+		mdio_cfg |= MDIO_CFG_ENC45;
+	} else {
+		/* clause 22 (ie 1G) */
+		dev_addr = regnum & 0x1f;
+		mdio_cfg &= ~MDIO_CFG_ENC45;
+	}
+
+	enetc_wr_reg(&regs->mdio_cfg, mdio_cfg);
+
+	ret = enetc_mdio_wait_complete(regs);
+	if (ret)
+		return ret;
+
+	/* set port and dev addr */
+	mdio_ctl = MDIO_CTL_PORT_ADDR(phy_id) | MDIO_CTL_DEV_ADDR(dev_addr);
+	enetc_wr_reg(&regs->mdio_ctl, mdio_ctl);
+
+	/* set the register address */
+	if (regnum & MII_ADDR_C45) {
+		enetc_wr_reg(&regs->mdio_addr, regnum & 0xffff);
+
+		ret = enetc_mdio_wait_complete(regs);
+		if (ret)
+			return ret;
+	}
+
+	/* write the value */
+	enetc_wr_reg(&regs->mdio_data, MDIO_DATA(value));
+
+	ret = enetc_mdio_wait_complete(regs);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
+static int enetc_mdio_read(struct mii_bus *bus, int phy_id, int regnum)
+{
+	struct enetc_mdio_regs __iomem *regs = bus_to_enetc_regs(bus);
+	u32 mdio_ctl, mdio_cfg;
+	u16 dev_addr, value;
+	int ret;
+
+	mdio_cfg = MDIO_CFG_CLKDIV(ENETC_MDC_DIV) | MDIO_CFG_NEG;
+	if (regnum & MII_ADDR_C45) {
+		dev_addr = (regnum >> 16) & 0x1f;
+		mdio_cfg |= MDIO_CFG_ENC45;
+	} else {
+		dev_addr = regnum & 0x1f;
+		mdio_cfg &= ~MDIO_CFG_ENC45;
+	}
+
+	enetc_wr_reg(&regs->mdio_cfg, mdio_cfg);
+
+	ret = enetc_mdio_wait_complete(regs);
+	if (ret)
+		return ret;
+
+	/* set port and device addr */
+	mdio_ctl = MDIO_CTL_PORT_ADDR(phy_id) | MDIO_CTL_DEV_ADDR(dev_addr);
+	enetc_wr_reg(&regs->mdio_ctl, mdio_ctl);
+
+	/* set the register address */
+	if (regnum & MII_ADDR_C45) {
+		enetc_wr_reg(&regs->mdio_addr, regnum & 0xffff);
+
+		ret = enetc_mdio_wait_complete(regs);
+		if (ret)
+			return ret;
+	}
+
+	/* initiate the read */
+	enetc_wr_reg(&regs->mdio_ctl, mdio_ctl | MDIO_CTL_READ);
+
+	ret = enetc_mdio_wait_complete(regs);
+	if (ret)
+		return ret;
+
+	/* return all Fs if nothing was there */
+	if (enetc_rd_reg(&regs->mdio_cfg) & MDIO_CFG_RD_ER) {
+		dev_dbg(&bus->dev,
+			"Error while reading PHY%d reg at %d.%hhu\n",
+			phy_id, dev_addr, regnum);
+		return 0xffff;
+	}
+
+	value = enetc_rd_reg(&regs->mdio_data) & 0xffff;
+
+	return value;
+}
+
+int enetc_mdio_probe(struct enetc_pf *pf)
+{
+	struct device *dev = &pf->si->pdev->dev;
+	struct enetc_mdio_regs __iomem *regs;
+	struct device_node *np;
+	struct mii_bus *bus;
+	int ret;
+
+	bus = mdiobus_alloc_size(sizeof(regs));
+	if (!bus)
+		return -ENOMEM;
+
+	bus->name = "Freescale ENETC MDIO Bus";
+	bus->read = enetc_mdio_read;
+	bus->write = enetc_mdio_write;
+	bus->parent = dev;
+	snprintf(bus->id, MII_BUS_ID_SIZE, "%s", dev_name(dev));
+
+	/* store the enetc mdio base address for this bus */
+	regs = pf->si->hw.port + ENETC_MDIO_REG_OFFSET;
+	bus->priv = regs;
+
+	np = of_get_child_by_name(dev->of_node, "mdio");
+	if (!np) {
+		dev_err(dev, "MDIO node missing\n");
+		ret = -EINVAL;
+		goto err_registration;
+	}
+
+	ret = of_mdiobus_register(bus, np);
+	if (ret) {
+		of_node_put(np);
+		dev_err(dev, "cannot register MDIO bus\n");
+		goto err_registration;
+	}
+
+	of_node_put(np);
+	pf->mdio = bus;
+
+	return 0;
+
+err_registration:
+	mdiobus_free(bus);
+
+	return ret;
+}
+
+void enetc_mdio_remove(struct enetc_pf *pf)
+{
+	if (pf->mdio) {
+		mdiobus_unregister(pf->mdio);
+		mdiobus_free(pf->mdio);
+	}
+}
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
index 7d28f5e..15876a6 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
@@ -746,6 +746,7 @@ static void enetc_pf_netdev_setup(struct enetc_si *si, struct net_device *ndev,
 
 static int enetc_of_get_phy(struct enetc_ndev_priv *priv)
 {
+	struct enetc_pf *pf = enetc_si_priv(priv->si);
 	struct device_node *np = priv->dev->of_node;
 	int err;
 
@@ -770,12 +771,22 @@ static int enetc_of_get_phy(struct enetc_ndev_priv *priv)
 		priv->phy_node = of_node_get(np);
 	}
 
+	if (!of_phy_is_fixed_link(np)) {
+		err = enetc_mdio_probe(pf);
+		if (err) {
+			of_node_put(priv->phy_node);
+			return err;
+		}
+	}
+
 	priv->if_mode = of_get_phy_mode(np);
 	if (priv->if_mode < 0) {
 		dev_err(priv->dev, "missing phy type\n");
 		of_node_put(priv->phy_node);
 		if (of_phy_is_fixed_link(np))
 			of_phy_deregister_fixed_link(np);
+		else
+			enetc_mdio_remove(pf);
 
 		return -EINVAL;
 	}
@@ -898,6 +909,7 @@ static void enetc_pf_remove(struct pci_dev *pdev)
 
 	unregister_netdev(si->ndev);
 
+	enetc_mdio_remove(pf);
 	enetc_of_put_phy(priv);
 
 	enetc_free_msix(priv);
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.h b/drivers/net/ethernet/freescale/enetc/enetc_pf.h
index 2061ae5..10dd1b5 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.h
@@ -42,8 +42,14 @@ struct enetc_pf {
 	char vlan_promisc_simap; /* bitmap of SIs in VLAN promisc mode */
 	DECLARE_BITMAP(vlan_ht_filter, ENETC_VLAN_HT_SIZE);
 	DECLARE_BITMAP(active_vlans, VLAN_N_VID);
+
+	struct mii_bus *mdio; /* saved for cleanup */
 };
 
 int enetc_msg_psi_init(struct enetc_pf *pf);
 void enetc_msg_psi_free(struct enetc_pf *pf);
 void enetc_msg_handle_rxmsg(struct enetc_pf *pf, int mbox_id, u16 *status);
+
+/* MDIO */
+int enetc_mdio_probe(struct enetc_pf *pf);
+void enetc_mdio_remove(struct enetc_pf *pf);
-- 
2.7.4


^ permalink raw reply related

* [PATCH net-next v3 4/4] dt-bindings: net: freescale: enetc: Add connection bindings for ENETC ethernet nodes
From: Claudiu Manoil @ 2019-02-22 15:04 UTC (permalink / raw)
  To: Shawn Guo, Li Yang, David S . Miller
  Cc: alexandru.marginean, linux-arm-kernel, devicetree, netdev,
	linux-kernel
In-Reply-To: <1550847859-17346-1-git-send-email-claudiu.manoil@nxp.com>

Define connection bindings (external PHY connections and internal links)
for the ENETC on-chip ethernet controllers.

Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com>
---
v3 - added this patch to the set

 .../devicetree/bindings/net/fsl-enetc.txt          | 109 +++++++++++++++++++++
 1 file changed, 109 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/net/fsl-enetc.txt

diff --git a/Documentation/devicetree/bindings/net/fsl-enetc.txt b/Documentation/devicetree/bindings/net/fsl-enetc.txt
new file mode 100644
index 0000000..2fbb998
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/fsl-enetc.txt
@@ -0,0 +1,109 @@
+* ENETC ethernet nodes - external connection bindings
+
+The ENETC ethernet controllers are PCIe integrated endpoints
+(IEPs), on-chip devices discoverable as standard PCIe endpoints,
+integrated into Freescale SoCs.  The ENETC devices are self
+contained, the information needed for device initialization
+is available in hardware (PCIe ECAM area).  However, depending
+on board design, their external connections are configurable.
+As usual for SoCs, device tree nodes may be used to define these
+external connections.  The rest of the document specifies how
+external connections for ENETC ethernet controllers may be
+defined via device tree nodes.
+
+Silicon (SoC) availability (<SoC name>: <SoC DT path/name>)
+	- LS1028A: [arch/arm64]	[...]freescale/fsl-ls1028a.dtsi
+
+
+* ENETC nodes
+
+Defined in the SoC device tree as "pci" child nodes of the
+"pci-host-ecam-generic" compatible "pcie" parent node also known
+as the Integrated Endpoint Root Complex (IERC) SoC node.
+
+Structure - example (LS1028A):
+
+	pcie@1f0000000 {
+		compatible = "pci-host-ecam-generic";
+		device_type = "pci";
+		...
+		enetc_port0: pci@0,0 {
+			reg = <0x000000 0 0 0 0>;
+		};
+		enetc_port1: pci@0,1 {
+			reg = <0x000100 0 0 0 0>;
+		};
+		...
+	}
+
+Each ENETC node has a device number and a function number (expressed
+by its "reg" property and pci node name, i.e. "pci@0,1" represents
+device number 0 and functions number 1).  Only the standard pci "reg"
+property is needed here.
+For easy reference, each ENETC node is tagged by a handle having the
+following format:
+
+	"enetc_port<idx>"   where, idx = 0 .. n-1;
+			    n - #of available ENETC nodes (Ports) on
+				the given SoC.
+
+NOTES
+i. The SoC H/W Reference Manual provides a mapping of the ENETC Port
+numbers to the PCIe Device Number/ Function Number.
+Example (LS1028):
+	All ENETC PFs (PCIe Physical Functions) have Device Number 0.
+	Port 0 - PF0 (pci@0,0)
+	Port 1 - PF1 (pci@0,1)
+	Port 2 - PF2 (pci@0,2)
+	Port 3 - PF6 (pci@0,6)
+
+ii. The SoC H/W Reference Manual also defines which ENETC Ports may have
+external connections (external ports) and which ones are internally
+connected to a on-chip L2 switch for instance (internal ports).
+
+
+* Defining connections for ENETC nodes
+
+To define external connections for the external ENETC Ports on a given
+board/platform, the board device tree should include the SoC device tree
+and reference the external ports by their "enetc_port<idx>" handle.
+
+Following cases arise, defining all possible connection bindings:
+
+1) The ENETC Port is connected to a MDIO configurable PHY:
+
+	In this case, the ENETC node should include a "mdio" sub-node
+	that in turn should contain the "phy" node describing the
+	external phy.  ENETC Port node structure (example):
+
+	&enetc_port0 {
+		phy-handle = <&sgmii_phy0>;
+		phy-connection-type = "sgmii";
+
+		mdio {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			sgmii_phy0: ethernet-phy@2 {
+				reg = <0x2>;
+			};
+		};
+	};
+
+	All properties are mandatory for this case, their bindings already
+	defined (see ethernet.txt and phy.txt).
+
+2) The ENETC Port has a fixed-link connection:
+
+	In this case, the ENETC Port node defines a fixed link connection,
+	with the following structure (example):
+
+	&enetc_port2 {
+		fixed-link {
+			speed = <1000>;
+			full-duplex;
+		};
+	};
+
+	The "fixed-link" node properties are standard (as defined in
+	fixed-link.txt).
+	This connection type also applies to the internal ENETC Ports.
-- 
2.7.4


^ permalink raw reply related

* Re: [PATCH bpf v2] bpf, lpm: fix lookup bug in map_delete_elem
From: Craig Gallek @ 2019-02-22 15:03 UTC (permalink / raw)
  To: Alban Crequy
  Cc: Alexei Starovoitov, Daniel Borkmann, Martin KaFai Lau, netdev,
	LKML, alban, iago
In-Reply-To: <20190222131908.6207-1-alban@kinvolk.io>

On Fri, Feb 22, 2019 at 8:19 AM Alban Crequy <alban.crequy@gmail.com> wrote:
>
> From: Alban Crequy <alban@kinvolk.io>
>
> trie_delete_elem() was deleting an entry even though it was not matching
> if the prefixlen was correct. This patch adds a check on matchlen.
>
> Reproducer:
>
> $ sudo bpftool map create /sys/fs/bpf/mylpm type lpm_trie key 8 value 1 entries 128 name mylpm flags 1
> $ sudo bpftool map update pinned /sys/fs/bpf/mylpm key hex 10 00 00 00 aa bb cc dd value hex 01
> $ sudo bpftool map dump pinned /sys/fs/bpf/mylpm
> key: 10 00 00 00 aa bb cc dd  value: 01
> Found 1 element
> $ sudo bpftool map delete pinned /sys/fs/bpf/mylpm key hex 10 00 00 00 ff ff ff ff
> $ echo $?
> 0
> $ sudo bpftool map dump pinned /sys/fs/bpf/mylpm
> Found 0 elements
>
> A similar reproducer is added in the selftests.
>
> Without the patch:
>
> $ sudo ./tools/testing/selftests/bpf/test_lpm_map
> test_lpm_map: test_lpm_map.c:485: test_lpm_delete: Assertion `bpf_map_delete_elem(map_fd, key) == -1 && errno == ENOENT' failed.
> Aborted
>
> With the patch: test_lpm_map runs without errors.
>
> Fixes: e454cf595853 ("bpf: Implement map_delete_elem for BPF_MAP_TYPE_LPM_TRIE")
> Cc: Craig Gallek <kraig@google.com>
> Signed-off-by: Alban Crequy <alban@kinvolk.io>
>
> ---
Acked-by: Craig Gallek <kraig@google.com>

Good catch, thanks for the fix!

^ permalink raw reply

* Re: [PATCH net-next v2] ip_tunnel: Add dst_cache management lwtunnel_state of ip tunnel
From: David Ahern @ 2019-02-22 15:03 UTC (permalink / raw)
  To: wenxu, davem, netdev
In-Reply-To: <26082211-7038-f26e-a8cf-ef5767c7cd77@ucloud.cn>

On 2/21/19 11:14 PM, wenxu wrote:
> build_state in the rcu_read_lock and disable the preempt
> 
>  rcu_read_lock();
>     ops = rcu_dereference(lwtun_encaps[encap_type]);
>     if (likely(ops && ops->build_state && try_module_get(ops->owner))) {
>         found = true;
>         ret = ops->build_state(encap, family, cfg, lws, extack);
>         if (ret)
>             module_put(ops->owner);
>     }  
>     rcu_read_unlock();
> 

Missed that.

Once a reference is taken the rcu_read_lock can be dropped before
calling build_state allowing the allocations to be GFP_KERNEL.

^ permalink raw reply

* pull-request: wireless-drivers-next 2019-02-22
From: Kalle Valo @ 2019-02-22 15:01 UTC (permalink / raw)
  To: David Miller; +Cc: linux-wireless, netdev, linux-kernel

Hi Dave,

here's a pull request to net-next tree for 5.1, more info below. Do note
that the diffstat again was wrong due to the wireless-drivers merge so I
had to recreate it manually.

Please let me know if there are any problems.

Kalle

The following changes since commit d04ca383860bef90a0dab4eb397907f7f05e839e:

  mt76x0u: fix suspend/resume (2019-02-07 18:32:16 +0200)

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git tags/wireless-drivers-next-for-davem-2019-02-22

for you to fetch changes up to 5c0c4c85463461a9ea0a69c4e80849a71c6b1e24:

  Merge tag 'iwlwifi-next-for-kalle-2019-02-20' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next (2019-02-20 21:06:13 +0200)

----------------------------------------------------------------
wireless-drivers-next patches for 5.1

Most likely the last set of patches for 5.1. WPA3 support to ath10k
and qtnfmac. FTM support to iwlwifi and ath10k. And of course other
new features and bugfixes.

wireless-drivers was merged due to dependency in mt76.

Major changes:

iwlwifi

* HE radiotap

* FTM (Fine Timing Measurement) initiator and responder implementation

* bump supported firmware API to 46

* VHT extended NSS support

* new PCI IDs for 9260 and 22000 series

ath10k

* change QMI interface to support the new (and backwards incompatible)
  interface from HL3.1 and used in recent HL2.0 branch firmware
  releases

* support WPA3 with WCN3990

* support for mac80211 airtime fairness based on transmit rate
  estimation, the firmware needs to support WMI_SERVICE_PEER_STATS to
  enable this

* report transmit airtime to mac80211 with firmwares having
  WMI_SERVICE_REPORT_AIRTIME feature, this to have more accurate
  airtime fairness based on real transmit time (instead of just
  estimated from transmit rate)

* support Fine Timing Measurement (FTM) responder role

* add dynamic VLAN support with firmware having WMI_SERVICE_PER_PACKET_SW_ENCRYPT

* switch to use SPDX license identifiers

ath

* add new country codes for US

brcmfmac

* support monitor frames with the hardware/ucode header

qtnfmac

* enable WPA3 SAE and OWE support

mt76

* beacon support for USB devices (mesh+ad-hoc only)

rtlwifi

* convert to use SPDX license identifiers

libertas_tf

* get the MAC address before registering the device

----------------------------------------------------------------
Abhishek Ambure (2):
      ath10k: assign 'n_cipher_suites = 11' for WCN3990 to enable WPA3
      ath10k: update GCMP & GCMP-256 cipher suite number for WCN3990

Adrian Bunk (1):
      mwifiex: Fix NL80211_TX_POWER_LIMITED

Alagu Sankar (1):
      ath10k: reduce transmit msdu count

Andrei Otcheretianski (1):
      iwlwifi: mvm: Set TX_CMD_FLG_PROT_REQUIRE correctly

Arend van Spriel (6):
      brcmfmac: assure SSID length from firmware is limited
      brcmfmac: add subtype check for event handling in data path
      brcmfmac: create debugfs files for bus-specific layer
      brcmfmac: disable MBSS feature for bcm4330 device
      brcmfmac: check and dump trap info during sdio probe
      brcmfmac: use chipname in brcmf_fw_alloc_request() for error path as well

Arnd Bergmann (1):
      iwlwifi: fix false-positive maybe-uninitialized warning

Avigail Grinstein (1):
      iwlwifi: mvm: support absolute thresholds in bf configuration

Avraham Stern (4):
      iwlwifi: mvm: Fix possible NULL pointer dereference
      iwlwifi: mvm: add support for new FTM fw API
      iwlwifi: mvm: add debug prints for FTM
      iwlwifi: mvm: stop static queues correctly

Ben Hutchings (1):
      mt76: Use the correct hweight8() function

Brian Norris (3):
      ath10k: sdio: add .owner field
      ath10k: pci: use mutex for diagnostic window CE polling
      mwifiex: don't advertise IBSS features without FW support

Christian Lamparter (1):
      ath10k: implement set_base_macaddr to fix rx-bssid mask in multiple APs conf

Colin Ian King (2):
      rsi: fix indentation issue with a code block
      rtlwifi: rtl8192ce: fix typo, "PairwiseENcAlgorithm" -> "PairwiseEncAlgorithm"

Dan Carpenter (2):
      rsi: fix a typo in a debug message
      carl9170: clean up a clamp() call

Daniel F. Dickinson (1):
      ath9k: Avoid OF no-EEPROM quirks without qca,no-eeprom

Emmanuel Grumbach (3):
      iwlwifi: mvm: support new format for the beacon notification
      iwlwifi: mvm: fix AP mode in WEP
      iwlwifi: mvm: fix the spatial reuse parsing for HE_TRIG PPDUs

Felix Fietkau (11):
      mt76: fix software encryption issues
      mt76: mt76x2: avoid running DPD calibration if tx is blocked
      mt76: explicitly disable energy detect cca during scan
      mt76: run MAC work every 100ms
      mt76: clear CCA timer stats in mt76x02_edcca_init
      mt76: measure the time between mt76x02_edcca_check runs
      mt76: increase ED/CCA tx block threshold
      mt76: fix tx status timeout processing
      mt76: fix corrupted software generated tx CCMP PN
      mt76: fix resetting software IV flag on key delete
      mt76: mt76x2: simplify per-chain signal strength handling

Govind Singh (5):
      ath10k: Add support for extended HTT aggr msg support
      ath10k: update HOST capability qmi message
      ath10k: enable bus layer suspend/resume for WCN3990
      ath10k: disable interface pause wow config for integrated chipset
      ath10k: request credit report if flow control enabled on ep

Greg Kroah-Hartman (5):
      ath10k: do not return invalid pointers as a *dentry
      ath9k: do not return invalid pointers as a *dentry
      iwlwifi: dvm: no need to check return value of debugfs_create functions
      iwlwifi: fw: no need to check return value of debugfs_create functions
      iwlwifi: iwl-drv: no need to check return value of debugfs_create functions

Gustavo A. R. Silva (2):
      iwlwifi: eeprom-parse: use struct_size() in kzalloc()
      iwlwifi: nvm-parse: use struct_size() in kzalloc()

Haim Dreyfuss (1):
      iwlwifi: mvm: add support for 32kHz external clock indication

Ido Yariv (1):
      iwlwifi: mvm: don't require WOWLAN images when unified

Ihab Zhaika (2):
      iwlwifi: add new card for 9260 series
      iwlwifi: add new cards for 22000 and killer series and change the market name

Ilan Peer (5):
      iwiwifi: mvm: Fix FW scan concurrency support assumptions
      iwlwifi: mvm: Don't warn on command failure during restart
      iwlwifi: mvm: Do not return an error value on HW restart
      iwlwifi: mvm: Don't request HW restart if already requested
      iwlwifi: mvm: Allow retries for probe responses

Johannes Berg (17):
      iwlwifi: mvm: remove redundant condition
      iwlwifi: dvm: use %u for sscanf() into unsigned variable
      iwlwifi: mvm: add HE TB PPDU SIG-A BW to radiotap
      iwlwifi: move config structs to C file
      iwlwifi: mvm: don't hide HE radiotap data in SKB
      iwlwifi: refactor NIC init sequence
      iwlwifi: mvm: fix RFH config command with >=10 CPUs
      iwlwifi: implement BISR HW workaround for 22260 devices
      iwlwifi: mvm: support FTM responder
      iwlwifi: mvm: support FTM initiator
      iwlwifi: mvm: clean up NO_PSDU case
      iwlwifi: bump FW API to 46 for 9000 and 22000 series
      iwlwifi: mvm: fix HE radiotap data4 for HE-TB PPDUs
      iwlwifi: mvm: fix error path in iwl_mvm_mac_setup_register()
      iwlwifi: nvm-parse: advertise IEEE80211_VHT_EXT_NSS_BW_CAPABLE in VHT
      iwlwifi: mvm: remove IWL_MVM_INIT_STATUS_REG_HW_INIT_COMPLETE
      iwlwifi: mvm: implement VHT extended NSS support in rs.c

Kalle Valo (16):
      Merge tag 'iwlwifi-next-for-kalle-2019-02-04' of git://git.kernel.org/.../iwlwifi/iwlwifi-next
      Merge ath-next from git://git.kernel.org/.../kvalo/ath.git
      Merge git://git.kernel.org/.../kvalo/wireless-drivers.git
      ath10k: fix line length warning in ath10k_ce_alloc_dest_ring()
      ath10k: add missing values to wmi_service_name()
      ath10k: make wmi_service_name() warn about missing service ids
      ath10k: change wmi.h to include only ieee80211.h
      ath10k: align ath10k_htt_txbuf structures
      ath10k: fix documentation in ath10k_wow_convert_8023_to_80211()
      ath10k: copy the whole struct ath10k_bus_params in ath10k_core_register()
      Merge tag 'iwlwifi-next-for-kalle-2019-02-14' of git://git.kernel.org/.../iwlwifi/iwlwifi-next
      Merge tag 'mt76-for-kvalo-2019-02-18' of https://github.com/nbd168/wireless
      ath10k: change 'unsigned long int' to 'unsigned long'
      ath10k: switch to use SPDX license identifiers
      Merge ath-next from git://git.kernel.org/.../kvalo/ath.git
      Merge tag 'iwlwifi-next-for-kalle-2019-02-20' of git://git.kernel.org/.../iwlwifi/iwlwifi-next

Kan Yan (1):
      ath10k: report estimated frame transmit airtime to improve fairness

Kangjie Lu (1):
      ath6kl: return error code in ath6kl_wmi_set_roam_lrssi_cmd()

Kees Cook (1):
      ath9k: eeprom: Use scnprintf instead of snprintf

Keyur Patel (1):
      orinoco : Replace function name in string with __func__

Larry Finger (21):
      rtlwifi: Replace old-style license information
      rtlwifi: btcoex: Replace old-style license information
      rtlwifi: rtl8188ee: Replace old-style license information
      rtlwifi: rtl8192com: Replace old-style license information
      rtlwifi: rtl8192ce: Replace old-style license information
      rtlwifi: rtl8192cu: Replace old-style license information
      rtlwifi: rtl8192de: Replace old-style license information
      rtlwifi: rtl8192ee: Replace old-style license information
      rtlwifi: rtl8192se: Replace old-style license information
      rtlwifi: rtl8723ae: Replace old-style license information
      rtlwifi: rtl8723be: Replace old-style license information
      rtlwifi: rtl8723_common: Replace old-style license information
      rtlwifi: rtl8821ae: Replace old-style license information
      rtlwifi: Remove CamelCase variables from base code
      rtlwifi: btcoexist: Remove CamelCase variable
      rtlwifi: rtl8188ee: Remove CamelCase variable
      rtlwifi: rtl8192{c,u}: Remove CamelCase variables
      rtlwifi: rtl8188de: Remove CamelCase variables
      rtlwifi: rtl8192se: Remove CamelCase variables
      rtlwifi: rtl8723{be,ae}: Remove CamelCase variables
      rtlwifi: rtl8821ae: Remove CamelCase variables

Liad Kaufman (3):
      iwlwifi: mvm: add tlc command name to output
      iwlwifi: mvm: config mac ctxt to HE before TLC
      iwlwifi: mvm: add read debugfs for he_sniffer_params

Lorenzo Bianconi (21):
      mt76x0: eeprom: fix VHT mcs{8,9} rate power offset
      mt76: move mt76_mcu_msg_alloc in mt76-core
      mt76: move mt76_mcu_get_response in mt76-core
      mt76: move mt76_mcu_rx_event in mt76-core
      mt76x0: mcu: remove useless commented configuration
      mt76: move mt76_dma_tx_queue_skb_raw in mt76-core module
      mt76: remove add_buf pointer in mt76_queue_ops
      mt76: move alloc_device common code in mt76_alloc_device
      mt76x2u: remove mt76x2u_alloc_device routine
      mt76x0: remove mt76x0u_alloc_device routine
      mt76x2: remove mt76x2_alloc_device routine
      mt76x0: phy: report target_power in debugfs
      mt76x0: init: introduce mt76x0_init_txpower routine
      mt76: usb: fix possible NULL pointer dereference in mt76u_mcu_deinit
      mt76: usb: fix possible memory leak in mt76u_buf_free
      mt76: usb: do not run mt76u_queues_deinit twice
      mt76: usb: move mt76u_check_sg in usb.c
      mt76: usb: do not use sg buffers for mcu messages
      mt76: usb: use a linear buffer for tx/rx datapath if sg is not supported
      mt76: usb: introduce disable_usb_sg parameter
      mt76: usb: use dev_err_ratelimited instead of dev_err in mt76u_complete_rx

Lubomir Rintel (7):
      libertas_tf: lower the debug level of command trace
      libertas_tf: don't set URB_ZERO_PACKET on IN USB transfer
      libertas_tf: move the banner to a more appropriate place
      libertas_tf: fix signal reporting
      libertas_tf: move hardware callbacks to a separate structure
      libertas_tf: don't defer firmware loading until start()
      libertas_tf: get the MAC address before registering the device

Luca Coelho (5):
      iwlwifi: bump FW API to 44 for 9000 and 22000 series
      iwlwifi: dvm: fix some fall through warnings
      iwlwifi: mvm: add fall through comments where needed
      iwlwifi: bump FW API to 45 for 9000 and 22000 series
      iwlwifi: start using B-step for some 9000 devices

Manikanta Pubbisetty (2):
      ath10k: add dynamic vlan support
      ath10k: report tx airtime provided by fw

Matteo Croce (1):
      brcmfmac: fix typos

Mordechay Goodstein (1):
      iwlwifi: add FW recovery flow

Naftali Goldstein (1):
      iwlwifi: mvm: add description to second BAD_COMMAND assert number

Oever Gonzalez (1):
      ath: regd: add extra US coutry codes

Pradeep Kumar Chitrapu (1):
      ath10k: add support to configure ftm responder role

Rafał Miłecki (10):
      brcmfmac: modify __brcmf_err() to take bus as a parameter
      brcmfmac: pass bus to the __brcmf_err() in pcie.c
      brcmfmac: add bphy_err() and use it in the cfg80211.c
      brcmfmac: support monitor frames with the hardware/ucode header
      brcmfmac: print firmware reported ring status errors
      brcmfmac: improve code handling bandwidth of firmware reported channels
      brcmfmac: support firmware reporting 160 MHz channels
      brcmfmac: rework bphy_err() to take struct brcmf_pub argument
      brcmfmac: use bphy_err() in all wiphy-related code
      brcmfmac: add basic validation of shared RAM address

Rakesh Pillai (7):
      ath10k: Set DMA address mask to 35 bit for WCN3990
      ath10k: Handle bundled tx completion for management frames
      ath10k: Enable bundle tx compl for management frames in WCN3990
      ath10k: fix dma unmap direction for management frames
      ath10k: fix hw-restart crash inject mode for WCN3990
      ath10k: enable Factory Test Mode for WCN3990
      ath10k: fix shadow register implementation for WCN3990

Ryder Lee (1):
      mt76: change the return type of mt76_dma_attach()

Sara Sharon (12):
      iwlwifi: mvm: simplify some return conditions
      iwlwifi: mvm: support CHANNEL_SWITCH_TIME_EVENT_CMD command
      iwlwifi: mvm: limit AMSDU size to 8K
      iwlwifi: mvm: fix RSS config command
      iwlwifi: pcie: fix emergency path
      iwlwifi: dvm: don't use IWL_DL_FW_ERRORS
      iwlwifi: pcie: add TPT oriented prints
      iwlwifi: mvm: support beacon IE injection
      iwlwifi: pcie: fix TX while flushing
      iwlwifi: mvm: reject new beacons when in inject mode
      iwlwifi: mvm: support non-transmitting AP
      iwlwifi: mvm: add some debug data to TX path

Sergey Matyukevich (2):
      qtnfmac: enable WPA3 OWE support
      qtnfmac: enable WPA3 SAE support

Shahar S Matityahu (33):
      iwlwifi dbg_ini: update ini structs doc
      iwlwifi: dbg_ini: fix iwl_fw_ini_buffer_location field enum bad naming
      iwlwifi: dbg_ini: give better naming to region struct fields
      iwlwifi: fix bad dma handling in page_mem dumping flow
      iwlwifi: differentiate between alive timeout and alive flow failure
      iwlwifi: dbg_ini: update ini triggers enum
      iwlwifi: dbg_ini: update max region id num to  support 64 regions
      iwlwifi: Fix pre operational dumping flows
      iwlwifi: dbg_ini: update ini structs meta doc
      iwlwifi: dbg_ini: remove redundant dram buffer allocation
      iwlwifi: dbg_ini: align struct iwl_fw_ini_region_cfg to the FW
      iwlwifi: dbg_ini: create new dump flow and implement prph dump
      iwlwifi: dbg_ini: implement csr memory dump
      iwlwifi: dbg_ini: implement device internal memory dump
      iwlwifi: dbg_ini: implement paging memory dump
      iwlwifi: fix send hcmd timeout recovery flow
      iwlwifi: dbg_ini: implement monitor sram memory dump
      iwlwifi: dbg_ini: implement monitor dram memory dump
      iwlwifi: receive umac and lmac error table addresses from TLVs
      iwlwifi: dbg_ini: rewrite trigger flow and align to FW API changes
      iwlwifi: mvm: add a debug_enable op
      iwlwifi: properly use delay option in dump trigger flow
      iwlwifi: dbg_ini: enable ignore consecutive trigger feature
      iwlwifi: dbg: buffer overflow in non_collect_ts_start array
      iwlwifi: dbg_ini: add early and after alive apply points to unified images
      iwlwifi: remove redundant condition from prior alive dump flow
      iwlwifi: dbg_ini: fix infinite time ignore consecutive dumps
      iwlwifi: dbg_ini: add print to iwl_dump_ini_mem in case of invalid range
      iwlwifi: dbg_ini: make memory dump get_size handler include headers
      iwlwifi: dbg_ini: make fill_range handler accept generic range pointer
      iwlwifi: dbg_ini: add region to fill_header handler
      iwlwifi: dbg_ini: implement Tx fifos dump
      iwlwifi: dbg_ini: implement Rx fifos dump

Shaul Triebitz (5):
      iwlwifi: introduce device family AX210
      iwlwifi: do not fail on large amount of channels
      iwlwifi: dbg: temporarily skip periphery dump for AX210 devices
      iwlwifi: align to new periphery address space for AX210 family
      iwlwifi: add force NMI for AX210 devices

Siva Rebbagondla (6):
      rsi: Add debug support for wowlan wakeup confirmation
      rsi: add hci detach for hibernation and poweroff
      rsi: fix wowlan wakeup issue for hibernate(S4)
      rsi: resolve power save issue after S4 resume
      rsi: fix for wowlan wakeup failure
      rsi: fix spelling mistakes

Stanislaw Gruszka (12):
      mt76x02: use mask for vifs
      mt76x02: use commmon add interface for mt76x2u
      mt76x02: initialize mutli bss mode when set up address
      mt76x02: minor beaconing init changes
      mt76x02: init beacon config for mt76x2u
      mt76: beaconing fixes for USB
      mt76x02: enable support for IBSS and MESH
      mt76x02u: use usb_bulk_msg to upload firmware
      mt76x02u: remove bogus check and comment padding
      rt2800: enable TX_PIN_CFG_LNA_PE_ bits per band
      rt2800: enable TX_PIN_CFG_RFRX_EN only for MT7620
      rt2800: comment and simplify AGC init for RT6352

Stefan Agner (1):
      mwifiex: don't print error message on coex event

Surabhi Vishnoi (2):
      ath10k: add a condition to fill the LDPC capability correctly
      ath10k: fill tx_duration for each peer in Tx stats per STA

Toke Høiland-Jørgensen (2):
      ath9k: Switch to mac80211 TXQ scheduling and airtime APIs
      ath10k: migrate to mac80211 txq scheduling

Tomislav Požega (2):
      rt2x00: remove unneeded check
      rt2x00: remove confusing AGC register

Triebitz (1):
      iwlwifi: pcie: allocate rb_stts's for all queues in one place

Wen Gong (1):
      ath10k: change swap mail box check after htc ready

Yu Wang (1):
      ath10k: fix S5 power consumption issue for QCA9377

YueHaibing (7):
      iwlwifi: mvm: remove duplicated include from ops.c
      ath10k: snoc: remove set but not used variable 'ar_snoc'
      rtlwifi: remove set but not used variable 'cmd_seq'
      brcmfmac: remove set but not used variable 'old_state'
      rsi: remove set but not used variables 'info, vif'
      libertas_tf: remove set but not used variable 'flags'
      rtl818x_pci: Remove set but not used variables 'io_addr, mem_addr'

Zhiwei Jiang (1):
      ath: move spin_lock_bh to spin_lock in tasklet

 drivers/net/wireless/ath/ath10k/Makefile           |    2 +-
 drivers/net/wireless/ath/ath10k/ahb.c              |   16 +-
 drivers/net/wireless/ath/ath10k/ahb.h              |   13 +-
 drivers/net/wireless/ath/ath10k/bmi.c              |   13 +-
 drivers/net/wireless/ath/ath10k/bmi.h              |   13 +-
 drivers/net/wireless/ath/ath10k/ce.c               |  117 ++-
 drivers/net/wireless/ath/ath10k/ce.h               |   29 +-
 drivers/net/wireless/ath/ath10k/core.c             |   45 +-
 drivers/net/wireless/ath/ath10k/core.h             |   42 +-
 drivers/net/wireless/ath/ath10k/coredump.c         |   15 +-
 drivers/net/wireless/ath/ath10k/coredump.h         |   13 +-
 drivers/net/wireless/ath/ath10k/debug.c            |   17 +-
 drivers/net/wireless/ath/ath10k/debug.h            |   33 +-
 drivers/net/wireless/ath/ath10k/debugfs_sta.c      |   23 +-
 drivers/net/wireless/ath/ath10k/hif.h              |   29 +-
 drivers/net/wireless/ath/ath10k/htc.c              |   22 +-
 drivers/net/wireless/ath/ath10k/htc.h              |   14 +-
 drivers/net/wireless/ath/ath10k/htt.c              |   15 +-
 drivers/net/wireless/ath/ath10k/htt.h              |   49 +-
 drivers/net/wireless/ath/ath10k/htt_rx.c           |  103 +-
 drivers/net/wireless/ath/ath10k/htt_tx.c           |   70 +-
 drivers/net/wireless/ath/ath10k/hw.c               |   23 +-
 drivers/net/wireless/ath/ath10k/hw.h               |   20 +-
 drivers/net/wireless/ath/ath10k/mac.c              |  249 +++--
 drivers/net/wireless/ath/ath10k/mac.h              |   13 +-
 drivers/net/wireless/ath/ath10k/p2p.c              |   13 +-
 drivers/net/wireless/ath/ath10k/p2p.h              |   13 +-
 drivers/net/wireless/ath/ath10k/pci.c              |   62 +-
 drivers/net/wireless/ath/ath10k/pci.h              |   16 +-
 drivers/net/wireless/ath/ath10k/qmi.c              |   13 +-
 drivers/net/wireless/ath/ath10k/qmi.h              |   13 +-
 drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.c     |  242 ++++-
 drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.h     |   47 +-
 drivers/net/wireless/ath/ath10k/rx_desc.h          |   13 +-
 drivers/net/wireless/ath/ath10k/sdio.c             |   59 +-
 drivers/net/wireless/ath/ath10k/sdio.h             |   13 +-
 drivers/net/wireless/ath/ath10k/snoc.c             |   93 +-
 drivers/net/wireless/ath/ath10k/snoc.h             |   15 +-
 drivers/net/wireless/ath/ath10k/spectral.c         |   16 +-
 drivers/net/wireless/ath/ath10k/spectral.h         |   13 +-
 drivers/net/wireless/ath/ath10k/swap.c             |   13 +-
 drivers/net/wireless/ath/ath10k/swap.h             |   13 +-
 drivers/net/wireless/ath/ath10k/targaddrs.h        |   13 +-
 drivers/net/wireless/ath/ath10k/testmode.c         |   15 +-
 drivers/net/wireless/ath/ath10k/testmode.h         |   13 +-
 drivers/net/wireless/ath/ath10k/testmode_i.h       |   13 +-
 drivers/net/wireless/ath/ath10k/thermal.c          |   13 +-
 drivers/net/wireless/ath/ath10k/thermal.h          |   13 +-
 drivers/net/wireless/ath/ath10k/trace.c            |   13 +-
 drivers/net/wireless/ath/ath10k/trace.h            |   13 +-
 drivers/net/wireless/ath/ath10k/txrx.c             |   19 +-
 drivers/net/wireless/ath/ath10k/txrx.h             |   13 +-
 drivers/net/wireless/ath/ath10k/usb.c              |   16 +-
 drivers/net/wireless/ath/ath10k/usb.h              |   13 +-
 drivers/net/wireless/ath/ath10k/wmi-ops.h          |   44 +-
 drivers/net/wireless/ath/ath10k/wmi-tlv.c          |   88 +-
 drivers/net/wireless/ath/ath10k/wmi-tlv.h          |   23 +-
 drivers/net/wireless/ath/ath10k/wmi.c              |   95 +-
 drivers/net/wireless/ath/ath10k/wmi.h              |   98 +-
 drivers/net/wireless/ath/ath10k/wow.c              |   20 +-
 drivers/net/wireless/ath/ath10k/wow.h              |   13 +-
 drivers/net/wireless/ath/ath6kl/wmi.c              |    4 +-
 drivers/net/wireless/ath/ath9k/ar9003_eeprom.c     |   12 +-
 drivers/net/wireless/ath/ath9k/ath9k.h             |   14 -
 drivers/net/wireless/ath/ath9k/common-spectral.c   |    3 +
 drivers/net/wireless/ath/ath9k/debug.c             |    3 -
 drivers/net/wireless/ath/ath9k/debug.h             |    8 -
 drivers/net/wireless/ath/ath9k/debug_sta.c         |   70 --
 drivers/net/wireless/ath/ath9k/htc_drv_txrx.c      |    6 +-
 drivers/net/wireless/ath/ath9k/init.c              |    9 +-
 drivers/net/wireless/ath/ath9k/recv.c              |    9 +-
 drivers/net/wireless/ath/ath9k/xmit.c              |  244 ++---
 drivers/net/wireless/ath/carl9170/rx.c             |    2 +-
 drivers/net/wireless/ath/regd.h                    |    2 +
 drivers/net/wireless/ath/regd_common.h             |    2 +
 .../wireless/broadcom/brcm80211/brcmfmac/bcdc.c    |   22 +-
 .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h |   10 +
 .../broadcom/brcm80211/brcmfmac/cfg80211.c         |  577 +++++-----
 .../wireless/broadcom/brcm80211/brcmfmac/common.c  |   46 +-
 .../wireless/broadcom/brcm80211/brcmfmac/core.c    |  135 ++-
 .../wireless/broadcom/brcm80211/brcmfmac/core.h    |    2 +-
 .../wireless/broadcom/brcm80211/brcmfmac/debug.h   |   19 +-
 .../wireless/broadcom/brcm80211/brcmfmac/feature.c |   22 +-
 .../wireless/broadcom/brcm80211/brcmfmac/feature.h |    4 +-
 .../broadcom/brcm80211/brcmfmac/firmware.c         |    8 +-
 .../wireless/broadcom/brcm80211/brcmfmac/fweh.c    |   25 +-
 .../wireless/broadcom/brcm80211/brcmfmac/fweh.h    |   18 +-
 .../wireless/broadcom/brcm80211/brcmfmac/fwil.c    |   10 +-
 .../broadcom/brcm80211/brcmfmac/fwsignal.c         |   38 +-
 .../wireless/broadcom/brcm80211/brcmfmac/msgbuf.c  |   90 +-
 .../net/wireless/broadcom/brcm80211/brcmfmac/p2p.c |   88 +-
 .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    |   65 +-
 .../net/wireless/broadcom/brcm80211/brcmfmac/pno.c |   22 +-
 .../wireless/broadcom/brcm80211/brcmfmac/proto.c   |    6 +-
 .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    |   71 +-
 .../broadcom/brcm80211/brcmfmac/tracepoint.c       |    9 +-
 .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c |    4 +-
 drivers/net/wireless/intel/iwlwifi/cfg/22000.c     |  104 +-
 drivers/net/wireless/intel/iwlwifi/cfg/9000.c      |    2 +-
 drivers/net/wireless/intel/iwlwifi/dvm/agn.h       |    9 +-
 drivers/net/wireless/intel/iwlwifi/dvm/debugfs.c   |   47 +-
 drivers/net/wireless/intel/iwlwifi/dvm/main.c      |   19 +-
 drivers/net/wireless/intel/iwlwifi/dvm/rx.c        |    6 +-
 drivers/net/wireless/intel/iwlwifi/dvm/scan.c      |    3 +-
 drivers/net/wireless/intel/iwlwifi/fw/acpi.c       |   32 +
 drivers/net/wireless/intel/iwlwifi/fw/acpi.h       |   22 +-
 drivers/net/wireless/intel/iwlwifi/fw/api/alive.h  |   48 +-
 .../net/wireless/intel/iwlwifi/fw/api/commands.h   |    5 +
 .../net/wireless/intel/iwlwifi/fw/api/dbg-tlv.h    |  180 ++--
 .../net/wireless/intel/iwlwifi/fw/api/location.h   |  191 +++-
 .../net/wireless/intel/iwlwifi/fw/api/mac-cfg.h    |   27 +
 drivers/net/wireless/intel/iwlwifi/fw/api/power.h  |   24 +-
 drivers/net/wireless/intel/iwlwifi/fw/api/scan.h   |    6 +-
 drivers/net/wireless/intel/iwlwifi/fw/api/tx.h     |   18 +-
 drivers/net/wireless/intel/iwlwifi/fw/dbg.c        | 1110 +++++++++++++++-----
 drivers/net/wireless/intel/iwlwifi/fw/dbg.h        |   85 +-
 drivers/net/wireless/intel/iwlwifi/fw/debugfs.c    |   11 +-
 drivers/net/wireless/intel/iwlwifi/fw/debugfs.h    |    9 +-
 drivers/net/wireless/intel/iwlwifi/fw/error-dump.h |   95 +-
 drivers/net/wireless/intel/iwlwifi/fw/file.h       |   25 +
 drivers/net/wireless/intel/iwlwifi/fw/img.h        |   31 +-
 drivers/net/wireless/intel/iwlwifi/fw/init.c       |    3 +
 drivers/net/wireless/intel/iwlwifi/fw/runtime.h    |   23 +-
 drivers/net/wireless/intel/iwlwifi/iwl-config.h    |   52 +-
 drivers/net/wireless/intel/iwlwifi/iwl-csr.h       |    5 +
 drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c   |   23 +-
 drivers/net/wireless/intel/iwlwifi/iwl-debug.h     |    5 +-
 drivers/net/wireless/intel/iwlwifi/iwl-drv.c       |   77 +-
 .../net/wireless/intel/iwlwifi/iwl-eeprom-parse.c  |    3 +-
 .../net/wireless/intel/iwlwifi/iwl-eeprom-read.c   |   47 +-
 drivers/net/wireless/intel/iwlwifi/iwl-io.c        |   79 +-
 drivers/net/wireless/intel/iwlwifi/iwl-io.h        |   44 +
 drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c |   31 +-
 drivers/net/wireless/intel/iwlwifi/iwl-prph.h      |    7 +-
 drivers/net/wireless/intel/iwlwifi/iwl-trans.h     |   41 +
 drivers/net/wireless/intel/iwlwifi/mvm/Makefile    |    1 +
 drivers/net/wireless/intel/iwlwifi/mvm/coex.c      |    7 +-
 drivers/net/wireless/intel/iwlwifi/mvm/constants.h |    7 +
 drivers/net/wireless/intel/iwlwifi/mvm/d3.c        |    2 +-
 drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c   |  138 ++-
 .../net/wireless/intel/iwlwifi/mvm/ftm-initiator.c |  654 ++++++++++++
 .../net/wireless/intel/iwlwifi/mvm/ftm-responder.c |  244 +++++
 drivers/net/wireless/intel/iwlwifi/mvm/fw.c        |  141 ++-
 drivers/net/wireless/intel/iwlwifi/mvm/led.c       |    3 +
 drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c  |  124 ++-
 drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c  |  292 ++++-
 drivers/net/wireless/intel/iwlwifi/mvm/mvm.h       |   61 +-
 drivers/net/wireless/intel/iwlwifi/mvm/ops.c       |   63 +-
 drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c  |    1 +
 drivers/net/wireless/intel/iwlwifi/mvm/power.c     |   23 +-
 drivers/net/wireless/intel/iwlwifi/mvm/rs.c        |   30 +-
 drivers/net/wireless/intel/iwlwifi/mvm/rx.c        |    2 +-
 drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c      |  103 +-
 drivers/net/wireless/intel/iwlwifi/mvm/scan.c      |   20 +-
 drivers/net/wireless/intel/iwlwifi/mvm/sta.c       |  152 +--
 drivers/net/wireless/intel/iwlwifi/mvm/sta.h       |    3 +
 .../net/wireless/intel/iwlwifi/mvm/time-event.c    |    2 +-
 drivers/net/wireless/intel/iwlwifi/mvm/tx.c        |   27 +-
 drivers/net/wireless/intel/iwlwifi/mvm/utils.c     |   31 +-
 .../wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c   |   16 +-
 .../net/wireless/intel/iwlwifi/pcie/ctxt-info.c    |    6 +-
 drivers/net/wireless/intel/iwlwifi/pcie/drv.c      |  115 +-
 drivers/net/wireless/intel/iwlwifi/pcie/internal.h |   30 +-
 drivers/net/wireless/intel/iwlwifi/pcie/rx.c       |  118 ++-
 .../net/wireless/intel/iwlwifi/pcie/trans-gen2.c   |   28 +-
 drivers/net/wireless/intel/iwlwifi/pcie/trans.c    |  213 ++--
 drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c  |    8 +-
 drivers/net/wireless/intel/iwlwifi/pcie/tx.c       |   30 +-
 drivers/net/wireless/intersil/orinoco/mic.c        |   10 +-
 drivers/net/wireless/marvell/libertas_tf/cmd.c     |    9 +-
 drivers/net/wireless/marvell/libertas_tf/if_usb.c  |   38 +-
 .../net/wireless/marvell/libertas_tf/libertas_tf.h |   18 +-
 drivers/net/wireless/marvell/libertas_tf/main.c    |  103 +-
 drivers/net/wireless/marvell/mwifiex/cfg80211.c    |   23 +-
 drivers/net/wireless/marvell/mwifiex/ioctl.h       |    1 +
 drivers/net/wireless/marvell/mwifiex/sta_ioctl.c   |   11 +-
 drivers/net/wireless/marvell/mwifiex/uap_event.c   |    2 +-
 drivers/net/wireless/mediatek/mt76/Makefile        |    3 +-
 drivers/net/wireless/mediatek/mt76/dma.c           |   29 +-
 drivers/net/wireless/mediatek/mt76/dma.h           |    2 +-
 drivers/net/wireless/mediatek/mt76/mac80211.c      |   11 +-
 drivers/net/wireless/mediatek/mt76/mcu.c           |   60 ++
 drivers/net/wireless/mediatek/mt76/mt76.h          |   32 +-
 drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c |   16 +-
 drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.h |    7 +-
 drivers/net/wireless/mediatek/mt76/mt76x0/init.c   |   39 +-
 drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h |    4 -
 drivers/net/wireless/mediatek/mt76/mt76x0/pci.c    |   19 +-
 drivers/net/wireless/mediatek/mt76/mt76x0/phy.c    |   11 +-
 drivers/net/wireless/mediatek/mt76/mt76x0/usb.c    |   26 +-
 .../net/wireless/mediatek/mt76/mt76x0/usb_mcu.c    |    6 -
 drivers/net/wireless/mediatek/mt76/mt76x02.h       |    7 +-
 drivers/net/wireless/mediatek/mt76/mt76x02_dfs.c   |    2 +-
 drivers/net/wireless/mediatek/mt76/mt76x02_mac.c   |   90 +-
 drivers/net/wireless/mediatek/mt76/mt76x02_mac.h   |    8 +-
 drivers/net/wireless/mediatek/mt76/mt76x02_mcu.c   |   69 +-
 drivers/net/wireless/mediatek/mt76/mt76x02_mcu.h   |    6 +
 drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c  |   12 +-
 .../net/wireless/mediatek/mt76/mt76x02_usb_core.c  |   14 +-
 .../net/wireless/mediatek/mt76/mt76x02_usb_mcu.c   |   72 +-
 drivers/net/wireless/mediatek/mt76/mt76x02_util.c  |   79 +-
 drivers/net/wireless/mediatek/mt76/mt76x2/mt76x2.h |    1 -
 .../net/wireless/mediatek/mt76/mt76x2/mt76x2u.h    |    1 -
 drivers/net/wireless/mediatek/mt76/mt76x2/pci.c    |   26 +-
 .../net/wireless/mediatek/mt76/mt76x2/pci_init.c   |   31 +-
 .../net/wireless/mediatek/mt76/mt76x2/pci_main.c   |    2 +-
 .../net/wireless/mediatek/mt76/mt76x2/pci_phy.c    |    6 +-
 drivers/net/wireless/mediatek/mt76/mt76x2/phy.c    |    2 +-
 drivers/net/wireless/mediatek/mt76/mt76x2/usb.c    |   24 +-
 .../net/wireless/mediatek/mt76/mt76x2/usb_init.c   |   32 +-
 .../net/wireless/mediatek/mt76/mt76x2/usb_main.c   |   17 +-
 drivers/net/wireless/mediatek/mt76/tx.c            |    5 +-
 drivers/net/wireless/mediatek/mt76/usb.c           |  162 ++-
 drivers/net/wireless/mediatek/mt76/usb_mcu.c       |   13 +-
 drivers/net/wireless/quantenna/qtnfmac/cfg80211.c  |   40 +-
 drivers/net/wireless/quantenna/qtnfmac/commands.c  |   29 +
 drivers/net/wireless/quantenna/qtnfmac/commands.h  |    2 +
 drivers/net/wireless/quantenna/qtnfmac/event.c     |  185 +++-
 drivers/net/wireless/quantenna/qtnfmac/qlink.h     |   36 +
 drivers/net/wireless/ralink/rt2x00/rt2800lib.c     |  141 +--
 drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c |    6 +-
 drivers/net/wireless/realtek/rtlwifi/base.c        |   29 +-
 drivers/net/wireless/realtek/rtlwifi/base.h        |   26 +-
 .../realtek/rtlwifi/btcoexist/halbt_precomp.h      |   27 +-
 .../realtek/rtlwifi/btcoexist/halbtc8192e2ant.c    |   35 +-
 .../realtek/rtlwifi/btcoexist/halbtc8192e2ant.h    |   27 +-
 .../realtek/rtlwifi/btcoexist/halbtc8723b1ant.c    |   26 +-
 .../realtek/rtlwifi/btcoexist/halbtc8723b1ant.h    |   27 +-
 .../realtek/rtlwifi/btcoexist/halbtc8723b2ant.c    |   27 +-
 .../realtek/rtlwifi/btcoexist/halbtc8723b2ant.h    |   27 +-
 .../realtek/rtlwifi/btcoexist/halbtc8821a1ant.c    |   26 +-
 .../realtek/rtlwifi/btcoexist/halbtc8821a1ant.h    |   26 +-
 .../realtek/rtlwifi/btcoexist/halbtc8821a2ant.c    |   26 +-
 .../realtek/rtlwifi/btcoexist/halbtc8821a2ant.h    |   26 +-
 .../rtlwifi/btcoexist/halbtc8822bwifionly.c        |   17 +-
 .../rtlwifi/btcoexist/halbtc8822bwifionly.h        |   17 +-
 .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c       |   26 +-
 .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h       |   27 +-
 .../wireless/realtek/rtlwifi/btcoexist/rtl_btc.c   |   27 +-
 .../wireless/realtek/rtlwifi/btcoexist/rtl_btc.h   |   25 +-
 drivers/net/wireless/realtek/rtlwifi/cam.c         |   27 +-
 drivers/net/wireless/realtek/rtlwifi/cam.h         |   26 +-
 drivers/net/wireless/realtek/rtlwifi/core.c        |   26 +-
 drivers/net/wireless/realtek/rtlwifi/core.h        |   26 +-
 drivers/net/wireless/realtek/rtlwifi/debug.c       |   25 +-
 drivers/net/wireless/realtek/rtlwifi/debug.h       |   27 +-
 drivers/net/wireless/realtek/rtlwifi/efuse.c       |   71 +-
 drivers/net/wireless/realtek/rtlwifi/efuse.h       |   28 +-
 drivers/net/wireless/realtek/rtlwifi/pci.c         |   26 +-
 drivers/net/wireless/realtek/rtlwifi/pci.h         |   26 +-
 drivers/net/wireless/realtek/rtlwifi/ps.c          |   26 +-
 drivers/net/wireless/realtek/rtlwifi/ps.h          |   26 +-
 drivers/net/wireless/realtek/rtlwifi/pwrseqcmd.h   |   26 +-
 drivers/net/wireless/realtek/rtlwifi/rc.c          |   26 +-
 drivers/net/wireless/realtek/rtlwifi/rc.h          |   26 +-
 drivers/net/wireless/realtek/rtlwifi/regd.c        |   34 +-
 drivers/net/wireless/realtek/rtlwifi/regd.h        |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/def.h   |   29 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/dm.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/dm.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/fw.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/fw.h    |   25 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/hw.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/hw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/led.c   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/led.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/phy.c   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/phy.h   |   26 +-
 .../wireless/realtek/rtlwifi/rtl8188ee/pwrseq.c    |   26 +-
 .../wireless/realtek/rtlwifi/rtl8188ee/pwrseq.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/reg.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/rf.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/rf.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/sw.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/sw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/table.c |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/table.h |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/trx.c   |   30 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/trx.h   |   26 +-
 .../wireless/realtek/rtlwifi/rtl8192c/dm_common.c  |   26 +-
 .../wireless/realtek/rtlwifi/rtl8192c/dm_common.h  |   30 +-
 .../wireless/realtek/rtlwifi/rtl8192c/fw_common.c  |   40 +-
 .../wireless/realtek/rtlwifi/rtl8192c/fw_common.h  |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192c/main.c   |   26 +-
 .../wireless/realtek/rtlwifi/rtl8192c/phy_common.c |   50 +-
 .../wireless/realtek/rtlwifi/rtl8192c/phy_common.h |   32 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/def.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/dm.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/dm.h    |   30 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/hw.c    |   66 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/hw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/led.c   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/led.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/phy.c   |   36 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/phy.h   |   32 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/reg.h   |   85 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/rf.c    |  138 +--
 .../net/wireless/realtek/rtlwifi/rtl8192ce/rf.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/sw.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/sw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/table.c |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/table.h |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/trx.c   |   30 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/trx.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/def.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/dm.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/dm.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/hw.c    |  304 +++---
 .../net/wireless/realtek/rtlwifi/rtl8192cu/hw.h    |   30 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/led.c   |   30 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/led.h   |   24 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/mac.c   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/mac.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/phy.c   |   42 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/phy.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/reg.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/rf.c    |  138 +--
 .../net/wireless/realtek/rtlwifi/rtl8192cu/rf.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/sw.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/sw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/table.c |   34 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/table.h |   42 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/trx.c   |   88 +-
 .../net/wireless/realtek/rtlwifi/rtl8192cu/trx.h   |   30 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/def.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/dm.c    |   50 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/dm.h    |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/fw.c    |   42 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/fw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/hw.c    |   92 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/hw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/led.c   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/led.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/phy.c   |   94 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/phy.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/reg.h   |   54 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/rf.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/rf.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/sw.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/sw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/table.c |   27 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/table.h |   27 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/trx.c   |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/trx.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/def.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/dm.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/dm.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/fw.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/fw.h    |   25 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/hw.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/hw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/led.c   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/led.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/phy.c   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/phy.h   |   26 +-
 .../wireless/realtek/rtlwifi/rtl8192ee/pwrseq.c    |   26 +-
 .../wireless/realtek/rtlwifi/rtl8192ee/pwrseq.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/reg.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/rf.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/rf.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/sw.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/sw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/table.c |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/table.h |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/trx.c   |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/trx.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/def.h   |   27 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/dm.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/dm.h    |   29 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/fw.c    |   30 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/fw.h    |   33 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/hw.c    |   48 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/hw.h    |   27 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/led.c   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/led.h   |   27 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/phy.c   |   70 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/phy.h   |   27 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/reg.h   |   75 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/rf.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/rf.h    |   27 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/sw.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/sw.h    |   25 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/table.c |   27 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/table.h |   20 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/trx.c   |   30 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/trx.h   |   27 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/btc.h   |   25 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/def.h   |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/dm.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/dm.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/fw.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/fw.h    |   25 +-
 .../realtek/rtlwifi/rtl8723ae/hal_bt_coexist.c     |   26 +-
 .../realtek/rtlwifi/rtl8723ae/hal_bt_coexist.h     |   25 +-
 .../wireless/realtek/rtlwifi/rtl8723ae/hal_btc.c   |   27 +-
 .../wireless/realtek/rtlwifi/rtl8723ae/hal_btc.h   |   25 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/hw.c    |   34 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/hw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/led.c   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/led.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/phy.c   |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/phy.h   |   28 +-
 .../wireless/realtek/rtlwifi/rtl8723ae/pwrseq.c    |   26 +-
 .../wireless/realtek/rtlwifi/rtl8723ae/pwrseq.h    |   44 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/reg.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/rf.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/rf.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/sw.c    |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/sw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/table.c |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/table.h |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/trx.c   |   30 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/trx.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/def.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/dm.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/dm.h    |   23 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/fw.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/fw.h    |   25 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/hw.c    |   40 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/hw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/led.c   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/led.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/phy.c   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/phy.h   |   26 +-
 .../wireless/realtek/rtlwifi/rtl8723be/pwrseq.c    |   26 +-
 .../wireless/realtek/rtlwifi/rtl8723be/pwrseq.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/reg.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/rf.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/rf.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/sw.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/sw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/table.c |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/table.h |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/trx.c   |   30 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/trx.h   |   26 +-
 .../realtek/rtlwifi/rtl8723com/dm_common.c         |   26 +-
 .../realtek/rtlwifi/rtl8723com/dm_common.h         |   26 +-
 .../realtek/rtlwifi/rtl8723com/fw_common.c         |   26 +-
 .../realtek/rtlwifi/rtl8723com/fw_common.h         |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8723com/main.c |   26 +-
 .../realtek/rtlwifi/rtl8723com/phy_common.c        |   26 +-
 .../realtek/rtlwifi/rtl8723com/phy_common.h        |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/def.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/dm.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/dm.h    |   36 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/fw.c    |  128 +--
 .../net/wireless/realtek/rtlwifi/rtl8821ae/fw.h    |   25 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/hw.c    |  260 +++--
 .../net/wireless/realtek/rtlwifi/rtl8821ae/hw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/led.c   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/led.h   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/phy.c   |  158 ++-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/phy.h   |   30 +-
 .../wireless/realtek/rtlwifi/rtl8821ae/pwrseq.c    |   26 +-
 .../wireless/realtek/rtlwifi/rtl8821ae/pwrseq.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/reg.h   |   60 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/rf.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/rf.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/sw.c    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/sw.h    |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/table.c |  213 ++--
 .../net/wireless/realtek/rtlwifi/rtl8821ae/table.h |   28 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/trx.c   |   26 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/trx.h   |   26 +-
 drivers/net/wireless/realtek/rtlwifi/stats.c       |   27 +-
 drivers/net/wireless/realtek/rtlwifi/stats.h       |   26 +-
 drivers/net/wireless/realtek/rtlwifi/usb.c         |   30 +-
 drivers/net/wireless/realtek/rtlwifi/usb.h         |   26 +-
 drivers/net/wireless/realtek/rtlwifi/wifi.h        |   52 +-
 drivers/net/wireless/rsi/rsi_91x_debugfs.c         |    8 +-
 drivers/net/wireless/rsi/rsi_91x_mac80211.c        |   41 +-
 drivers/net/wireless/rsi/rsi_91x_main.c            |    6 -
 drivers/net/wireless/rsi/rsi_91x_mgmt.c            |   37 +-
 drivers/net/wireless/rsi/rsi_91x_sdio.c            |   24 +-
 drivers/net/wireless/rsi/rsi_91x_usb.c             |    9 +-
 drivers/net/wireless/rsi/rsi_main.h                |    1 +
 include/linux/ieee80211.h                          |    2 +
 include/net/ieee80211_radiotap.h                   |    6 +
 478 files changed, 8789 insertions(+), 10522 deletions(-)
 create mode 100644 drivers/net/wireless/intel/iwlwifi/mvm/ftm-initiator.c
 create mode 100644 drivers/net/wireless/intel/iwlwifi/mvm/ftm-responder.c
 create mode 100644 drivers/net/wireless/mediatek/mt76/mcu.c

^ permalink raw reply

* Re: [PATCH net-next] net: dsa: add missing of_node_put
From: Andrew Lunn @ 2019-02-22 14:36 UTC (permalink / raw)
  To: Himadri Pandya, wen.yang99
  Cc: vivien.didelot, f.fainelli, davem, netdev, linux-kernel
In-Reply-To: <20190222111818.3888-1-himadri18.07@gmail.com>

On Fri, Feb 22, 2019 at 04:48:18PM +0530, Himadri Pandya wrote:
> Decrement the reference count on port while returning out of the
> loop. Issue identified by Coccinelle.

You and Wen Yang are both fixing the same issue. Maybe you can
coordinate?

	Andrew

^ permalink raw reply

* Re: [PATCH] net: dsa: Inherit dev addr from master
From: Andrew Lunn @ 2019-02-22 14:30 UTC (permalink / raw)
  To: Vinod Koul
  Cc: David S. Miller, linux-arm-msm, Bjorn Andersson, Xiaofei Shen,
	Vivien Didelot, Florian Fainelli, Niklas Cassel, netdev
In-Reply-To: <20190222125654.12478-1-vkoul@kernel.org>

On Fri, Feb 22, 2019 at 06:26:54PM +0530, Vinod Koul wrote:
> From: Xiaofei Shen <xiaofeis@codeaurora.org>
> 
> When we create slave netdevice, the dev addr is inherited from master
> but the master dev addr maybe NULL at that time, so inherit it again
> while opening the slave.

Hi Xiaofei, Vinod

Inheriting it twice seems a bit clumsy. Can the first inherit be
removed? Can you change your MAC driver to set its MAC address in
probe?

	Andrew

^ permalink raw reply

* Re: [PATCH] net: dsa: read mac address from DT for slave device
From: Andrew Lunn @ 2019-02-22 14:26 UTC (permalink / raw)
  To: Vinod Koul
  Cc: David S. Miller, linux-arm-msm, Bjorn Andersson, Xiaofei Shen,
	Vivien Didelot, Florian Fainelli, Niklas Cassel, netdev
In-Reply-To: <20190222125815.12866-1-vkoul@kernel.org>

On Fri, Feb 22, 2019 at 06:28:15PM +0530, Vinod Koul wrote:
> From: Xiaofei Shen <xiaofeis@codeaurora.org>
> 
> Before creating a slave netdevice, get the mac address from DTS and
> apply in case it is valid.
> 
> Signed-off-by: Xiaofei Shen <xiaofeis@codeaurora.org>
> Signed-off-by: Vinod Koul <vkoul@kernel.org>

Hi Xiaofei, Vinod

It would be good to document this in the binding.

   Andrew

^ permalink raw reply

* Re: [PATCH net-next v2 0/7] AF_PACKET transport_offset fix
From: Willem de Bruijn @ 2019-02-22 14:20 UTC (permalink / raw)
  To: Maxim Mikityanskiy
  Cc: David S. Miller, Saeed Mahameed, Willem de Bruijn, Jason Wang,
	Eric Dumazet, netdev@vger.kernel.org, Eran Ben Elisha,
	Tariq Toukan
In-Reply-To: <20190221123908.7196-1-maximmi@mellanox.com>

On Thu, Feb 21, 2019 at 7:40 AM Maxim Mikityanskiy <maximmi@mellanox.com> wrote:
>
> This patch series contains the implementation of the RFC that was posted
> on this mailing list previously:
> https://www.spinics.net/lists/netdev/msg541709.html
>
> It fixes having incorrect skb->transport_header values in cases when
> dissect fails. Having correct values set by the kernel fixes mlx5
> operation and allows to remove some unnecessary code flows in mlx5.
>
> v2 changes:
>
> - Rebase against the fresh net-next.
> - Don't return bool from skb_probe_transport_header (and don't rename
>   the function).
> - WARN_ON_ONCE and error path in case of GSO without the L4 header.
>
> Maxim Mikityanskiy (7):
>   net: Don't set transport offset to invalid value
>   net: Introduce parse_protocol header_ops callback
>   net/ethernet: Add parse_protocol header_ops support
>   net/packet: Ask driver for protocol if not provided by user
>   net/packet: Remove redundant skb->protocol set
>   net/mlx5e: Remove the wrong assumption about transport offset
>   net/mlx5e: Trust kernel regarding transport offset

For the series: Acked-by: Willem de Bruijn <willemb@google.com>

^ permalink raw reply

* Re: [PATCH net-next] net: Skip GSO length estimation if transport header is not set
From: Willem de Bruijn @ 2019-02-22 14:19 UTC (permalink / raw)
  To: Maxim Mikityanskiy
  Cc: David S. Miller, Willem de Bruijn, Saeed Mahameed, Jason Wang,
	Eric Dumazet, netdev@vger.kernel.org, Eran Ben Elisha,
	Tariq Toukan
In-Reply-To: <20190222125457.8509-1-maximmi@mellanox.com>

On Fri, Feb 22, 2019 at 7:56 AM Maxim Mikityanskiy <maximmi@mellanox.com> wrote:
>
> qdisc_pkt_len_init expects transport_header to be set for GSO packets.
> Patch [1] skips transport_header validation for GSO packets that don't
> have network_header set at the moment of calling virtio_net_hdr_to_skb,
> and allows them to pass into the stack. After patch [2] no placeholder
> value is assigned to transport_header if dissection fails, so this patch
> adds a check to the place where the value of transport_header is used.
>
> [1] https://patchwork.ozlabs.org/patch/1044429/
> [2] https://patchwork.ozlabs.org/patch/1046122/
>
> Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com>

Acked-by: Willem de Bruijn <willemb@google.com>

^ permalink raw reply

* Re: [PATCH net-next v2 1/7] net: Don't set transport offset to invalid value
From: Willem de Bruijn @ 2019-02-22 14:16 UTC (permalink / raw)
  To: Maxim Mikityanskiy
  Cc: David S. Miller, Saeed Mahameed, Willem de Bruijn, Jason Wang,
	Eric Dumazet, netdev@vger.kernel.org, Eran Ben Elisha,
	Tariq Toukan
In-Reply-To: <AM6PR05MB5879232068A16CF20F9E450ED17F0@AM6PR05MB5879.eurprd05.prod.outlook.com>

On Fri, Feb 22, 2019 at 7:30 AM Maxim Mikityanskiy <maximmi@mellanox.com> wrote:
>
> > -----Original Message-----
> > From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
> > Sent: 21 February, 2019 19:28
> > To: Maxim Mikityanskiy <maximmi@mellanox.com>
> > Cc: David S. Miller <davem@davemloft.net>; Saeed Mahameed
> > <saeedm@mellanox.com>; Willem de Bruijn <willemb@google.com>; Jason Wang
> > <jasowang@redhat.com>; Eric Dumazet <edumazet@google.com>;
> > netdev@vger.kernel.org; Eran Ben Elisha <eranbe@mellanox.com>; Tariq Toukan
> > <tariqt@mellanox.com>
> > Subject: Re: [PATCH net-next v2 1/7] net: Don't set transport offset to
> > invalid value
> >
> > On Thu, Feb 21, 2019 at 7:40 AM Maxim Mikityanskiy <maximmi@mellanox.com>
> > wrote:
> > >
> > > If the socket was created with socket(AF_PACKET, SOCK_RAW, 0),
> > > skb->protocol will be unset, __skb_flow_dissect() will fail, and
> > > skb_probe_transport_header() will fall back to the offset_hint, making
> > > the resulting skb_transport_offset incorrect.
> > >
> > > If, however, there is no transport header in the packet,
> > > transport_header shouldn't be set to an arbitrary value.
> > >
> > > Fix it by leaving the transport offset unset if it couldn't be found, to
> > > be explicit rather than to fill it with some wrong value. It changes the
> > > behavior, but if some code relied on the old behavior, it would be
> > > broken anyway, as the old one is incorrect.
> > >
> > > Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com>
> >
> > qdisc_pkt_len_init also expects skb_transport_header(skb) to always be
> > set for gso packets.
> >
> > Once net is merged into net-next, commit d5be7f632bad ("net: validate
>
> This commit is already in net-next, isn't it?

It is now yes.

> > untrusted gso packets without csum offload") will ensure that packets
> > that fail flow dissection do not make it into the stack. But we have
> > to skip dissection in some cases, like tun [1].
>
> OK, got you. However, is everything OK with patch [1]? It fixes false
> positives, when a packet was dropped because network_header had not been
> set yet for dissection to succeed, but what about evil packets that have
> no network_offset at the moment of calling virtio_net_hdr_to_skb? Why
> are all of them considered valid?

They are not considered valid. But it is the cost of avoiding false
positives. We cannot break legitimate traffic.

The two patches as is restrict a large class of illegal packets
from packet sockets. Which always set network header, so
this cannot be worked around.

Extending these checks to tun will require an independent
additional fix.

> > I think we need to add a check in qdisc_pkt_len_init to skip the gso
> > size estimation branch if !skb_transport_header_was_set(skb).
> >
> > Otherwise this patch set looks good to me. To avoid resubmitting
> > everything we can fix up the qdisc_pkt_len_init in a follow-up, in
> > which case I'm happy to add my Acked-by to this series.
>
> I'll add this check and submit the patch soon. Thanks for reviewing!
>
> > [1] http://patchwork.ozlabs.org/patch/1044429/

Looks good, thanks.

^ permalink raw reply

* Re: [PATCH] tcp: detect use sendpage for slab-based objects
From: Vasily Averin @ 2019-02-22 14:02 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: netdev
In-Reply-To: <CANn89i+tJA1zHN9Hbw58UQOEDY2iZCAssJcZ-+Y7C=zsNW3VSA@mail.gmail.com>

On 2/21/19 7:00 PM, Eric Dumazet wrote:
> On Thu, Feb 21, 2019 at 7:30 AM Vasily Averin <vvs@virtuozzo.com> wrote:
>> index 2079145a3b7c..cf9572f4fc0f 100644
>> --- a/net/ipv4/tcp.c
>> +++ b/net/ipv4/tcp.c
>> @@ -996,6 +996,7 @@ ssize_t do_tcp_sendpages(struct sock *sk, struct page *page, int offset,
>>                         goto wait_for_memory;
>>
>>                 if (can_coalesce) {
>> +                       WARN_ON_ONCE(PageSlab(page));
> 
> Please use VM_WARN_ON_ONCE() to make this a nop for CONFIG_VM_DEBUG=n
> 
> Also the whole tcp_sendpage() should be protected, not only the coalescing part.
> 
> (The get_page()  done few lines later should not be attempted either)
> 
>>                         skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy);
>>                 } else {
>>                         get_page(page);
>> --
> 
> It seems the bug has nothing to do with TCP, and belongs to the caller.
> 
> Otherwise you need to add the check to all existing .sendpage() /
> .sendpage_locked() handler out there.
 
Eric, could you please elaborate once again why tcp_sendpage() should not handle slab objects?

There is known restriction: sendpage should not be called for pages with counter=0,
because internal put_page() releases the page. All sendpage callers I know have such check.

However why they should add one check for PageSlab?

Let me explain the problem once again:
I do not see any bugs neither in tcp nor in any sendpage callers,
there is false alert on receiving side that crashes correctly worked host.

There is network block device with XFS, 
XFS submit IO request with slab objects, 
block device driver checks that page count is positive and decides to use sendpage.
sendpage calls tcp_sendpage() that can merge 2 neighbour slab objects into one tcp fragment.

If data is transferred outside -- nothing bad happen, network device successfully send data outside.
However if data is received locally tcp_recvmsg detects strange vector with "merged" slab objects.
It is not real problem, data can be accessed correctly, however this check calls BUG_ON and crashes the host.

By this way recently added hardening check forces all .sendpage callers modify code that worked correctly for ages.

It looks abnormal to me, but I do not understand how to fix this problem correctly.

I do not like an idea to keep current state -- it can trigger crash of correctly worked hosts in some rare corner cases.
I do not like an idea to fix all callers -- why they need modify correctly worked code to protect from false positive?
I do not like an idea to modify tcp -- to block merge of fragments with slab objects like I proposed earlier.
We can trigger warning in tcp code -- to inform .sendpage callers that they are under fire,
however I agree with yours "bug has nothing to do with TCP" and do not understand why we need to modify tcp_sendpage().

May be it's better to replace BUG_ON to WARN_ON in hardening check?
Could you probably advise some other solution?

Thank you,
	Vasily Averin

^ permalink raw reply

* [PATCH net-next 1/8] selftests: tdc_batch.py: add options needed for concurrency tests
From: Vlad Buslov @ 2019-02-22 14:00 UTC (permalink / raw)
  To: netdev
  Cc: jhs, xiyou.wangcong, davem, shuah, batuhanosmantaskaya, lucasb,
	dcaratti, marcelo.leitner, chrism, Vlad Buslov
In-Reply-To: <20190222140047.13215-1-vladbu@mellanox.com>

Extend tdc_batch.py with several optional CLI arguments that are used for
implementation of concurrency tests in following patches in this set:

- Add optional argument to specify range of filter handles used in batch
  file [fitler_handle, filter_handle+number). This is needed for testing
  filter deletion where it is necessary to know exact handles of configured
  filters.

- Add optional argument to specify filter operation type (possible values
  are ['add', 'del', 'replace']) instead of hardcoded "add" value. This
  allows generation of batches for filter addition, deletion and
  replacement.

- Add optional argument to allow user to change mac address prefix that is
  used for all filters in batch. This is necessary to allow generating
  multiple batches with unique flower classifier keys.

Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
---
 tools/testing/selftests/tc-testing/tdc_batch.py | 58 +++++++++++++++++++++++--
 1 file changed, 54 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/tc-testing/tdc_batch.py b/tools/testing/selftests/tc-testing/tdc_batch.py
index 52fa539dc662..6a2bd2cf528e 100755
--- a/tools/testing/selftests/tc-testing/tdc_batch.py
+++ b/tools/testing/selftests/tc-testing/tdc_batch.py
@@ -13,6 +13,12 @@ parser.add_argument("device", help="device name")
 parser.add_argument("file", help="batch file name")
 parser.add_argument("-n", "--number", type=int,
                     help="how many lines in batch file")
+parser.add_argument(
+    "-a",
+    "--handle_start",
+    type=int,
+    default=1,
+    help="start handle range from (default: 1)")
 parser.add_argument("-o", "--skip_sw",
                     help="skip_sw (offload), by default skip_hw",
                     action="store_true")
@@ -22,6 +28,21 @@ parser.add_argument("-s", "--share_action",
 parser.add_argument("-p", "--prio",
                     help="all filters have different prio",
                     action="store_true")
+parser.add_argument(
+    "-e",
+    "--operation",
+    choices=['add', 'del', 'replace'],
+    default='add',
+    help="operation to perform on filters"
+    "(default: add filter)")
+parser.add_argument(
+    "-m",
+    "--mac_prefix",
+    type=int,
+    default=0,
+    choices=range(0, 256),
+    help="third byte of source MAC address of flower filter"
+    "(default: 0)")
 args = parser.parse_args()
 
 device = args.device
@@ -31,6 +52,8 @@ number = 1
 if args.number:
     number = args.number
 
+handle_start = args.handle_start
+
 skip = "skip_hw"
 if args.skip_sw:
     skip = "skip_sw"
@@ -45,16 +68,43 @@ if args.prio:
     if number > 0x4000:
         number = 0x4000
 
+mac_prefix = args.mac_prefix
+
+def format_add_filter(device, prio, handle, skip, src_mac, dst_mac,
+                      share_action):
+    return ("filter add dev {} {} protocol ip parent ffff: handle {} "
+            " flower {} src_mac {} dst_mac {} action drop {}".format(
+                device, prio, handle, skip, src_mac, dst_mac, share_action))
+
+
+def format_rep_filter(device, prio, handle, skip, src_mac, dst_mac,
+                      share_action):
+    return ("filter replace dev {} {} protocol ip parent ffff: handle {} "
+            " flower {} src_mac {} dst_mac {} action drop {}".format(
+                device, prio, handle, skip, src_mac, dst_mac, share_action))
+
+
+def format_del_filter(device, prio, handle, skip, src_mac, dst_mac,
+                      share_action):
+    return ("filter del dev {} {} protocol ip parent ffff: handle {} "
+            "flower".format(device, prio, handle))
+
+
+formatter = format_add_filter
+if args.operation == "del":
+    formatter = format_del_filter
+elif args.operation == "replace":
+    formatter = format_rep_filter
+
 index = 0
 for i in range(0x100):
     for j in range(0x100):
         for k in range(0x100):
             mac = ("{:02x}:{:02x}:{:02x}".format(i, j, k))
-            src_mac = "e4:11:00:" + mac
+            src_mac = "e4:11:{:02x}:{}".format(mac_prefix, mac)
             dst_mac = "e4:12:00:" + mac
-            cmd = ("filter add dev {} {} protocol ip parent ffff: flower {} "
-                   "src_mac {} dst_mac {} action drop {}".format
-                   (device, prio, skip, src_mac, dst_mac, share_action))
+            cmd = formatter(device, prio, handle_start + index, skip, src_mac,
+                            dst_mac, share_action)
             file.write("{}\n".format(cmd))
             index += 1
             if index >= number:
-- 
2.13.6


^ permalink raw reply related

* [PATCH net-next 3/8] selftests: concurrency: add test to verify parallel rules deletion
From: Vlad Buslov @ 2019-02-22 14:00 UTC (permalink / raw)
  To: netdev
  Cc: jhs, xiyou.wangcong, davem, shuah, batuhanosmantaskaya, lucasb,
	dcaratti, marcelo.leitner, chrism, Vlad Buslov
In-Reply-To: <20190222140047.13215-1-vladbu@mellanox.com>

Implement test that verifies parallel rules deletion by adding 1 million
flower filters and then deleting them with 10 concurrent tc instances.

Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
---
 .../tc-testing/tc-tests/filters/concurrency.json   | 25 ++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json b/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
index adb14e944594..d26fa47844f1 100644
--- a/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
+++ b/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
@@ -21,5 +21,30 @@
             "$TC qdisc del dev $DEV2 ingress",
             "/bin/rm -rf $BATCH_DIR"
         ]
+    },
+    {
+        "id": "6f52",
+        "name": "Delete 1M flower filters with 10 parallel tc instances",
+        "category": [
+            "filter",
+            "flower",
+            "concurrency"
+        ],
+        "setup": [
+            "/bin/mkdir $BATCH_DIR",
+            "$TC qdisc add dev $DEV2 ingress",
+            "./tdc_multibatch.py $DEV2 $BATCH_DIR 1000000 1 add",
+            "$TC -b $BATCH_DIR/add_0",
+            "./tdc_multibatch.py $DEV2 $BATCH_DIR 100000 10 del"
+        ],
+        "cmdUnderTest": "find $BATCH_DIR/del* -print | xargs -n 1 -P 10 $TC -b",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s filter show dev $DEV2 ingress",
+        "matchPattern": "filter protocol ip pref 1 flower chain 0 handle",
+        "matchCount": "0",
+        "teardown": [
+            "$TC qdisc del dev $DEV2 ingress",
+            "/bin/rm -rf $BATCH_DIR"
+        ]
     }
 ]
-- 
2.13.6


^ permalink raw reply related

* [PATCH net-next 5/8] selftests: concurrency: add test to verify concurrent replace
From: Vlad Buslov @ 2019-02-22 14:00 UTC (permalink / raw)
  To: netdev
  Cc: jhs, xiyou.wangcong, davem, shuah, batuhanosmantaskaya, lucasb,
	dcaratti, marcelo.leitner, chrism, Vlad Buslov
In-Reply-To: <20190222140047.13215-1-vladbu@mellanox.com>

Implement test that verifies concurrent replacement of rules by executing
10 tc instances that replace flower filters in same handle range.

Extend tdc_multibatch.py script with new optional CLI argument that is used
to generate all batch files with same filter handle range.

Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
---
 .../tc-testing/tc-tests/filters/concurrency.json   | 25 ++++++++++++++++++++++
 .../testing/selftests/tc-testing/tdc_multibatch.py |  9 +++++++-
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json b/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
index 57ed29eb58bf..3c49fca7e76c 100644
--- a/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
+++ b/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
@@ -71,5 +71,30 @@
             "$TC qdisc del dev $DEV2 ingress",
             "/bin/rm -rf $BATCH_DIR"
         ]
+    },
+    {
+        "id": "14be",
+        "name": "Concurrently replace same range of 100k flower filters from 10 tc instances",
+        "category": [
+            "filter",
+            "flower",
+            "concurrency"
+        ],
+        "setup": [
+            "/bin/mkdir $BATCH_DIR",
+            "$TC qdisc add dev $DEV2 ingress",
+            "./tdc_multibatch.py $DEV2 $BATCH_DIR 100000 1 add",
+            "$TC -b $BATCH_DIR/add_0",
+            "./tdc_multibatch.py -d $DEV2 $BATCH_DIR 100000 10 replace"
+        ],
+        "cmdUnderTest": "find $BATCH_DIR/replace* -print | xargs -n 1 -P 10 $TC -b",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s filter show dev $DEV2 ingress",
+        "matchPattern": "filter protocol ip pref 1 flower chain 0 handle",
+        "matchCount": "100000",
+        "teardown": [
+            "$TC qdisc del dev $DEV2 ingress",
+            "/bin/rm -rf $BATCH_DIR"
+        ]
     }
 ]
diff --git a/tools/testing/selftests/tc-testing/tdc_multibatch.py b/tools/testing/selftests/tc-testing/tdc_multibatch.py
index cd980d1785bb..0d8be39b5580 100755
--- a/tools/testing/selftests/tc-testing/tdc_multibatch.py
+++ b/tools/testing/selftests/tc-testing/tdc_multibatch.py
@@ -21,6 +21,11 @@ parser.add_argument(
     "operation",
     choices=['add', 'del', 'replace'],
     help="operation to perform on filters")
+parser.add_argument(
+    "-d",
+    "--duplicate_handles",
+    action="store_true",
+    help="duplicate filter handle range in all files")
 args = parser.parse_args()
 
 device = args.device
@@ -29,10 +34,12 @@ file_prefix = args.operation + "_"
 num_filters = args.num_filters
 num_files = args.num_files
 operation = args.operation
+duplicate_handles = args.duplicate_handles
 handle = 1
 
 for i in range(num_files):
     file = dir + '/' + file_prefix + str(i)
     os.system("./tdc_batch.py -n {} -a {} -e {} -m {} {} {}".format(
         num_filters, handle, operation, i, device, file))
-    handle += num_filters
+    if not duplicate_handles:
+        handle += num_filters
-- 
2.13.6


^ permalink raw reply related

* [PATCH net-next 6/8] selftests: concurrency: add test to verify concurrent delete
From: Vlad Buslov @ 2019-02-22 14:00 UTC (permalink / raw)
  To: netdev
  Cc: jhs, xiyou.wangcong, davem, shuah, batuhanosmantaskaya, lucasb,
	dcaratti, marcelo.leitner, chrism, Vlad Buslov
In-Reply-To: <20190222140047.13215-1-vladbu@mellanox.com>

Implement test that verifies concurrent deletion of rules by executing 10
tc instances that delete flower filters in same handle range. In this case
only one tc instance succeeds in deleting a filter with particular handle.
To mitigate expected failures of all other instances, run tc with 'force'
option to continue processing batch file in case of errors and expect xargs
to return code '123' that indicates that invocation of command(s) exited
with error in range 1-125.

Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
---
 .../tc-testing/tc-tests/filters/concurrency.json   | 25 ++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json b/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
index 3c49fca7e76c..102a6a3f08df 100644
--- a/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
+++ b/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
@@ -96,5 +96,30 @@
             "$TC qdisc del dev $DEV2 ingress",
             "/bin/rm -rf $BATCH_DIR"
         ]
+    },
+    {
+        "id": "0c44",
+        "name": "Concurrently delete same range of 100k flower filters from 10 tc instances",
+        "category": [
+            "filter",
+            "flower",
+            "concurrency"
+        ],
+        "setup": [
+            "/bin/mkdir $BATCH_DIR",
+            "$TC qdisc add dev $DEV2 ingress",
+            "./tdc_multibatch.py $DEV2 $BATCH_DIR 100000 1 add",
+            "$TC -b $BATCH_DIR/add_0",
+            "./tdc_multibatch.py -d $DEV2 $BATCH_DIR 100000 10 del"
+        ],
+        "cmdUnderTest": "find $BATCH_DIR/del* -print | xargs -n 1 -P 10 $TC -f -b",
+        "expExitCode": "123",
+        "verifyCmd": "$TC -s filter show dev $DEV2 ingress",
+        "matchPattern": "filter protocol ip pref 1 flower chain 0 handle",
+        "matchCount": "0",
+        "teardown": [
+            "$TC qdisc del dev $DEV2 ingress",
+	    "/bin/rm -rf $BATCH_DIR"
+        ]
     }
 ]
-- 
2.13.6


^ permalink raw reply related

* [PATCH net-next 8/8] selftests: concurrency: add test to verify parallel replace/delete
From: Vlad Buslov @ 2019-02-22 14:00 UTC (permalink / raw)
  To: netdev
  Cc: jhs, xiyou.wangcong, davem, shuah, batuhanosmantaskaya, lucasb,
	dcaratti, marcelo.leitner, chrism, Vlad Buslov
In-Reply-To: <20190222140047.13215-1-vladbu@mellanox.com>

Implement test that runs 5 instances of tc replace filter in parallel with
5 instances of tc del filter from same tp instance. Each instance uses its
own filter handle and key range.

Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
---
 .../tc-testing/tc-tests/filters/concurrency.json   | 26 ++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json b/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
index 8316634a0cd7..9002714b1851 100644
--- a/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
+++ b/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
@@ -147,5 +147,31 @@
             "$TC qdisc del dev $DEV2 ingress",
             "/bin/rm -rf $BATCH_DIR"
         ]
+    },
+    {
+        "id": "6e8f",
+        "name": "Replace and delete from same tp with 10 tc instances",
+        "category": [
+            "filter",
+            "flower",
+            "concurrency"
+        ],
+        "setup": [
+            "/bin/mkdir $BATCH_DIR",
+            "$TC qdisc add dev $DEV2 ingress",
+            "./tdc_multibatch.py -x init_ $DEV2 $BATCH_DIR 100000 10 add",
+            "find $BATCH_DIR/init_* -print | xargs -n 1 -P 5 $TC -b",
+            "./tdc_multibatch.py -x par_ -a 500001 -m 5 $DEV2 $BATCH_DIR 100000 5 replace",
+            "./tdc_multibatch.py -x par_ $DEV2 $BATCH_DIR 100000 5 del"
+        ],
+        "cmdUnderTest": "find $BATCH_DIR/par_* -print | xargs -n 1 -P 10 $TC -b",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s filter show dev $DEV2 ingress",
+        "matchPattern": "filter protocol ip pref 1 flower chain 0 handle",
+        "matchCount": "500000",
+        "teardown": [
+            "$TC qdisc del dev $DEV2 ingress",
+            "/bin/rm -rf $BATCH_DIR"
+        ]
     }
 ]
-- 
2.13.6


^ permalink raw reply related

* [PATCH net-next 7/8] selftests: concurrency: add test to verify parallel add/delete
From: Vlad Buslov @ 2019-02-22 14:00 UTC (permalink / raw)
  To: netdev
  Cc: jhs, xiyou.wangcong, davem, shuah, batuhanosmantaskaya, lucasb,
	dcaratti, marcelo.leitner, chrism, Vlad Buslov
In-Reply-To: <20190222140047.13215-1-vladbu@mellanox.com>

Implement test that runs 5 instances of tc add filter in parallel with 5
instances of tc del filter from same tp instance. Each instance uses its
own filter handle and key range.

Extend tdc_multibatch.py with additional options required to implement the
test: common prefix for all generated batch files, first value of filter
handle range, MAC address prefix modifier. These are necessary to allow
creating batch files with unique keys and handle ranges with multiple
invocation of tdc_multibatch.py helper script.

Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
---
 .../tc-testing/tc-tests/filters/concurrency.json   | 26 ++++++++++++++++++++++
 .../testing/selftests/tc-testing/tdc_multibatch.py | 26 +++++++++++++++++++---
 2 files changed, 49 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json b/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
index 102a6a3f08df..8316634a0cd7 100644
--- a/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
+++ b/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
@@ -121,5 +121,31 @@
             "$TC qdisc del dev $DEV2 ingress",
 	    "/bin/rm -rf $BATCH_DIR"
         ]
+    },
+    {
+        "id": "ab62",
+        "name": "Add and delete from same tp with 10 tc instances",
+        "category": [
+            "filter",
+            "flower",
+            "concurrency"
+        ],
+        "setup": [
+            "/bin/mkdir $BATCH_DIR",
+            "$TC qdisc add dev $DEV2 ingress",
+            "./tdc_multibatch.py -x init_ $DEV2 $BATCH_DIR 100000 5 add",
+            "find $BATCH_DIR/init_* -print | xargs -n 1 -P 5 $TC -b",
+            "./tdc_multibatch.py -x par_ -a 500001 -m 5 $DEV2 $BATCH_DIR 100000 5 add",
+            "./tdc_multibatch.py -x par_ $DEV2 $BATCH_DIR 100000 5 del"
+        ],
+        "cmdUnderTest": "find $BATCH_DIR/par_* -print | xargs -n 1 -P 10 $TC -b",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s filter show dev $DEV2 ingress",
+        "matchPattern": "filter protocol ip pref 1 flower chain 0 handle",
+        "matchCount": "500000",
+        "teardown": [
+            "$TC qdisc del dev $DEV2 ingress",
+            "/bin/rm -rf $BATCH_DIR"
+        ]
     }
 ]
diff --git a/tools/testing/selftests/tc-testing/tdc_multibatch.py b/tools/testing/selftests/tc-testing/tdc_multibatch.py
index 0d8be39b5580..5e7237952e49 100755
--- a/tools/testing/selftests/tc-testing/tdc_multibatch.py
+++ b/tools/testing/selftests/tc-testing/tdc_multibatch.py
@@ -22,24 +22,44 @@ parser.add_argument(
     choices=['add', 'del', 'replace'],
     help="operation to perform on filters")
 parser.add_argument(
+    "-x",
+    "--file_prefix",
+    default="",
+    help="prefix for generated batch file names")
+parser.add_argument(
     "-d",
     "--duplicate_handles",
     action="store_true",
     help="duplicate filter handle range in all files")
+parser.add_argument(
+    "-a",
+    "--handle_start",
+    type=int,
+    default=1,
+    help="start handle range from (default: 1)")
+parser.add_argument(
+    "-m",
+    "--mac_prefix",
+    type=int,
+    default=0,
+    choices=range(0, 256),
+    help="add this value to third byte of source MAC address of flower filter"
+    "(default: 0)")
 args = parser.parse_args()
 
 device = args.device
 dir = args.dir
-file_prefix = args.operation + "_"
+file_prefix = args.file_prefix + args.operation + "_"
 num_filters = args.num_filters
 num_files = args.num_files
 operation = args.operation
 duplicate_handles = args.duplicate_handles
-handle = 1
+handle = args.handle_start
+mac_prefix = args.mac_prefix
 
 for i in range(num_files):
     file = dir + '/' + file_prefix + str(i)
     os.system("./tdc_batch.py -n {} -a {} -e {} -m {} {} {}".format(
-        num_filters, handle, operation, i, device, file))
+        num_filters, handle, operation, i + mac_prefix, device, file))
     if not duplicate_handles:
         handle += num_filters
-- 
2.13.6


^ permalink raw reply related

* [PATCH net-next 4/8] selftests: concurrency: add test to verify parallel rules replace
From: Vlad Buslov @ 2019-02-22 14:00 UTC (permalink / raw)
  To: netdev
  Cc: jhs, xiyou.wangcong, davem, shuah, batuhanosmantaskaya, lucasb,
	dcaratti, marcelo.leitner, chrism, Vlad Buslov
In-Reply-To: <20190222140047.13215-1-vladbu@mellanox.com>

Implement test that verifies parallel rules replacement by adding 1 million
flower filters and then replacing them with 10 concurrent tc instances.

Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
---
 .../tc-testing/tc-tests/filters/concurrency.json   | 25 ++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json b/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
index d26fa47844f1..57ed29eb58bf 100644
--- a/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
+++ b/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
@@ -46,5 +46,30 @@
             "$TC qdisc del dev $DEV2 ingress",
             "/bin/rm -rf $BATCH_DIR"
         ]
+    },
+    {
+        "id": "c9da",
+        "name": "Replace 1M flower filters with 10 parallel tc instances",
+        "category": [
+            "filter",
+            "flower",
+            "concurrency"
+        ],
+        "setup": [
+            "/bin/mkdir $BATCH_DIR",
+            "$TC qdisc add dev $DEV2 ingress",
+            "./tdc_multibatch.py $DEV2 $BATCH_DIR 1000000 1 add",
+            "$TC -b $BATCH_DIR/add_0",
+            "./tdc_multibatch.py $DEV2 $BATCH_DIR 100000 10 replace"
+        ],
+        "cmdUnderTest": "find $BATCH_DIR/replace* -print | xargs -n 1 -P 10 $TC -b",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s filter show dev $DEV2 ingress",
+        "matchPattern": "filter protocol ip pref 1 flower chain 0 handle",
+        "matchCount": "1000000",
+        "teardown": [
+            "$TC qdisc del dev $DEV2 ingress",
+            "/bin/rm -rf $BATCH_DIR"
+        ]
     }
 ]
-- 
2.13.6


^ permalink raw reply related

* [PATCH net-next 2/8] selftests: concurrency: add test to verify parallel rules insertion
From: Vlad Buslov @ 2019-02-22 14:00 UTC (permalink / raw)
  To: netdev
  Cc: jhs, xiyou.wangcong, davem, shuah, batuhanosmantaskaya, lucasb,
	dcaratti, marcelo.leitner, chrism, Vlad Buslov
In-Reply-To: <20190222140047.13215-1-vladbu@mellanox.com>

Implement test that verifies parallel rules insertion by adding 1 million
flower filters with 10 concurrent tc instances. Put it to standalone
'concurrency' category.

Implement tdc_multibatch.py helper script that is used to generate multiple
batch files for concurrent tc execution. Extend config with new 'BATCH_DIR'
variable to specify temporary output directory that is used to store batch
files generated by tdc_multibatch.py.

Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
---
 .../tc-testing/tc-tests/filters/concurrency.json   | 25 ++++++++++++++
 tools/testing/selftests/tc-testing/tdc_config.py   |  1 +
 .../testing/selftests/tc-testing/tdc_multibatch.py | 38 ++++++++++++++++++++++
 3 files changed, 64 insertions(+)
 create mode 100644 tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
 create mode 100755 tools/testing/selftests/tc-testing/tdc_multibatch.py

diff --git a/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json b/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
new file mode 100644
index 000000000000..adb14e944594
--- /dev/null
+++ b/tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
@@ -0,0 +1,25 @@
+[
+    {
+        "id": "e41d",
+        "name": "Add 1M flower filters with 10 parallel tc instances",
+        "category": [
+            "filter",
+            "flower",
+            "concurrency"
+        ],
+        "setup": [
+            "/bin/mkdir $BATCH_DIR",
+            "$TC qdisc add dev $DEV2 ingress",
+            "./tdc_multibatch.py $DEV2 $BATCH_DIR 100000 10 add"
+        ],
+        "cmdUnderTest": "find $BATCH_DIR/add* -print | xargs -n 1 -P 10 $TC -b",
+        "expExitCode": "0",
+        "verifyCmd": "$TC -s filter show dev $DEV2 ingress",
+        "matchPattern": "filter protocol ip pref 1 flower chain 0 handle",
+        "matchCount": "1000000",
+        "teardown": [
+            "$TC qdisc del dev $DEV2 ingress",
+            "/bin/rm -rf $BATCH_DIR"
+        ]
+    }
+]
diff --git a/tools/testing/selftests/tc-testing/tdc_config.py b/tools/testing/selftests/tc-testing/tdc_config.py
index 6d91e48c2625..942c70c041be 100644
--- a/tools/testing/selftests/tc-testing/tdc_config.py
+++ b/tools/testing/selftests/tc-testing/tdc_config.py
@@ -15,6 +15,7 @@ NAMES = {
           'DEV1': 'v0p1',
           'DEV2': '',
           'BATCH_FILE': './batch.txt',
+          'BATCH_DIR': 'tmp',
           # Length of time in seconds to wait before terminating a command
           'TIMEOUT': 12,
           # Name of the namespace to use
diff --git a/tools/testing/selftests/tc-testing/tdc_multibatch.py b/tools/testing/selftests/tc-testing/tdc_multibatch.py
new file mode 100755
index 000000000000..cd980d1785bb
--- /dev/null
+++ b/tools/testing/selftests/tc-testing/tdc_multibatch.py
@@ -0,0 +1,38 @@
+#!/usr/bin/python3
+# SPDX-License-Identifier: GPL-2.0
+"""
+tdc_multibatch.py - a thin wrapper over tdc_batch.py to generate multiple batch
+files
+
+Copyright (C) 2019 Vlad Buslov <vladbu@mellanox.com>
+"""
+
+import argparse
+import os
+
+parser = argparse.ArgumentParser(
+    description='TC multiple batch file generator')
+parser.add_argument("device", help="device name")
+parser.add_argument("dir", help="where to put batch files")
+parser.add_argument(
+    "num_filters", type=int, help="how many lines per batch file")
+parser.add_argument("num_files", type=int, help="how many batch files")
+parser.add_argument(
+    "operation",
+    choices=['add', 'del', 'replace'],
+    help="operation to perform on filters")
+args = parser.parse_args()
+
+device = args.device
+dir = args.dir
+file_prefix = args.operation + "_"
+num_filters = args.num_filters
+num_files = args.num_files
+operation = args.operation
+handle = 1
+
+for i in range(num_files):
+    file = dir + '/' + file_prefix + str(i)
+    os.system("./tdc_batch.py -n {} -a {} -e {} -m {} {} {}".format(
+        num_filters, handle, operation, i, device, file))
+    handle += num_filters
-- 
2.13.6


^ permalink raw reply related

* [PATCH net-next 0/8] Add tests for unlocked flower classifier implementation
From: Vlad Buslov @ 2019-02-22 14:00 UTC (permalink / raw)
  To: netdev
  Cc: jhs, xiyou.wangcong, davem, shuah, batuhanosmantaskaya, lucasb,
	dcaratti, marcelo.leitner, chrism, Vlad Buslov

Implement tests for tdc testsuite to verify concurrent rules update with
rtnl-unlocked flower classifier implementation. The goal of these tests
is to verify general flower classifier correctness by updating filters
on same classifier instance in parallel and to verify its atomicity by
concurrently updating filters in same handle range. All three filter
update operations (add, replace, delete) are tested.

Existing script tdc_batch.py is re-used for batch file generation. It is
extended with several optional CLI arguments that are needed for
concurrency tests. Thin wrapper tdc_multibatch.py is implemented on top
of tdc_batch.py to simplify its usage when generating multiple batch
files for several test configurations.

Parallelism in tests is implemented by running multiple instances of tc
in batch mode with xargs tool. Xargs is chosen for its ease of use and
because it is available by default on most modern Linux distributions.

Vlad Buslov (8):
  selftests: tdc_batch.py: add options needed for concurrency tests
  selftests: concurrency: add test to verify parallel rules insertion
  selftests: concurrency: add test to verify parallel rules deletion
  selftests: concurrency: add test to verify parallel rules replace
  selftests: concurrency: add test to verify concurrent replace
  selftests: concurrency: add test to verify concurrent delete
  selftests: concurrency: add test to verify parallel add/delete
  selftests: concurrency: add test to verify parallel replace/delete

 .../tc-testing/tc-tests/filters/concurrency.json   | 177 +++++++++++++++++++++
 tools/testing/selftests/tc-testing/tdc_batch.py    |  58 ++++++-
 tools/testing/selftests/tc-testing/tdc_config.py   |   1 +
 .../testing/selftests/tc-testing/tdc_multibatch.py |  65 ++++++++
 4 files changed, 297 insertions(+), 4 deletions(-)
 create mode 100644 tools/testing/selftests/tc-testing/tc-tests/filters/concurrency.json
 create mode 100755 tools/testing/selftests/tc-testing/tdc_multibatch.py

-- 
2.13.6


^ permalink raw reply

* [PATCH net-next 08/10] mlxsw: reg: Add new port type-speed fields for PTYS register
From: Ido Schimmel @ 2019-02-22 13:56 UTC (permalink / raw)
  To: netdev@vger.kernel.org
  Cc: davem@davemloft.net, Jiri Pirko, Shalom Toledo, mlxsw,
	Ido Schimmel
In-Reply-To: <20190222135613.27692-1-idosch@mellanox.com>

From: Shalom Toledo <shalomt@mellanox.com>

PTYS register introduces a new layout for port type-speed fields. These
fields extend the existing ones in order to handle more types and speeds.
For example, the new 200Gbps speed.

Signed-off-by: Shalom Toledo <shalomt@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlxsw/reg.h | 57 +++++++++++++++++++++++
 1 file changed, 57 insertions(+)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/reg.h b/drivers/net/ethernet/mellanox/mlxsw/reg.h
index a174ff2f8a8d..eb4c5e8964cd 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/reg.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/reg.h
@@ -3971,6 +3971,25 @@ enum {
  */
 MLXSW_ITEM32(reg, ptys, an_status, 0x04, 28, 4);
 
+#define MLXSW_REG_PTYS_EXT_ETH_SPEED_SGMII_100M				BIT(0)
+#define MLXSW_REG_PTYS_EXT_ETH_SPEED_1000BASE_X_SGMII			BIT(1)
+#define MLXSW_REG_PTYS_EXT_ETH_SPEED_2_5GBASE_X_2_5GMII			BIT(2)
+#define MLXSW_REG_PTYS_EXT_ETH_SPEED_5GBASE_R				BIT(3)
+#define MLXSW_REG_PTYS_EXT_ETH_SPEED_XFI_XAUI_1_10G			BIT(4)
+#define MLXSW_REG_PTYS_EXT_ETH_SPEED_XLAUI_4_XLPPI_4_40G		BIT(5)
+#define MLXSW_REG_PTYS_EXT_ETH_SPEED_25GAUI_1_25GBASE_CR_KR		BIT(6)
+#define MLXSW_REG_PTYS_EXT_ETH_SPEED_50GAUI_2_LAUI_2_50GBASE_CR2_KR2	BIT(7)
+#define MLXSW_REG_PTYS_EXT_ETH_SPEED_50GAUI_1_LAUI_1_50GBASE_CR_KR	BIT(8)
+#define MLXSW_REG_PTYS_EXT_ETH_SPEED_CAUI_4_100GBASE_CR4_KR4		BIT(9)
+#define MLXSW_REG_PTYS_EXT_ETH_SPEED_100GAUI_2_100GBASE_CR2_KR2		BIT(10)
+#define MLXSW_REG_PTYS_EXT_ETH_SPEED_200GAUI_4_200GBASE_CR4_KR4		BIT(12)
+
+/* reg_ptys_ext_eth_proto_cap
+ * Extended Ethernet port supported speeds and protocols.
+ * Access: RO
+ */
+MLXSW_ITEM32(reg, ptys, ext_eth_proto_cap, 0x08, 0, 32);
+
 #define MLXSW_REG_PTYS_ETH_SPEED_SGMII			BIT(0)
 #define MLXSW_REG_PTYS_ETH_SPEED_1000BASE_KX		BIT(1)
 #define MLXSW_REG_PTYS_ETH_SPEED_10GBASE_CX4		BIT(2)
@@ -4025,6 +4044,12 @@ MLXSW_ITEM32(reg, ptys, ib_link_width_cap, 0x10, 16, 16);
  */
 MLXSW_ITEM32(reg, ptys, ib_proto_cap, 0x10, 0, 16);
 
+/* reg_ptys_ext_eth_proto_admin
+ * Extended speed and protocol to set port to.
+ * Access: RW
+ */
+MLXSW_ITEM32(reg, ptys, ext_eth_proto_admin, 0x14, 0, 32);
+
 /* reg_ptys_eth_proto_admin
  * Speed and protocol to set port to.
  * Access: RW
@@ -4043,6 +4068,12 @@ MLXSW_ITEM32(reg, ptys, ib_link_width_admin, 0x1C, 16, 16);
  */
 MLXSW_ITEM32(reg, ptys, ib_proto_admin, 0x1C, 0, 16);
 
+/* reg_ptys_ext_eth_proto_oper
+ * The extended current speed and protocol configured for the port.
+ * Access: RO
+ */
+MLXSW_ITEM32(reg, ptys, ext_eth_proto_oper, 0x20, 0, 32);
+
 /* reg_ptys_eth_proto_oper
  * The current speed and protocol configured for the port.
  * Access: RO
@@ -4089,6 +4120,16 @@ static inline void mlxsw_reg_ptys_eth_pack(char *payload, u8 local_port,
 	mlxsw_reg_ptys_an_disable_admin_set(payload, !autoneg);
 }
 
+static inline void mlxsw_reg_ptys_ext_eth_pack(char *payload, u8 local_port,
+					       u32 proto_admin, bool autoneg)
+{
+	MLXSW_REG_ZERO(ptys, payload);
+	mlxsw_reg_ptys_local_port_set(payload, local_port);
+	mlxsw_reg_ptys_proto_mask_set(payload, MLXSW_REG_PTYS_PROTO_MASK_ETH);
+	mlxsw_reg_ptys_ext_eth_proto_admin_set(payload, proto_admin);
+	mlxsw_reg_ptys_an_disable_admin_set(payload, !autoneg);
+}
+
 static inline void mlxsw_reg_ptys_eth_unpack(char *payload,
 					     u32 *p_eth_proto_cap,
 					     u32 *p_eth_proto_admin,
@@ -4105,6 +4146,22 @@ static inline void mlxsw_reg_ptys_eth_unpack(char *payload,
 			mlxsw_reg_ptys_eth_proto_oper_get(payload);
 }
 
+static inline void mlxsw_reg_ptys_ext_eth_unpack(char *payload,
+						 u32 *p_eth_proto_cap,
+						 u32 *p_eth_proto_admin,
+						 u32 *p_eth_proto_oper)
+{
+	if (p_eth_proto_cap)
+		*p_eth_proto_cap =
+			mlxsw_reg_ptys_ext_eth_proto_cap_get(payload);
+	if (p_eth_proto_admin)
+		*p_eth_proto_admin =
+			mlxsw_reg_ptys_ext_eth_proto_admin_get(payload);
+	if (p_eth_proto_oper)
+		*p_eth_proto_oper =
+			mlxsw_reg_ptys_ext_eth_proto_oper_get(payload);
+}
+
 static inline void mlxsw_reg_ptys_ib_pack(char *payload, u8 local_port,
 					  u16 proto_admin, u16 link_width)
 {
-- 
2.20.1


^ permalink raw reply related

* [PATCH net-next 10/10] mlxsw: spectrum: Add Spectrum-2 ASIC support for new port types and speeds
From: Ido Schimmel @ 2019-02-22 13:56 UTC (permalink / raw)
  To: netdev@vger.kernel.org
  Cc: davem@davemloft.net, Jiri Pirko, Shalom Toledo, mlxsw,
	Ido Schimmel
In-Reply-To: <20190222135613.27692-1-idosch@mellanox.com>

From: Shalom Toledo <shalomt@mellanox.com>

Add Spectrum-2 ASIC support for the following new port types and speeds:
  * 50Gbps 1-lane
  * 100Gbps 2-lanes
  * 200Gbps 4-lanes

Signed-off-by: Shalom Toledo <shalomt@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
---
 .../net/ethernet/mellanox/mlxsw/spectrum.c    | 54 +++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index c55b478e48e9..771188bf94de 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -2685,6 +2685,18 @@ mlxsw_sp2_mask_ethtool_50gaui_2_laui_2_50gbase_cr2_kr2[] = {
 #define MLXSW_SP2_MASK_ETHTOOL_50GAUI_2_LAUI_2_50GBASE_CR2_KR2_LEN \
 	ARRAY_SIZE(mlxsw_sp2_mask_ethtool_50gaui_2_laui_2_50gbase_cr2_kr2)
 
+static const enum ethtool_link_mode_bit_indices
+mlxsw_sp2_mask_ethtool_50gaui_1_laui_1_50gbase_cr_kr[] = {
+	ETHTOOL_LINK_MODE_50000baseKR_Full_BIT,
+	ETHTOOL_LINK_MODE_50000baseSR_Full_BIT,
+	ETHTOOL_LINK_MODE_50000baseCR_Full_BIT,
+	ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT,
+	ETHTOOL_LINK_MODE_50000baseDR_Full_BIT,
+};
+
+#define MLXSW_SP2_MASK_ETHTOOL_50GAUI_1_LAUI_1_50GBASE_CR_KR_LEN \
+	ARRAY_SIZE(mlxsw_sp2_mask_ethtool_50gaui_1_laui_1_50gbase_cr_kr)
+
 static const enum ethtool_link_mode_bit_indices
 mlxsw_sp2_mask_ethtool_caui_4_100gbase_cr4_kr4[] = {
 	ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT,
@@ -2696,6 +2708,30 @@ mlxsw_sp2_mask_ethtool_caui_4_100gbase_cr4_kr4[] = {
 #define MLXSW_SP2_MASK_ETHTOOL_CAUI_4_100GBASE_CR4_KR4_LEN \
 	ARRAY_SIZE(mlxsw_sp2_mask_ethtool_caui_4_100gbase_cr4_kr4)
 
+static const enum ethtool_link_mode_bit_indices
+mlxsw_sp2_mask_ethtool_100gaui_2_100gbase_cr2_kr2[] = {
+	ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT,
+	ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT,
+	ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT,
+	ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT,
+	ETHTOOL_LINK_MODE_100000baseDR2_Full_BIT,
+};
+
+#define MLXSW_SP2_MASK_ETHTOOL_100GAUI_2_100GBASE_CR2_KR2_LEN \
+	ARRAY_SIZE(mlxsw_sp2_mask_ethtool_100gaui_2_100gbase_cr2_kr2)
+
+static const enum ethtool_link_mode_bit_indices
+mlxsw_sp2_mask_ethtool_200gaui_4_200gbase_cr4_kr4[] = {
+	ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT,
+	ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT,
+	ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT,
+	ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT,
+	ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT,
+};
+
+#define MLXSW_SP2_MASK_ETHTOOL_200GAUI_4_200GBASE_CR4_KR4_LEN \
+	ARRAY_SIZE(mlxsw_sp2_mask_ethtool_200gaui_4_200gbase_cr4_kr4)
+
 struct mlxsw_sp2_port_link_mode {
 	const enum ethtool_link_mode_bit_indices *mask_ethtool;
 	int m_ethtool_len;
@@ -2752,12 +2788,30 @@ static const struct mlxsw_sp2_port_link_mode mlxsw_sp2_port_link_mode[] = {
 		.m_ethtool_len	= MLXSW_SP2_MASK_ETHTOOL_50GAUI_2_LAUI_2_50GBASE_CR2_KR2_LEN,
 		.speed		= SPEED_50000,
 	},
+	{
+		.mask		= MLXSW_REG_PTYS_EXT_ETH_SPEED_50GAUI_1_LAUI_1_50GBASE_CR_KR,
+		.mask_ethtool	= mlxsw_sp2_mask_ethtool_50gaui_1_laui_1_50gbase_cr_kr,
+		.m_ethtool_len	= MLXSW_SP2_MASK_ETHTOOL_50GAUI_1_LAUI_1_50GBASE_CR_KR_LEN,
+		.speed		= SPEED_50000,
+	},
 	{
 		.mask		= MLXSW_REG_PTYS_EXT_ETH_SPEED_CAUI_4_100GBASE_CR4_KR4,
 		.mask_ethtool	= mlxsw_sp2_mask_ethtool_caui_4_100gbase_cr4_kr4,
 		.m_ethtool_len	= MLXSW_SP2_MASK_ETHTOOL_CAUI_4_100GBASE_CR4_KR4_LEN,
 		.speed		= SPEED_100000,
 	},
+	{
+		.mask		= MLXSW_REG_PTYS_EXT_ETH_SPEED_100GAUI_2_100GBASE_CR2_KR2,
+		.mask_ethtool	= mlxsw_sp2_mask_ethtool_100gaui_2_100gbase_cr2_kr2,
+		.m_ethtool_len	= MLXSW_SP2_MASK_ETHTOOL_100GAUI_2_100GBASE_CR2_KR2_LEN,
+		.speed		= SPEED_100000,
+	},
+	{
+		.mask		= MLXSW_REG_PTYS_EXT_ETH_SPEED_200GAUI_4_200GBASE_CR4_KR4,
+		.mask_ethtool	= mlxsw_sp2_mask_ethtool_200gaui_4_200gbase_cr4_kr4,
+		.m_ethtool_len	= MLXSW_SP2_MASK_ETHTOOL_200GAUI_4_200GBASE_CR4_KR4_LEN,
+		.speed		= SPEED_200000,
+	},
 };
 
 #define MLXSW_SP2_PORT_LINK_MODE_LEN ARRAY_SIZE(mlxsw_sp2_port_link_mode)
-- 
2.20.1


^ permalink raw reply related

* [PATCH net-next 09/10] mlxsw: spectrum: Add Spectrum-2 ASIC port type-speed operations
From: Ido Schimmel @ 2019-02-22 13:56 UTC (permalink / raw)
  To: netdev@vger.kernel.org
  Cc: davem@davemloft.net, Jiri Pirko, Shalom Toledo, mlxsw,
	Ido Schimmel
In-Reply-To: <20190222135613.27692-1-idosch@mellanox.com>

From: Shalom Toledo <shalomt@mellanox.com>

Add Spectrum-2 ASIC port type-speed operations.

Since multiple ethtool link modes are represented using a single bit in the
ASIC, the driver forces the user to configure all types per a specific
speed. For example, if the user wants to advertise 100Gbps 4-lanes speed,
he should advertise all the types of 100Gbps 4-lanes speed that are
supported by the ASIC as shown below:

  Supported ethtool bits for 100Gbps 4-lanes:
      0x1000000000      100000baseKR4 Full
      0x2000000000      100000baseSR4 Full
      0x4000000000      100000baseCR4 Full
      0x8000000000      100000baseLR4_ER4 Full

  Command for advertising 100Gbps 4-lanes:
      ethtool -s enp3s0np1 advertise 0xF000000000

Signed-off-by: Shalom Toledo <shalomt@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
---
 .../net/ethernet/mellanox/mlxsw/spectrum.c    | 330 +++++++++++++++++-
 .../net/ethernet/mellanox/mlxsw/spectrum.h    |   1 +
 2 files changed, 330 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index fc0e7924233e..c55b478e48e9 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -2607,6 +2607,334 @@ mlxsw_sp1_port_type_speed_ops = {
 	.reg_ptys_eth_unpack		= mlxsw_sp1_reg_ptys_eth_unpack,
 };
 
+static const enum ethtool_link_mode_bit_indices
+mlxsw_sp2_mask_ethtool_sgmii_100m[] = {
+	ETHTOOL_LINK_MODE_100baseT_Full_BIT,
+};
+
+#define MLXSW_SP2_MASK_ETHTOOL_SGMII_100M_LEN \
+	ARRAY_SIZE(mlxsw_sp2_mask_ethtool_sgmii_100m)
+
+static const enum ethtool_link_mode_bit_indices
+mlxsw_sp2_mask_ethtool_1000base_x_sgmii[] = {
+	ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
+	ETHTOOL_LINK_MODE_1000baseKX_Full_BIT,
+};
+
+#define MLXSW_SP2_MASK_ETHTOOL_1000BASE_X_SGMII_LEN \
+	ARRAY_SIZE(mlxsw_sp2_mask_ethtool_1000base_x_sgmii)
+
+static const enum ethtool_link_mode_bit_indices
+mlxsw_sp2_mask_ethtool_2_5gbase_x_2_5gmii[] = {
+	ETHTOOL_LINK_MODE_2500baseX_Full_BIT,
+};
+
+#define MLXSW_SP2_MASK_ETHTOOL_2_5GBASE_X_2_5GMII_LEN \
+	ARRAY_SIZE(mlxsw_sp2_mask_ethtool_2_5gbase_x_2_5gmii)
+
+static const enum ethtool_link_mode_bit_indices
+mlxsw_sp2_mask_ethtool_5gbase_r[] = {
+	ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
+};
+
+#define MLXSW_SP2_MASK_ETHTOOL_5GBASE_R_LEN \
+	ARRAY_SIZE(mlxsw_sp2_mask_ethtool_5gbase_r)
+
+static const enum ethtool_link_mode_bit_indices
+mlxsw_sp2_mask_ethtool_xfi_xaui_1_10g[] = {
+	ETHTOOL_LINK_MODE_10000baseT_Full_BIT,
+	ETHTOOL_LINK_MODE_10000baseKR_Full_BIT,
+	ETHTOOL_LINK_MODE_10000baseR_FEC_BIT,
+	ETHTOOL_LINK_MODE_10000baseCR_Full_BIT,
+	ETHTOOL_LINK_MODE_10000baseSR_Full_BIT,
+	ETHTOOL_LINK_MODE_10000baseLR_Full_BIT,
+	ETHTOOL_LINK_MODE_10000baseER_Full_BIT,
+};
+
+#define MLXSW_SP2_MASK_ETHTOOL_XFI_XAUI_1_10G_LEN \
+	ARRAY_SIZE(mlxsw_sp2_mask_ethtool_xfi_xaui_1_10g)
+
+static const enum ethtool_link_mode_bit_indices
+mlxsw_sp2_mask_ethtool_xlaui_4_xlppi_4_40g[] = {
+	ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT,
+	ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT,
+	ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT,
+	ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT,
+};
+
+#define MLXSW_SP2_MASK_ETHTOOL_XLAUI_4_XLPPI_4_40G_LEN \
+	ARRAY_SIZE(mlxsw_sp2_mask_ethtool_xlaui_4_xlppi_4_40g)
+
+static const enum ethtool_link_mode_bit_indices
+mlxsw_sp2_mask_ethtool_25gaui_1_25gbase_cr_kr[] = {
+	ETHTOOL_LINK_MODE_25000baseCR_Full_BIT,
+	ETHTOOL_LINK_MODE_25000baseKR_Full_BIT,
+	ETHTOOL_LINK_MODE_25000baseSR_Full_BIT,
+};
+
+#define MLXSW_SP2_MASK_ETHTOOL_25GAUI_1_25GBASE_CR_KR_LEN \
+	ARRAY_SIZE(mlxsw_sp2_mask_ethtool_25gaui_1_25gbase_cr_kr)
+
+static const enum ethtool_link_mode_bit_indices
+mlxsw_sp2_mask_ethtool_50gaui_2_laui_2_50gbase_cr2_kr2[] = {
+	ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT,
+	ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT,
+	ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT,
+};
+
+#define MLXSW_SP2_MASK_ETHTOOL_50GAUI_2_LAUI_2_50GBASE_CR2_KR2_LEN \
+	ARRAY_SIZE(mlxsw_sp2_mask_ethtool_50gaui_2_laui_2_50gbase_cr2_kr2)
+
+static const enum ethtool_link_mode_bit_indices
+mlxsw_sp2_mask_ethtool_caui_4_100gbase_cr4_kr4[] = {
+	ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT,
+	ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT,
+	ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT,
+	ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT,
+};
+
+#define MLXSW_SP2_MASK_ETHTOOL_CAUI_4_100GBASE_CR4_KR4_LEN \
+	ARRAY_SIZE(mlxsw_sp2_mask_ethtool_caui_4_100gbase_cr4_kr4)
+
+struct mlxsw_sp2_port_link_mode {
+	const enum ethtool_link_mode_bit_indices *mask_ethtool;
+	int m_ethtool_len;
+	u32 mask;
+	u32 speed;
+};
+
+static const struct mlxsw_sp2_port_link_mode mlxsw_sp2_port_link_mode[] = {
+	{
+		.mask		= MLXSW_REG_PTYS_EXT_ETH_SPEED_SGMII_100M,
+		.mask_ethtool	= mlxsw_sp2_mask_ethtool_sgmii_100m,
+		.m_ethtool_len	= MLXSW_SP2_MASK_ETHTOOL_SGMII_100M_LEN,
+		.speed		= SPEED_100,
+	},
+	{
+		.mask		= MLXSW_REG_PTYS_EXT_ETH_SPEED_1000BASE_X_SGMII,
+		.mask_ethtool	= mlxsw_sp2_mask_ethtool_1000base_x_sgmii,
+		.m_ethtool_len	= MLXSW_SP2_MASK_ETHTOOL_1000BASE_X_SGMII_LEN,
+		.speed		= SPEED_1000,
+	},
+	{
+		.mask		= MLXSW_REG_PTYS_EXT_ETH_SPEED_2_5GBASE_X_2_5GMII,
+		.mask_ethtool	= mlxsw_sp2_mask_ethtool_2_5gbase_x_2_5gmii,
+		.m_ethtool_len	= MLXSW_SP2_MASK_ETHTOOL_2_5GBASE_X_2_5GMII_LEN,
+		.speed		= SPEED_2500,
+	},
+	{
+		.mask		= MLXSW_REG_PTYS_EXT_ETH_SPEED_5GBASE_R,
+		.mask_ethtool	= mlxsw_sp2_mask_ethtool_5gbase_r,
+		.m_ethtool_len	= MLXSW_SP2_MASK_ETHTOOL_5GBASE_R_LEN,
+		.speed		= SPEED_5000,
+	},
+	{
+		.mask		= MLXSW_REG_PTYS_EXT_ETH_SPEED_XFI_XAUI_1_10G,
+		.mask_ethtool	= mlxsw_sp2_mask_ethtool_xfi_xaui_1_10g,
+		.m_ethtool_len	= MLXSW_SP2_MASK_ETHTOOL_XFI_XAUI_1_10G_LEN,
+		.speed		= SPEED_10000,
+	},
+	{
+		.mask		= MLXSW_REG_PTYS_EXT_ETH_SPEED_XLAUI_4_XLPPI_4_40G,
+		.mask_ethtool	= mlxsw_sp2_mask_ethtool_xlaui_4_xlppi_4_40g,
+		.m_ethtool_len	= MLXSW_SP2_MASK_ETHTOOL_XLAUI_4_XLPPI_4_40G_LEN,
+		.speed		= SPEED_40000,
+	},
+	{
+		.mask		= MLXSW_REG_PTYS_EXT_ETH_SPEED_25GAUI_1_25GBASE_CR_KR,
+		.mask_ethtool	= mlxsw_sp2_mask_ethtool_25gaui_1_25gbase_cr_kr,
+		.m_ethtool_len	= MLXSW_SP2_MASK_ETHTOOL_25GAUI_1_25GBASE_CR_KR_LEN,
+		.speed		= SPEED_25000,
+	},
+	{
+		.mask		= MLXSW_REG_PTYS_EXT_ETH_SPEED_50GAUI_2_LAUI_2_50GBASE_CR2_KR2,
+		.mask_ethtool	= mlxsw_sp2_mask_ethtool_50gaui_2_laui_2_50gbase_cr2_kr2,
+		.m_ethtool_len	= MLXSW_SP2_MASK_ETHTOOL_50GAUI_2_LAUI_2_50GBASE_CR2_KR2_LEN,
+		.speed		= SPEED_50000,
+	},
+	{
+		.mask		= MLXSW_REG_PTYS_EXT_ETH_SPEED_CAUI_4_100GBASE_CR4_KR4,
+		.mask_ethtool	= mlxsw_sp2_mask_ethtool_caui_4_100gbase_cr4_kr4,
+		.m_ethtool_len	= MLXSW_SP2_MASK_ETHTOOL_CAUI_4_100GBASE_CR4_KR4_LEN,
+		.speed		= SPEED_100000,
+	},
+};
+
+#define MLXSW_SP2_PORT_LINK_MODE_LEN ARRAY_SIZE(mlxsw_sp2_port_link_mode)
+
+static void
+mlxsw_sp2_from_ptys_supported_port(struct mlxsw_sp *mlxsw_sp,
+				   u32 ptys_eth_proto,
+				   struct ethtool_link_ksettings *cmd)
+{
+	ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);
+	ethtool_link_ksettings_add_link_mode(cmd, supported, Backplane);
+}
+
+static void
+mlxsw_sp2_set_bit_ethtool(const struct mlxsw_sp2_port_link_mode *link_mode,
+			  unsigned long *mode)
+{
+	int i;
+
+	for (i = 0; i < link_mode->m_ethtool_len; i++)
+		__set_bit(link_mode->mask_ethtool[i], mode);
+}
+
+static void
+mlxsw_sp2_from_ptys_link(struct mlxsw_sp *mlxsw_sp, u32 ptys_eth_proto,
+			 unsigned long *mode)
+{
+	int i;
+
+	for (i = 0; i < MLXSW_SP2_PORT_LINK_MODE_LEN; i++) {
+		if (ptys_eth_proto & mlxsw_sp2_port_link_mode[i].mask)
+			mlxsw_sp2_set_bit_ethtool(&mlxsw_sp2_port_link_mode[i],
+						  mode);
+	}
+}
+
+static void
+mlxsw_sp2_from_ptys_speed_duplex(struct mlxsw_sp *mlxsw_sp, bool carrier_ok,
+				 u32 ptys_eth_proto,
+				 struct ethtool_link_ksettings *cmd)
+{
+	u32 speed = SPEED_UNKNOWN;
+	u8 duplex = DUPLEX_UNKNOWN;
+	int i;
+
+	if (!carrier_ok)
+		goto out;
+
+	for (i = 0; i < MLXSW_SP2_PORT_LINK_MODE_LEN; i++) {
+		if (ptys_eth_proto & mlxsw_sp2_port_link_mode[i].mask) {
+			speed = mlxsw_sp2_port_link_mode[i].speed;
+			duplex = DUPLEX_FULL;
+			break;
+		}
+	}
+out:
+	cmd->base.speed = speed;
+	cmd->base.duplex = duplex;
+}
+
+static bool
+mlxsw_sp2_test_bit_ethtool(const struct mlxsw_sp2_port_link_mode *link_mode,
+			   const unsigned long *mode)
+{
+	int cnt = 0;
+	int i;
+
+	for (i = 0; i < link_mode->m_ethtool_len; i++) {
+		if (test_bit(link_mode->mask_ethtool[i], mode))
+			cnt++;
+	}
+
+	return cnt == link_mode->m_ethtool_len;
+}
+
+static u32
+mlxsw_sp2_to_ptys_advert_link(struct mlxsw_sp *mlxsw_sp,
+			      const struct ethtool_link_ksettings *cmd)
+{
+	u32 ptys_proto = 0;
+	int i;
+
+	for (i = 0; i < MLXSW_SP2_PORT_LINK_MODE_LEN; i++) {
+		if (mlxsw_sp2_test_bit_ethtool(&mlxsw_sp2_port_link_mode[i],
+					       cmd->link_modes.advertising))
+			ptys_proto |= mlxsw_sp2_port_link_mode[i].mask;
+	}
+	return ptys_proto;
+}
+
+static u32 mlxsw_sp2_to_ptys_speed(struct mlxsw_sp *mlxsw_sp, u32 speed)
+{
+	u32 ptys_proto = 0;
+	int i;
+
+	for (i = 0; i < MLXSW_SP2_PORT_LINK_MODE_LEN; i++) {
+		if (speed == mlxsw_sp2_port_link_mode[i].speed)
+			ptys_proto |= mlxsw_sp2_port_link_mode[i].mask;
+	}
+	return ptys_proto;
+}
+
+static u32
+mlxsw_sp2_to_ptys_upper_speed(struct mlxsw_sp *mlxsw_sp, u32 upper_speed)
+{
+	u32 ptys_proto = 0;
+	int i;
+
+	for (i = 0; i < MLXSW_SP2_PORT_LINK_MODE_LEN; i++) {
+		if (mlxsw_sp2_port_link_mode[i].speed <= upper_speed)
+			ptys_proto |= mlxsw_sp2_port_link_mode[i].mask;
+	}
+	return ptys_proto;
+}
+
+static int
+mlxsw_sp2_port_speed_base(struct mlxsw_sp *mlxsw_sp, u8 local_port,
+			  u32 *base_speed)
+{
+	char ptys_pl[MLXSW_REG_PTYS_LEN];
+	u32 eth_proto_cap;
+	int err;
+
+	/* In Spectrum-2, the speed of 1x can change from port to port, so query
+	 * it from firmware.
+	 */
+	mlxsw_reg_ptys_ext_eth_pack(ptys_pl, local_port, 0, false);
+	err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ptys), ptys_pl);
+	if (err)
+		return err;
+	mlxsw_reg_ptys_ext_eth_unpack(ptys_pl, &eth_proto_cap, NULL, NULL);
+
+	if (eth_proto_cap &
+	    MLXSW_REG_PTYS_EXT_ETH_SPEED_50GAUI_1_LAUI_1_50GBASE_CR_KR) {
+		*base_speed = MLXSW_SP_PORT_BASE_SPEED_50G;
+		return 0;
+	}
+
+	if (eth_proto_cap &
+	    MLXSW_REG_PTYS_EXT_ETH_SPEED_25GAUI_1_25GBASE_CR_KR) {
+		*base_speed = MLXSW_SP_PORT_BASE_SPEED_25G;
+		return 0;
+	}
+
+	return -EIO;
+}
+
+static void
+mlxsw_sp2_reg_ptys_eth_pack(struct mlxsw_sp *mlxsw_sp, char *payload,
+			    u8 local_port, u32 proto_admin,
+			    bool autoneg)
+{
+	mlxsw_reg_ptys_ext_eth_pack(payload, local_port, proto_admin, autoneg);
+}
+
+static void
+mlxsw_sp2_reg_ptys_eth_unpack(struct mlxsw_sp *mlxsw_sp, char *payload,
+			      u32 *p_eth_proto_cap, u32 *p_eth_proto_admin,
+			      u32 *p_eth_proto_oper)
+{
+	mlxsw_reg_ptys_ext_eth_unpack(payload, p_eth_proto_cap,
+				      p_eth_proto_admin, p_eth_proto_oper);
+}
+
+static const struct mlxsw_sp_port_type_speed_ops
+mlxsw_sp2_port_type_speed_ops = {
+	.from_ptys_supported_port	= mlxsw_sp2_from_ptys_supported_port,
+	.from_ptys_link			= mlxsw_sp2_from_ptys_link,
+	.from_ptys_speed_duplex		= mlxsw_sp2_from_ptys_speed_duplex,
+	.to_ptys_advert_link		= mlxsw_sp2_to_ptys_advert_link,
+	.to_ptys_speed			= mlxsw_sp2_to_ptys_speed,
+	.to_ptys_upper_speed		= mlxsw_sp2_to_ptys_upper_speed,
+	.port_speed_base		= mlxsw_sp2_port_speed_base,
+	.reg_ptys_eth_pack		= mlxsw_sp2_reg_ptys_eth_pack,
+	.reg_ptys_eth_unpack		= mlxsw_sp2_reg_ptys_eth_unpack,
+};
+
 static void
 mlxsw_sp_port_get_link_supported(struct mlxsw_sp *mlxsw_sp, u32 eth_proto_cap,
 				 struct ethtool_link_ksettings *cmd)
@@ -4189,7 +4517,7 @@ static int mlxsw_sp2_init(struct mlxsw_core *mlxsw_core,
 	mlxsw_sp->mac_mask = mlxsw_sp2_mac_mask;
 	mlxsw_sp->rif_ops_arr = mlxsw_sp2_rif_ops_arr;
 	mlxsw_sp->sb_vals = &mlxsw_sp2_sb_vals;
-	mlxsw_sp->port_type_speed_ops = &mlxsw_sp1_port_type_speed_ops;
+	mlxsw_sp->port_type_speed_ops = &mlxsw_sp2_port_type_speed_ops;
 
 	return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info);
 }
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
index d4f53632b24c..a61c1130d9e3 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
@@ -34,6 +34,7 @@
 #define MLXSW_SP_PORTS_PER_CLUSTER_MAX 4
 
 #define MLXSW_SP_PORT_BASE_SPEED_25G 25000 /* Mb/s */
+#define MLXSW_SP_PORT_BASE_SPEED_50G 50000 /* Mb/s */
 
 #define MLXSW_SP_KVD_LINEAR_SIZE 98304 /* entries */
 #define MLXSW_SP_KVD_GRANULARITY 128
-- 
2.20.1


^ permalink raw reply related

* [PATCH net-next 00/10] mlxsw: Add support for new port types and speeds for Spectrum-2
From: Ido Schimmel @ 2019-02-22 13:56 UTC (permalink / raw)
  To: netdev@vger.kernel.org
  Cc: davem@davemloft.net, Jiri Pirko, Shalom Toledo, mlxsw,
	Ido Schimmel

Shalom says:

This patchset adds support for new port types and speeds for Spectrum-2.

Patch #1 + #2 removes an unsupported PTYS field and a duplicate link
mode entry.

Patch #3 queries port's connector type from firmware instead of deriving
it from port admin state.

Patch #4 renames functions which relate to port type-speed to be
Spectrum-1 specific.

Patch #5 defines port type-speed operations and applies it for
Spectrum-1.

Patch #6 + #7 are small renaming and cosmetic changes.

Patch #8 adds new port type-speed fields for PTYS register. These new
fields extend the existing ones in order to support more types and
speeds.

Patch #9 adds Spectrum-2 support for port type-speed operations.

Patch #10 adds Spectrum-2 new port types and speeds.

For Spectrum-2, the user must configure all the types per speed if he /
she wants a specific speed to be advertised. For example, if the user
wants to advertise 100Gbps 4-lanes speed, the following ethtool bits
should be advertised:

  Supported ethtool bits for 100Gbps 4-lanes:
      0x1000000000      100000baseKR4 Full
      0x2000000000      100000baseSR4 Full
      0x4000000000      100000baseCR4 Full
      0x8000000000      100000baseLR4_ER4 Full

  Command for advertising 100Gbps 4-lanes:
      ethtool -s enp3s0np1 advertise 0xF000000000

Shalom Toledo (10):
  mlxsw: spectrum: Remove duplicate port link mode entry
  mlxsw: spectrum: Remove unsupported eth_proto_lp_advertise field in
    PTYS
  mlxsw: spectrum: Query port connector type from firmware
  mlxsw: spectrum: Rename port type-speed functions to ASIC specific
  mlxsw: spectrum: Add port type-speed operations
  mlxsw: reg: Rename p_eth_proto_adm to full name p_eth_proto_admin
  mlxsw: reg: 80 columns wrapping change
  mlxsw: reg: Add new port type-speed fields for PTYS register
  mlxsw: spectrum: Add Spectrum-2 ASIC port type-speed operations
  mlxsw: spectrum: Add Spectrum-2 ASIC support for new port types and
    speeds

 drivers/net/ethernet/mellanox/mlxsw/reg.h     |  89 ++-
 .../net/ethernet/mellanox/mlxsw/spectrum.c    | 618 +++++++++++++++---
 .../net/ethernet/mellanox/mlxsw/spectrum.h    |  28 +-
 3 files changed, 641 insertions(+), 94 deletions(-)

-- 
2.20.1


^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox