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

Commit 22bdc645 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "atlantic forwarding driver v1.0.29"

parents aa4c04fb d624a28c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ atlantic-fwd-objs := atl_fw.o \
atlantic-fwd-$(CONFIG_ATLFWD_FWD) += atl_fwd.o
atlantic-fwd-$(CONFIG_ATLFWD_FWD_NETLINK) += atl_fwdnl.o \
					      atl_fwdnl_params.o
atlantic-fwd-$(CONFIG_MACSEC) += atl_macsec.o macsec/macsec_api.o

atlantic-fwd-$(CONFIG_AQFWD_QCOM) += atl_qcom.o
atlantic-fwd-$(CONFIG_AQFWD_QCOM_IPA) += atl_qcom_ipa.o
+16 −22
Original line number Diff line number Diff line
@@ -18,13 +18,14 @@
#include <linux/netdevice.h>
#include <linux/moduleparam.h>

#define ATL_VERSION "1.0.27"
#define ATL_VERSION "1.0.29"

struct atl_nic;
enum atl_fwd_notify;

#include "atl_compat.h"
#include "atl_hw.h"
#include "atl_ring_desc.h"
#include "atl_stats.h"

#define ATL_MAX_QUEUES 8
@@ -160,27 +161,8 @@ struct atl_fwd {
};

#ifdef CONFIG_ATLFWD_FWD_NETLINK
/* FWD ring descriptor
 * Similar to atl_desc_ring, but has less fields.
 *
 * Note: it's not a part of atl_fwd_ring on purpose.
 */
struct atl_fwd_ring_desc {
	struct atl_hw_ring hw;
	uint32_t head;
	uint32_t tail;
	union {
		struct atl_txbuf *txbufs;
	};
	struct u64_stats_sync syncp;
	struct atl_ring_stats stats;
	u32 tx_hw_head;
	struct atl_fwd_event tx_evt;
	struct atl_fwd_event rx_evt;
};

struct atl_fwdnl {
	struct atl_fwd_ring_desc ring_desc[ATL_NUM_FWD_RINGS * 2];
	struct atl_desc_ring ring_desc[ATL_NUM_FWD_RINGS * 2];
	/* State of forced redirections */
	int force_icmp_via;
	int force_tx_via;
@@ -283,11 +265,16 @@ enum atl_priv_flag_bits {
extern const char atl_driver_name[];

extern const struct ethtool_ops atl_ethtool_ops;
#ifdef NETIF_F_HW_MACSEC
extern const struct macsec_ops atl_macsec_ops;
#endif

extern unsigned int atl_max_queues;
extern unsigned int atl_max_queues_non_msi;
extern unsigned atl_rx_linear;
extern unsigned atl_min_intr_delay;
extern int atl_enable_msi;
extern bool atl_enable_msi;
extern bool atl_wq_non_msi;
extern unsigned int atl_tx_clean_budget;
extern unsigned int atl_tx_free_low;
extern unsigned int atl_tx_free_high;
@@ -366,6 +353,7 @@ void atl_clear_tdm_cache(struct atl_nic *nic);
int atl_alloc_rings(struct atl_nic *nic);
void atl_free_rings(struct atl_nic *nic);
irqreturn_t atl_ring_irq(int irq, void *priv);
void atl_ring_work(struct work_struct *work);
void atl_start_hw_global(struct atl_nic *nic);
int atl_intr_init(struct atl_nic *nic);
void atl_intr_release(struct atl_nic *nic);
@@ -413,5 +401,11 @@ int atl_update_thermal_flag(struct atl_hw *hw, int bit, bool val);
int atl_verify_thermal_limits(struct atl_hw *hw, struct atl_thermal *thermal);
int atl_do_reset(struct atl_nic *nic);
int atl_set_media_detect(struct atl_nic *nic, bool on);
int atl_init_macsec(struct atl_hw *hw);
void atl_macsec_work(struct atl_nic *nic);
int atl_macsec_rx_sa_cnt(struct atl_hw *hw);
int atl_macsec_tx_sc_cnt(struct atl_hw *hw);
int atl_macsec_tx_sa_cnt(struct atl_hw *hw);
int atl_macsec_update_stats(struct atl_hw *hw);

#endif
+3 −0
Original line number Diff line number Diff line
@@ -181,6 +181,9 @@ static inline void timer_setup(struct timer_list *timer,
	setup_timer(timer, (void (*)(unsigned long))callback,
			(unsigned long)timer);
}

#define from_timer(var, callback_timer, timer_fieldname) \
	container_of(callback_timer, typeof(*var), timer_fieldname)
#endif	/* 4.14.0 && RHEL < 7.6 */

#if LINUX_VERSION_CODE < KERNEL_VERSION(4,8,0) && RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,5)
+2 −0
Original line number Diff line number Diff line
@@ -10,6 +10,8 @@
#ifndef _ATL_DESC_H_
#define _ATL_DESC_H_

#include <linux/kernel.h>

#if defined(__LITTLE_ENDIAN_BITFIELD)
struct atl_tx_ctx {
	unsigned long long :40; //0
+216 −21
Original line number Diff line number Diff line
@@ -363,10 +363,12 @@ static void atl_get_channels(struct net_device *ndev,
	struct atl_nic *nic = netdev_priv(ndev);
	int max_rings;

	if (atl_enable_msi)
		max_rings = min_t(int, ATL_MAX_QUEUES, num_present_cpus());
	if (nic->flags & ATL_FL_MULTIPLE_VECTORS)
		max_rings = atl_max_queues;
	else
		max_rings = 1;
		max_rings = atl_max_queues_non_msi;
	if (max_rings > num_present_cpus())
		max_rings = num_present_cpus();

	chan->max_combined = max_rings;
	chan->combined_count = nic->nvecs;
@@ -633,6 +635,92 @@ static const char atl_priv_flags[][ETH_GSTRING_LEN] = {
	ATL_PRIV_FLAG(MediaDetect, MEDIA_DETECT),
};

#ifdef NETIF_F_HW_MACSEC

#define ATL_MACSEC_STAT(_name, _field)					\
{									\
	.stat_name = #_name,						\
	.idx = offsetof(struct atl_macsec_common_stats, _field) /	\
		sizeof(uint64_t),					\
}

#define ATL_MACSEC_RX_SA_STAT(_name, _field)				\
{									\
	.stat_name = #_name,						\
	.idx = offsetof(struct atl_macsec_rx_sa_stats, _field) /	\
		sizeof(uint64_t),					\
}

#define ATL_MACSEC_TX_SA_STAT(_name, _field)				\
{									\
	.stat_name = #_name,						\
	.idx = offsetof(struct atl_macsec_tx_sa_stats, _field) /	\
		sizeof(uint64_t),				\
}

#define ATL_MACSEC_TX_SC_STAT(_name, _field)				\
{									\
	.stat_name = #_name,						\
	.idx = offsetof(struct atl_macsec_tx_sc_stats, _field) /	\
		sizeof(uint64_t),					\
}

static const struct atl_stat_desc macsec_stat_descs[] = {
	ATL_MACSEC_STAT(in_ctl_pkts, in.ctl_pkts),
	ATL_MACSEC_STAT(in_tagged_miss_pkts, in.tagged_miss_pkts),
	ATL_MACSEC_STAT(in_untagged_miss_pkts, in.untagged_miss_pkts),
	ATL_MACSEC_STAT(in_notag_pkts, in.notag_pkts),
	ATL_MACSEC_STAT(in_untagged_pkts, in.untagged_pkts),
	ATL_MACSEC_STAT(in_bad_tag_pkts, in.bad_tag_pkts),
	ATL_MACSEC_STAT(in_no_sci_pkts, in.no_sci_pkts),
	ATL_MACSEC_STAT(in_unknown_sci_pkts, in.unknown_sci_pkts),
	ATL_MACSEC_STAT(in_ctrl_prt_pass_pkts, in.ctrl_prt_pass_pkts),
	ATL_MACSEC_STAT(in_unctrl_prt_pass_pkts, in.unctrl_prt_pass_pkts),
	ATL_MACSEC_STAT(in_ctrl_prt_fail_pkts, in.ctrl_prt_fail_pkts),
	ATL_MACSEC_STAT(in_unctrl_prt_fail_pkts, in.unctrl_prt_fail_pkts),
	ATL_MACSEC_STAT(in_too_long_pkts, in.too_long_pkts),
	ATL_MACSEC_STAT(in_igpoc_ctl_pkts, in.igpoc_ctl_pkts),
	ATL_MACSEC_STAT(in_ecc_error_pkts, in.ecc_error_pkts),
	ATL_MACSEC_STAT(in_unctrl_hit_drop_redir, in.unctrl_hit_drop_redir),
	ATL_MACSEC_STAT(out_ctl_pkts, out.ctl_pkts),
	ATL_MACSEC_STAT(out_unknown_sa_pkts, out.unknown_sa_pkts),
	ATL_MACSEC_STAT(out_untagged_pkts, out.untagged_pkts),
	ATL_MACSEC_STAT(out_too_long, out.too_long),
	ATL_MACSEC_STAT(out_ecc_error_pkts, out.ecc_error_pkts),
	ATL_MACSEC_STAT(out_unctrl_hit_drop_redir, out.unctrl_hit_drop_redir),
};

static const struct atl_stat_desc macsec_rx_sa_stat_descs[] = {
	ATL_MACSEC_RX_SA_STAT(untagged_hit_pkts, untagged_hit_pkts),
	ATL_MACSEC_RX_SA_STAT(ctrl_hit_drop_redir_pkts, ctrl_hit_drop_redir_pkts),
	ATL_MACSEC_RX_SA_STAT(not_using_sa, not_using_sa),
	ATL_MACSEC_RX_SA_STAT(unused_sa, unused_sa),
	ATL_MACSEC_RX_SA_STAT(not_valid_pkts, not_valid_pkts),
	ATL_MACSEC_RX_SA_STAT(invalid_pkts, invalid_pkts),
	ATL_MACSEC_RX_SA_STAT(ok_pkts, ok_pkts),
	ATL_MACSEC_RX_SA_STAT(late_pkts, late_pkts),
	ATL_MACSEC_RX_SA_STAT(delayed_pkts, delayed_pkts),
	ATL_MACSEC_RX_SA_STAT(unchecked_pkts, unchecked_pkts),
	ATL_MACSEC_RX_SA_STAT(validated_octets, validated_octets),
	ATL_MACSEC_RX_SA_STAT(decrypted_octets, decrypted_octets),
};

static const struct atl_stat_desc macsec_tx_sa_stat_descs[] = {
	ATL_MACSEC_TX_SA_STAT(hit_drop_redirect, sa_hit_drop_redirect),
	ATL_MACSEC_TX_SA_STAT(protected2_pkts, sa_protected2_pkts),
	ATL_MACSEC_TX_SA_STAT(protected_pkts, sa_protected_pkts),
	ATL_MACSEC_TX_SA_STAT(encrypted_pkts, sa_encrypted_pkts),
};


static const struct atl_stat_desc macsec_tx_sc_stat_descs[] = {
	ATL_MACSEC_TX_SC_STAT(protected_pkts, sc_protected_pkts),
	ATL_MACSEC_TX_SC_STAT(encrypted_pkts, sc_encrypted_pkts),
	ATL_MACSEC_TX_SC_STAT(protected_octets, sc_protected_octets),
	ATL_MACSEC_TX_SC_STAT(encrypted_octets, sc_encrypted_octets),
};
#endif

static int atl_get_sset_count(struct net_device *ndev, int sset)
{
	struct atl_nic *nic = netdev_priv(ndev);
@@ -645,6 +733,17 @@ static int atl_get_sset_count(struct net_device *ndev, int sset)
#ifdef CONFIG_ATLFWD_FWD_NETLINK
		       + ARRAY_SIZE(tx_stat_descs) *
				 hweight_long(nic->fwd.ring_map[ATL_FWDIR_TX])
		       + ARRAY_SIZE(rx_stat_descs) *
				 hweight_long(nic->fwd.ring_map[ATL_FWDIR_RX])
#endif
#ifdef NETIF_F_HW_MACSEC
		       + ARRAY_SIZE(macsec_stat_descs)
		       + ARRAY_SIZE(macsec_tx_sc_stat_descs) *
				 atl_macsec_tx_sc_cnt(&nic->hw)
		       + ARRAY_SIZE(macsec_tx_sa_stat_descs) *
				 atl_macsec_tx_sa_cnt(&nic->hw)
		       + ARRAY_SIZE(macsec_rx_sa_stat_descs) *
				 atl_macsec_rx_sa_cnt(&nic->hw)
#endif
			;

@@ -662,8 +761,8 @@ static void atl_copy_stats_strings(char **data, char *prefix,
	int i;

	for (i = 0; i < len; i++) {
		snprintf(*data, ETH_GSTRING_LEN, "%s%s",
			prefix, descs[i].stat_name);
		snprintf(*data, ETH_GSTRING_LEN, "%s%s", prefix,
			 descs[i].stat_name);
		*data += ETH_GSTRING_LEN;
	}
}
@@ -698,12 +797,64 @@ static void atl_get_strings(struct net_device *ndev, uint32_t sset,

#ifdef CONFIG_ATLFWD_FWD_NETLINK
		for (i = 0; i < ATL_NUM_FWD_RINGS; i++) {
			if (!atlfwd_nl_is_tx_fwd_ring_created(ndev, i))
				continue;

			snprintf(prefix, sizeof(prefix), "fwd_ring_%d_", i);
			atl_copy_stats_strings(&p, prefix, tx_stat_descs,

			if (atlfwd_nl_is_tx_fwd_ring_created(ndev, i))
				atl_copy_stats_strings(
					&p, prefix, tx_stat_descs,
					ARRAY_SIZE(tx_stat_descs));
			if (atlfwd_nl_is_rx_fwd_ring_created(ndev, i))
				atl_copy_stats_strings(
					&p, prefix, rx_stat_descs,
					ARRAY_SIZE(rx_stat_descs));
		}
#endif
#ifdef NETIF_F_HW_MACSEC
		atl_copy_stats_strings(&p, "macsec_", macsec_stat_descs,
				       ARRAY_SIZE(macsec_stat_descs));

		for (i = 0; i < ATL_MACSEC_MAX_SC; i++) {
			if (!(test_bit(i, &nic->hw.macsec_cfg.txsc_idx_busy)))
				continue;
			struct atl_macsec_txsc *atl_txsc =
				&nic->hw.macsec_cfg.atl_txsc[i];
			int assoc_num;

			snprintf(prefix, sizeof(prefix), "txsc%d_",
				 atl_txsc->hw_sc_idx);
			atl_copy_stats_strings(
				&p, prefix, macsec_tx_sc_stat_descs,
				ARRAY_SIZE(macsec_tx_sc_stat_descs));
			for (assoc_num = 0; assoc_num < MACSEC_NUM_AN;
			     assoc_num++) {
				if (!test_bit(assoc_num,
					      &atl_txsc->tx_sa_idx_busy))
					continue;
				snprintf(prefix, sizeof(prefix), "txsc%d_sa%d_",
					 atl_txsc->hw_sc_idx, assoc_num);
				atl_copy_stats_strings(
					&p, prefix, macsec_tx_sa_stat_descs,
					ARRAY_SIZE(macsec_tx_sa_stat_descs));
			}
		}
		for (i = 0; i < ATL_MACSEC_MAX_SC; i++) {
			if (!(test_bit(i, &nic->hw.macsec_cfg.rxsc_idx_busy)))
				continue;
			struct atl_macsec_rxsc *atl_rxsc =
				&nic->hw.macsec_cfg.atl_rxsc[i];
			int assoc_num;

			for (assoc_num = 0; assoc_num < MACSEC_NUM_AN;
			     assoc_num++) {
				if (!test_bit(assoc_num,
					      &atl_rxsc->rx_sa_idx_busy))
					continue;
				snprintf(prefix, sizeof(prefix), "rxsc%d_sa%d_",
					 atl_rxsc->hw_sc_idx, assoc_num);
				atl_copy_stats_strings(
					&p, prefix, macsec_rx_sa_stat_descs,
					ARRAY_SIZE(macsec_rx_sa_stat_descs));
			}
		}
#endif
		return;
@@ -732,7 +883,9 @@ static void atl_get_ethtool_stats(struct net_device *ndev,

	atl_update_eth_stats(nic);
	atl_update_global_stats(nic);

#ifdef NETIF_F_HW_MACSEC
	atl_macsec_update_stats(&nic->hw);
#endif
	atl_write_stats(&nic->stats.tx, tx_stat_descs, data, uint64_t);
	atl_write_stats(&nic->stats.rx, rx_stat_descs, data, uint64_t);

@@ -752,11 +905,53 @@ static void atl_get_ethtool_stats(struct net_device *ndev,
	for (i = 0; i < ATL_NUM_FWD_RINGS; i++) {
		struct atl_ring_stats tmp;

		if (!atlfwd_nl_is_tx_fwd_ring_created(ndev, i))
		if (atlfwd_nl_is_tx_fwd_ring_created(ndev, i)) {
			atl_fwd_get_ring_stats(nic->fwd.rings[ATL_FWDIR_TX][i],
					       &tmp);
			atl_write_stats(&tmp.tx, tx_stat_descs, data, uint64_t);
		}
		if (atlfwd_nl_is_rx_fwd_ring_created(ndev, i)) {
			atl_fwd_get_ring_stats(nic->fwd.rings[ATL_FWDIR_RX][i],
					       &tmp);
			atl_write_stats(&tmp.rx, rx_stat_descs, data, uint64_t);
		}
	}
#endif
#ifdef NETIF_F_HW_MACSEC
	int assoc_num;
	atl_write_stats(&nic->hw.macsec_cfg.stats, macsec_stat_descs, data,
			uint64_t);

	for (i = 0; i < ATL_MACSEC_MAX_SC; i++) {
		if (!(test_bit(i, &nic->hw.macsec_cfg.txsc_idx_busy)))
			continue;
		struct atl_macsec_txsc *atl_txsc =
			&nic->hw.macsec_cfg.atl_txsc[i];

		atl_fwd_get_ring_stats(nic->fwd.rings[ATL_FWDIR_TX][i], &tmp);
		atl_write_stats(&tmp.tx, tx_stat_descs, data, uint64_t);
		atl_write_stats(&atl_txsc->stats, macsec_tx_sc_stat_descs, data,
				uint64_t);

		for (assoc_num = 0; assoc_num < MACSEC_NUM_AN; assoc_num++) {
			if (!test_bit(assoc_num, &atl_txsc->tx_sa_idx_busy))
				continue;
			atl_write_stats(&atl_txsc->tx_sa_stats[assoc_num],
					macsec_tx_sa_stat_descs, data,
					uint64_t);
		}
	}
	for (i = 0; i < ATL_MACSEC_MAX_SC; i++) {
		if (!(test_bit(i, &nic->hw.macsec_cfg.rxsc_idx_busy)))
			continue;
		struct atl_macsec_rxsc *atl_rxsc =
			&nic->hw.macsec_cfg.atl_rxsc[i];
		int assoc_num;

		for (assoc_num = 0; assoc_num < MACSEC_NUM_AN; assoc_num++) {
			if (!test_bit(assoc_num, &atl_rxsc->rx_sa_idx_busy))
				continue;
			atl_write_stats(&atl_rxsc->rx_sa_stats[assoc_num],
					macsec_rx_sa_stat_descs, data, uint64_t);
		}
	}
#endif
}
Loading