Loading drivers/net/ethernet/aquantia/atlantic-fwd/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading drivers/net/ethernet/aquantia/atlantic-fwd/atl_common.h +16 −22 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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 drivers/net/ethernet/aquantia/atlantic-fwd/atl_compat.h +3 −0 Original line number Diff line number Diff line Loading @@ -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) Loading drivers/net/ethernet/aquantia/atlantic-fwd/atl_desc.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading drivers/net/ethernet/aquantia/atlantic-fwd/atl_ethtool.c +216 −21 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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 ; Loading @@ -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; } } Loading Loading @@ -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; Loading Loading @@ -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); Loading @@ -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 Loading
drivers/net/ethernet/aquantia/atlantic-fwd/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
drivers/net/ethernet/aquantia/atlantic-fwd/atl_common.h +16 −22 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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
drivers/net/ethernet/aquantia/atlantic-fwd/atl_compat.h +3 −0 Original line number Diff line number Diff line Loading @@ -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) Loading
drivers/net/ethernet/aquantia/atlantic-fwd/atl_desc.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
drivers/net/ethernet/aquantia/atlantic-fwd/atl_ethtool.c +216 −21 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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 ; Loading @@ -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; } } Loading Loading @@ -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; Loading Loading @@ -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); Loading @@ -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