add 6GHz radio support in ath11k driver
v3 cover add 6GHz radio support in ath11k driver
This patch series adds 6GHz frequency listing in ath11k driver and mac80211 registration for the 6GHz band. Also, extends some of wmi command tlvs for supporting 6GHz.
In cfg80211, a helper function is added for identifying Preferred Scanning Channels (PSC) in 6GHz band.
changes in v3:
- cfg80211: remove PSC channel flag and instead add helper function.
- Address differences in 6GHZ frequencies between IEEE P802.11ax/D6.0 and IEEE P802.11ax/D6.1
changes in v2:
- Fixed ath11k_phymode to be set in 6GHZ band
Pradeep Kumar Chitrapu (9):
cfg80211: Add helper function to identify 6GHz PSC channel
ath11k: add 6G frequency list supported by driver
ath11k: add support for 6GHz radio in driver
ath11k: Use freq instead of channel number in rx path
ath11k: extend peer_assoc_cmd for 6GHz band
ath11k: set psc channel flag when sending channel list to firmware.
ath11k: Add 6G scan dwell time parameter in scan request command
ath11k: Send multiple scan_chan_list messages if required
ath11k: Add support for 6g scan hint
drivers/net/wireless/ath/ath11k/core.h | 6 +- drivers/net/wireless/ath/ath11k/dp_rx.c | 6 +- drivers/net/wireless/ath/ath11k/mac.c | 174 +++++++++++++-- drivers/net/wireless/ath/ath11k/reg.c | 4 + drivers/net/wireless/ath/ath11k/wmi.c | 269 +++++++++++++++++------- drivers/net/wireless/ath/ath11k/wmi.h | 40 +++- include/net/cfg80211.h | 24 +++ 7 files changed, 425 insertions(+), 98 deletions(-)
Signature · 7 lines
2.17.1 _______________________________________________ ath11k mailing list [email protected] http://lists.infradead.org/mailman/listinfo/ath11k
PATCH v3 1/9 cfg80211: Add helper function to identify 6GHz PSC channel
6GHz channels are divided into preferred scanning channels(PSC) and non-PSC channels. One in every four 20MHz channels is a PSC. Spec mandates to use only PSC channels as primary channels for setting up BSS on 6GHz only AP.
The set of 20 MHz channels in the 6 GHz band, with channel center frequency, ch_a = Channel starting frequency – 55 + 80 × n (MHz) are referred to as preferred scanning channels (PSCs) where, n = 1, …, 15 as per IEEE P802.11ax/D6.1.
This function can be used by drivers or cfg80211 when making scanning decision on 6GHz channels.
---
v3:
- update channel starting frequency from 5945 to 5950 as per IEEE P802.11ax/D6.1
- Define helper function and remove cahnnel flag PSC
include/net/cfg80211.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
include/net/cfg80211.h +24 -0
@@ -5281,6 +5281,30 @@ ieee80211_get_channel(struct wiphy *wiphy, int freq)return ieee80211_get_channel_khz (wiphy,MHZ_TO_KHZ (freq)); } +/** +* ieee80211_is_channel_psc - is 6ghz channel a Preferred Scanning Channel (PSC) +* +* @chan: struct ieee80211_channel to determine +* Return: True if 6ghz channel is a PSC channel. False for the rest. +*/ +static inline bool ieee80211_is_channel_psc (struct ieee80211_channel *chan) +{ +if (chan->band !=NL80211_BAND_6GHZ ) +return false; + +/* +* From IEEE P802.11ax/D6.1: The set of 20 MHz channels in the 6 GHz +* band, with channel center frequency, ch_a = Channel starting +* frequency – 55 80 × n (MHz) are referred to as preferred scanning +* channels (PSCs). Channel starting frequency is defined in 27.3.23.2 +* (Channel allocation in the 6 GHz band), and n = 1, …, 15. +*/ +if (!(((chan->center_freq -5950 +55 ) >>4 ) %5 )) +return true; + +return false; +} +/** * ieee80211_get_response_rate - get basic rate for a given rate *
Signature · 7 lines
2.17.1 _______________________________________________ ath11k mailing list [email protected] http://lists.infradead.org/mailman/listinfo/ath11k
Johannes Berg
maintainerRe: [PATCH v3 1/9] cfg80211: Add helper function to identify 6GHz PSC channel
On Tue, 2020-05-26 at 15:42 -0700, Pradeep Kumar Chitrapu wrote:
Hi,
Just checked what we had here, and it was the following:
Quoted 13 lines
include/net/cfg80211.h +13
-0+/** +* ieee80211_is_channel_psc - is 6ghz channel a Preferred Scanning Channel (PSC) +* +* @chan: struct ieee80211_channel to determine +* Return: True if 6ghz channel is a PSC channel. False for the rest. +*/ +static inline bool ieee80211_is_channel_psc (struct ieee80211_channel *chan) +{ +if (chan->band !=NL80211_BAND_6GHZ ) +return false; + +/* +* From IEEE P802.11ax/D6.1: The set of 20 MHz channels in the 6 GHz
include/net/cfg80211.h ieee80211_get_channel(struct wiphy *wiphy, int freq) · line 5306
Quoted 10 lines
include/net/cfg80211.h +10
-0+* band, with channel center frequency, ch_a = Channel starting +* frequency – 55 80 × n (MHz) are referred to as preferred scanning +* channels (PSCs). Channel starting frequency is defined in 27.3.23.2 +* (Channel allocation in the 6 GHz band), and n = 1, …, 15. +*/ +if (!(((chan->center_freq -5950 +55 ) >>4 ) %5 )) +return true; + +return false; +}
static inline bool cfg80211_is_psc(struct ieee80211_channel *chan)
{
int chan_num =
ieee80211_frequency_to_channel(chan->center_freq);
return chan->band == NL80211_BAND_6GHZ && chan_num % 16 == 5;
}Apart from the naming, where I guess I prefer actually
cfg80211_channel_is_psc()
or so, does that seem reasonable to you? I'd prefer not to hardcode frequencies everywhere, so in that regard I like our version better. Maybe bail out earlier if band != 6 ghz:
static inline bool cfg80211_channel_is_psc(struct ieee80211_channel *chan)
{
if (chan->band != NL80211_BAND_6GHZ)
return false;
return ieee80211_frequency_to_channel(chan->center_freq) % 16 == 5;
}johannes
_______________________________________________
ath11k mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/ath11k
Re: [PATCH v3 1/9] cfg80211: Add helper function to identify 6GHz PSC channel
Quoted 10 lines
static inline bool
cfg80211_channel_is_psc(struct ieee80211_channel *chan){ if (chan->band != NL80211_BAND_6GHZ) return false; return ieee80211_frequency_to_channel(chan->center_freq) % 16 == 5; }johannes
sure Johannes. Above looks neat.
Thanks
pradeep
PATCH v3 2/9 ath11k: add 6G frequency list supported by driver
In reply to Pradeep Kumar ChitrapuThis patch adds support for 6GHz frequency listing.
---
v3:
- update channel list as defined in IEEE P802.11ax/D6.1
drivers/net/wireless/ath/ath11k/mac.c | 71 +++++++++++++++++++++++++++ 1 file changed, 71 insertions(+)
drivers/net/wireless/ath/ath11k/mac.c +71 -0
@@ -33,6 +33,15 @@ .max_power = 30, \ } +#define CHAN6G (_channel, _freq, _flags) { \ + .band = NL80211_BAND_6GHZ, \ + .hw_value = (_channel), \ + .center_freq = (_freq), \ + .flags = (_flags), \ + .max_antenna_gain = 0, \ + .max_power = 30, \ +} +/* frame mode values are mapped as per enum ath11k_hw_txrx_mode */ static unsigned int ath11k_frame_mode =ATH11K_HW_TXRX_NATIVE_WIFI ;module_param_named (frame_mode, ath11k_frame_mode, uint,0644 );
@@ -86,6 +95,68 @@ static const struct ieee80211_channel ath11k_5ghz_channels[] = { CHAN5G(173, 5865, 0), }; +static const struct ieee80211_channel ath11k_6ghz_channels[] = { +CHAN6G (1 ,5955 ,0 ), +CHAN6G (5 ,5975 ,0 ), +CHAN6G (9 ,5995 ,0 ), +CHAN6G (13 ,6015 ,0 ), +CHAN6G (17 ,6035 ,0 ), +CHAN6G (21 ,6055 ,0 ), +CHAN6G (25 ,6075 ,0 ), +CHAN6G (29 ,6095 ,0 ), +CHAN6G (33 ,6115 ,0 ), +CHAN6G (37 ,6135 ,0 ), +CHAN6G (41 ,6155 ,0 ), +CHAN6G (45 ,6175 ,0 ), +CHAN6G (49 ,6195 ,0 ), +CHAN6G (53 ,6215 ,0 ), +CHAN6G (57 ,6235 ,0 ), +CHAN6G (61 ,6255 ,0 ), +CHAN6G (65 ,6275 ,0 ), +CHAN6G (69 ,6295 ,0 ), +CHAN6G (73 ,6315 ,0 ), +CHAN6G (77 ,6335 ,0 ), +CHAN6G (81 ,6355 ,0 ), +CHAN6G (85 ,6375 ,0 ), +CHAN6G (89 ,6395 ,0 ), +CHAN6G (93 ,6415 ,0 ), +CHAN6G (97 ,6435 ,0 ), +CHAN6G (101 ,6455 ,0 ), +CHAN6G (105 ,6475 ,0 ), +CHAN6G (109 ,6495 ,0 ), +CHAN6G (113 ,6515 ,0 ), +CHAN6G (117 ,6535 ,0 ), +CHAN6G (121 ,6555 ,0 ), +CHAN6G (125 ,6575 ,0 ), +CHAN6G (129 ,6595 ,0 ), +CHAN6G (133 ,6615 ,0 ), +CHAN6G (137 ,6635 ,0 ), +CHAN6G (141 ,6655 ,0 ), +CHAN6G (145 ,6675 ,0 ), +CHAN6G (149 ,6695 ,0 ), +CHAN6G (153 ,6715 ,0 ), +CHAN6G (157 ,6735 ,0 ), +CHAN6G (161 ,6755 ,0 ), +CHAN6G (165 ,6775 ,0 ), +CHAN6G (169 ,6795 ,0 ), +CHAN6G (173 ,6815 ,0 ), +CHAN6G (177 ,6835 ,0 ), +CHAN6G (181 ,6855 ,0 ), +CHAN6G (185 ,6875 ,0 ), +CHAN6G (189 ,6895 ,0 ), +CHAN6G (193 ,6915 ,0 ), +CHAN6G (197 ,6935 ,0 ), +CHAN6G (201 ,6955 ,0 ), +CHAN6G (205 ,6975 ,0 ), +CHAN6G (209 ,6995 ,0 ), +CHAN6G (213 ,7015 ,0 ), +CHAN6G (217 ,7035 ,0 ), +CHAN6G (221 ,7055 ,0 ), +CHAN6G (225 ,7075 ,0 ), +CHAN6G (229 ,7095 ,0 ), +CHAN6G (233 ,7115 ,0 ), +}; +static struct ieee80211_rate ath11k_legacy_rates[] = { { .bitrate =10 , .hw_value =ATH11K_HW_RATE_CCK_LP_1M },
Signature · 7 lines
2.17.1 _______________________________________________ ath11k mailing list [email protected] http://lists.infradead.org/mailman/listinfo/ath11k
PATCH v3 3/9 ath11k: add support for 6GHz radio in driver
In reply to Pradeep Kumar ChitrapuThis patch adds 6GHz band support and mac80211 registration for the 6G phy radio.
---
v3:
- update 6G min and max frequencies as defined in IEEE P802.11ax/D6.1
v2:
- fixed phymode to be set in 6ghz band
drivers/net/wireless/ath/ath11k/core.h | 6 +- drivers/net/wireless/ath/ath11k/mac.c | 103 +++++++++++++++++++++---- drivers/net/wireless/ath/ath11k/wmi.c | 16 +++- 3 files changed, 105 insertions(+), 20 deletions(-)
drivers/net/wireless/ath/ath11k/core.h +5 -1
@@ -353,7 +353,10 @@ struct ath11k_sta {#endif }; -#define ATH11K_NUM_CHANS 41 +#define ATH11K_MIN_5G_FREQ 4150 +#define ATH11K_MIN_6G_FREQ 5945 +#define ATH11K_MAX_6G_FREQ 7115 +#define ATH11K_NUM_CHANS 100#define ATH11K_MAX_5G_CHAN 173enum ath11k_state {
@@ -431,6 +434,7 @@ struct ath11k {u32 vht_cap_info;struct ath11k_he ar_he;enum ath11k_state state; +bool supports_6ghz;struct {struct completion started;struct completion completed;
drivers/net/wireless/ath/ath11k/mac.c +86 -17
165 lines not on this page · raw message
drivers/net/wireless/ath/ath11k/wmi.c +14 -2
@@ -368,6 +368,17 @@ ath11k_pull_mac_phy_cap_svc_ready_ext(struct ath11k_pdev_wmi *wmi_handle,memcpy (&cap_band->he_ppet, &mac_phy_caps->he_ppet5g,sizeof (struct ath11k_ppe_threshold )); + cap_band = &pdev_cap->band[NL80211_BAND_6GHZ ]; + cap_band->max_bw_supported = mac_phy_caps->max_bw_supported_5g; + cap_band->ht_cap_info = mac_phy_caps->ht_cap_info_5g; + cap_band->he_cap_info[0 ] = mac_phy_caps->he_cap_info_5g; + cap_band->he_cap_info[1 ] = mac_phy_caps->he_cap_info_5g_ext; + cap_band->he_mcs = mac_phy_caps->he_supp_mcs_5g; +memcpy (cap_band->he_cap_phy_info, &mac_phy_caps->he_cap_phy_info_5g, +sizeof (u32) *PSOC_HOST_MAX_PHY_SIZE ); +memcpy (&cap_band->he_ppet, &mac_phy_caps->he_ppet5g, +sizeof (struct ath11k_ppe_threshold )); +return 0 ; }
@@ -5206,9 +5217,10 @@ static void ath11k_mgmt_rx_event(struct ath11k_base *ab, struct sk_buff *skb) goto exit; } -if (rx_ev.phy_mode ==MODE_11B && status->band ==NL80211_BAND_5GHZ ) +if (rx_ev.phy_mode ==MODE_11B && + (status->band ==NL80211_BAND_5GHZ || status->band ==NL80211_BAND_6GHZ ))ath11k_dbg (ab,ATH11K_DBG_WMI , -"wmi mgmt rx 11b (CCK) on 5GHz\n" ); +"wmi mgmt rx 11b (CCK) on 5/6GHz, band = %d\n" , status->band); sband = &ar->mac.sbands[status->band];
Signature · 7 lines
2.17.1 _______________________________________________ ath11k mailing list [email protected] http://lists.infradead.org/mailman/listinfo/ath11k
PATCH v3 4/9 ath11k: Use freq instead of channel number in rx path
In reply to Pradeep Kumar ChitrapuAs 6GHz cahnnel numbers overlap with those of 5GHz and 2GHz bands, it is necessary to use frequency when determining the band info in rx path.
--- drivers/net/wireless/ath/ath11k/dp_rx.c | 6 +++++- drivers/net/wireless/ath/ath11k/wmi.c | 5 ++++- drivers/net/wireless/ath/ath11k/wmi.h | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-)
drivers/net/wireless/ath/ath11k/dp_rx.c +5 -1
@@ -2162,6 +2162,7 @@ static void ath11k_dp_rx_h_ppdu(struct ath11k *ar, struct hal_rx_desc *rx_desc, struct ieee80211_rx_status *rx_status) {u8 channel_num; +u32 center_freq; rx_status->freq =0 ; rx_status->rate_idx =0 ;
@@ -2172,8 +2173,11 @@ static void ath11k_dp_rx_h_ppdu(struct ath11k *ar, struct hal_rx_desc *rx_desc, rx_status->flag |=RX_FLAG_NO_SIGNAL_VAL ; channel_num =ath11k_dp_rx_h_msdu_start_freq (rx_desc); + center_freq =ath11k_dp_rx_h_msdu_start_freq (rx_desc) >>16 ; -if (channel_num >=1 && channel_num <=14 ) { +if (center_freq >=5945 && center_freq <=7115 ) + rx_status->band =NL80211_BAND_6GHZ ; +else if (channel_num >=1 && channel_num <=14 ) { rx_status->band =NL80211_BAND_2GHZ ; }else if (channel_num >=36 && channel_num <=173 ) { rx_status->band =NL80211_BAND_5GHZ ;
drivers/net/wireless/ath/ath11k/wmi.c +4 -1
@@ -3833,6 +3833,7 @@ static int ath11k_pull_mgmt_rx_params_tlv(struct ath11k_base *ab, } hdr->pdev_id = ev->pdev_id; + hdr->chan_freq = ev->chan_freq; hdr->channel = ev->channel; hdr->snr = ev->snr; hdr->rate = ev->rate;
@@ -5204,7 +5205,9 @@ static void ath11k_mgmt_rx_event(struct ath11k_base *ab, struct sk_buff *skb)if (rx_ev.status &WMI_RX_STATUS_ERR_MIC ) status->flag |=RX_FLAG_MMIC_ERROR ; -if (rx_ev.channel >=1 && rx_ev.channel <=14 ) { +if (rx_ev.chan_freq >=ATH11K_MIN_6G_FREQ ) { + status->band =NL80211_BAND_6GHZ ; + }else if (rx_ev.channel >=1 && rx_ev.channel <=14 ) { status->band =NL80211_BAND_2GHZ ; }else if (rx_ev.channel >=36 && rx_ev.channel <=ATH11K_MAX_5G_CHAN ) { status->band =NL80211_BAND_5GHZ ;
drivers/net/wireless/ath/ath11k/wmi.h +2 -0
@@ -4228,6 +4228,7 @@ struct wmi_pdev_temperature_event {#define WLAN_MGMT_TXRX_HOST_MAX_ANTENNA 4struct mgmt_rx_event_params { +u32 chan_freq;u32 channel;u32 snr;u8 rssi_ctl[WLAN_MGMT_TXRX_HOST_MAX_ANTENNA ];
@@ -4257,6 +4258,7 @@ struct wmi_mgmt_rx_hdr {u32 rx_tsf_l32;u32 rx_tsf_u32;u32 pdev_id; +u32 chan_freq; } __packed;#define MAX_ANTENNA_EIGHT 8
Signature · 7 lines
2.17.1 _______________________________________________ ath11k mailing list [email protected] http://lists.infradead.org/mailman/listinfo/ath11k
PATCH v3 5/9 ath11k: extend peer_assoc_cmd for 6GHz band
In reply to Pradeep Kumar ChitrapuThis adds support required for configuring min_data_rate of 6GHz oper IE and peer_he_caps_6ghz in peer assoc command. The Minimum Rate field indicates the minimum rate, in units of 1 Mb/s, that the non-AP STA is allowed to use for sending PPDUs as defined in IEEE P802.11ax™/D6.0.
--- drivers/net/wireless/ath/ath11k/wmi.c | 2 ++ drivers/net/wireless/ath/ath11k/wmi.h | 5 +++++ 2 files changed, 7 insertions(+)
drivers/net/wireless/ath/ath11k/wmi.c +2 -0
@@ -1789,6 +1789,7 @@ int ath11k_wmi_send_peer_assoc_cmd(struct ath11k *ar, cmd->peer_he_cap_info = param->peer_he_cap_macinfo[0 ]; cmd->peer_he_cap_info_ext = param->peer_he_cap_macinfo[1 ]; cmd->peer_he_cap_info_internal = param->peer_he_cap_macinfo_internal; + cmd->peer_he_caps_6ghz = param->peer_he_caps_6ghz; cmd->peer_he_ops = param->peer_he_ops;memcpy (&cmd->peer_he_cap_phy, ¶m->peer_he_cap_phyinfo,sizeof (param->peer_he_cap_phyinfo));
@@ -1842,6 +1843,7 @@ int ath11k_wmi_send_peer_assoc_cmd(struct ath11k *ar,/* HE Rates */ cmd->peer_he_mcs = param->peer_he_mcs_count; + cmd->min_data_rate = param->min_data_rate; ptr +=sizeof (*mcs);
drivers/net/wireless/ath/ath11k/wmi.h +5 -0
@@ -1011,6 +1011,7 @@ enum wmi_tlv_vdev_param {WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME ,WMI_VDEV_PARAM_BA_MODE =0x7e ,WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE =0x87 , +WMI_VDEV_PARAM_6GHZ_PARAMS =0x99 ,WMI_VDEV_PARAM_PROTOTYPE =0x8000 ,WMI_VDEV_PARAM_BSS_COLOR , WMI_VDEV_PARAM_SET_HEMU_MODE,
@@ -3444,6 +3445,7 @@ struct peer_assoc_params {u32 tx_max_rate;u32 tx_mcs_set;u8 vht_capable; +u8 min_data_rate;u32 tx_max_mcs_nss;u32 peer_bw_rxnss_override;bool is_pmf_enabled;
@@ -3472,6 +3474,7 @@ struct peer_assoc_params {bool he_flag;u32 peer_he_cap_macinfo[2 ];u32 peer_he_cap_macinfo_internal; +u32 peer_he_caps_6ghz;u32 peer_he_ops;u32 peer_he_cap_phyinfo[WMI_HOST_MAX_HECAP_PHY_SIZE ];u32 peer_he_mcs_count;
@@ -3509,6 +3512,8 @@ struct wmi_peer_assoc_complete_cmd {u32 peer_he_mcs;u32 peer_he_cap_info_ext;u32 peer_he_cap_info_internal; +u32 min_data_rate; +u32 peer_he_caps_6ghz; } __packed;struct wmi_stop_scan_cmd {
Signature · 7 lines
2.17.1 _______________________________________________ ath11k mailing list [email protected] http://lists.infradead.org/mailman/listinfo/ath11k
PATCH v3 6/9 ath11k: set psc channel flag when sending channel list to firmware.
In reply to Pradeep Kumar ChitrapuIf 6 ghz channel is a Preferred Scanning Channel(PSC), mark the channel flag accordingly when updating channel list to firmware. This will be used when making scanning decision in 6GHz channels.
---
v3:
- use helper function ieee80211_is_channel_psc() instead of channel flag for identifying 6GHz PSC channels.
drivers/net/wireless/ath/ath11k/reg.c | 4 ++++ drivers/net/wireless/ath/ath11k/wmi.h | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-)
drivers/net/wireless/ath/ath11k/reg.c +4 -0
@@ -161,6 +161,10 @@ int ath11k_reg_update_chan_list(struct ath11k *ar)else ch->phy_mode =MODE_11A ; +if (channel->band ==NL80211_BAND_6GHZ && +ieee80211_is_channel_psc (channel)) + ch->psc_channel = true; + ath11k_dbg(ar->ab, ATH11K_DBG_WMI, "mac channel [%d/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n", i, params->nallchans,
drivers/net/wireless/ath/ath11k/wmi.h +2 -1
@@ -2520,7 +2520,8 @@ struct channel_param { allow_ht:1, allow_vht:1, allow_he:1, - set_agile:1; + set_agile:1, + psc_channel:1;u32 phy_mode;u32 cfreq1;u32 cfreq2;
Signature · 7 lines
2.17.1 _______________________________________________ ath11k mailing list [email protected] http://lists.infradead.org/mailman/listinfo/ath11k
PATCH v3 7/9 ath11k: Add 6G scan dwell time parameter in scan request command
In reply to Pradeep Kumar ChitrapuAdd 6G scan active and passive dwell time parameter to scan request.
--- drivers/net/wireless/ath/ath11k/wmi.c | 4 ++++ drivers/net/wireless/ath/ath11k/wmi.h | 5 +++++ 2 files changed, 9 insertions(+)
drivers/net/wireless/ath/ath11k/wmi.c +4 -0
@@ -1899,6 +1899,8 @@ void ath11k_wmi_start_scan_init(struct ath11k *ar, arg->dwell_time_active =50 ; arg->dwell_time_active_2g =0 ; arg->dwell_time_passive =150 ; + arg->dwell_time_active_6g =40 ; + arg->dwell_time_passive_6g =30 ; arg->min_rest_time =50 ; arg->max_rest_time =500 ; arg->repeat_probe_time =0 ;
@@ -2045,6 +2047,8 @@ int ath11k_wmi_send_scan_start_cmd(struct ath11k *ar, cmd->dwell_time_active = params->dwell_time_active; cmd->dwell_time_active_2g = params->dwell_time_active_2g; cmd->dwell_time_passive = params->dwell_time_passive; + cmd->dwell_time_active_6g = params->dwell_time_active_6g; + cmd->dwell_time_passive_6g = params->dwell_time_passive_6g; cmd->min_rest_time = params->min_rest_time; cmd->max_rest_time = params->max_rest_time; cmd->repeat_probe_time = params->repeat_probe_time;
drivers/net/wireless/ath/ath11k/wmi.h +5 -0
@@ -3061,6 +3061,9 @@ struct wmi_start_scan_cmd {u32 num_vendor_oui;u32 scan_ctrl_flags_ext;u32 dwell_time_active_2g; +u32 dwell_time_active_6g; +u32 dwell_time_passive_6g; +u32 scan_start_offset; } __packed;#define WMI_SCAN_FLAG_PASSIVE 0x1
@@ -3127,6 +3130,8 @@ struct scan_req_params {u32 dwell_time_active;u32 dwell_time_active_2g;u32 dwell_time_passive; +u32 dwell_time_active_6g; +u32 dwell_time_passive_6g;u32 min_rest_time;u32 max_rest_time;u32 repeat_probe_time;
Signature · 7 lines
2.17.1 _______________________________________________ ath11k mailing list [email protected] http://lists.infradead.org/mailman/listinfo/ath11k
PATCH v3 8/9 ath11k: Send multiple scan_chan_list messages if required
In reply to Pradeep Kumar ChitrapuWith addition of 6Ghz channels, it is possible that wmi buffer size can exceed the maximum wmi buffer size. So iterate over the channel list, and send multiple messages till channel list is empty.
Also mark PSC channel flag for 6GHz channels accordingly.
--- drivers/net/wireless/ath/ath11k/wmi.c | 170 ++++++++++++++------------ drivers/net/wireless/ath/ath11k/wmi.h | 3 + 2 files changed, 98 insertions(+), 75 deletions(-)
drivers/net/wireless/ath/ath11k/wmi.c +95 -75
@@ -2194,91 +2194,111 @@ int ath11k_wmi_send_scan_chan_list_cmd(struct ath11k *ar,struct channel_param *tchan_info;struct wmi_tlv *tlv;void *ptr; -int i, ret, len; +int i, ret =0 , len; +u16 num_send_chans, num_sends =0 , max_chan_limit =0 ;u32 *reg1, *reg2; - len =sizeof (*cmd) +TLV_HDR_SIZE + -sizeof (*chan_info) * chan_list->nallchans; - - skb =ath11k_wmi_alloc_skb (wmi->wmi_ab, len); -if (!skb) -return -ENOMEM ; - - cmd = (struct wmi_scan_chan_list_cmd *)skb->data; - cmd->tlv_header =FIELD_PREP (WMI_TLV_TAG ,WMI_TAG_SCAN_CHAN_LIST_CMD ) | -FIELD_PREP (WMI_TLV_LEN ,sizeof (*cmd) -TLV_HDR_SIZE ); - -ath11k_dbg (ar->ab,ATH11K_DBG_WMI , -"WMI no.of chan = %d len = %d\n" , chan_list->nallchans, len); - cmd->pdev_id = chan_list->pdev_id; - cmd->num_scan_chans = chan_list->nallchans; - - ptr = skb->data +sizeof (*cmd); - - len =sizeof (*chan_info) * chan_list->nallchans; - tlv = ptr; - tlv->header =FIELD_PREP (WMI_TLV_TAG ,WMI_TAG_ARRAY_STRUCT ) | -FIELD_PREP (WMI_TLV_LEN , len -TLV_HDR_SIZE ); - ptr +=TLV_HDR_SIZE ; - tchan_info = &chan_list->ch_param[0 ]; +while (chan_list->nallchans) { + len =sizeof (*cmd) +TLV_HDR_SIZE ; + max_chan_limit = + (wmi->wmi_ab->max_msg_len[ar->pdev_idx] - len) / +sizeof (*chan_info); + +if (chan_list->nallchans > max_chan_limit) + num_send_chans = max_chan_limit; +else + num_send_chans = chan_list->nallchans; + + chan_list->nallchans -= num_send_chans; + len +=sizeof (*chan_info) * num_send_chans; + + skb =ath11k_wmi_alloc_skb (wmi->wmi_ab, len); +if (!skb) +return -ENOMEM ; -for (i =0 ; i < chan_list->nallchans; ++i) { - chan_info = ptr; -memset (chan_info,0 ,sizeof (*chan_info)); - len =sizeof (*chan_info); - chan_info->tlv_header =FIELD_PREP (WMI_TLV_TAG , -WMI_TAG_CHANNEL ) | -FIELD_PREP (WMI_TLV_LEN , - len -TLV_HDR_SIZE ); - - reg1 = &chan_info->reg_info_1; - reg2 = &chan_info->reg_info_2; - chan_info->mhz = tchan_info->mhz; - chan_info->band_center_freq1 = tchan_info->cfreq1; - chan_info->band_center_freq2 = tchan_info->cfreq2; - -if (tchan_info->is_chan_passive) - chan_info->info |=WMI_CHAN_INFO_PASSIVE ; -if (tchan_info->allow_he) - chan_info->info |=WMI_CHAN_INFO_ALLOW_HE ; -else if (tchan_info->allow_vht) - chan_info->info |=WMI_CHAN_INFO_ALLOW_VHT ; -else if (tchan_info->allow_ht) - chan_info->info |=WMI_CHAN_INFO_ALLOW_HT ; -if (tchan_info->half_rate) - chan_info->info |=WMI_CHAN_INFO_HALF_RATE ; -if (tchan_info->quarter_rate) - chan_info->info |=WMI_CHAN_INFO_QUARTER_RATE ; - - chan_info->info |=FIELD_PREP (WMI_CHAN_INFO_MODE , - tchan_info->phy_mode); - *reg1 |=FIELD_PREP (WMI_CHAN_REG_INFO1_MIN_PWR , - tchan_info->minpower); - *reg1 |=FIELD_PREP (WMI_CHAN_REG_INFO1_MAX_PWR , - tchan_info->maxpower); - *reg1 |=FIELD_PREP (WMI_CHAN_REG_INFO1_MAX_REG_PWR , - tchan_info->maxregpower); - *reg1 |=FIELD_PREP (WMI_CHAN_REG_INFO1_REG_CLS , - tchan_info->reg_class_id); - *reg2 |=FIELD_PREP (WMI_CHAN_REG_INFO2_ANT_MAX , - tchan_info->antennamax); + cmd = (struct wmi_scan_chan_list_cmd *)skb->data; + cmd->tlv_header =FIELD_PREP (WMI_TLV_TAG ,WMI_TAG_SCAN_CHAN_LIST_CMD ) | +FIELD_PREP (WMI_TLV_LEN ,sizeof (*cmd) -TLV_HDR_SIZE ); + cmd->pdev_id = chan_list->pdev_id; + cmd->num_scan_chans = num_send_chans; +if (num_sends) + cmd->flags |=WMI_APPEND_TO_EXISTING_CHAN_LIST_FLAG ;ath11k_dbg (ar->ab,ATH11K_DBG_WMI , -"WMI chan scan list chan[%d] = %u\n" , - i, chan_info->mhz); +"WMI no.of chan = %d len = %d pdev_id = %d num_sends = %d\n" , + num_send_chans, len, cmd->pdev_id, num_sends); - ptr +=sizeof (*chan_info); + ptr = skb->data +sizeof (*cmd); - tchan_info++; - } + len =sizeof (*chan_info) * num_send_chans; + tlv = ptr; + tlv->header =FIELD_PREP (WMI_TLV_TAG ,WMI_TAG_ARRAY_STRUCT ) | +FIELD_PREP (WMI_TLV_LEN , len -TLV_HDR_SIZE ); + ptr +=TLV_HDR_SIZE ; - ret =ath11k_wmi_cmd_send (wmi, skb,WMI_SCAN_CHAN_LIST_CMDID ); -if (ret) { -ath11k_warn (ar->ab,"failed to send WMI_SCAN_CHAN_LIST cmd\n" ); -dev_kfree_skb (skb); - } +for (i =0 ; i < num_send_chans; ++i) { + chan_info = ptr; +memset (chan_info,0 ,sizeof (*chan_info)); + len =sizeof (*chan_info); + chan_info->tlv_header =FIELD_PREP (WMI_TLV_TAG , +WMI_TAG_CHANNEL ) | +FIELD_PREP (WMI_TLV_LEN , + len -TLV_HDR_SIZE ); + + reg1 = &chan_info->reg_info_1; + reg2 = &chan_info->reg_info_2; + chan_info->mhz = tchan_info->mhz; + chan_info->band_center_freq1 = tchan_info->cfreq1; + chan_info->band_center_freq2 = tchan_info->cfreq2; + +if (tchan_info->is_chan_passive) + chan_info->info |=WMI_CHAN_INFO_PASSIVE ; +if (tchan_info->allow_he) + chan_info->info |=WMI_CHAN_INFO_ALLOW_HE ; +else if (tchan_info->allow_vht) + chan_info->info |=WMI_CHAN_INFO_ALLOW_VHT ; +else if (tchan_info->allow_ht) + chan_info->info |=WMI_CHAN_INFO_ALLOW_HT ; +if (tchan_info->half_rate) + chan_info->info |=WMI_CHAN_INFO_HALF_RATE ; +if (tchan_info->quarter_rate) + chan_info->info |=WMI_CHAN_INFO_QUARTER_RATE ; +if (tchan_info->psc_channel) + chan_info->info |=WMI_CHAN_INFO_PSC ; + + chan_info->info |=FIELD_PREP (WMI_CHAN_INFO_MODE , + tchan_info->phy_mode); + *reg1 |=FIELD_PREP (WMI_CHAN_REG_INFO1_MIN_PWR , + tchan_info->minpower); + *reg1 |=FIELD_PREP (WMI_CHAN_REG_INFO1_MAX_PWR , + tchan_info->maxpower); + *reg1 |=FIELD_PREP (WMI_CHAN_REG_INFO1_MAX_REG_PWR , + tchan_info->maxregpower); + *reg1 |=FIELD_PREP (WMI_CHAN_REG_INFO1_REG_CLS , + tchan_info->reg_class_id); + *reg2 |=FIELD_PREP (WMI_CHAN_REG_INFO2_ANT_MAX , + tchan_info->antennamax); + +ath11k_dbg (ar->ab,ATH11K_DBG_WMI , +"WMI chan scan list chan[%d] = %u, chan_info->info %8x\n" , + i, chan_info->mhz, chan_info->info); + + ptr +=sizeof (*chan_info); + + tchan_info++; + } + ret =ath11k_wmi_cmd_send (wmi, skb,WMI_SCAN_CHAN_LIST_CMDID ); +if (ret) { +ath11k_warn (ar->ab,"failed to send WMI_SCAN_CHAN_LIST cmd\n" ); +dev_kfree_skb (skb); + goto end; + } + + num_sends++; + } +end:return ret; }
drivers/net/wireless/ath/ath11k/wmi.h +3 -0
@@ -54,6 +54,8 @@ struct wmi_tlv {#define WLAN_SCAN_PARAMS_MAX_BSSID 4#define WLAN_SCAN_PARAMS_MAX_IE_LEN 256 +#define WMI_APPEND_TO_EXISTING_CHAN_LIST_FLAG 1 +#define WMI_BA_MODE_BUFFER_SIZE_256 3/* * HW mode config type replicated from FW header
@@ -3271,6 +3273,7 @@ struct wmi_bcn_send_from_host_cmd {#define WMI_CHAN_INFO_QUARTER_RATE BIT(15)#define WMI_CHAN_INFO_DFS_FREQ2 BIT(16)#define WMI_CHAN_INFO_ALLOW_HE BIT(17) +#define WMI_CHAN_INFO_PSC BIT(18)#define WMI_CHAN_REG_INFO1_MIN_PWR GENMASK(7, 0)#define WMI_CHAN_REG_INFO1_MAX_PWR GENMASK(15, 8)
Signature · 7 lines
2.17.1 _______________________________________________ ath11k mailing list [email protected] http://lists.infradead.org/mailman/listinfo/ath11k
PATCH v3 9/9 ath11k: Add support for 6g scan hint
In reply to Pradeep Kumar ChitrapuAdd support for 6Ghz short ssid and bssid hint mechanism as part of scan command.
--- drivers/net/wireless/ath/ath11k/wmi.c | 72 +++++++++++++++++++++++++++ drivers/net/wireless/ath/ath11k/wmi.h | 22 ++++++++ 2 files changed, 94 insertions(+)
drivers/net/wireless/ath/ath11k/wmi.c +72 -0
@@ -2005,6 +2005,8 @@ int ath11k_wmi_send_scan_start_cmd(struct ath11k *ar,int i, ret, len;u32 *tmp_ptr;u8 extraie_len_with_pad =0 ; +struct hint_short_ssid *s_ssid =NULL ; +struct hint_bssid *hint_bssid =NULL ; len =sizeof (*cmd);
@@ -2026,6 +2028,14 @@ int ath11k_wmi_send_scan_start_cmd(struct ath11k *ar,roundup (params->extraie.len,sizeof (u32)); len += extraie_len_with_pad; +if (params->num_hint_bssid) + len +=TLV_HDR_SIZE + + params->num_hint_bssid *sizeof (struct hint_bssid ); + +if (params->num_hint_s_ssid) + len +=TLV_HDR_SIZE + + params->num_hint_s_ssid *sizeof (struct hint_short_ssid ); + skb =ath11k_wmi_alloc_skb (wmi->wmi_ab, len);if (!skb)return -ENOMEM ;
@@ -2126,6 +2136,68 @@ int ath11k_wmi_send_scan_start_cmd(struct ath11k *ar, ptr += extraie_len_with_pad; +if (params->num_hint_s_ssid) { + len = params->num_hint_s_ssid *sizeof (struct hint_short_ssid ); + tlv = ptr; + tlv->header =FIELD_PREP (WMI_TLV_TAG ,WMI_TAG_ARRAY_FIXED_STRUCT ) | +FIELD_PREP (WMI_TLV_LEN , len); + ptr +=TLV_HDR_SIZE ; + s_ssid = ptr; +for (i =0 ; i < params->num_hint_s_ssid; ++i) { + s_ssid->freq_flags = params->hint_s_ssid[i].freq_flags; + s_ssid->short_ssid = params->hint_s_ssid[i].short_ssid; + s_ssid++; + } + ptr += len; + } + +if (params->num_hint_bssid) { + len = params->num_hint_bssid *sizeof (struct hint_bssid ); + tlv = ptr; + tlv->header =FIELD_PREP (WMI_TLV_TAG ,WMI_TAG_ARRAY_FIXED_STRUCT ) | +FIELD_PREP (WMI_TLV_LEN , len); + ptr +=TLV_HDR_SIZE ; + hint_bssid = ptr; +for (i =0 ; i < params->num_hint_bssid; ++i) { + hint_bssid->freq_flags = + params->hint_bssid[i].freq_flags; +ether_addr_copy (¶ms->hint_bssid[i].bssid.addr[0 ], + &hint_bssid->bssid.addr[0 ]); + hint_bssid++; + } + } + + len = params->num_hint_s_ssid *sizeof (struct hint_short_ssid ); + tlv = ptr; + tlv->header =FIELD_PREP (WMI_TLV_TAG ,WMI_TAG_ARRAY_FIXED_STRUCT ) | +FIELD_PREP (WMI_TLV_LEN , len); + ptr +=TLV_HDR_SIZE ; +if (params->num_hint_s_ssid) { + s_ssid = ptr; +for (i =0 ; i < params->num_hint_s_ssid; ++i) { + s_ssid->freq_flags = params->hint_s_ssid[i].freq_flags; + s_ssid->short_ssid = params->hint_s_ssid[i].short_ssid; + s_ssid++; + } + } + ptr += len; + + len = params->num_hint_bssid *sizeof (struct hint_bssid ); + tlv = ptr; + tlv->header =FIELD_PREP (WMI_TLV_TAG ,WMI_TAG_ARRAY_FIXED_STRUCT ) | +FIELD_PREP (WMI_TLV_LEN , len); + ptr +=TLV_HDR_SIZE ; +if (params->num_hint_bssid) { + hint_bssid = ptr; +for (i =0 ; i < params->num_hint_bssid; ++i) { + hint_bssid->freq_flags = + params->hint_bssid[i].freq_flags; +ether_addr_copy (¶ms->hint_bssid[i].bssid.addr[0 ], + &hint_bssid->bssid.addr[0 ]); + hint_bssid++; + } + } + ret =ath11k_wmi_cmd_send (wmi, skb,WMI_START_SCAN_CMDID );if (ret) {
drivers/net/wireless/ath/ath11k/wmi.h +22 -0
@@ -50,6 +50,14 @@ struct wmi_tlv {#define WMI_MAX_MEM_REQS 32#define ATH11K_MAX_HW_LISTEN_INTERVAL 5 +#define WLAN_SCAN_MAX_HINT_S_SSID 10 +#define WLAN_SCAN_MAX_HINT_BSSID 10 +#define MAX_RNR_BSS 5 + +#define WLAN_SCAN_MAX_HINT_S_SSID 10 +#define WLAN_SCAN_MAX_HINT_BSSID 10 +#define MAX_RNR_BSS 5 +#define WLAN_SCAN_PARAMS_MAX_SSID 16#define WLAN_SCAN_PARAMS_MAX_BSSID 4#define WLAN_SCAN_PARAMS_MAX_IE_LEN 256
@@ -3105,6 +3113,16 @@ enum { ((flag) |= (((mode) <<WMI_SCAN_DWELL_MODE_SHIFT ) & \ WMI_SCAN_DWELL_MODE_MASK)) +struct hint_short_ssid { +u32 freq_flags; +u32 short_ssid; +}; + +struct hint_bssid { +u32 freq_flags; +struct wmi_mac_addr bssid; +}; +struct scan_req_params {u32 scan_id;u32 scan_req_id;
@@ -3184,6 +3202,10 @@ struct scan_req_params {struct element_info extraie;struct element_info htcap;struct element_info vhtcap; +u32 num_hint_s_ssid; +u32 num_hint_bssid; +struct hint_short_ssid hint_s_ssid[WLAN_SCAN_MAX_HINT_S_SSID ]; +struct hint_bssid hint_bssid[WLAN_SCAN_MAX_HINT_BSSID ]; };struct wmi_ssid_arg {
Signature · 7 lines
2.17.1 _______________________________________________ ath11k mailing list [email protected] http://lists.infradead.org/mailman/listinfo/ath11k