Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37f13c1f authored by Dmitry Bogdanov's avatar Dmitry Bogdanov Committed by Jinesh K. Jayakumar
Browse files

atlantic forwarding driver v1.1.2

  [ATLDRV-1348] - FWD: IPv6 and L4 ntuple filters not work

Change-Id: Ib41f418e4773ea5391efb0f53c368d18c817185e
Signed-off: Dmitry Bogdanov <dbogdanov@marvell.com>
Git-commit: 714828615d0657982fbde6fa8503008a53554147
Git-repo: https://github.com/aquantia/linux-4.14-atlantic-forwarding


Signed-off-by: default avatarJinesh K. Jayakumar <jineshk@codeaurora.org>
parent 55218ce6
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@
#include <linux/netdevice.h>
#include <linux/moduleparam.h>

#define ATL_VERSION "1.1.1"
#define ATL_VERSION "1.1.2"

struct atl_nic;
enum atl_fwd_notify;
@@ -90,8 +90,8 @@ enum atl2_ntuple_cmd {
	ATL2_NTC_L3_IPV6_PROTO_SHIFT = 0x18,

	ATL2_NTC_L4_EN = BIT(0), /* Filter enabled */
	ATL2_NTC_L4_SP = BIT(1),
	ATL2_NTC_L4_DP = BIT(2),
	ATL2_NTC_L4_DP = BIT(1),
	ATL2_NTC_L4_SP = BIT(2),
};

struct atl2_rxf_l3 {
+19 −10
Original line number Diff line number Diff line
@@ -1792,8 +1792,8 @@ static void atl2_rxf_set_ntuple(struct atl_nic *nic,

	if (ntuple->cmd[idx] & ATL_NTC_PROTO)
		l3.cmd |= ntuple->cmd[idx] & ATL_NTC_V6 ?
			  ATL2_NTC_L3_IPV6_PROTO :
			  ATL2_NTC_L3_IPV4_PROTO;
			  ATL2_NTC_L3_IPV6_PROTO | ATL2_NTC_L3_IPV6_EN :
			  ATL2_NTC_L3_IPV4_PROTO | ATL2_NTC_L3_IPV4_EN;

	switch (ntuple->cmd[idx] & ATL_NTC_L4_MASK) {
	case ATL_NTC_L4_TCP:
@@ -2221,9 +2221,9 @@ static void atl2_update_ntuple_flt(struct atl_nic *nic, int idx)
			mask |= ATL2_RPF_TAG_L3_V6_MASK;
			cmd |= (l3_idx + 1) << 0x14;

			if (l3->cmd & ATL2_NTC_L3_IPV4_SA)
			if (l3->cmd & ATL2_NTC_L3_IPV6_SA)
				atl2_rpf_l3_v6_sa_set(hw, l3_idx, l3->src_ip6);
			if (l3->cmd & ATL2_NTC_L3_IPV4_DA)
			if (l3->cmd & ATL2_NTC_L3_IPV6_DA)
				atl2_rpf_l3_v6_da_set(hw, l3_idx, l3->dst_ip6);
		} else {
			WARN(1, "L3 filter invalid");
@@ -2243,6 +2243,10 @@ static void atl2_update_ntuple_flt(struct atl_nic *nic, int idx)
			return;
		}
		cmd = l4->cmd | (l4_idx + 1) << 0x4;
		atl_write(hw, ATL_NTUPLE_SPORT(l4_idx),
			swab16(l4->src_port));
		atl_write(hw, ATL_NTUPLE_DPORT(l4_idx),
			swab16(l4->dst_port));
		atl_write(hw, ATL2_RPF_L4_FLT(l4_idx), cmd);
	}

@@ -2298,6 +2302,10 @@ void atl_update_ntuple_flt(struct atl_nic *nic, int idx)
				swab32(ntuple->dst_ip4[idx]));
	}

	/* ports are used by both new RPF and legacy RPF, but with different
	 * locations
	 */
	if (!nic->hw.new_rpf) {
		if (cmd & ATL_NTC_SP)
			atl_write(hw, ATL_NTUPLE_SPORT(idx),
				swab16(ntuple->src_port[idx]));
@@ -2305,6 +2313,7 @@ void atl_update_ntuple_flt(struct atl_nic *nic, int idx)
		if (cmd & ATL_NTC_DP)
			atl_write(hw, ATL_NTUPLE_DPORT(idx),
				swab16(ntuple->dst_port[idx]));
	}

	if (cmd & ATL_NTC_RXQ)
		cmd |= 1 << ATL_NTC_ACT_SHIFT;
+1 −1
Original line number Diff line number Diff line
@@ -272,7 +272,7 @@ static inline void atl2_rpf_vlan_flr_tag_set(struct atl_hw *hw, u32 tag,
static inline void atl2_rpf_etht_flr_tag_set(struct atl_hw *hw, u32 tag,
					     u32 filter)
{
	atl_write_bits(hw, ATL_RX_ETYPE_FLT(filter), 0, 3, tag);
	atl_write_bits(hw, ATL2_RX_ETYPE_TAG(filter), 0, 3, tag);
}

static inline void atl2_rpf_l3_v4_da_set(struct atl_hw *hw, u32 filter, u32 val)
+1 −0
Original line number Diff line number Diff line
@@ -107,6 +107,7 @@ enum mcp_scratchpad {
#define ATL_VLAN_FLT_NUM 16
#define ATL_RX_VLAN_FLT(idx) ATL_REG_STRIDE(0x5290, 4, idx)
#define ATL_RX_ETYPE_FLT(idx) ATL_REG_STRIDE(0x5300, 4, idx)
#define ATL2_RX_ETYPE_TAG(idx) ATL_REG_STRIDE(0x5340, 4, idx)
#define ATL_ETYPE_FLT_NUM 15
#define ATL_NTUPLE_CTRL(idx) ATL_REG_STRIDE(0x5380, 4, idx)
#define ATL_NTUPLE_SADDR(idx) ATL_REG_STRIDE(0x53b0, 4, idx)
+4 −0
Original line number Diff line number Diff line
Version 1.1.2
==============
[ATLDRV-1348] - FWD: IPv6 and L4 ntuple filters not work 

Version 1.1.1
==============
[ATLDRV-1315] - driver 1.1.0 crashes at start on A1