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

/**
 * @file nss_dp_api_if.h
 *	nss-dp exported structures/apis.
 *
 * This file declares all the public interfaces
 * for NSS data-plane driver.
 */

#ifndef __NSS_DP_API_IF_H
#define __NSS_DP_API_IF_H

#include "nss_dp_arch.h"

/**
 * @addtogroup nss_dp_subsystem
 * @{
 */

/*
 * NSS DP status
 */
#define NSS_DP_SUCCESS	0
#define NSS_DP_FAILURE	-1

/*
 * NSS DP platform specific defines
 */
#define NSS_DP_START_IFNUM	NSS_DP_HAL_START_IFNUM
			/**< First GMAC interface number (0/1) depending on SoC. */
#define NSS_DP_MAX_INTERFACES	(NSS_DP_HAL_MAX_PORTS + NSS_DP_START_IFNUM)
			/**< Last interface index for the SoC, to be used by qca-nss-drv. */
#define NSS_DP_INVALID_INTERFACE -1

/*
 * NSS PTP service code
 */
#define NSS_PTP_EVENT_SERVICE_CODE	0x9

/**
 * nss_dp_data_plane_ctx
 *	Data plane context base class.
 */
struct nss_dp_data_plane_ctx {
	struct net_device *dev;
};

/**
 * nss_dp_gmac_stats
 *	The per-GMAC statistics structure.
 */
struct nss_dp_gmac_stats {
	struct nss_dp_hal_gmac_stats stats;
};

/**
 * nss_dp_data_plane_ops
 *	Per data-plane ops structure.
 *
 * Default would be slowpath and can be overridden by nss-drv
 */
struct nss_dp_data_plane_ops {
	int (*init)(struct nss_dp_data_plane_ctx *dpc);
	int (*open)(struct nss_dp_data_plane_ctx *dpc, uint32_t tx_desc_ring,
		    uint32_t rx_desc_ring, uint32_t mode);
	int (*close)(struct nss_dp_data_plane_ctx *dpc);
	int (*link_state)(struct nss_dp_data_plane_ctx *dpc,
			  uint32_t link_state);
	int (*mac_addr)(struct nss_dp_data_plane_ctx *dpc, uint8_t *addr);
	int (*change_mtu)(struct nss_dp_data_plane_ctx *dpc, uint32_t mtu);
	netdev_tx_t (*xmit)(struct nss_dp_data_plane_ctx *dpc, struct sk_buff *os_buf);
	void (*set_features)(struct nss_dp_data_plane_ctx *dpc);
	int (*pause_on_off)(struct nss_dp_data_plane_ctx *dpc,
			    uint32_t pause_on);
	int (*vsi_assign)(struct nss_dp_data_plane_ctx *dpc, uint32_t vsi);
	int (*vsi_unassign)(struct nss_dp_data_plane_ctx *dpc, uint32_t vsi);
	int (*rx_flow_steer)(struct nss_dp_data_plane_ctx *dpc, struct sk_buff *skb,
				uint32_t cpu, bool is_add);
	void (*get_stats)(struct nss_dp_data_plane_ctx *dpc, struct nss_dp_gmac_stats *stats);
	int (*deinit)(struct nss_dp_data_plane_ctx *dpc);
};

/**
 * nss_dp_receive
 *	Called by overlay drivers to deliver packets to nss-dp.
 *
 * @datatypes
 * net_device
 * sk_buff
 * napi_struct
 *
 * @param[in] netdev Pointer to netdev structure on which packet is received.
 * @param[in] skb Pointer to the received packet.
 * @param[in] napi Pointer to napi context.
 */
void nss_dp_receive(struct net_device *netdev, struct sk_buff *skb,
						struct napi_struct *napi);

/**
 * nss_dp_is_in_open_state
 *	Returns if a data plane is opened or not.
 *
 * @datatypes
 * net_device
 *
 * @param[in] netdev Pointer to netdev structure.
 *
 * @return
 * bool
 */
bool nss_dp_is_in_open_state(struct net_device *netdev);

/**
 * nss_dp_override_data_palne
 *	API to allow overlay drivers to override the data plane.
 *
 * @datatypes
 * net_device
 * nss_dp_data_plane_ops
 * nss_dp_data_plane_ctx
 *
 * @param[in] netdev Pointer to netdev structure.
 * @param[in] dp_ops Pointer to respective data plane ops structure.
 * @param[in] dpc Pointer to data plane context.
 *
 * @return
 * int
 */
int nss_dp_override_data_plane(struct net_device *netdev,
			       struct nss_dp_data_plane_ops *dp_ops,
			       struct nss_dp_data_plane_ctx *dpc);

/**
 * nss_dp_start_data_plane
 *	Dataplane API to inform netdev when it is ready to start.
 *
 * @datatypes
 * net_device
 * nss_dp_data_plane_ctx
 *
 * @param[in] netdev Pointer to netdev structure.
 * @param[in] dpc Pointer to data plane context.
 */
void nss_dp_start_data_plane(struct net_device *netdev,
			     struct nss_dp_data_plane_ctx *dpc);

/**
 * nss_dp_restore_data_plane
 *	Called by overlay drivers to detach itself from nss-dp.
 *
 * @datatypes
 * net_device
 *
 * @param[in] netdev Pointer to netdev structure.
 */
void nss_dp_restore_data_plane(struct net_device *netdev);

/**
 * nss_dp_get_netdev_by_nss_if_num
 *	Returns the net device of the corresponding id if it exists.
 *
 * @datatypes
 * int
 *
 * @param[in] interface ID of the physical mac port.
 *
 * @return
 * Pointer to netdev structure.
 */
struct net_device *nss_dp_get_netdev_by_nss_if_num(int if_num);

/**
 * nss_phy_tstamp_rx_buf
 *	Receive timestamp packet.
 *
 * @datatypes
 * sk_buff
 *
 * @param[in] app_data Pointer to the application context of the message.
 * @param[in] skb Pointer to the packet.
 */
void nss_phy_tstamp_rx_buf(void *app_data, struct sk_buff *skb);

/**
 * nss_phy_tstamp_tx_buf
 *	Transmit timestamp packet
 *
 * @datatypes
 * net_device
 * sk_buff
 *
 * @param[in] net_device Pointer to netdev structure.
 * @param[in] skb Pointer to the packet.
 */
void nss_phy_tstamp_tx_buf(struct net_device *ndev, struct sk_buff *skb);

/**
 * nss_dp_is_netdev_physical
 *	Returns true if the net device is physical, false otherwise..
 *
 * @datatypes
 * net_device
 *
 * @param[in] net_device pointer to netdev structure.
 *
 * @return
 * true if interface is physical, false otherwise.
 */
bool nss_dp_is_netdev_physical(struct net_device *netdev);

/**
 * nss_dp_get_port_num
 *	Returns the port number for the physical interface.
 *
 * @datatypes
 * net_device
 *
 * @param[in] net_device pointer to netdev structure.
 *
 * @return
 * port number correspond to this net_device.
 */
int32_t nss_dp_get_port_num(struct net_device *netdev);

/**
 *@}
 */

#endif	/** __NSS_DP_API_IF_H */
