/*
 * (C) Copyright 2013 Quantenna Communications Inc.
 */

#ifndef FWT_SW_H_
#define FWT_SW_H_


#include <linux/types.h>
#include <qtn/topaz_fwt_db.h>
#include <qtn/topaz_fwt_if.h>

/* Success definition in FWT Interface is return positive value */
#define FWT_IF_SUCCESS(x)	((x) >= 0)
/* Error definition in FWT Interface is return negative value */
#define FWT_IF_ERROR(x)		(!(FWT_IF_SUCCESS(x)))

typedef enum
{
	FWT_SW_4_ADDR_DEPRECATE = 0,
	FWT_SW_4_ADDR_SUPPORT,
	FWT_SW_4_ADDR_MAX,
}fwt_sw_4addr_status;

/* Portal represent support in 4 address mode */
#define FWT_SW_DEFAULT_4ADDR	FWT_SW_4_ADDR_DEPRECATE

/*
 * Register overwrite entries for second level entry delete protocol from FWT table
 * @param dst_index: Index to be overwritten
 * @param src_index: Source index
 * */
void topaz_fwt_register_overwrite_entries(uint16_t dst_index,uint16_t src_index);

/*
 * Register a node
 * @param node_num: node number
 * @param vap_idx: vap index
 */
void fwt_sw_register_node(uint8_t node_num, uint8_t vap_idx);

/*
 * Unregister a node
 * @param node_num: node number
 * @param vap_idx: vap index
 */
void fwt_sw_unregister_node(uint8_t node_num, uint8_t vap_idx);

/*
 * Add device to the FWT.
 * If successful, update the FWT mirror table and the node list at the fwt database
 *
 * @param mac_id: MAC ID in big endian presentation
 * @param port_id: the port number. Note: must match the FWT HW presentation.
 * @param node_num: the node number
 * @param ip_map: Multicast aliasing bit identifier.
 * @return success / failure indication.
 */
int fwt_sw_add_device(const uint8_t *mac_be, uint8_t port_id, uint8_t node_num,
		const struct br_ip *group);

/*
 * Set 4 address support for specific MAC ID
 * @param mac_be: mac id in big endian presentation
 * @param addr: Support indication for 4 address method
 */
int fwt_sw_set_4_address_support(const uint8_t *mac_be, fwt_sw_4addr_status addr);
/*
 * Reset call will clear both HW and Software FWT tables
 */
void fwt_sw_reset(void);

/*
 * Print both node list and FWT table
 */
int fwt_sw_print(void);


/* Inidicate expiry time
 * @param mac_be: mac id in big endian presentation
 */
int fwt_sw_get_timestamp(const uint8_t *mac_be);

/*
 * Delete device entry from both HW and SW FWT tables
 * @param mac_be: MAC in big endian
 */
int fwt_sw_delete_device(const uint8_t *mac_be);

/*
 * Update or insert new FWT table entry from multicast IGMP message.
 * @param node: node number.
 * @param port_id: output port.
 * @param group: Indication for the multicast address by group id.
 */
int fwt_sw_join_multicast(uint8_t node, uint8_t port_id,
		const struct br_ip *group);
/*
 * Remove or delete node from the FWT table entry from multicast IGMP message.
 * @param node: node number.
 * @param port_id: output port.
 * @param group: Indication for the multicast address by group id.
 */
int fwt_sw_leave_multicast(uint8_t node, uint8_t port_id,
		const struct br_ip *group);

typedef int (*fwt_sw_4addr_callback_t)(void *token, const uint8_t *mac_be, uint8_t port_id,
		uint8_t node_num);

typedef uint8_t (*fwt_sw_remapper_t)(uint8_t in_port, const uint8_t *mac_be);

void fwt_sw_register_port_remapper(uint8_t port, fwt_sw_remapper_t remapper);

/**
 * Callback to determine whether a FWT table entry should be added as 4 address mode or not.
 * Typically registered by qdrv
 * @param callback: callback function pointer to register
 * @param token: will always be provided to the callback when invoked, as the first argument
 */
void fwt_sw_4addr_callback_set(fwt_sw_4addr_callback_t callback, void *token);

/* Get number of current entries */
uint16_t fwt_sw_get_entries_cnt(void);

int fwt_sw_cmd(fwt_if_usr_cmd cmd, struct fwt_if_common *data);

int fwt_sw_get_index_from_mac_be(const uint8_t *mac_be);

/*
 * Fast way to get fwt entry for unicast packet
 * @param src_mac_be: source mac address of the packet
 * @param dst_mac_be: destination mac address of the packet
 */
fwt_db_entry *fwt_sw_fast_get_ucast_entry(const unsigned char *src_mac_be,
		const unsigned char *dst_mac_be);

void fwt_sw_update_false_miss(int index, uint8_t false_miss);

int fwt_sw_get_ipff(char *buf, int buflen);

extern dma_addr_t ipmac_hash_bus;
extern dma_addr_t ipmac_base_bus;

int fwt_sw_update_uc_ipmac(const uint8_t *mac_be, const uint8_t *ip, uint16_t type);

void fwt_sw_remove_uc_ipmac(const uint8_t *ip, uint16_t type);

#endif /* FWT_INTERFACE_H_ */
