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:

committed by
snandini

parent
4fd0241eff
commit
cad70ccae2
@@ -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));
|
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_6G_PRESENT() - Check if REG_BAND_6G is set in the band_mask
|
||||||
* @band_mask: Bitmask for bands
|
* @band_mask: Bitmask for bands
|
||||||
|
@@ -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);
|
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
|
* 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;
|
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
|
#ifdef CONFIG_6G_FREQ_OVERLAP
|
||||||
static inline bool reg_is_range_overlap_6g(qdf_freq_t low_freq,
|
static inline bool reg_is_range_overlap_6g(qdf_freq_t low_freq,
|
||||||
qdf_freq_t high_freq)
|
qdf_freq_t high_freq)
|
||||||
|
@@ -27,7 +27,14 @@
|
|||||||
#define REG_SBS_SEPARATION_THRESHOLD 100
|
#define REG_SBS_SEPARATION_THRESHOLD 100
|
||||||
|
|
||||||
#ifdef CONFIG_BAND_6GHZ
|
#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
|
#else
|
||||||
#define REG_MAX_CHANNELS_PER_OPERATING_CLASS 25
|
#define REG_MAX_CHANNELS_PER_OPERATING_CLASS 25
|
||||||
#endif
|
#endif
|
||||||
@@ -515,6 +522,32 @@ enum channel_state {
|
|||||||
CHANNEL_STATE_INVALID,
|
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
|
* enum reg_domain: reg domain
|
||||||
* @REGDOMAIN_FCC: FCC domain
|
* @REGDOMAIN_FCC: FCC domain
|
||||||
|
@@ -244,6 +244,28 @@ uint16_t wlan_reg_max_6ghz_chan_freq(void);
|
|||||||
wlan_reg_is_6g_freq_indoor(pdev, freq)
|
wlan_reg_is_6g_freq_indoor(pdev, freq)
|
||||||
bool wlan_reg_is_6g_freq_indoor(struct wlan_objmgr_pdev *pdev, qdf_freq_t 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
|
#else
|
||||||
|
|
||||||
#define WLAN_REG_IS_6GHZ_CHAN_FREQ(freq) (false)
|
#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;
|
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 */
|
#endif /* CONFIG_BAND_6GHZ */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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);
|
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 */
|
#endif /* CONFIG_BAND_6GHZ */
|
||||||
|
|
||||||
uint16_t
|
uint16_t
|
||||||
|
Reference in New Issue
Block a user