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

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

atlantic forwarding driver v1.0.29



  [ATLDRV-1139] - after ifconfig -multicast Unicast filters registers have valid values for multicast addresses
  [ATLDRV-1170] - macsec key cleaned on SA updates
  [ATLDRV-1171] - AQ066: MSI index leak for head pointer writeback event
  [ATLDRV-1172] - AQ068: shift-count-overflow error in DESCR_FIELD()
  [ATLDRV-1187] - atlfwdtool not compiled on Centos
  [ATLDRV-1186] - FWD: MACsec offload (cleanup)

Signed-off: Dmitry Bogdanov <dbogdanov@marvell.com>
Signed-off: Mark Starovoytov <mstarovo@aquantia.com>
Co-authored-by: default avatarMark Starovoytov <mstarovo@aquantia.com>
Change-Id: I93e0ead992901b8f2306836d936fb394deb2bef9
Git-commit: 674c4e44c501eed10a57e6f52e58c749f07a4639
Git-repo: https://github.com/aquantia/linux-4.14-atlantic-forwarding


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

#define ATL_VERSION "1.0.28"
#define ATL_VERSION "1.0.29"

struct atl_nic;
enum atl_fwd_notify;
@@ -404,6 +404,7 @@ 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);

+43 −37
Original line number Diff line number Diff line
@@ -739,7 +739,7 @@ static int atl_get_sset_count(struct net_device *ndev, int sset)
#ifdef NETIF_F_HW_MACSEC
		       + ARRAY_SIZE(macsec_stat_descs)
		       + ARRAY_SIZE(macsec_tx_sc_stat_descs) *
		       		hweight_long(nic->hw.macsec_cfg.secy_idx_busy)
				 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) *
@@ -761,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;
	}
}
@@ -813,26 +813,27 @@ static void atl_get_strings(struct net_device *ndev, uint32_t sset,
		atl_copy_stats_strings(&p, "macsec_", macsec_stat_descs,
				       ARRAY_SIZE(macsec_stat_descs));

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

			snprintf(prefix, sizeof(prefix), "txsc%d_",
				 atl_secy->sc_idx);
			atl_copy_stats_strings(&p, prefix,
					macsec_tx_sc_stat_descs,
				 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++) {
			for (assoc_num = 0; assoc_num < MACSEC_NUM_AN;
			     assoc_num++) {
				if (!test_bit(assoc_num,
					      &atl_secy->tx_sa_idx_busy))
					      &atl_txsc->tx_sa_idx_busy))
					continue;
				snprintf(prefix, sizeof(prefix), "txsc%d_sa%d_",
					 atl_secy->sc_idx, assoc_num);
				atl_copy_stats_strings(&p, prefix,
						macsec_tx_sa_stat_descs,
					 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));
			}
		}
@@ -843,14 +844,15 @@ static void atl_get_strings(struct net_device *ndev, uint32_t sset,
				&nic->hw.macsec_cfg.atl_rxsc[i];
			int assoc_num;

			for (assoc_num = 0; assoc_num < MACSEC_NUM_AN; 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,
				atl_copy_stats_strings(
					&p, prefix, macsec_rx_sa_stat_descs,
					ARRAY_SIZE(macsec_rx_sa_stat_descs));
			}
		}
@@ -917,20 +919,24 @@ static void atl_get_ethtool_stats(struct net_device *ndev,
#endif
#ifdef NETIF_F_HW_MACSEC
	int assoc_num;
	atl_write_stats(&nic->hw.macsec_cfg.stats, macsec_stat_descs, data, uint64_t);
	atl_write_stats(&nic->hw.macsec_cfg.stats, macsec_stat_descs, data,
			uint64_t);

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

		atl_write_stats(&atl_secy->stats, macsec_tx_sc_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_secy->tx_sa_idx_busy))
			if (!test_bit(assoc_num, &atl_txsc->tx_sa_idx_busy))
				continue;
			atl_write_stats(&atl_secy->tx_sa_stats[assoc_num],
					macsec_tx_sa_stat_descs, data, uint64_t);
			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++) {
+4 −0
Original line number Diff line number Diff line
@@ -625,6 +625,8 @@ void atl_fwd_release_event(struct atl_fwd_event *evt)

	atl_fwd_disable_event(evt);

	ring->evt = NULL;

	if (evt->flags & ATL_FWD_EVT_TXWB)
		return;

@@ -711,6 +713,8 @@ int atl_fwd_request_event(struct atl_fwd_event *evt)
		ret = atl_fwd_init_event(evt);
		if (ret)
			goto fail;

		return 0;
	}

	idx = find_next_zero_bit(map, ATL_NUM_MSI_VECS, ATL_FWD_MSI_BASE);
+13 −6
Original line number Diff line number Diff line
@@ -630,12 +630,17 @@ void atl_set_rx_mode(struct net_device *ndev)
{
	struct atl_nic *nic = netdev_priv(ndev);
	struct atl_hw *hw = &nic->hw;
	int uc_count = netdev_uc_count(ndev), mc_count = netdev_mc_count(ndev);
	int promisc_needed = !!(ndev->flags & IFF_PROMISC);
	bool is_multicast_enabled = !!(ndev->flags & IFF_MULTICAST);
	int all_multi_needed = !!(ndev->flags & IFF_ALLMULTI);
	int promisc_needed = !!(ndev->flags & IFF_PROMISC);
	int uc_count = netdev_uc_count(ndev);
	int mc_count = 0;
	int i = 1; /* UC filter 0 reserved for MAC address */
	struct netdev_hw_addr *hwaddr;

	if (is_multicast_enabled)
		mc_count = netdev_mc_count(ndev);

	if (uc_count > ATL_UC_FLT_NUM - 1)
		promisc_needed |= 1;
	else if (uc_count + mc_count > ATL_UC_FLT_NUM - 1)
@@ -655,11 +660,13 @@ void atl_set_rx_mode(struct net_device *ndev)
	netdev_for_each_uc_addr(hwaddr, ndev)
		atl_set_uc_flt(hw, i++, hwaddr->addr);

	if (is_multicast_enabled) {
		atl_set_all_multi(hw, all_multi_needed);

		if (!all_multi_needed)
			netdev_for_each_mc_addr(hwaddr, ndev)
				atl_set_uc_flt(hw, i++, hwaddr->addr);
	}

	while (i < ATL_UC_FLT_NUM)
		atl_disable_uc_flt(hw, i++);
+5 −5
Original line number Diff line number Diff line
@@ -74,7 +74,6 @@ enum atl_nic_state {
	ATL_ST_DETACHED,
};
#ifdef NETIF_F_HW_MACSEC
#define ATL_MACSEC_MAX_SECY 32
#define ATL_MACSEC_MAX_SC 32
#define ATL_MACSEC_MAX_SA 32
enum atl_macsec_sc_sa {
@@ -149,17 +148,18 @@ struct atl_macsec_tx_sc_stats {
};

struct atl_macsec_cfg {
	unsigned long secy_idx_busy;
	enum atl_macsec_sc_sa sc_sa;
	struct atl_macsec_secy {
		uint32_t sc_idx;
	/* Egress channel configuration */
	unsigned long txsc_idx_busy;
	struct atl_macsec_txsc {
		uint32_t hw_sc_idx;
		unsigned long tx_sa_idx_busy;
		const struct macsec_secy *sw_secy;
		/* It is not OK to store key in driver but it is until ... */
		u8 tx_sa_key[MACSEC_NUM_AN][MACSEC_KEYID_LEN];
		struct atl_macsec_tx_sc_stats stats;
		struct atl_macsec_tx_sa_stats tx_sa_stats[MACSEC_NUM_AN];
	} atl_secy[ATL_MACSEC_MAX_SECY];
	} atl_txsc[ATL_MACSEC_MAX_SC];
	/* Ingress channel configuration */
	unsigned long rxsc_idx_busy;
	struct atl_macsec_rxsc {
Loading