blob: 7e4ae9dc73a2ea604f18b46c85550c7a2203f040 [file] [log] [blame]
/*
* Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "nss_core.h"
#include "nss_data_plane_hal.h"
static DEFINE_SPINLOCK(nss_data_plane_hal_gmac_stats_lock);
/*
* nss_data_plane_hal_get_stats()
* Called by nss-dp to get GMAC stats
*/
static void nss_data_plane_hal_get_stats(struct nss_dp_data_plane_ctx *dpc,
struct nss_dp_gmac_stats *stats)
{
struct nss_data_plane_param *dp = (struct nss_data_plane_param *)dpc;
spin_lock_bh(&nss_data_plane_hal_gmac_stats_lock);
memcpy(stats, &dp->gmac_stats, sizeof(*stats));
spin_unlock_bh(&nss_data_plane_hal_gmac_stats_lock);
}
/*
* nss_data_plane_hal_add_dp_ops()
*/
void nss_data_plane_hal_add_dp_ops(struct nss_dp_data_plane_ops *dp_ops)
{
dp_ops->get_stats = nss_data_plane_hal_get_stats;
}
/*
* nss_data_plane_hal_register()
*/
void nss_data_plane_hal_register(struct nss_ctx_instance *nss_ctx)
{
}
/*
* nss_data_plane_hal_unregister()
*/
void nss_data_plane_hal_unregister(struct nss_ctx_instance *nss_ctx)
{
}
/*
* nss_data_plane_hal_set_features
*/
void nss_data_plane_hal_set_features(struct nss_dp_data_plane_ctx *dpc)
{
dpc->dev->features |= NSS_DATA_PLANE_SUPPORTED_FEATURES;
dpc->dev->hw_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES;
dpc->dev->wanted_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES;
/*
* Synopsys GMAC does not support checksum offload for QinQ VLANs.
* Hence, we do not advertise checksum offload support for VLANs.
*/
dpc->dev->vlan_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES &
(~(NETIF_F_RXCSUM | NETIF_F_HW_CSUM));
}
/*
* nss_data_plane_hal_stats_sync()
*/
void nss_data_plane_hal_stats_sync(struct nss_data_plane_param *ndpp,
struct nss_phys_if_stats *stats)
{
struct nss_dp_hal_gmac_stats *gmac_stats = &ndpp->gmac_stats.stats;
spin_lock_bh(&nss_data_plane_hal_gmac_stats_lock);
gmac_stats->rx_bytes += stats->if_stats.rx_bytes;
gmac_stats->rx_packets += stats->if_stats.rx_packets;
gmac_stats->rx_errors += stats->estats.rx_errors;
gmac_stats->rx_receive_errors += stats->estats.rx_receive_errors;
gmac_stats->rx_descriptor_errors += stats->estats.rx_descriptor_errors;
gmac_stats->rx_late_collision_errors += stats->estats.rx_late_collision_errors;
gmac_stats->rx_dribble_bit_errors += stats->estats.rx_dribble_bit_errors;
gmac_stats->rx_length_errors += stats->estats.rx_length_errors;
gmac_stats->rx_ip_header_errors += stats->estats.rx_ip_header_errors;
gmac_stats->rx_ip_payload_errors += stats->estats.rx_ip_payload_errors;
gmac_stats->rx_no_buffer_errors += stats->estats.rx_no_buffer_errors;
gmac_stats->rx_transport_csum_bypassed += stats->estats.rx_transport_csum_bypassed;
gmac_stats->tx_bytes += stats->if_stats.tx_bytes;
gmac_stats->tx_packets += stats->if_stats.tx_packets;
gmac_stats->tx_collisions += stats->estats.tx_collisions;
gmac_stats->tx_errors += stats->estats.tx_errors;
gmac_stats->tx_jabber_timeout_errors += stats->estats.tx_jabber_timeout_errors;
gmac_stats->tx_frame_flushed_errors += stats->estats.tx_frame_flushed_errors;
gmac_stats->tx_loss_of_carrier_errors += stats->estats.tx_loss_of_carrier_errors;
gmac_stats->tx_no_carrier_errors += stats->estats.tx_no_carrier_errors;
gmac_stats->tx_late_collision_errors += stats->estats.tx_late_collision_errors;
gmac_stats->tx_excessive_collision_errors += stats->estats.tx_excessive_collision_errors;
gmac_stats->tx_excessive_deferral_errors += stats->estats.tx_excessive_deferral_errors;
gmac_stats->tx_underflow_errors += stats->estats.tx_underflow_errors;
gmac_stats->tx_ip_header_errors += stats->estats.tx_ip_header_errors;
gmac_stats->tx_ip_payload_errors += stats->estats.tx_ip_payload_errors;
gmac_stats->tx_dropped += stats->estats.tx_dropped;
gmac_stats->hw_errs[0] += stats->estats.hw_errs[0];
gmac_stats->hw_errs[1] += stats->estats.hw_errs[1];
gmac_stats->hw_errs[2] += stats->estats.hw_errs[2];
gmac_stats->hw_errs[3] += stats->estats.hw_errs[3];
gmac_stats->hw_errs[4] += stats->estats.hw_errs[4];
gmac_stats->hw_errs[5] += stats->estats.hw_errs[5];
gmac_stats->hw_errs[6] += stats->estats.hw_errs[6];
gmac_stats->hw_errs[7] += stats->estats.hw_errs[7];
gmac_stats->hw_errs[8] += stats->estats.hw_errs[8];
gmac_stats->hw_errs[9] += stats->estats.hw_errs[9];
gmac_stats->rx_missed += stats->estats.rx_missed;
gmac_stats->fifo_overflows += stats->estats.fifo_overflows;
gmac_stats->rx_scatter_errors += stats->estats.rx_scatter_errors;
gmac_stats->tx_ts_create_errors += stats->estats.tx_ts_create_errors;
gmac_stats->gmac_total_ticks += stats->estats.gmac_total_ticks;
gmac_stats->gmac_worst_case_ticks += stats->estats.gmac_worst_case_ticks;
gmac_stats->gmac_iterations += stats->estats.gmac_iterations;
gmac_stats->tx_pause_frames += stats->estats.tx_pause_frames;
gmac_stats->mmc_rx_overflow_errors += stats->estats.mmc_rx_overflow_errors;
gmac_stats->mmc_rx_watchdog_timeout_errors += stats->estats.mmc_rx_watchdog_timeout_errors;
gmac_stats->mmc_rx_crc_errors += stats->estats.mmc_rx_crc_errors;
gmac_stats->mmc_rx_ip_header_errors += stats->estats.mmc_rx_ip_header_errors;
gmac_stats->mmc_rx_octets_g += stats->estats.mmc_rx_octets_g;
gmac_stats->mmc_rx_ucast_frames += stats->estats.mmc_rx_ucast_frames;
gmac_stats->mmc_rx_bcast_frames += stats->estats.mmc_rx_bcast_frames;
gmac_stats->mmc_rx_mcast_frames += stats->estats.mmc_rx_mcast_frames;
gmac_stats->mmc_rx_undersize += stats->estats.mmc_rx_undersize;
gmac_stats->mmc_rx_oversize += stats->estats.mmc_rx_oversize;
gmac_stats->mmc_rx_jabber += stats->estats.mmc_rx_jabber;
gmac_stats->mmc_rx_octets_gb += stats->estats.mmc_rx_octets_gb;
gmac_stats->mmc_rx_frag_frames_g += stats->estats.mmc_rx_frag_frames_g;
gmac_stats->mmc_tx_octets_g += stats->estats.mmc_tx_octets_g;
gmac_stats->mmc_tx_ucast_frames += stats->estats.mmc_tx_ucast_frames;
gmac_stats->mmc_tx_bcast_frames += stats->estats.mmc_tx_bcast_frames;
gmac_stats->mmc_tx_mcast_frames += stats->estats.mmc_tx_mcast_frames;
gmac_stats->mmc_tx_deferred += stats->estats.mmc_tx_deferred;
gmac_stats->mmc_tx_single_col += stats->estats.mmc_tx_single_col;
gmac_stats->mmc_tx_multiple_col += stats->estats.mmc_tx_multiple_col;
gmac_stats->mmc_tx_octets_gb += stats->estats.mmc_tx_octets_gb;
spin_unlock_bh(&nss_data_plane_hal_gmac_stats_lock);
}
/*
* nss_data_plane_hal_get_mtu_sz()
*/
uint16_t nss_data_plane_hal_get_mtu_sz(uint16_t mtu)
{
/*
* Return MTU value as is.
*/
return mtu;
}