/*
 **************************************************************************
 * Copyright (c) 2016,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 OF0
 * 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.
 **************************************************************************
 */

#ifndef __SYN_DEV_H__
#define __SYN_DEV_H__

#include "syn_reg.h"
#include <fal/fal_mib.h>
#include <fal/fal_port_ctrl.h>

/*
 * Subclass for base nss_gmac_haldev
 */
struct syn_hal_dev {
	struct nss_gmac_hal_dev nghd;	/* Base class */
};

/*
 * syn_set_rx_flow_ctrl()
 */
static inline void syn_set_rx_flow_ctrl(
		struct nss_gmac_hal_dev *nghd)
{
	hal_set_reg_bits(nghd->mac_base, SYN_MAC_RX_FLOW_CTL,
			SYN_MAC_RX_FLOW_ENABLE);
}

/*
 * syn_clear_rx_flow_ctrl()
 */
static inline void syn_clear_rx_flow_ctrl(
		struct nss_gmac_hal_dev *nghd)
{
	hal_clear_reg_bits(nghd->mac_base, SYN_MAC_RX_FLOW_CTL,
			SYN_MAC_RX_FLOW_ENABLE);
}

/*
 * syn_set_tx_flow_ctrl()
 */
static inline void syn_set_tx_flow_ctrl(
		struct nss_gmac_hal_dev *nghd)
{
	hal_set_reg_bits(nghd->mac_base, SYN_MAC_Q0_TX_FLOW_CTL,
			SYN_MAC_TX_FLOW_ENABLE);
}

/*
 * syn_send_tx_pause_frame()
 */
static inline void syn_send_tx_pause_frame(
		struct nss_gmac_hal_dev *nghd)
{
	hal_set_reg_bits(nghd->mac_base, SYN_MAC_Q0_TX_FLOW_CTL,
			SYN_MAC_TX_FLOW_ENABLE);
	hal_set_reg_bits(nghd->mac_base, SYN_MAC_Q0_TX_FLOW_CTL,
			SYN_MAC_TX_PAUSE_SEND);
}

/*
 * syn_clear_tx_flow_ctrl()
 */
static inline void syn_clear_tx_flow_ctrl(
		struct nss_gmac_hal_dev *nghd)
{
	hal_clear_reg_bits(nghd->mac_base, SYN_MAC_Q0_TX_FLOW_CTL,
			SYN_MAC_TX_FLOW_ENABLE);
}

/*
 * syn_clear_mac_ctrl()
 */
static inline void syn_clear_mac_ctrl(
		struct nss_gmac_hal_dev *nghd)
{
	hal_write_relaxed_reg(nghd->mac_base, SYN_MAC_TX_CONFIG, 0);
	hal_write_relaxed_reg(nghd->mac_base, SYN_MAC_RX_CONFIG, 0);
}

/*
 * syn_rx_enable()
 */
static inline void syn_rx_enable(struct nss_gmac_hal_dev *nghd)
{
	hal_set_reg_bits(nghd->mac_base, SYN_MAC_RX_CONFIG, SYN_MAC_RX_ENABLE);
	hal_set_reg_bits(nghd->mac_base, SYN_MAC_PACKET_FILTER, SYN_MAC_RX_ENABLE);
}

/*
 * syn_rx_disable()
 */
static inline void syn_rx_disable(struct nss_gmac_hal_dev *nghd)
{
	hal_clear_reg_bits(nghd->mac_base, SYN_MAC_RX_CONFIG, SYN_MAC_RX_ENABLE);
}

/*
 * syn_tx_enable()
 */
static inline void syn_tx_enable(struct nss_gmac_hal_dev *nghd)
{
	hal_set_reg_bits(nghd->mac_base, SYN_MAC_TX_CONFIG, SYN_MAC_TX_ENABLE);
}

/*
 * syn_tx_disable()
 */
static inline void syn_tx_disable(struct nss_gmac_hal_dev *nghd)
{
	hal_clear_reg_bits(nghd->mac_base, SYN_MAC_TX_CONFIG,
			SYN_MAC_TX_ENABLE);
}

/*
 * syn_set_mmc_stats()
 */
static inline void syn_set_mmc_stats(struct nss_gmac_hal_dev *nghd)
{
	hal_set_reg_bits(nghd->mac_base, SYN_MAC_MMC_CTL,
			SYN_MAC_MMC_RSTONRD);
}

/*
 * syn_rx_jumbo_frame_enable()
 */
static inline void syn_rx_jumbo_frame_enable(
		struct nss_gmac_hal_dev *nghd)
{
	hal_set_reg_bits(nghd->mac_base, SYN_MAC_RX_CONFIG,
			SYN_MAC_JUMBO_FRAME_ENABLE);
}

/*
 * syn_rx_jumbo_frame_disable()
 */
static inline void syn_rx_jumbo_frame_disable(
		struct nss_gmac_hal_dev *nghd)
{
	hal_clear_reg_bits(nghd->mac_base, SYN_MAC_RX_CONFIG,
			SYN_MAC_JUMBO_FRAME_ENABLE);
}

/*
 * syn_set_full_duplex()
 */
static inline void syn_set_full_duplex(
		struct nss_gmac_hal_dev *nghd)
{
	/* TBD */
	return;
}

/*
 * syn_set_half_duplex()
 */
static inline void syn_set_half_duplex(
		struct nss_gmac_hal_dev *nghd)
{
	/* TBD */
	return;
}

static int syn_get_xmib_stats(struct nss_gmac_hal_dev *nghd, fal_xgmib_info_t *stats)
{
	if (fal_get_xgmib_info(0, nghd->mac_id, stats)) {
		return -1;
	}

	return 0;
}
#endif /*__SYN_DEV_H__*/
