mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 03:24:19 +02:00
wifi: rtw89: adjust channel encoding to common function
Since the range of channel table is identical among ICs. Make channel encode/decode function common and not IC dependent. So all ICs with matching firmware that needs this kind of coding can use it directly. This patch doesn't change logic at all. Signed-off-by: Po-Hao Huang <phhuang@realtek.com> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Signed-off-by: Kalle Valo <kvalo@kernel.org> Link: https://lore.kernel.org/r/20230220070202.29868-4-pkshih@realtek.com
This commit is contained in:
parent
31c416e69d
commit
bb9040b3ff
|
|
@ -4294,3 +4294,75 @@ void rtw89_phy_tssi_ctrl_set_bandedge_cfg(struct rtw89_dev *rtwdev,
|
|||
data[RTW89_TSSI_SBW20]);
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_phy_tssi_ctrl_set_bandedge_cfg);
|
||||
|
||||
static
|
||||
const u8 rtw89_ch_base_table[16] = {1, 0xff,
|
||||
36, 100, 132, 149, 0xff,
|
||||
1, 33, 65, 97, 129, 161, 193, 225, 0xff};
|
||||
#define RTW89_CH_BASE_IDX_2G 0
|
||||
#define RTW89_CH_BASE_IDX_5G_FIRST 2
|
||||
#define RTW89_CH_BASE_IDX_5G_LAST 5
|
||||
#define RTW89_CH_BASE_IDX_6G_FIRST 7
|
||||
#define RTW89_CH_BASE_IDX_6G_LAST 14
|
||||
|
||||
#define RTW89_CH_BASE_IDX_MASK GENMASK(7, 4)
|
||||
#define RTW89_CH_OFFSET_MASK GENMASK(3, 0)
|
||||
|
||||
u8 rtw89_encode_chan_idx(struct rtw89_dev *rtwdev, u8 central_ch, u8 band)
|
||||
{
|
||||
u8 chan_idx;
|
||||
u8 last, first;
|
||||
u8 idx;
|
||||
|
||||
switch (band) {
|
||||
case RTW89_BAND_2G:
|
||||
chan_idx = FIELD_PREP(RTW89_CH_BASE_IDX_MASK, RTW89_CH_BASE_IDX_2G) |
|
||||
FIELD_PREP(RTW89_CH_OFFSET_MASK, central_ch);
|
||||
return chan_idx;
|
||||
case RTW89_BAND_5G:
|
||||
first = RTW89_CH_BASE_IDX_5G_FIRST;
|
||||
last = RTW89_CH_BASE_IDX_5G_LAST;
|
||||
break;
|
||||
case RTW89_BAND_6G:
|
||||
first = RTW89_CH_BASE_IDX_6G_FIRST;
|
||||
last = RTW89_CH_BASE_IDX_6G_LAST;
|
||||
break;
|
||||
default:
|
||||
rtw89_warn(rtwdev, "Unsupported band %d\n", band);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (idx = last; idx >= first; idx--)
|
||||
if (central_ch >= rtw89_ch_base_table[idx])
|
||||
break;
|
||||
|
||||
if (idx < first) {
|
||||
rtw89_warn(rtwdev, "Unknown band %d channel %d\n", band, central_ch);
|
||||
return 0;
|
||||
}
|
||||
|
||||
chan_idx = FIELD_PREP(RTW89_CH_BASE_IDX_MASK, idx) |
|
||||
FIELD_PREP(RTW89_CH_OFFSET_MASK,
|
||||
(central_ch - rtw89_ch_base_table[idx]) >> 1);
|
||||
return chan_idx;
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_encode_chan_idx);
|
||||
|
||||
void rtw89_decode_chan_idx(struct rtw89_dev *rtwdev, u8 chan_idx,
|
||||
u8 *ch, enum nl80211_band *band)
|
||||
{
|
||||
u8 idx, offset;
|
||||
|
||||
idx = FIELD_GET(RTW89_CH_BASE_IDX_MASK, chan_idx);
|
||||
offset = FIELD_GET(RTW89_CH_OFFSET_MASK, chan_idx);
|
||||
|
||||
if (idx == RTW89_CH_BASE_IDX_2G) {
|
||||
*band = NL80211_BAND_2GHZ;
|
||||
*ch = offset;
|
||||
return;
|
||||
}
|
||||
|
||||
*band = idx <= RTW89_CH_BASE_IDX_5G_LAST ? NL80211_BAND_5GHZ : NL80211_BAND_6GHZ;
|
||||
*ch = rtw89_ch_base_table[idx] + (offset << 1);
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_decode_chan_idx);
|
||||
|
|
|
|||
|
|
@ -555,5 +555,8 @@ void rtw89_phy_tssi_ctrl_set_bandedge_cfg(struct rtw89_dev *rtwdev,
|
|||
enum rtw89_tssi_bandedge_cfg bandedge_cfg);
|
||||
void rtw89_phy_ul_tb_assoc(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
void rtw89_phy_ul_tb_ctrl_track(struct rtw89_dev *rtwdev);
|
||||
u8 rtw89_encode_chan_idx(struct rtw89_dev *rtwdev, u8 central_ch, u8 band);
|
||||
void rtw89_decode_chan_idx(struct rtw89_dev *rtwdev, u8 chan_idx,
|
||||
u8 *ch, enum nl80211_band *band);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -852,76 +852,6 @@ static void rtw8852c_set_gain_error(struct rtw89_dev *rtwdev,
|
|||
}
|
||||
}
|
||||
|
||||
static
|
||||
const u8 rtw8852c_ch_base_table[16] = {1, 0xff,
|
||||
36, 100, 132, 149, 0xff,
|
||||
1, 33, 65, 97, 129, 161, 193, 225, 0xff};
|
||||
#define RTW8852C_CH_BASE_IDX_2G 0
|
||||
#define RTW8852C_CH_BASE_IDX_5G_FIRST 2
|
||||
#define RTW8852C_CH_BASE_IDX_5G_LAST 5
|
||||
#define RTW8852C_CH_BASE_IDX_6G_FIRST 7
|
||||
#define RTW8852C_CH_BASE_IDX_6G_LAST 14
|
||||
|
||||
#define RTW8852C_CH_BASE_IDX_MASK GENMASK(7, 4)
|
||||
#define RTW8852C_CH_OFFSET_MASK GENMASK(3, 0)
|
||||
|
||||
static u8 rtw8852c_encode_chan_idx(struct rtw89_dev *rtwdev, u8 central_ch, u8 band)
|
||||
{
|
||||
u8 chan_idx;
|
||||
u8 last, first;
|
||||
u8 idx;
|
||||
|
||||
switch (band) {
|
||||
case RTW89_BAND_2G:
|
||||
chan_idx = FIELD_PREP(RTW8852C_CH_BASE_IDX_MASK, RTW8852C_CH_BASE_IDX_2G) |
|
||||
FIELD_PREP(RTW8852C_CH_OFFSET_MASK, central_ch);
|
||||
return chan_idx;
|
||||
case RTW89_BAND_5G:
|
||||
first = RTW8852C_CH_BASE_IDX_5G_FIRST;
|
||||
last = RTW8852C_CH_BASE_IDX_5G_LAST;
|
||||
break;
|
||||
case RTW89_BAND_6G:
|
||||
first = RTW8852C_CH_BASE_IDX_6G_FIRST;
|
||||
last = RTW8852C_CH_BASE_IDX_6G_LAST;
|
||||
break;
|
||||
default:
|
||||
rtw89_warn(rtwdev, "Unsupported band %d\n", band);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (idx = last; idx >= first; idx--)
|
||||
if (central_ch >= rtw8852c_ch_base_table[idx])
|
||||
break;
|
||||
|
||||
if (idx < first) {
|
||||
rtw89_warn(rtwdev, "Unknown band %d channel %d\n", band, central_ch);
|
||||
return 0;
|
||||
}
|
||||
|
||||
chan_idx = FIELD_PREP(RTW8852C_CH_BASE_IDX_MASK, idx) |
|
||||
FIELD_PREP(RTW8852C_CH_OFFSET_MASK,
|
||||
(central_ch - rtw8852c_ch_base_table[idx]) >> 1);
|
||||
return chan_idx;
|
||||
}
|
||||
|
||||
static void rtw8852c_decode_chan_idx(struct rtw89_dev *rtwdev, u8 chan_idx,
|
||||
u8 *ch, enum nl80211_band *band)
|
||||
{
|
||||
u8 idx, offset;
|
||||
|
||||
idx = FIELD_GET(RTW8852C_CH_BASE_IDX_MASK, chan_idx);
|
||||
offset = FIELD_GET(RTW8852C_CH_OFFSET_MASK, chan_idx);
|
||||
|
||||
if (idx == RTW8852C_CH_BASE_IDX_2G) {
|
||||
*band = NL80211_BAND_2GHZ;
|
||||
*ch = offset;
|
||||
return;
|
||||
}
|
||||
|
||||
*band = idx <= RTW8852C_CH_BASE_IDX_5G_LAST ? NL80211_BAND_5GHZ : NL80211_BAND_6GHZ;
|
||||
*ch = rtw8852c_ch_base_table[idx] + (offset << 1);
|
||||
}
|
||||
|
||||
static void rtw8852c_set_gain_offset(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
|
|
@ -1084,7 +1014,7 @@ static void rtw8852c_ctrl_ch(struct rtw89_dev *rtwdev,
|
|||
}
|
||||
}
|
||||
|
||||
chan_idx = rtw8852c_encode_chan_idx(rtwdev, chan->primary_channel, band);
|
||||
chan_idx = rtw89_encode_chan_idx(rtwdev, chan->primary_channel, band);
|
||||
rtw89_phy_write32_idx(rtwdev, R_MAC_PIN_SEL, B_CH_IDX_SEG0, chan_idx, phy_idx);
|
||||
}
|
||||
|
||||
|
|
@ -2730,7 +2660,7 @@ static void rtw8852c_fill_freq_with_ppdu(struct rtw89_dev *rtwdev,
|
|||
if (chan_idx == 0)
|
||||
return;
|
||||
|
||||
rtw8852c_decode_chan_idx(rtwdev, chan_idx, &ch, &band);
|
||||
rtw89_decode_chan_idx(rtwdev, chan_idx, &ch, &band);
|
||||
status->freq = ieee80211_channel_to_frequency(ch, band);
|
||||
status->band = band;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user