qcacmn: Add an API to get max TxPower for 6G TPE

Add an API wlan_reg_get_max_txpower_for_6g_tpe, to get the max tx-power
in PSD or EIRP format, based on the client type as follows:

 =======|===============================================
| S No. |      Default Client       | Subordinate Client|
|=======|===============================================|
| EIRP  | reg_get_channel_reg_power |       24 dBm      |
|       | _for_freq(pdev, freq)     |                   |
|-------------------------------------------------------|
| PSD   |          (-1) dBm         |        5 dBm      |
 =======================================================

Change-Id: Ic4946cd3e3f2e13469b0d5e2020e3fcda5040c2f
CRs-Fixed: 2765566
This commit is contained in:
Hariharan Basuthkar
2020-08-12 19:04:18 +05:30
committed by snandini
vanhempi 4fd0241eff
commit cad70ccae2
5 muutettua tiedostoa jossa 206 lisäystä ja 1 poistoa

Näytä tiedosto

@@ -2626,6 +2626,99 @@ bool reg_is_6g_freq_indoor(struct wlan_objmgr_pdev *pdev, qdf_freq_t freq)
return (REG_IS_6GHZ_FREQ(freq) && reg_is_freq_indoor(pdev, freq));
}
/**
* reg_get_max_psd() - Get max PSD.
* @freq: Channel frequency.
* @bw: Channel bandwidth.
* @reg_ap: Regulatory 6G AP type.
* @reg_client: Regulatory 6G client type.
* @tx_power: Pointer to tx-power.
*
* Return: Return QDF_STATUS_SUCCESS, if PSD is filled for 6G TPE IE
* else return QDF_STATUS_E_FAILURE.
*/
static QDF_STATUS reg_get_max_psd(qdf_freq_t freq,
uint16_t bw,
enum reg_6g_ap_type reg_ap,
enum reg_6g_client_type reg_client,
uint8_t *tx_power)
{
if (reg_ap == REG_INDOOR_AP) {
switch (reg_client) {
case REG_DEFAULT_CLIENT:
*tx_power = REG_PSD_MAX_TXPOWER_FOR_DEFAULT_CLIENT;
return QDF_STATUS_SUCCESS;
case REG_SUBORDINATE_CLIENT:
*tx_power = REG_PSD_MAX_TXPOWER_FOR_SUBORDINATE_CLIENT;
return QDF_STATUS_SUCCESS;
default:
reg_err_rl("Invalid client type");
return QDF_STATUS_E_FAILURE;
}
}
return QDF_STATUS_E_FAILURE;
}
/**
* reg_get_max_txpower_for_eirp() - Get max EIRP.
* @pdev: Pointer to pdev.
* @freq: Channel frequency.
* @bw: Channel bandwidth.
* @reg_ap: Regulatory 6G AP type.
* @reg_client: Regulatory client type.
* @tx_power: Pointer to tx-power.
*
* Return: Return QDF_STATUS_SUCCESS, if EIRP is filled for 6G TPE IE
* else return QDF_STATUS_E_FAILURE.
*/
static QDF_STATUS reg_get_max_eirp(struct wlan_objmgr_pdev *pdev,
qdf_freq_t freq,
uint16_t bw,
enum reg_6g_ap_type reg_ap,
enum reg_6g_client_type reg_client,
uint8_t *tx_power)
{
if (reg_ap == REG_INDOOR_AP) {
switch (reg_client) {
case REG_DEFAULT_CLIENT:
*tx_power = reg_get_channel_reg_power_for_freq(pdev,
freq);
return QDF_STATUS_SUCCESS;
case REG_SUBORDINATE_CLIENT:
*tx_power = REG_EIRP_MAX_TXPOWER_FOR_SUBORDINATE_CLIENT;
return QDF_STATUS_SUCCESS;
default:
reg_err_rl("Invalid client type");
return QDF_STATUS_E_FAILURE;
}
}
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS reg_get_max_txpower_for_6g_tpe(struct wlan_objmgr_pdev *pdev,
qdf_freq_t freq, uint8_t bw,
enum reg_6g_ap_type reg_ap,
enum reg_6g_client_type reg_client,
bool is_psd,
uint8_t *tx_power)
{
if (!REG_IS_6GHZ_FREQ(freq)) {
reg_err_rl("%d is not a 6G channel frequency", freq);
return QDF_STATUS_E_FAILURE;
}
/*
* For now, there is support only for Indoor AP and we have only
* LPI power values.
*/
if (is_psd)
return reg_get_max_psd(freq, bw, reg_ap, reg_client, tx_power);
return reg_get_max_eirp(pdev, freq, bw, reg_ap, reg_client, tx_power);
}
/**
* BAND_6G_PRESENT() - Check if REG_BAND_6G is set in the band_mask
* @band_mask: Bitmask for bands

Näytä tiedosto

@@ -647,6 +647,27 @@ bool reg_is_6ghz_psc_chan_freq(uint16_t freq);
*/
bool reg_is_6g_freq_indoor(struct wlan_objmgr_pdev *pdev, qdf_freq_t freq);
/**
* reg_get_max_txpower_for_6g_tpe() - Get max txpower for 6G TPE IE.
* @pdev: Pointer to pdev.
* @freq: Channel frequency.
* @bw: Channel bandwidth.
* @reg_ap: Regulatory 6G AP type.
* @reg_client: Regulatory 6G client type.
* @is_psd: True if txpower is needed in PSD format, and false if needed in EIRP
* format.
* @tx_power: Pointer to tx-power.
*
* Return: Return QDF_STATUS_SUCCESS, if tx_power is filled for 6G TPE IE
* else return QDF_STATUS_E_FAILURE.
*/
QDF_STATUS reg_get_max_txpower_for_6g_tpe(struct wlan_objmgr_pdev *pdev,
qdf_freq_t freq, uint8_t bw,
enum reg_6g_ap_type reg_ap,
enum reg_6g_client_type reg_client,
bool is_psd,
uint8_t *tx_power);
/**
* reg_min_6ghz_chan_freq() - Get minimum 6GHz channel center frequency
*
@@ -672,6 +693,17 @@ reg_is_6g_freq_indoor(struct wlan_objmgr_pdev *pdev, qdf_freq_t freq)
return false;
}
static inline QDF_STATUS
reg_get_max_txpower_for_6g_tpe(struct wlan_objmgr_pdev *pdev,
qdf_freq_t freq, uint8_t bw,
enum reg_6g_ap_type reg_ap,
enum reg_6g_client_type reg_client,
bool is_psd,
uint8_t *tx_power)
{
return QDF_STATUS_E_FAILURE;
}
#ifdef CONFIG_6G_FREQ_OVERLAP
static inline bool reg_is_range_overlap_6g(qdf_freq_t low_freq,
qdf_freq_t high_freq)

Näytä tiedosto

@@ -27,7 +27,14 @@
#define REG_SBS_SEPARATION_THRESHOLD 100
#ifdef CONFIG_BAND_6GHZ
#define REG_MAX_CHANNELS_PER_OPERATING_CLASS 70
#define REG_MAX_CHANNELS_PER_OPERATING_CLASS 70
/*
* These tx-power macros are present till the 6G regdomains are defined to
* support tx-power values for various client types.
*/
#define REG_PSD_MAX_TXPOWER_FOR_DEFAULT_CLIENT (-1) /* dBm */
#define REG_PSD_MAX_TXPOWER_FOR_SUBORDINATE_CLIENT 5 /* dBm */
#define REG_EIRP_MAX_TXPOWER_FOR_SUBORDINATE_CLIENT 24 /* dBm */
#else
#define REG_MAX_CHANNELS_PER_OPERATING_CLASS 25
#endif
@@ -515,6 +522,32 @@ enum channel_state {
CHANNEL_STATE_INVALID,
};
/**
* enum reg_6g_ap_type - Regulatory AP type for regulatory info subfield.
* @REG_INDOOR_AP: Indoor AP
* @REG_STANDARD_POWER_AP: Standard Power AP
* @REG_MAX_AP_TYPE: Maximum value possible for (3 bits) regulatory info
* sub-field in the 6G HE Operation IE
*/
enum reg_6g_ap_type {
REG_INDOOR_AP = 0,
REG_STANDARD_POWER_AP = 1,
REG_MAX_AP_TYPE = 7,
};
/**
* enum reg_6g_client_type - Regulatory client type for max tx-power category
* @REG_DEFAULT_CLIENT: Default client
* @REG_SUBORDINATE_CLIENT: Subordinate client
* @REG_MAX_CLIENT_TYPE: Maximum value possible for max tx-power category
* (2 bits) sub-field in the TPE (Transmit Power Envelope) IE
*/
enum reg_6g_client_type {
REG_DEFAULT_CLIENT = 0,
REG_SUBORDINATE_CLIENT = 1,
REG_MAX_CLIENT_TYPE = 3,
};
/**
* enum reg_domain: reg domain
* @REGDOMAIN_FCC: FCC domain

Näytä tiedosto

@@ -244,6 +244,28 @@ uint16_t wlan_reg_max_6ghz_chan_freq(void);
wlan_reg_is_6g_freq_indoor(pdev, freq)
bool wlan_reg_is_6g_freq_indoor(struct wlan_objmgr_pdev *pdev, qdf_freq_t freq);
/**
* wlan_reg_get_max_txpower_for_6g_tpe() - Get max txpower for 6G TPE IE.
* @pdev: Pointer to pdev.
* @freq: Channel frequency.
* @bw: Channel bandwidth.
* @reg_ap: Regulatory 6G AP type.
* @reg_client: Regulatory client type.
* @is_psd: True if txpower is needed in PSD format, and false if needed in EIRP
* format.
* @tx_power: Pointer to tx-power.
*
* Return: Return QDF_STATUS_SUCCESS, if tx_power is filled for 6G TPE IE
* else return QDF_STATUS_E_FAILURE.
*/
QDF_STATUS
wlan_reg_get_max_txpower_for_6g_tpe(struct wlan_objmgr_pdev *pdev,
qdf_freq_t freq, uint8_t bw,
enum reg_6g_ap_type reg_ap,
enum reg_6g_client_type reg_client,
bool is_psd,
uint8_t *tx_power);
#else
#define WLAN_REG_IS_6GHZ_CHAN_FREQ(freq) (false)
@@ -282,6 +304,17 @@ wlan_reg_is_6g_freq_indoor(struct wlan_objmgr_pdev *pdev, qdf_freq_t freq)
{
return false;
}
static inline QDF_STATUS
wlan_reg_get_max_txpower_for_6g_tpe(struct wlan_objmgr_pdev *pdev,
qdf_freq_t freq, uint8_t bw,
enum reg_6g_ap_type reg_ap,
enum reg_6g_client_type reg_client,
bool is_psd,
uint8_t *tx_power)
{
return QDF_STATUS_E_FAILURE;
}
#endif /* CONFIG_BAND_6GHZ */
/**

Näytä tiedosto

@@ -836,6 +836,20 @@ bool wlan_reg_is_6g_freq_indoor(struct wlan_objmgr_pdev *pdev, qdf_freq_t freq)
{
return reg_is_6g_freq_indoor(pdev, freq);
}
QDF_STATUS
wlan_reg_get_max_txpower_for_6g_tpe(struct wlan_objmgr_pdev *pdev,
qdf_freq_t freq, uint8_t bw,
enum reg_6g_ap_type reg_ap,
enum reg_6g_client_type reg_client,
bool is_psd,
uint8_t *tx_power)
{
return reg_get_max_txpower_for_6g_tpe(pdev, freq, bw,
reg_ap,
reg_client, is_psd,
tx_power);
}
#endif /* CONFIG_BAND_6GHZ */
uint16_t