* [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
* [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, ð_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 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 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 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 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 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 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 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 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 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 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 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
* 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
* 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 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 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: 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: 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-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
* 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 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
* 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
* [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
* [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, ®s->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(®s->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(®s->mdio_ctl, mdio_ctl);
+
+ /* set the register address */
+ if (regnum & MII_ADDR_C45) {
+ enetc_wr_reg(®s->mdio_addr, regnum & 0xffff);
+
+ ret = enetc_mdio_wait_complete(regs);
+ if (ret)
+ return ret;
+ }
+
+ /* write the value */
+ enetc_wr_reg(®s->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(®s->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(®s->mdio_ctl, mdio_ctl);
+
+ /* set the register address */
+ if (regnum & MII_ADDR_C45) {
+ enetc_wr_reg(®s->mdio_addr, regnum & 0xffff);
+
+ ret = enetc_mdio_wait_complete(regs);
+ if (ret)
+ return ret;
+ }
+
+ /* initiate the read */
+ enetc_wr_reg(®s->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(®s->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(®s->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
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox