Commit 0237f65a authored by Zong-Zhe Yang's avatar Zong-Zhe Yang Committed by Kalle Valo

rtw89: handle 6G band if supported by a chipset

For next chipset which can support 6G band, we add the handling
of ieee80211_supported_band for 6G band in advance. And a bitmap,
support_bands, is added to rtw89_chip_info to declare which
NL80211_BAND_* are supported. With the chipset's declaration,
we register the corresponding instances of ieee80211_supported_band
with wiphy.
Signed-off-by: default avatarZong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220113011042.6705-1-pkshih@realtek.com
parent 14f0999d
...@@ -21,50 +21,122 @@ static bool rtw89_disable_ps_mode; ...@@ -21,50 +21,122 @@ static bool rtw89_disable_ps_mode;
module_param_named(disable_ps_mode, rtw89_disable_ps_mode, bool, 0644); module_param_named(disable_ps_mode, rtw89_disable_ps_mode, bool, 0644);
MODULE_PARM_DESC(disable_ps_mode, "Set Y to disable low power mode"); MODULE_PARM_DESC(disable_ps_mode, "Set Y to disable low power mode");
#define RTW89_DEF_CHAN(_freq, _hw_val, _flags, _band) \
{ .center_freq = _freq, .hw_value = _hw_val, .flags = _flags, .band = _band, }
#define RTW89_DEF_CHAN_2G(_freq, _hw_val) \
RTW89_DEF_CHAN(_freq, _hw_val, 0, NL80211_BAND_2GHZ)
#define RTW89_DEF_CHAN_5G(_freq, _hw_val) \
RTW89_DEF_CHAN(_freq, _hw_val, 0, NL80211_BAND_5GHZ)
#define RTW89_DEF_CHAN_5G_NO_HT40MINUS(_freq, _hw_val) \
RTW89_DEF_CHAN(_freq, _hw_val, IEEE80211_CHAN_NO_HT40MINUS, NL80211_BAND_5GHZ)
#define RTW89_DEF_CHAN_6G(_freq, _hw_val) \
RTW89_DEF_CHAN(_freq, _hw_val, 0, NL80211_BAND_6GHZ)
static struct ieee80211_channel rtw89_channels_2ghz[] = { static struct ieee80211_channel rtw89_channels_2ghz[] = {
{ .center_freq = 2412, .hw_value = 1, }, RTW89_DEF_CHAN_2G(2412, 1),
{ .center_freq = 2417, .hw_value = 2, }, RTW89_DEF_CHAN_2G(2417, 2),
{ .center_freq = 2422, .hw_value = 3, }, RTW89_DEF_CHAN_2G(2422, 3),
{ .center_freq = 2427, .hw_value = 4, }, RTW89_DEF_CHAN_2G(2427, 4),
{ .center_freq = 2432, .hw_value = 5, }, RTW89_DEF_CHAN_2G(2432, 5),
{ .center_freq = 2437, .hw_value = 6, }, RTW89_DEF_CHAN_2G(2437, 6),
{ .center_freq = 2442, .hw_value = 7, }, RTW89_DEF_CHAN_2G(2442, 7),
{ .center_freq = 2447, .hw_value = 8, }, RTW89_DEF_CHAN_2G(2447, 8),
{ .center_freq = 2452, .hw_value = 9, }, RTW89_DEF_CHAN_2G(2452, 9),
{ .center_freq = 2457, .hw_value = 10, }, RTW89_DEF_CHAN_2G(2457, 10),
{ .center_freq = 2462, .hw_value = 11, }, RTW89_DEF_CHAN_2G(2462, 11),
{ .center_freq = 2467, .hw_value = 12, }, RTW89_DEF_CHAN_2G(2467, 12),
{ .center_freq = 2472, .hw_value = 13, }, RTW89_DEF_CHAN_2G(2472, 13),
{ .center_freq = 2484, .hw_value = 14, }, RTW89_DEF_CHAN_2G(2484, 14),
}; };
static struct ieee80211_channel rtw89_channels_5ghz[] = { static struct ieee80211_channel rtw89_channels_5ghz[] = {
{.center_freq = 5180, .hw_value = 36,}, RTW89_DEF_CHAN_5G(5180, 36),
{.center_freq = 5200, .hw_value = 40,}, RTW89_DEF_CHAN_5G(5200, 40),
{.center_freq = 5220, .hw_value = 44,}, RTW89_DEF_CHAN_5G(5220, 44),
{.center_freq = 5240, .hw_value = 48,}, RTW89_DEF_CHAN_5G(5240, 48),
{.center_freq = 5260, .hw_value = 52,}, RTW89_DEF_CHAN_5G(5260, 52),
{.center_freq = 5280, .hw_value = 56,}, RTW89_DEF_CHAN_5G(5280, 56),
{.center_freq = 5300, .hw_value = 60,}, RTW89_DEF_CHAN_5G(5300, 60),
{.center_freq = 5320, .hw_value = 64,}, RTW89_DEF_CHAN_5G(5320, 64),
{.center_freq = 5500, .hw_value = 100,}, RTW89_DEF_CHAN_5G(5500, 100),
{.center_freq = 5520, .hw_value = 104,}, RTW89_DEF_CHAN_5G(5520, 104),
{.center_freq = 5540, .hw_value = 108,}, RTW89_DEF_CHAN_5G(5540, 108),
{.center_freq = 5560, .hw_value = 112,}, RTW89_DEF_CHAN_5G(5560, 112),
{.center_freq = 5580, .hw_value = 116,}, RTW89_DEF_CHAN_5G(5580, 116),
{.center_freq = 5600, .hw_value = 120,}, RTW89_DEF_CHAN_5G(5600, 120),
{.center_freq = 5620, .hw_value = 124,}, RTW89_DEF_CHAN_5G(5620, 124),
{.center_freq = 5640, .hw_value = 128,}, RTW89_DEF_CHAN_5G(5640, 128),
{.center_freq = 5660, .hw_value = 132,}, RTW89_DEF_CHAN_5G(5660, 132),
{.center_freq = 5680, .hw_value = 136,}, RTW89_DEF_CHAN_5G(5680, 136),
{.center_freq = 5700, .hw_value = 140,}, RTW89_DEF_CHAN_5G(5700, 140),
{.center_freq = 5720, .hw_value = 144,}, RTW89_DEF_CHAN_5G(5720, 144),
{.center_freq = 5745, .hw_value = 149,}, RTW89_DEF_CHAN_5G(5745, 149),
{.center_freq = 5765, .hw_value = 153,}, RTW89_DEF_CHAN_5G(5765, 153),
{.center_freq = 5785, .hw_value = 157,}, RTW89_DEF_CHAN_5G(5785, 157),
{.center_freq = 5805, .hw_value = 161,}, RTW89_DEF_CHAN_5G(5805, 161),
{.center_freq = 5825, .hw_value = 165, RTW89_DEF_CHAN_5G_NO_HT40MINUS(5825, 165),
.flags = IEEE80211_CHAN_NO_HT40MINUS}, };
static struct ieee80211_channel rtw89_channels_6ghz[] = {
RTW89_DEF_CHAN_6G(5955, 1),
RTW89_DEF_CHAN_6G(5975, 5),
RTW89_DEF_CHAN_6G(5995, 9),
RTW89_DEF_CHAN_6G(6015, 13),
RTW89_DEF_CHAN_6G(6035, 17),
RTW89_DEF_CHAN_6G(6055, 21),
RTW89_DEF_CHAN_6G(6075, 25),
RTW89_DEF_CHAN_6G(6095, 29),
RTW89_DEF_CHAN_6G(6115, 33),
RTW89_DEF_CHAN_6G(6135, 37),
RTW89_DEF_CHAN_6G(6155, 41),
RTW89_DEF_CHAN_6G(6175, 45),
RTW89_DEF_CHAN_6G(6195, 49),
RTW89_DEF_CHAN_6G(6215, 53),
RTW89_DEF_CHAN_6G(6235, 57),
RTW89_DEF_CHAN_6G(6255, 61),
RTW89_DEF_CHAN_6G(6275, 65),
RTW89_DEF_CHAN_6G(6295, 69),
RTW89_DEF_CHAN_6G(6315, 73),
RTW89_DEF_CHAN_6G(6335, 77),
RTW89_DEF_CHAN_6G(6355, 81),
RTW89_DEF_CHAN_6G(6375, 85),
RTW89_DEF_CHAN_6G(6395, 89),
RTW89_DEF_CHAN_6G(6415, 93),
RTW89_DEF_CHAN_6G(6435, 97),
RTW89_DEF_CHAN_6G(6455, 101),
RTW89_DEF_CHAN_6G(6475, 105),
RTW89_DEF_CHAN_6G(6495, 109),
RTW89_DEF_CHAN_6G(6515, 113),
RTW89_DEF_CHAN_6G(6535, 117),
RTW89_DEF_CHAN_6G(6555, 121),
RTW89_DEF_CHAN_6G(6575, 125),
RTW89_DEF_CHAN_6G(6595, 129),
RTW89_DEF_CHAN_6G(6615, 133),
RTW89_DEF_CHAN_6G(6635, 137),
RTW89_DEF_CHAN_6G(6655, 141),
RTW89_DEF_CHAN_6G(6675, 145),
RTW89_DEF_CHAN_6G(6695, 149),
RTW89_DEF_CHAN_6G(6715, 153),
RTW89_DEF_CHAN_6G(6735, 157),
RTW89_DEF_CHAN_6G(6755, 161),
RTW89_DEF_CHAN_6G(6775, 165),
RTW89_DEF_CHAN_6G(6795, 169),
RTW89_DEF_CHAN_6G(6815, 173),
RTW89_DEF_CHAN_6G(6835, 177),
RTW89_DEF_CHAN_6G(6855, 181),
RTW89_DEF_CHAN_6G(6875, 185),
RTW89_DEF_CHAN_6G(6895, 189),
RTW89_DEF_CHAN_6G(6915, 193),
RTW89_DEF_CHAN_6G(6935, 197),
RTW89_DEF_CHAN_6G(6955, 201),
RTW89_DEF_CHAN_6G(6975, 205),
RTW89_DEF_CHAN_6G(6995, 209),
RTW89_DEF_CHAN_6G(7015, 213),
RTW89_DEF_CHAN_6G(7035, 217),
RTW89_DEF_CHAN_6G(7055, 221),
RTW89_DEF_CHAN_6G(7075, 225),
RTW89_DEF_CHAN_6G(7095, 229),
RTW89_DEF_CHAN_6G(7115, 233),
}; };
static struct ieee80211_rate rtw89_bitrates[] = { static struct ieee80211_rate rtw89_bitrates[] = {
...@@ -118,6 +190,16 @@ static struct ieee80211_supported_band rtw89_sband_5ghz = { ...@@ -118,6 +190,16 @@ static struct ieee80211_supported_band rtw89_sband_5ghz = {
.vht_cap = {0}, .vht_cap = {0},
}; };
static struct ieee80211_supported_band rtw89_sband_6ghz = {
.band = NL80211_BAND_6GHZ,
.channels = rtw89_channels_6ghz,
.n_channels = ARRAY_SIZE(rtw89_channels_6ghz),
/* 6G has no CCK rates, 1M/2M/5.5M/11M */
.bitrates = rtw89_bitrates + 4,
.n_bitrates = ARRAY_SIZE(rtw89_bitrates) - 4,
};
static void rtw89_traffic_stats_accu(struct rtw89_dev *rtwdev, static void rtw89_traffic_stats_accu(struct rtw89_dev *rtwdev,
struct rtw89_traffic_stats *stats, struct rtw89_traffic_stats *stats,
struct sk_buff *skb, bool tx) struct sk_buff *skb, bool tx)
...@@ -149,6 +231,7 @@ static void rtw89_get_channel_params(struct cfg80211_chan_def *chandef, ...@@ -149,6 +231,7 @@ static void rtw89_get_channel_params(struct cfg80211_chan_def *chandef,
u8 center_chan; u8 center_chan;
u8 bandwidth = RTW89_CHANNEL_WIDTH_20; u8 bandwidth = RTW89_CHANNEL_WIDTH_20;
u8 primary_chan_idx = 0; u8 primary_chan_idx = 0;
u8 band;
center_chan = channel->hw_value; center_chan = channel->hw_value;
primary_freq = channel->center_freq; primary_freq = channel->center_freq;
...@@ -195,10 +278,24 @@ static void rtw89_get_channel_params(struct cfg80211_chan_def *chandef, ...@@ -195,10 +278,24 @@ static void rtw89_get_channel_params(struct cfg80211_chan_def *chandef,
break; break;
} }
switch (channel->band) {
default:
case NL80211_BAND_2GHZ:
band = RTW89_BAND_2G;
break;
case NL80211_BAND_5GHZ:
band = RTW89_BAND_5G;
break;
case NL80211_BAND_6GHZ:
band = RTW89_BAND_6G;
break;
}
chan_param->center_chan = center_chan; chan_param->center_chan = center_chan;
chan_param->primary_chan = channel->hw_value; chan_param->primary_chan = channel->hw_value;
chan_param->bandwidth = bandwidth; chan_param->bandwidth = bandwidth;
chan_param->pri_ch_idx = primary_chan_idx; chan_param->pri_ch_idx = primary_chan_idx;
chan_param->band_type = band;
} }
void rtw89_set_channel(struct rtw89_dev *rtwdev) void rtw89_set_channel(struct rtw89_dev *rtwdev)
...@@ -209,7 +306,6 @@ void rtw89_set_channel(struct rtw89_dev *rtwdev) ...@@ -209,7 +306,6 @@ void rtw89_set_channel(struct rtw89_dev *rtwdev)
struct rtw89_channel_params ch_param; struct rtw89_channel_params ch_param;
struct rtw89_channel_help_params bak; struct rtw89_channel_help_params bak;
u8 center_chan, bandwidth; u8 center_chan, bandwidth;
u8 band_type;
bool band_changed; bool band_changed;
rtw89_get_channel_params(&hw->conf.chandef, &ch_param); rtw89_get_channel_params(&hw->conf.chandef, &ch_param);
...@@ -218,15 +314,14 @@ void rtw89_set_channel(struct rtw89_dev *rtwdev) ...@@ -218,15 +314,14 @@ void rtw89_set_channel(struct rtw89_dev *rtwdev)
center_chan = ch_param.center_chan; center_chan = ch_param.center_chan;
bandwidth = ch_param.bandwidth; bandwidth = ch_param.bandwidth;
band_type = center_chan > 14 ? RTW89_BAND_5G : RTW89_BAND_2G; band_changed = hal->current_band_type != ch_param.band_type ||
band_changed = hal->current_band_type != band_type ||
hal->current_channel == 0; hal->current_channel == 0;
hal->current_band_width = bandwidth; hal->current_band_width = bandwidth;
hal->current_channel = center_chan; hal->current_channel = center_chan;
hal->prev_primary_channel = hal->current_primary_channel; hal->prev_primary_channel = hal->current_primary_channel;
hal->current_primary_channel = ch_param.primary_chan; hal->current_primary_channel = ch_param.primary_chan;
hal->current_band_type = band_type; hal->current_band_type = ch_param.band_type;
switch (center_chan) { switch (center_chan) {
case 1 ... 14: case 1 ... 14:
...@@ -2219,15 +2314,20 @@ static int rtw89_core_set_supported_band(struct rtw89_dev *rtwdev) ...@@ -2219,15 +2314,20 @@ static int rtw89_core_set_supported_band(struct rtw89_dev *rtwdev)
{ {
struct ieee80211_hw *hw = rtwdev->hw; struct ieee80211_hw *hw = rtwdev->hw;
struct ieee80211_supported_band *sband_2ghz = NULL, *sband_5ghz = NULL; struct ieee80211_supported_band *sband_2ghz = NULL, *sband_5ghz = NULL;
struct ieee80211_supported_band *sband_6ghz = NULL;
u32 size = sizeof(struct ieee80211_supported_band); u32 size = sizeof(struct ieee80211_supported_band);
u8 support_bands = rtwdev->chip->support_bands;
if (support_bands & BIT(NL80211_BAND_2GHZ)) {
sband_2ghz = kmemdup(&rtw89_sband_2ghz, size, GFP_KERNEL); sband_2ghz = kmemdup(&rtw89_sband_2ghz, size, GFP_KERNEL);
if (!sband_2ghz) if (!sband_2ghz)
goto err; goto err;
rtw89_init_ht_cap(rtwdev, &sband_2ghz->ht_cap); rtw89_init_ht_cap(rtwdev, &sband_2ghz->ht_cap);
rtw89_init_he_cap(rtwdev, NL80211_BAND_2GHZ, sband_2ghz); rtw89_init_he_cap(rtwdev, NL80211_BAND_2GHZ, sband_2ghz);
hw->wiphy->bands[NL80211_BAND_2GHZ] = sband_2ghz; hw->wiphy->bands[NL80211_BAND_2GHZ] = sband_2ghz;
}
if (support_bands & BIT(NL80211_BAND_5GHZ)) {
sband_5ghz = kmemdup(&rtw89_sband_5ghz, size, GFP_KERNEL); sband_5ghz = kmemdup(&rtw89_sband_5ghz, size, GFP_KERNEL);
if (!sband_5ghz) if (!sband_5ghz)
goto err; goto err;
...@@ -2235,18 +2335,31 @@ static int rtw89_core_set_supported_band(struct rtw89_dev *rtwdev) ...@@ -2235,18 +2335,31 @@ static int rtw89_core_set_supported_band(struct rtw89_dev *rtwdev)
rtw89_init_vht_cap(rtwdev, &sband_5ghz->vht_cap); rtw89_init_vht_cap(rtwdev, &sband_5ghz->vht_cap);
rtw89_init_he_cap(rtwdev, NL80211_BAND_5GHZ, sband_5ghz); rtw89_init_he_cap(rtwdev, NL80211_BAND_5GHZ, sband_5ghz);
hw->wiphy->bands[NL80211_BAND_5GHZ] = sband_5ghz; hw->wiphy->bands[NL80211_BAND_5GHZ] = sband_5ghz;
}
if (support_bands & BIT(NL80211_BAND_6GHZ)) {
sband_6ghz = kmemdup(&rtw89_sband_6ghz, size, GFP_KERNEL);
if (!sband_6ghz)
goto err;
rtw89_init_he_cap(rtwdev, NL80211_BAND_6GHZ, sband_6ghz);
hw->wiphy->bands[NL80211_BAND_6GHZ] = sband_6ghz;
}
return 0; return 0;
err: err:
hw->wiphy->bands[NL80211_BAND_2GHZ] = NULL; hw->wiphy->bands[NL80211_BAND_2GHZ] = NULL;
hw->wiphy->bands[NL80211_BAND_5GHZ] = NULL; hw->wiphy->bands[NL80211_BAND_5GHZ] = NULL;
hw->wiphy->bands[NL80211_BAND_6GHZ] = NULL;
if (sband_2ghz) if (sband_2ghz)
kfree(sband_2ghz->iftype_data); kfree(sband_2ghz->iftype_data);
if (sband_5ghz) if (sband_5ghz)
kfree(sband_5ghz->iftype_data); kfree(sband_5ghz->iftype_data);
if (sband_6ghz)
kfree(sband_6ghz->iftype_data);
kfree(sband_2ghz); kfree(sband_2ghz);
kfree(sband_5ghz); kfree(sband_5ghz);
kfree(sband_6ghz);
return -ENOMEM; return -ENOMEM;
} }
...@@ -2256,10 +2369,14 @@ static void rtw89_core_clr_supported_band(struct rtw89_dev *rtwdev) ...@@ -2256,10 +2369,14 @@ static void rtw89_core_clr_supported_band(struct rtw89_dev *rtwdev)
kfree(hw->wiphy->bands[NL80211_BAND_2GHZ]->iftype_data); kfree(hw->wiphy->bands[NL80211_BAND_2GHZ]->iftype_data);
kfree(hw->wiphy->bands[NL80211_BAND_5GHZ]->iftype_data); kfree(hw->wiphy->bands[NL80211_BAND_5GHZ]->iftype_data);
if (hw->wiphy->bands[NL80211_BAND_6GHZ])
kfree(hw->wiphy->bands[NL80211_BAND_6GHZ]->iftype_data);
kfree(hw->wiphy->bands[NL80211_BAND_2GHZ]); kfree(hw->wiphy->bands[NL80211_BAND_2GHZ]);
kfree(hw->wiphy->bands[NL80211_BAND_5GHZ]); kfree(hw->wiphy->bands[NL80211_BAND_5GHZ]);
kfree(hw->wiphy->bands[NL80211_BAND_6GHZ]);
hw->wiphy->bands[NL80211_BAND_2GHZ] = NULL; hw->wiphy->bands[NL80211_BAND_2GHZ] = NULL;
hw->wiphy->bands[NL80211_BAND_5GHZ] = NULL; hw->wiphy->bands[NL80211_BAND_5GHZ] = NULL;
hw->wiphy->bands[NL80211_BAND_6GHZ] = NULL;
} }
static void rtw89_core_ppdu_sts_init(struct rtw89_dev *rtwdev) static void rtw89_core_ppdu_sts_init(struct rtw89_dev *rtwdev)
......
...@@ -203,6 +203,7 @@ enum rtw89_port { ...@@ -203,6 +203,7 @@ enum rtw89_port {
enum rtw89_band { enum rtw89_band {
RTW89_BAND_2G = 0, RTW89_BAND_2G = 0,
RTW89_BAND_5G = 1, RTW89_BAND_5G = 1,
RTW89_BAND_6G = 2,
RTW89_BAND_MAX, RTW89_BAND_MAX,
}; };
...@@ -568,6 +569,7 @@ struct rtw89_channel_params { ...@@ -568,6 +569,7 @@ struct rtw89_channel_params {
u8 primary_chan; u8 primary_chan;
u8 bandwidth; u8 bandwidth;
u8 pri_ch_idx; u8 pri_ch_idx;
u8 band_type;
}; };
struct rtw89_channel_help_params { struct rtw89_channel_help_params {
...@@ -2204,6 +2206,7 @@ struct rtw89_chip_info { ...@@ -2204,6 +2206,7 @@ struct rtw89_chip_info {
const struct rtw89_hfc_param_ini *hfc_param_ini; const struct rtw89_hfc_param_ini *hfc_param_ini;
const struct rtw89_dle_mem *dle_mem; const struct rtw89_dle_mem *dle_mem;
u32 rf_base_addr[2]; u32 rf_base_addr[2];
u8 support_bands;
u8 rf_path_num; u8 rf_path_num;
u8 tx_nss; u8 tx_nss;
u8 rx_nss; u8 rx_nss;
......
...@@ -2022,6 +2022,8 @@ const struct rtw89_chip_info rtw8852a_chip_info = { ...@@ -2022,6 +2022,8 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
.txpwr_factor_rf = 2, .txpwr_factor_rf = 2,
.txpwr_factor_mac = 1, .txpwr_factor_mac = 1,
.dig_table = &rtw89_8852a_phy_dig_table, .dig_table = &rtw89_8852a_phy_dig_table,
.support_bands = BIT(NL80211_BAND_2GHZ) |
BIT(NL80211_BAND_5GHZ),
.rf_path_num = 2, .rf_path_num = 2,
.tx_nss = 2, .tx_nss = 2,
.rx_nss = 2, .rx_nss = 2,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment