hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/******************************************************************************
 *
 * Copyright(c) 2019 Realtek Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 *****************************************************************************/
#define _HAL_EXT_TX_PWR_LMT_C_
#include "hal_headers.h"
 
enum rtw_hal_status
rtw_hal_set_power_limit(void *hal, u8 band_idx)
{
   struct hal_info_t *hal_info = (struct hal_info_t *)hal;
   enum rtw_hal_status status = RTW_HAL_STATUS_SUCCESS;
   enum phl_phy_idx phy_idx = HW_PHY_0;
 
   if (band_idx == 1) {
       if (hal_info->hal_com->dbcc_en) {
           phy_idx = HW_PHY_1;
       } else {
           PHL_WARN("%s: band_idx(%d) dbcc_en(%d)\n", __func__,
                band_idx, hal_info->hal_com->dbcc_en);
           return status;
       }
   }
   status = rtw_hal_rf_set_power(hal_info, phy_idx, (PWR_LIMIT | PWR_LIMIT_RU));
   return status;
}
 
s8 rtw_hal_get_power_limit(void *hal, enum phl_phy_idx phy,
   u16 rate, u8 bandwidth, u8 beamforming, u8 tx_num, u8 channel)
{
   struct hal_info_t *hal_info = (struct hal_info_t *)hal;
 
   return rtw_hal_rf_get_power_limit(hal_info, phy, rate, bandwidth,
                     beamforming, tx_num, channel);
}
 
bool
rtw_hal_get_ext_pwr_lmt_en(void *hal,
       u8 hw_band)
{
   struct hal_info_t *hal_info = (struct hal_info_t *)hal;
   struct rtw_hal_com_t *hal_com = hal_info->hal_com;
   struct rtw_tpu_info *tpu = &(hal_com->band[hw_band].rtw_tpu_i);
 
   PHL_INFO("%s: hw_band(%d), en(%d)\n", __func__, hw_band, tpu->ext_pwr_lmt_en);
 
   return tpu->ext_pwr_lmt_en;
}
 
void
rtw_hal_set_ext_pwr_lmt_en(void *hal,
       u8 hw_band, bool enable)
{
   struct hal_info_t *hal_info = (struct hal_info_t *)hal;
   struct rtw_hal_com_t *hal_com = hal_info->hal_com;
   struct rtw_tpu_info *tpu = &(hal_com->band[hw_band].rtw_tpu_i);
 
   PHL_INFO("%s: hw_band(%d), en(%d)\n", __func__, hw_band, enable);
 
   tpu->ext_pwr_lmt_en = enable;
}
 
void
rtw_hal_enable_ext_pwr_lmt(void *hal, u8 hw_band,
       struct rtw_phl_ext_pwr_lmt_info *ext_pwr_lmt_info)
{
   struct hal_info_t *hal_info = (struct hal_info_t *)hal;
   struct rtw_hal_com_t *hal_com = hal_info->hal_com;
   struct rtw_tpu_info *tpu = &(hal_com->band[hw_band].rtw_tpu_i);
   enum phl_phy_idx phy_idx = HW_PHY_0;
 
   PHL_INFO("%s\n", __func__);
 
   if (hw_band == 1)
       phy_idx = HW_PHY_1;
 
 
   /* Fill external tx power limit into hal_com->band[hw_band].rtw_tpu_i.ext_pwr_lmt_i */
   _os_mem_cpy(hal_com->drv_priv, &(tpu->ext_pwr_lmt_i),
           ext_pwr_lmt_info, sizeof(struct rtw_phl_ext_pwr_lmt_info));
 
   /**
    * Update extension(or external) tx power limit to corresponding field of halrf power limit table (as below)
    *   2g=> rf->pwr_info.tx_pwr_limit_2g[PW_LMT_REGU_EXT_PWR][bw][rate][bf][ch][tx_num]
    *   5g=> rf->pwr_info.tx_pwr_limit_5g[PW_LMT_REGU_EXT_PWR][bw][rate][bf][ch][tx_num]
    *   6g=> rf->pwr_info.tx_pwr_limit_6g[PW_LMT_REGU_EXT_PWR][bw][rate][bf][ch][tx_num]
    */
   rtw_hal_rf_update_ext_pwr_lmt_table(hal_info, phy_idx);
 
   /* enable external tx power limit mechanism */
   tpu->ext_pwr_lmt_en = true;
}