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

Commit 657ff1d5 authored by Dmitry Bogdanov's avatar Dmitry Bogdanov Committed by Gerrit - the friendly Code Review server
Browse files

atlantic forwarding driver v1.1.10



  [ATLDRV-1559] - Add support of icmp proto to the rx filters
  [ATLDRV-1401] - A2: Filtering
  [ATLDRV-1513] - PM runtime failure

Change-Id: Ic8aa75694f9eccfda94577630a908d177b402cb9
Signed-off-by: default avatarDmitry Bogdanov <dbogdanov@marvell.com>
Git-commit: d5b0f4c48788abb3bb11dd1b3e70db111a20390c
Git-repo: https://github.com/aquantia/linux-4.14-atlantic-forwarding


Signed-off-by: default avatarLakshit Tyagi <ltyagi@codeaurora.org>
parent 35763bd6
Loading
Loading
Loading
Loading
+78 −1
Original line number Diff line number Diff line
@@ -153,10 +153,56 @@ static inline int atl2_shared_buffer_finish_ack(struct atl_hw *hw)
	return err;
}

static int atl2_fw_get_filter_caps(struct atl_hw *hw)
{
	struct atl_nic *nic = container_of(hw, struct atl_nic, hw);
	struct filter_caps_s filter_caps;
	u32 tag_top;
	int err;

	err = atl2_shared_buffer_read_safe(hw, filter_caps, &filter_caps);
	if (err)
		return err;

	hw->art_base_index = filter_caps.rslv_tbl_base_index * 8;
	hw->art_available = filter_caps.rslv_tbl_count * 8;
	if (hw->art_available == 0)
		hw->art_available = 128;
	nic->rxf_flex.available = 1;
	nic->rxf_flex.base_index = filter_caps.flexible_filter_mask >> 1;
	nic->rxf_mac.base_index = filter_caps.l2_filters_base_index;
	nic->rxf_mac.available = filter_caps.l2_filter_count;
	nic->rxf_etype.base_index = filter_caps.ethertype_filter_base_index;
	nic->rxf_etype.available = filter_caps.ethertype_filter_count;
	nic->rxf_etype.tag_top =
		(nic->rxf_etype.available >= ATL2_RPF_ETYPE_TAGS) ?
		 (ATL2_RPF_ETYPE_TAGS) : (ATL2_RPF_ETYPE_TAGS >> 1);
	nic->rxf_vlan.base_index = filter_caps.vlan_filter_base_index;
	/* 0 - no tag, 1 - reserved for vlan-filter-offload filters */
	tag_top = (filter_caps.vlan_filter_count == ATL_VLAN_FLT_NUM) ?
		  (ATL_VLAN_FLT_NUM - 2) :
		  (ATL_VLAN_FLT_NUM / 2 - 2);
	nic->rxf_vlan.available = min_t(u32, filter_caps.vlan_filter_count - 2,
					tag_top);
	nic->rxf_ntuple.l3_v4_base_index = filter_caps.l3_ip4_filter_base_index;
	nic->rxf_ntuple.l3_v4_available = min_t(u32,
						filter_caps.l3_ip4_filter_count,
						ATL_NTUPLE_FLT_NUM - 1);
	nic->rxf_ntuple.l3_v6_base_index = filter_caps.l3_ip6_filter_base_index;
	nic->rxf_ntuple.l3_v6_available = filter_caps.l3_ip6_filter_count;
	nic->rxf_ntuple.l4_base_index = filter_caps.l4_filter_base_index;
	nic->rxf_ntuple.l4_available = min_t(u32, filter_caps.l4_filter_count,
						ATL_NTUPLE_FLT_NUM - 1);

	return 0;
}

static int __atl2_fw_wait_init(struct atl_hw *hw)
{
	struct request_policy_s request_policy;
	struct link_control_s link_control;
	uint32_t mtu;
	int err;

	BUILD_BUG_ON_MSG(sizeof(struct link_options_s) != 0x4,
			 "linkOptions invalid size");
@@ -168,7 +214,7 @@ static int __atl2_fw_wait_init(struct atl_hw *hw)
			 "pauseQuanta invalid size");
	BUILD_BUG_ON_MSG(sizeof(struct cable_diag_control_s) != 0x4,
			 "cableDiagControl invalid size");
	BUILD_BUG_ON_MSG(sizeof(struct statistics_s) != 0x6C,
	BUILD_BUG_ON_MSG(sizeof(struct statistics_s) != 0x70,
			 "statistics_s invalid size");


@@ -225,9 +271,16 @@ static int __atl2_fw_wait_init(struct atl_hw *hw)
			 "stats invalid offset");
	BUILD_BUG_ON_MSG(offsetof(struct fw_interface_out, filter_caps) != 0x774,
			 "filter_caps invalid offset");
	BUILD_BUG_ON_MSG(offsetof(struct fw_interface_out,
				  management_status) != 0x78c,
			 "management_status invalid offset");
	BUILD_BUG_ON_MSG(offsetof(struct fw_interface_out, trace) != 0x800,
			 "trace invalid offset");

	err = atl2_fw_get_filter_caps(hw);
	if (err)
		return err;

	atl2_shared_buffer_get(hw, link_control, link_control);
	link_control.mode = ATL2_HOST_MODE_ACTIVE;
	atl2_shared_buffer_write(hw, link_control, link_control);
@@ -236,6 +289,30 @@ static int __atl2_fw_wait_init(struct atl_hw *hw)
	mtu = ATL_MAX_MTU + ETH_FCS_LEN + ETH_HLEN;
	atl2_shared_buffer_write(hw, mtu, mtu);

	atl2_shared_buffer_get(hw, request_policy, request_policy);
	request_policy.bcast.accept = 1;
	request_policy.bcast.queue_or_tc = 1;
	request_policy.bcast.rx_queue_tc_index = 0;
	request_policy.mcast.accept = 1;
	request_policy.mcast.queue_or_tc = 1;
	request_policy.mcast.rx_queue_tc_index = 0;
	request_policy.promisc.queue_or_tc = 1;
	request_policy.promisc.rx_queue_tc_index = 0;
	atl2_shared_buffer_write(hw, request_policy, request_policy);

	return atl2_shared_buffer_finish_ack(hw);
}

int atl2_fw_set_filter_policy(struct atl_hw *hw, bool promisc, bool allmulti)
{
	struct request_policy_s request_policy;

	atl2_shared_buffer_get(hw, request_policy, request_policy);

	request_policy.promisc.all = promisc;
	request_policy.mcast.promisc = allmulti;

	atl2_shared_buffer_write(hw, request_policy, request_policy);
	return atl2_shared_buffer_finish_ack(hw);
}

+71 −15
Original line number Diff line number Diff line
@@ -80,7 +80,6 @@ struct thermal_shutdown_s {

struct mac_address_s {
	uint8_t mac_address[6];
	uint16_t rsvd;
};

struct sleep_proxy_s {
@@ -188,7 +187,7 @@ struct sleep_proxy_s {
		uint32_t rr__offset;
	} mdns;
	/* WARN: where this gap actually is not known */
	uint32_t reserveFWGAP:16;
	uint32_t reserve_fw_gap:16;
};

struct ptp_s {
@@ -472,26 +471,64 @@ struct statistics_s {

		uint32_t tx_good_frames;
		uint32_t rx_good_frames;
		uint32_t reserveFWGAP;
		uint32_t reserve_fw_gap;
	} msm;
	uint32_t main_loop_cycles;
	uint32_t reserve_fw_gap;
};

struct filter_caps_s {
	uint8_t unicast_filters_count;
	uint8_t multicast_filters_count;
	uint8_t ethertype_filters_count;
	uint8_t vlan_filters_count;
	uint8_t l3_filters_count;
	uint8_t l4_filters_count;
	uint8_t l4_flex_filters_count;
	uint8_t flexible_filters_count;
	uint8_t l2_filters_base_index:6;
	uint8_t flexible_filter_mask:2;
	uint8_t l2_filter_count;
	uint8_t ethertype_filter_base_index;
	uint8_t ethertype_filter_count;

	uint8_t vlan_filter_base_index;
	uint8_t vlan_filter_count;
	uint8_t l3_ip4_filter_base_index:4;
	uint8_t l3_ip4_filter_count:4;
	uint8_t l3_ip6_filter_base_index:4;
	uint8_t l3_ip6_filter_count:4;

	uint8_t l4_filter_base_index:4;
	uint8_t l4_filter_count:4;
	uint8_t l4_flex_filter_base_index:4;
	uint8_t l4_flex_filter_count:4;
	uint8_t rslv_tbl_base_index;
	uint8_t rslv_tbl_count;
};

struct request_policy_s {
	struct {
		uint8_t all:1;
		uint8_t rsvd:1;
		uint8_t rx_queue_tc_index:5;
		uint8_t queue_or_tc:1;
	} promisc;

	struct {
		uint8_t accept:1;
		uint8_t rsvd:1;
		uint8_t rx_queue_tc_index:5;
		uint8_t queue_or_tc:1;
	} bcast;

	struct {
		uint8_t accept:1;
		uint8_t promisc:1;
		uint8_t rx_queue_tc_index:5;
		uint8_t queue_or_tc:1;
	} mcast;

	uint8_t rsvd:8;
};

struct fw_interface_in {
	uint32_t mtu;
	uint32_t rsvd1:32;
	struct mac_address_s mac_address;
	uint16_t rsvd;
	struct link_control_s link_control;
	uint32_t rsvd2:32;
	struct link_options_s link_options;
@@ -504,6 +541,8 @@ struct fw_interface_in {
	struct cable_diag_control_s cable_diag_control;
	uint32_t rsvd6:32;
	struct data_buffer_status_s data_buffer_status;
	uint32_t rsvd7:32;
	struct request_policy_s request_policy;
};

struct transaction_counter_s {
@@ -511,6 +550,22 @@ struct transaction_counter_s {
	uint32_t transaction_cnt_b:16;
};

struct management_status_s {
	struct mac_address_s mac_address;
	uint16_t vlan;

	struct{
		uint32_t enable : 1;
		uint32_t rsvd:31;
	} flags;

	uint32_t rsvd1:32;
	uint32_t rsvd2:32;
	uint32_t rsvd3:32;
	uint32_t rsvd4:32;
	uint32_t rsvd5:32;
};

struct fw_interface_out {
	struct transaction_counter_s transaction_id;
	struct version_s version;
@@ -536,11 +591,11 @@ struct fw_interface_out {
	uint32_t rsvd11:32;
	struct statistics_s stats;
	uint32_t rsvd12:32;
	uint32_t rsvd13:32;
	struct filter_caps_s filter_caps;
	uint32_t rsvd14:32;
	struct device_caps_s device_caps;
	uint32_t reserve[30];
	uint32_t rsvd13:32;
	struct management_status_s management_status;
	uint32_t reserve[21];
	struct trace_s trace;
};

@@ -629,6 +684,7 @@ enum ATL2_WAKE_REASON {

int atl2_fw_init(struct atl_hw *hw);
int atl2_get_fw_version(struct atl_hw *hw, u32 *fw_version);
int atl2_fw_set_filter_policy(struct atl_hw *hw, bool promisc, bool allmulti);


#endif
+32 −4
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@
#include <linux/netdevice.h>
#include <linux/moduleparam.h>

#define ATL_VERSION "1.1.9"
#define ATL_VERSION "1.1.10"

struct atl_nic;

@@ -41,8 +41,8 @@ enum {
	ATL_RXF_VLAN_MAX = ATL_VLAN_FLT_NUM,
	ATL_RXF_ETYPE_BASE = ATL_RXF_VLAN_BASE + ATL_RXF_VLAN_MAX,
	ATL_RXF_ETYPE_MAX = ATL_ETYPE_FLT_NUM,
	/* + 1 is for backward compatibility */
	ATL_RXF_NTUPLE_BASE = ATL_RXF_ETYPE_BASE + ATL_RXF_ETYPE_MAX + 1,
	ATL2_RPF_ETYPE_TAGS = 7,
	ATL_RXF_NTUPLE_BASE = ATL_RXF_ETYPE_BASE + ATL_RXF_ETYPE_MAX,
	ATL_RXF_NTUPLE_MAX = ATL_NTUPLE_FLT_NUM,
	ATL_RXF_FLEX_BASE = ATL_RXF_NTUPLE_BASE + ATL_RXF_NTUPLE_MAX,
	ATL_RXF_FLEX_MAX = 1,
@@ -134,12 +134,20 @@ struct atl_rxf_ntuple {
	__be16 dst_port[ATL_RXF_NTUPLE_MAX];
	__be16 src_port[ATL_RXF_NTUPLE_MAX];

	struct atl2_rxf_l3 l3[ATL_RXF_NTUPLE_MAX];
	struct atl2_rxf_l3 l3v4[ATL_RXF_NTUPLE_MAX];
	struct atl2_rxf_l3 l3v6[ATL_RXF_NTUPLE_MAX];
	struct atl2_rxf_l4 l4[ATL_RXF_NTUPLE_MAX];
	s8 l3_idx[ATL_RXF_NTUPLE_MAX];
	bool is_ipv6[ATL_RXF_NTUPLE_MAX];
	s8 l4_idx[ATL_RXF_NTUPLE_MAX];
	uint32_t cmd[ATL_RXF_NTUPLE_MAX];
	int count;
	int l3_v4_base_index;
	int l3_v4_available;
	int l3_v6_base_index;
	int l3_v6_available;
	int l4_base_index;
	int l4_available;
};

enum atl_vlan_cmd {
@@ -159,6 +167,8 @@ struct atl_rxf_vlan {
	unsigned long map[ATL_VID_MAP_LEN];
	int vlans_active;
	int promisc_count;
	int base_index;
	int available;
};

enum atl_etype_cmd {
@@ -170,9 +180,24 @@ enum atl_etype_cmd {
	ATL_ETYPE_VAL_MASK = BIT(16) - 1,
};

struct atl2_tag_policy {
	u16 action;
	u16 usage;
};

struct atl_rxf_etype {
	uint32_t cmd[ATL_RXF_ETYPE_MAX];
	int count;
	struct atl2_tag_policy tags_policy[ATL_RXF_ETYPE_MAX];
	int tag[ATL_RXF_ETYPE_MAX];
	int base_index;
	int available;
	int tag_top;
};

struct atl_rxf_mac {
	int base_index;
	int available;
};

enum atl_flex_cmd {
@@ -186,6 +211,8 @@ enum atl_flex_cmd {
struct atl_rxf_flex {
	uint32_t cmd[ATL_RXF_FLEX_MAX];
	int count;
	int base_index;
	int available;
};

struct atl_queue_vec;
@@ -258,6 +285,7 @@ struct atl_nic {
	struct atl_rxf_ntuple rxf_ntuple;
	struct atl_rxf_vlan rxf_vlan;
	struct atl_rxf_etype rxf_etype;
	struct atl_rxf_mac rxf_mac;
	struct atl_rxf_flex rxf_flex;

	/* PTP support */
+1 −1
Original line number Diff line number Diff line
@@ -113,7 +113,7 @@ static inline int skb_xmit_more(struct sk_buff *skb)
{
	return 0;
}
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5,2,0)
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0) || RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8, 2)
static inline int skb_xmit_more(struct sk_buff *skb)
{
	return netdev_xmit_more();
+295 −135

File changed.

Preview size limit exceeded, changes collapsed.

Loading