/*
 * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
 *
 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
 *
 *
 * 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.
 */

/*
 * This file was originally distributed by Qualcomm Atheros, Inc.
 * under proprietary terms before Copyright ownership was assigned
 * to the Linux Foundation.
 */

#if !defined(__SAP_CH_SELECT_H)
#define __SAP_CH_SELECT_H

/*===========================================================================

				sapChSelect.h

   OVERVIEW:

   This software unit holds the implementation of the WLAN SAP modules
   functions for channel selection.

   DEPENDENCIES:

   Are listed for each API below.
   ===========================================================================*/

/*--------------------------------------------------------------------------
   Include Files
   ------------------------------------------------------------------------*/
#include "ani_global.h"
/*--------------------------------------------------------------------------
   defines and enum
   --------------------------------------------------------------------------*/

#define SPECT_24GHZ_CH_COUNT    (11)    /* USA regulatory domain */
#define SAPDFS_NORMALISE_1000      (1000/9)     /* Case of spec20 with channel diff = 0 */
/* Gen 5 values
   #define SOFTAP_MIN_RSSI         (-85)
   #define SOFTAP_MAX_RSSI         (-45)
 */
#define SOFTAP_MIN_RSSI         (-100)
#define SOFTAP_MAX_RSSI         (0)
#define SOFTAP_MIN_COUNT        (0)
#define SOFTAP_MAX_COUNT        (60)
#define SOFTAP_RSSI_WEIGHT      (20)
#define SOFTAP_COUNT_WEIGHT     (20)

#define SAP_DEFAULT_24GHZ_CHANNEL     (6)
#define SAP_DEFAULT_5GHZ_CHANNEL      (40)
#define SAP_CHANNEL_NOT_SELECTED (0)

#define SOFTAP_HT20_CHANNELWIDTH 0
#define SAP_SUBBAND1_RSSI_EFFECT_PRIMARY  (-20) /* In HT40/VHT80, Effect of primary Channel RSSi on Subband1 */
#define SAP_SUBBAND2_RSSI_EFFECT_PRIMARY  (-30) /* In VHT80, Effect of primary Channel RSSI on Subband2 */
#define SAP_SUBBAND3_RSSI_EFFECT_PRIMARY  (-40) /* In VHT80, Effect of Primary Channel RSSI on Subband3 */

#define SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY      (-10)     /* In 2.4GHZ, Effect of Primary  Channel RSSI on First Overlapping Channel */
#define SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY        (-20)     /* In 2.4GHZ, Effect of Primary  Channel RSSI on Second Overlapping Channel */
#define SAP_24GHZ_THIRD_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY      (-30)     /* In 2.4GHZ, Effect of Primary  Channel RSSI on Third Overlapping Channel */
#define SAP_24GHZ_FOURTH_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY     (-40)     /* In 2.4GHZ, Effect of Primary  Channel RSSI on Fourth Overlapping Channel */

typedef enum {
	CHANNEL_1 = 1,
	CHANNEL_2,
	CHANNEL_3,
	CHANNEL_4,
	CHANNEL_5,
	CHANNEL_6,
	CHANNEL_7,
	CHANNEL_8,
	CHANNEL_9,
	CHANNEL_10,
	CHANNEL_11,
	CHANNEL_12,
	CHANNEL_13,
	CHANNEL_14
} tSapChannel;

#define MAX_80MHZ_BANDS 6
#define SAP_80MHZ_MASK     0x0F
#define SAP_40MHZ_MASK_L   0x03
#define SAP_40MHZ_MASK_H   0x0C

/*
 * structs for holding channel bonding bitmap
 * used for finding new channel when SAP is on
 * DFS channel and radar is detected.
 */
typedef struct sChannelBondingInfo {
	uint8_t channelMap:4;
	uint8_t rsvd:4;
	uint8_t startChannel;
} tChannelBondingInfo;

typedef struct __chan_bonding_bitmap {
	tChannelBondingInfo chanBondingSet[MAX_80MHZ_BANDS];
} chan_bonding_bitmap;

/**
 * Structure holding information of each channel in the spectrum,
 * it contains the channel number, the computed weight
 */
typedef struct sChannelInfo {
	uint8_t channel;
	bool valid;             /* if the channel is valid to be picked as new channel */
} tChannelInfo;

typedef struct sAll5GChannelList {
	uint8_t numChannel;
	tChannelInfo *channelList;
} tAll5GChannelList;

typedef struct sSapChannelListInfo {
	uint8_t numChannel;
	uint8_t *channelList;
} tSapChannelListInfo;

typedef struct {
	uint16_t chNum;         /* Channel Number */
	uint16_t channelWidth;  /* Channel Width */
	uint16_t bssCount;      /* bss found in scanresult for this channel */
	int32_t rssiAgr;        /* Max value of rssi among all BSS(es) from scanresult for this channel */
	uint32_t weight;        /* Weightage of this channel */
	uint32_t weight_copy;   /* copy of the orignal weight */
	bool valid;             /* Is this a valid center frequency for regulatory domain */
} tSapSpectChInfo;              /* tDfsSpectChInfo; */

/**
 * Structure holding all the information required to make a
 * decision for the best operating channel based on dfs formula
 */

typedef struct {
	tSapSpectChInfo *pSpectCh;      /* tDfsSpectChInfo *pSpectCh;  // Ptr to the channels in the entire spectrum band */
	uint8_t numSpectChans;  /* Total num of channels in the spectrum */
} tSapChSelSpectInfo;           /* tDfsChSelParams; */

/**
 * Structure for channel weight calculation parameters
 */
typedef struct sSapChSelParams {
	void *pSpectInfoParams; /**pDfsParams;   // Filled with tSapChSelSpectInfo */
	uint16_t numChannels;
} tSapChSelParams;

#define SAP_TX_LEAKAGE_THRES 310
#define SAP_TX_LEAKAGE_MAX  1000
#define SAP_TX_LEAKAGE_MIN  200

/*
 * This define is used to block additional channels
 * based on the new data gathered on auto platforms
 * and to differentiate the leakage data among different
 * platforms.
 */

#define SAP_TX_LEAKAGE_AUTO_MIN  210

typedef struct sSapTxLeakInfo {
	uint8_t leak_chan;      /* leak channel */
	uint32_t leak_lvl;      /* tx leakage lvl */
} tSapTxLeakInfo;

typedef struct sSapChanMatrixInfo {
	uint8_t channel;        /* channel to switch from */
	tSapTxLeakInfo chan_matrix[RF_CHAN_144 - RF_CHAN_36 + 1];
} tSapChanMatrixInfo;

#endif /* if !defined __SAP_CH_SELECT_H */
