/* SPDX-License-Identifier: BSD-3-Clause-Clear */
/*
 * Copyright (c) 2020 The Linux Foundation. All rights reserved.
 */

#ifndef ATH11K_NSS_H
#define ATH11K_NSS_H

#ifdef CONFIG_ATH11K_NSS_SUPPORT
#include <nss_api_if.h>
#include <nss_cmn.h>
#include <nss_wifi_meshmgr.h>
#include "../../../../../net/mac80211/mesh.h"
#endif

struct ath11k;
struct ath11k_base;
struct ath11k_vif;
struct ath11k_peer;
struct ath11k_sta;
enum ath11k_ast_entry_type;
struct hal_rx_mon_ppdu_info;
struct hal_rx_user_status;

/* NSS DBG macro is not included as part of debug enum to avoid
 * frequent changes during upgrade*/
#define ATH11K_DBG_NSS		0x20000000
#define ATH11K_DBG_NSS_WDS	0x40000000
#define ATH11K_DBG_NSS_MESH	0x80000000

/* WIFILI Supported Target Types */
#define ATH11K_WIFILI_TARGET_TYPE_UNKNOWN   0xFF
#define ATH11K_WIFILI_TARGET_TYPE_QCA8074   20
#define ATH11K_WIFILI_TARGET_TYPE_QCA8074V2 24
#define ATH11K_WIFILI_TARGET_TYPE_QCA6018   25
#define ATH11K_WIFILI_TARGET_TYPE_QCN9074   26
#define ATH11K_WIFILI_TARGET_TYPE_QCA5018   29
#define ATH11K_WIFILI_TARGET_TYPE_QCN6122   30

/* Max limit for NSS Queue */
#define ATH11K_WIFIILI_MAX_TX_PROCESSQ 1024

/* Max TX Desc limit */
#define ATH11K_WIFILI_MAX_TX_DESC	65536

/* TX Desc related info */
/*TODO : Check this again during experiments for lowmem or
 changes for platforms based on num radios supported */
#define ATH11K_WIFILI_DBDC_NUM_TX_DESC (1024 * 8)
#define ATH11K_WIFILI_DBTC_NUM_TX_DESC (1024 * 8)

// TODO Revisit these page size calc
#define WIFILI_NSS_TX_DESC_SIZE 20*4
#define WIFILI_NSS_TX_EXT_DESC_SIZE 40*4
/* Number of desc per page(12bit) should be<4096, page limit per 1024 byte is 80*3=240 */
#define WIFILI_NSS_TX_DESC_PAGE_LIMIT 240
#define WIFILI_NSS_MAX_MEM_PAGE_SIZE (WIFILI_NSS_TX_DESC_PAGE_LIMIT * 1024)
#define WIFILI_NSS_MAX_EXT_MEM_PAGE_SIZE  (WIFILI_NSS_TX_DESC_PAGE_LIMIT * 1024)
#define WIFILI_RX_DESC_POOL_WEIGHT 3

/* Status of the NSS messages sent from driver */
#define ATH11K_NSS_MSG_ACK	0
/* Timeout for waiting for response from NSS on TX msg */
#define ATH11K_NSS_MSG_TIMEOUT_MS 5000

#define ATH11K_MESH_DEFAULT_ELEMENT_TTL	31
/* Init Flags */
#define WIFILI_NSS_CCE_DISABLED 0x1
#define WIFILI_ADDTL_MEM_SEG_SET 0x000000002

/* ATH11K NSS PEER Info */
/* Host memory allocated for peer info storage in nss */
#define WIFILI_NSS_PEER_BYTE_SIZE 1152

/* ATH11K NSS Stats */
#define ATH11K_NSS_STATS_ENABLE 1
#define ATH11K_NSS_STATS_DISABLE 0

/* TX Buf cfg range */
#define ATH11K_NSS_RADIO_TX_LIMIT_RANGE 4

/* TODO : Analysis based on platform */
/* TX Limit till 64 clients */
#define ATH11K_NSS_RADIO_TX_LIMIT_RANGE0 8192
/* TX Limit till 128 clients */
#define ATH11K_NSS_RADIO_TX_LIMIT_RANGE1 8192
/* TX Limit till 256 clients */
#define ATH11K_NSS_RADIO_TX_LIMIT_RANGE2 8192
/* TX Limit > 256 clients */
#define ATH11K_NSS_RADIO_TX_LIMIT_RANGE3 8192

#define ATH11K_NSS_MAX_NUMBER_OF_PAGE 96

#define NSS_TX_TID_MAX 8

/* Enables the MCBC exception in NSS fw, 1 = enable */
#define ATH11K_NSS_ENABLE_MCBC_EXC	1

enum ath11k_nss_opmode {
	ATH11K_NSS_OPMODE_UNKNOWN,
	ATH11K_NSS_OPMODE_AP,
	ATH11K_NSS_OPMODE_IBSS,
	ATH11K_NSS_OPMODE_STA,
	ATH11K_NSS_OPMODE_MONITOR,
};

struct peer_stats {
	u64 last_rx;
	u64 last_ack;
	u32 tx_packets;
	u32 tx_bytes;
	u32 tx_retries;
	u32 tx_failed;
	u32 rx_packets;
	u32 rx_bytes;
	u32 rx_dropped;
	u32 last_rxdrop;
	struct rate_info rxrate;
	u32 tx_tid_msdu[NSS_TX_TID_MAX];
	u32 rx_tid_msdu[IEEE80211_NUM_TIDS + 1];
};

enum ath11k_nss_peer_sec_type {
	PEER_SEC_TYPE_NONE,
	PEER_SEC_TYPE_WEP128,
	PEER_SEC_TYPE_WEP104,
	PEER_SEC_TYPE_WEP40,
	PEER_SEC_TYPE_TKIP,
	PEER_SEC_TYPE_TKIP_NOMIC,
	PEER_SEC_TYPE_AES_CCMP,
	PEER_SEC_TYPE_WAPI,
	PEER_SEC_TYPE_AES_CCMP_256,
	PEER_SEC_TYPE_AES_GCMP,
	PEER_SEC_TYPE_AES_GCMP_256,
	PEER_SEC_TYPES_MAX
};

/* this holds the memory allocated for nss managed peer info */
struct ath11k_nss_peer {
	uint32_t *vaddr;
	dma_addr_t paddr;
	bool ext_vdev_up;
	struct peer_stats *nss_stats;
	struct completion complete;
};

struct ath11k_nss_mpath_entry {
	struct list_head list;
	u32 num_entries;
#ifdef CONFIG_ATH11K_NSS_SUPPORT
	struct nss_wifi_mesh_path_dump_entry mpath[0];
#endif
};

struct ath11k_nss_mpp_entry {
	struct list_head list;
	u32 num_entries;
#ifdef CONFIG_ATH11K_NSS_SUPPORT
	struct nss_wifi_mesh_proxy_path_dump_entry mpp[0];
#endif
};

/* Structure to hold the vif related info for nss offload support */
struct arvif_nss {
	/* dynamic ifnum allocated by nss driver for vif */
	int if_num;
	/* mesh handle for mesh obj vap */
#ifdef CONFIG_ATH11K_NSS_SUPPORT
	nss_wifi_mesh_handle_t mesh_handle;
	/* Keep the copy of di_type for nss */
	enum nss_dynamic_interface_type di_type;
	/* protected by ar->data_lock */
	struct nss_wifi_mesh_stats_sync_msg mesh_stats;
#endif
	/* Used for completion status for vdev config nss messages */
	struct completion complete;
	/* Keep the copy of encap type for nss */
	int encap;
	/* Keep the copy of decap type for nss */
	int decap;
	/* AP_VLAN vif context obtained on ext vdev register */
	void* ctx;
	/* Parent AP vif stored in case of AP_VLAN vif */
	struct ath11k_vif *ap_vif;
	/* WDS cfg should be done only once for ext vdev */
	bool wds_cfg_done;
	bool created;

	u8 mesh_ttl;
	bool mesh_forward_enabled;
	u32 metadata_type;
	u32 mpath_refresh_time;


	struct list_head list;
	struct list_head mpath_dump;
	/* total number of mpath entries in all of the mpath_dump list */
	u32 mpath_dump_num_entries;
	struct completion dump_mpath_complete;

	struct list_head mpp_dump;
	/* total number of mpp entries in all of the mpp_dump list */
	u32 mpp_dump_num_entries;
	struct completion dump_mpp_complete;
};

/* Structure to hold the pdev/radio related info for nss offload support */
struct ath11k_nss {
	/* dynamic ifnum allocated by nss driver for pdev */
	int if_num;
	/* Radio/pdev Context obtained on pdev register */
	void* ctx;
	/* protects stats from nss */
	spinlock_t dump_lock;
};

/* Structure to hold the soc related info for nss offload support */
struct ath11k_soc_nss {
	/* turn on/off nss offload support in ath11k */
	bool enabled;
	/* Mesh offload support as advertised by nss */
	bool mesh_nss_offload_enabled;
#ifdef CONFIG_ATH11K_NSS_SUPPORT
	/* soc nss ctx */
	void* ctx;
	/* if_num to be used for soc related nss messages */
	int if_num;
	/* debug mode to disable the regular mesh configuration from mac80211 */
	bool debug_mode;
	/* Completion to nss message response */
	struct completion complete;
	/* Response to nss messages are stored here on msg callback
	* used only in contention free messages during init */
	int response;
	/* Below is used for identifying allocated tx descriptors */
	dma_addr_t tx_desc_paddr[ATH11K_NSS_MAX_NUMBER_OF_PAGE];
	uint32_t * tx_desc_vaddr[ATH11K_NSS_MAX_NUMBER_OF_PAGE];
	uint32_t tx_desc_size[ATH11K_NSS_MAX_NUMBER_OF_PAGE];
#endif
};

#ifdef CONFIG_ATH11K_NSS_SUPPORT
int ath11k_nss_tx(struct ath11k_vif *arvif, struct sk_buff *skb);
int ath11k_nss_vdev_set_cmd(struct ath11k_vif *arvif, int cmd, int val);
int ath11k_nss_vdev_create(struct ath11k_vif *arvif);
void ath11k_nss_vdev_delete(struct ath11k_vif *arvif);
int ath11k_nss_vdev_up(struct ath11k_vif *arvif);
int ath11k_nss_vdev_down(struct ath11k_vif *arvif);
int ath11k_nss_peer_delete(struct ath11k_base *ab, u8 *addr);
int ath11k_nss_peer_create(struct ath11k_base *ab, struct ath11k_peer *peer);
int ath11k_nss_add_wds_peer(struct ath11k *ar, struct ath11k_peer *peer,
			    u8 *dest_mac, enum ath11k_ast_entry_type type);
int ath11k_nss_update_wds_peer(struct ath11k *ar, struct ath11k_peer *peer,
			       u8 *dest_mac);
int ath11k_nss_map_wds_peer(struct ath11k *ar, struct ath11k_peer *peer,
			    u8 *dest_mac, enum ath11k_ast_entry_type type);
int ath11k_nss_del_wds_peer(struct ath11k *ar, u8 *peer_addr,
			    int peer_id, u8 *dest_mac);
int ath11k_nss_ext_vdev_cfg_wds_peer(struct ath11k_vif *arvif,
				     u8 *wds_addr, u32 wds_peer_id);
int ath11k_nss_ext_vdev_wds_4addr_allow(struct ath11k_vif *arvif,
					u32 wds_peer_id);
int ath11k_nss_ext_vdev_create(struct ath11k_vif *arvif);
int ath11k_nss_ext_vdev_configure(struct ath11k_vif *arvif);
void ath11k_nss_ext_vdev_unregister(struct ath11k_vif *arvif);
int ath11k_nss_ext_vdev_up(struct ath11k_vif *arvif);
int ath11k_nss_ext_vdev_down(struct ath11k_vif *arvif);
void ath11k_nss_ext_vdev_delete(struct ath11k_vif *arvif);
int ath11k_nss_ext_vdev_cfg_dyn_vlan(struct ath11k_vif *arvif, u16 vlan_id);
int ath11k_nss_dyn_vlan_set_group_key(struct ath11k_vif *arvif, u16 vlan_id,
				      u16 group_key);
int ath11k_nss_set_peer_sec_type(struct ath11k *ar, struct ath11k_peer *peer,
				 struct ieee80211_key_conf *key_conf);
void ath11k_nss_update_sta_stats(struct ath11k_vif *arvif,
				 struct station_info *sinfo,
				 struct ieee80211_sta *sta);
void ath11k_nss_update_sta_rxrate(struct hal_rx_mon_ppdu_info *ppdu_info,
				  struct ath11k_peer *peer,
				  struct hal_rx_user_status *user_stats);
int ath11k_nss_setup(struct ath11k_base *ab);
int ath11k_nss_teardown(struct ath11k_base *ab);
void ath11k_nss_ext_rx_stats(struct ath11k_base *ab, struct htt_rx_ring_tlv_filter *tlv_filter);
int ath11k_nss_dump_mpath_request(struct ath11k_vif *arvif);
int ath11k_nss_dump_mpp_request(struct ath11k_vif *arvif);
#ifdef CONFIG_MAC80211_MESH
int ath11k_nss_mesh_config_path(struct ath11k *ar, struct ath11k_vif *arvif,
				enum ieee80211_mesh_path_offld_cmd cmd,
				struct ieee80211_mesh_path_offld *path);
bool ath11k_nss_mesh_offload_enabled(struct ath11k_base *ab);
bool ath11k_nss_debug_mode(struct ath11k_vif *arvif);
int ath11k_nss_mesh_exception_flags(struct ath11k_vif *arvif,
			       struct nss_wifi_mesh_exception_flag_msg *nss_msg);
#endif
int ath11k_nss_mesh_config_update(struct ieee80211_vif *vif, int changed);
int ath11k_nss_assoc_link_arvif_to_ifnum(struct ath11k_vif *arvif, int if_num);
int ath11k_nss_exc_rate_config(struct ath11k_vif *arvif,
					struct nss_wifi_mesh_rate_limit_config *nss_exc_cfg);
bool ath11k_nss_offload_enabled(struct ath11k_base *ab);
void ath11k_nss_set_enabled(struct ath11k_base *ab, bool enable);
#else
static inline int ath11k_nss_tx(struct ath11k_vif *arvif, struct sk_buff *skb)
{
	return 0;
}

static inline int ath11k_nss_vdev_set_cmd(struct ath11k_vif *arvif, int cmd, int val)
{
	return 0;
}

static inline int ath11k_nss_vdev_create(struct ath11k_vif *arvif)
{
	return 0;
}

static inline void ath11k_nss_vdev_delete(struct ath11k_vif *arvif)
{
}

static inline void ath11k_nss_update_sta_stats(struct ath11k_vif *arvif,
					       struct station_info *sinfo,
					       struct ieee80211_sta *sta)
{
	return;
}

static inline void ath11k_nss_update_sta_rxrate(struct hal_rx_mon_ppdu_info *ppdu_info,
					 struct ath11k_peer *peer,
					 struct hal_rx_user_status *user_stats)
{
	return;
}

static inline int ath11k_nss_vdev_up(struct ath11k_vif *arvif)
{
	return 0;
}

static inline int ath11k_nss_vdev_down(struct ath11k_vif *arvif)
{
	return 0;
}

static inline int ath11k_nss_peer_delete(struct ath11k_base *ab, u8 *addr)
{
	return 0;
}

static inline int ath11k_nss_peer_create(struct ath11k_base *ab, struct ath11k_peer *peer)
{
	return 0;
}

static inline int ath11k_nss_update_wds_peer(struct ath11k *ar, struct ath11k_peer *peer,
					     u8 *dest_mac)
{
	return 0;
}

static inline int ath11k_nss_del_wds_peer(struct ath11k *ar, u8 *peer_addr,
					  int peer_id, u8 *dest_mac)
{
	return 0;
}

static inline int ath11k_nss_ext_vdev_cfg_wds_peer(struct ath11k_vif *arvif,
				     u8 *wds_addr, u32 wds_peer_id)
{
	return 0;
}

static inline int ath11k_nss_ext_vdev_wds_4addr_allow(struct ath11k_vif *arvif,
					u32 wds_peer_id)
{
	return 0;
}

static inline int ath11k_nss_ext_vdev_create(struct ath11k_vif *arvif)
{
	return 0;
}

static inline int ath11k_nss_ext_vdev_configure(struct ath11k_vif *arvif)
{
	return 0;
}

static inline void ath11k_nss_ext_vdev_unregister(struct ath11k_vif *arvif)
{
	return;
}

static inline int ath11k_nss_ext_vdev_up(struct ath11k_vif *arvif)
{
	return 0;
}

static inline int ath11k_nss_ext_vdev_down(struct ath11k_vif *arvif)
{
	return 0;
}

static inline int ath11k_nss_ext_vdev_cfg_dyn_vlan(struct ath11k_vif *arvif,
						   u16 vlan_id)
{
	return 0;
}

static inline int ath11k_nss_dyn_vlan_set_group_key(struct ath11k_vif *arvif,
						    u16 vlan_id, u16 group_key)
{
	return 0;
}

static inline int ath11k_nss_set_peer_sec_type(struct ath11k *ar, struct ath11k_peer *peer,
					       struct ieee80211_key_conf *key_conf)
{
	return 0;
}

static inline int ath11k_nss_setup(struct ath11k_base *ab)
{
	return 0;
}

static inline int ath11k_nss_teardown(struct ath11k_base *ab)
{
	return 0;
}

static inline void ath11k_nss_ext_rx_stats(struct ath11k_base *ab, struct htt_rx_ring_tlv_filter *tlv_filter)
{
	return;
}

#ifdef CONFIG_MAC80211_MESH
static inline int
ath11k_nss_mesh_config_path(struct ath11k *ar, struct ath11k_vif *arvif,
			    enum ieee80211_mesh_path_offld_cmd cmd,
			    struct ieee80211_mesh_path_offld *path)
{
	return 0;
}
static inline bool ath11k_nss_mesh_offload_enabled(struct ath11k_base *ab)
{
	return false;
}
static inline bool ath11k_nss_debug_mode(struct ath11k_vif *arvif)
{
	return false;
}
static inline int ath11k_nss_mesh_exception_flags(struct ath11k_vif *arvif)
{
	return 0;
}
#endif
static inline int
ath11k_nss_mesh_config_update(struct ieee80211_vif *vif, int changed)
{
	return 0;
}
static inline int ath11k_nss_assoc_link_arvif_to_ifnum(struct ath11k_vif *arvif,
						int if_num)
{
	return 0;
}
static inline int ath11k_nss_exc_rate_config(struct ath11k_vif *arvif)
{
	return 0;
}
static inline bool ath11k_nss_offload_enabled(struct ath11k_base *ab)
{
	return false;
}
static inline void ath11k_nss_set_enabled(struct ath11k_base *ab, bool enable)
{
}
static inline void ath11k_nss_ext_vdev_delete(struct ath11k_vif *ar_vif)
{
}
#endif /* CONFIG_ATH11K_NSS_SUPPORT */
#endif
