diff mbox series

[v2] wifi: ath10k: add support to allow broadcast action frame RX

Message ID 20231116173246.40458-1-prestwoj@gmail.com (mailing list archive)
State Accepted
Commit 63b896629353157e8ca77cabdfab340b5c69ca59
Delegated to: Kalle Valo
Headers show
Series [v2] wifi: ath10k: add support to allow broadcast action frame RX | expand

Commit Message

James Prestwood Nov. 16, 2023, 5:32 p.m. UTC
Broadcast action frames are needed for the Device Provisioning
Protocol (DPP) for Presence and PKEX Exchange requests. Currently
just ath9k has this capability so this is being enabled for
ath10k (for at least one hardware variant).

Add a new capability flag in ath10k_hw_params to indicate support
for receiving multicast action frames. This bit is then checked
when configuring the RX filter and (if set) multicast action frame
registration is enabled.

Until more hardware can be tested only the "qca6174 hw3.2" variant
is enabling this feature.

Note: I went ahead and removed the 'changed_flags' mask operation
since it had no effect, that parameter was not being used anywhere.

Tested-on: QCA6174 hw3.2 WLAN.RM.4.4.1-00288-

Signed-off-by: James Prestwood <prestwoj@gmail.com>
---
 drivers/net/wireless/ath/ath10k/core.c |  1 +
 drivers/net/wireless/ath/ath10k/hw.h   |  3 +++
 drivers/net/wireless/ath/ath10k/mac.c  | 14 +++++++++++---
 3 files changed, 15 insertions(+), 3 deletions(-)

v2:
 * Add flag in ath10k_hw_params and only set FIF_MCAST_ACTION
   if that hardware allows it.

Comments

Jeff Johnson Nov. 16, 2023, 8:04 p.m. UTC | #1
On 11/16/2023 9:32 AM, James Prestwood wrote:
> Broadcast action frames are needed for the Device Provisioning
> Protocol (DPP) for Presence and PKEX Exchange requests. Currently
> just ath9k has this capability so this is being enabled for
> ath10k (for at least one hardware variant).
> 
> Add a new capability flag in ath10k_hw_params to indicate support
> for receiving multicast action frames. This bit is then checked
> when configuring the RX filter and (if set) multicast action frame
> registration is enabled.
> 
> Until more hardware can be tested only the "qca6174 hw3.2" variant
> is enabling this feature.
> 
> Note: I went ahead and removed the 'changed_flags' mask operation
> since it had no effect, that parameter was not being used anywhere.
> 
> Tested-on: QCA6174 hw3.2 WLAN.RM.4.4.1-00288-
> 
> Signed-off-by: James Prestwood <prestwoj@gmail.com>
> ---
>  drivers/net/wireless/ath/ath10k/core.c |  1 +
>  drivers/net/wireless/ath/ath10k/hw.h   |  3 +++
>  drivers/net/wireless/ath/ath10k/mac.c  | 14 +++++++++++---
>  3 files changed, 15 insertions(+), 3 deletions(-)
> 
> v2:
>  * Add flag in ath10k_hw_params and only set FIF_MCAST_ACTION
>    if that hardware allows it.
> 
> diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
> index 5eb131ab916f..f2077756ffdf 100644
> --- a/drivers/net/wireless/ath/ath10k/core.c
> +++ b/drivers/net/wireless/ath/ath10k/core.c
> @@ -381,6 +381,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
>  		.hw_restart_disconnect = false,
>  		.use_fw_tx_credits = true,
>  		.delay_unmap_buffer = false,
> +		.mcast_frame_registration = true,
>  	},
>  	{
>  		.id = QCA99X0_HW_2_0_DEV_VERSION,
> diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h
> index 9643031a4427..2aeb52c7f189 100644
> --- a/drivers/net/wireless/ath/ath10k/hw.h
> +++ b/drivers/net/wireless/ath/ath10k/hw.h
> @@ -639,6 +639,9 @@ struct ath10k_hw_params {
>  	bool use_fw_tx_credits;
>  
>  	bool delay_unmap_buffer;
> +
> +	/* The hardware support multicast frame registrations */
> +	bool mcast_frame_registration;
>  };
>  
>  struct htt_resp;
> diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
> index ec8d5b29bc72..0d0de3646d31 100644
> --- a/drivers/net/wireless/ath/ath10k/mac.c
> +++ b/drivers/net/wireless/ath/ath10k/mac.c
> @@ -1249,7 +1249,7 @@ static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
>  	return ar->monitor ||
>  	       (!test_bit(ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST,
>  			  ar->running_fw->fw_file.fw_features) &&
> -		(ar->filter_flags & FIF_OTHER_BSS)) ||
> +		(ar->filter_flags & (FIF_OTHER_BSS | FIF_MCAST_ACTION))) ||
>  	       test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
>  }
>  
> @@ -6027,11 +6027,15 @@ static void ath10k_configure_filter(struct ieee80211_hw *hw,
>  {
>  	struct ath10k *ar = hw->priv;
>  	int ret;
> +	unsigned int supported = SUPPORTED_FILTERS;
>  
>  	mutex_lock(&ar->conf_mutex);
>  
> -	changed_flags &= SUPPORTED_FILTERS;
> -	*total_flags &= SUPPORTED_FILTERS;
> +	if (ar->hw_params.mcast_frame_registration)
> +		supported |= FIF_MCAST_ACTION;
> +
> +	*total_flags &= supported;
> +
>  	ar->filter_flags = *total_flags;
>  
>  	ret = ath10k_monitor_recalc(ar);
> @@ -10114,6 +10118,10 @@ int ath10k_mac_register(struct ath10k *ar)
>  			      NL80211_EXT_FEATURE_SET_SCAN_DWELL);
>  	wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_AQL);
>  
> +	if (ar->hw_params.mcast_frame_registration)
> +		wiphy_ext_feature_set(ar->hw->wiphy,
> +				      NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS);
> +
>  	if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map) ||
>  	    test_bit(WMI_SERVICE_HTT_MGMT_TX_COMP_VALID_FLAGS, ar->wmi.svc_map))
>  		wiphy_ext_feature_set(ar->hw->wiphy,

+ath10k mailing list for visibility

(note I scan ath10/11/12k mailing lists constantly but due to the volume
only scan linux-wireless every few days)
Jeff Johnson Nov. 16, 2023, 8:05 p.m. UTC | #2
On 11/16/2023 9:32 AM, James Prestwood wrote:
> Broadcast action frames are needed for the Device Provisioning
> Protocol (DPP) for Presence and PKEX Exchange requests. Currently
> just ath9k has this capability so this is being enabled for
> ath10k (for at least one hardware variant).
> 
> Add a new capability flag in ath10k_hw_params to indicate support
> for receiving multicast action frames. This bit is then checked
> when configuring the RX filter and (if set) multicast action frame
> registration is enabled.
> 
> Until more hardware can be tested only the "qca6174 hw3.2" variant
> is enabling this feature.
> 
> Note: I went ahead and removed the 'changed_flags' mask operation
> since it had no effect, that parameter was not being used anywhere.
> 
> Tested-on: QCA6174 hw3.2 WLAN.RM.4.4.1-00288-
> 
> Signed-off-by: James Prestwood <prestwoj@gmail.com>
> ---
>  drivers/net/wireless/ath/ath10k/core.c |  1 +
>  drivers/net/wireless/ath/ath10k/hw.h   |  3 +++
>  drivers/net/wireless/ath/ath10k/mac.c  | 14 +++++++++++---
>  3 files changed, 15 insertions(+), 3 deletions(-)
> 
> v2:
>  * Add flag in ath10k_hw_params and only set FIF_MCAST_ACTION
>    if that hardware allows it.
> 
> diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
> index 5eb131ab916f..f2077756ffdf 100644
> --- a/drivers/net/wireless/ath/ath10k/core.c
> +++ b/drivers/net/wireless/ath/ath10k/core.c
> @@ -381,6 +381,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
>  		.hw_restart_disconnect = false,
>  		.use_fw_tx_credits = true,
>  		.delay_unmap_buffer = false,
> +		.mcast_frame_registration = true,
>  	},
>  	{
>  		.id = QCA99X0_HW_2_0_DEV_VERSION,
> diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h
> index 9643031a4427..2aeb52c7f189 100644
> --- a/drivers/net/wireless/ath/ath10k/hw.h
> +++ b/drivers/net/wireless/ath/ath10k/hw.h
> @@ -639,6 +639,9 @@ struct ath10k_hw_params {
>  	bool use_fw_tx_credits;
>  
>  	bool delay_unmap_buffer;
> +
> +	/* The hardware support multicast frame registrations */
> +	bool mcast_frame_registration;
>  };
>  
>  struct htt_resp;
> diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
> index ec8d5b29bc72..0d0de3646d31 100644
> --- a/drivers/net/wireless/ath/ath10k/mac.c
> +++ b/drivers/net/wireless/ath/ath10k/mac.c
> @@ -1249,7 +1249,7 @@ static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
>  	return ar->monitor ||
>  	       (!test_bit(ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST,
>  			  ar->running_fw->fw_file.fw_features) &&
> -		(ar->filter_flags & FIF_OTHER_BSS)) ||
> +		(ar->filter_flags & (FIF_OTHER_BSS | FIF_MCAST_ACTION))) ||
>  	       test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
>  }
>  
> @@ -6027,11 +6027,15 @@ static void ath10k_configure_filter(struct ieee80211_hw *hw,
>  {
>  	struct ath10k *ar = hw->priv;
>  	int ret;
> +	unsigned int supported = SUPPORTED_FILTERS;
>  
>  	mutex_lock(&ar->conf_mutex);
>  
> -	changed_flags &= SUPPORTED_FILTERS;
> -	*total_flags &= SUPPORTED_FILTERS;
> +	if (ar->hw_params.mcast_frame_registration)
> +		supported |= FIF_MCAST_ACTION;
> +
> +	*total_flags &= supported;
> +
>  	ar->filter_flags = *total_flags;
>  
>  	ret = ath10k_monitor_recalc(ar);
> @@ -10114,6 +10118,10 @@ int ath10k_mac_register(struct ath10k *ar)
>  			      NL80211_EXT_FEATURE_SET_SCAN_DWELL);
>  	wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_AQL);
>  
> +	if (ar->hw_params.mcast_frame_registration)
> +		wiphy_ext_feature_set(ar->hw->wiphy,
> +				      NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS);
> +
>  	if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map) ||
>  	    test_bit(WMI_SERVICE_HTT_MGMT_TX_COMP_VALID_FLAGS, ar->wmi.svc_map))
>  		wiphy_ext_feature_set(ar->hw->wiphy,

Actually add the ath10k list this time.  Sigh.
Kalle Valo Nov. 29, 2023, 11:59 a.m. UTC | #3
James Prestwood <prestwoj@gmail.com> wrote:

> Broadcast action frames are needed for the Device Provisioning
> Protocol (DPP) for Presence and PKEX Exchange requests. Currently
> just ath9k has this capability so this is being enabled for
> ath10k (for at least one hardware variant).
> 
> Add a new capability flag in ath10k_hw_params to indicate support
> for receiving multicast action frames. This bit is then checked
> when configuring the RX filter and (if set) multicast action frame
> registration is enabled.
> 
> Until more hardware can be tested only the "qca6174 hw3.2" variant
> is enabling this feature.
> 
> Note: I went ahead and removed the 'changed_flags' mask operation
> since it had no effect, that parameter was not being used anywhere.
> 
> Tested-on: QCA6174 hw3.2 WLAN.RM.4.4.1-00288-
> 
> Signed-off-by: James Prestwood <prestwoj@gmail.com>
> Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>

This had a simple conflict in ath10k_configure_filter() and I fixed it in the
pending branch, please check:

https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?h=pending&id=cc9f5dfd74f93ae6f596bccc3a5b92fe3f18c439

In the future please use ath.git master branch as the baseline for ath driver patches.
James Prestwood Nov. 29, 2023, 12:22 p.m. UTC | #4
Hi Kalle,

On 11/29/23 03:59, Kalle Valo wrote:
> James Prestwood <prestwoj@gmail.com> wrote:
>
>> Broadcast action frames are needed for the Device Provisioning
>> Protocol (DPP) for Presence and PKEX Exchange requests. Currently
>> just ath9k has this capability so this is being enabled for
>> ath10k (for at least one hardware variant).
>>
>> Add a new capability flag in ath10k_hw_params to indicate support
>> for receiving multicast action frames. This bit is then checked
>> when configuring the RX filter and (if set) multicast action frame
>> registration is enabled.
>>
>> Until more hardware can be tested only the "qca6174 hw3.2" variant
>> is enabling this feature.
>>
>> Note: I went ahead and removed the 'changed_flags' mask operation
>> since it had no effect, that parameter was not being used anywhere.
>>
>> Tested-on: QCA6174 hw3.2 WLAN.RM.4.4.1-00288-
>>
>> Signed-off-by: James Prestwood <prestwoj@gmail.com>
>> Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
> This had a simple conflict in ath10k_configure_filter() and I fixed it in the
> pending branch, please check:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?h=pending&id=cc9f5dfd74f93ae6f596bccc3a5b92fe3f18c439
>
> In the future please use ath.git master branch as the baseline for ath driver patches.

Thank you for resolving that, and I'll use ath.git in the future.

Thanks,

James
Kalle Valo Dec. 5, 2023, 3:27 p.m. UTC | #5
Jeff Johnson <quic_jjohnson@quicinc.com> writes:

> On 11/16/2023 9:32 AM, James Prestwood wrote:
>
>> Broadcast action frames are needed for the Device Provisioning
>> Protocol (DPP) for Presence and PKEX Exchange requests. Currently
>> just ath9k has this capability so this is being enabled for
>> ath10k (for at least one hardware variant).
>> 
>> Add a new capability flag in ath10k_hw_params to indicate support
>> for receiving multicast action frames. This bit is then checked
>> when configuring the RX filter and (if set) multicast action frame
>> registration is enabled.
>> 
>> Until more hardware can be tested only the "qca6174 hw3.2" variant
>> is enabling this feature.
>> 
>> Note: I went ahead and removed the 'changed_flags' mask operation
>> since it had no effect, that parameter was not being used anywhere.
>> 
>> Tested-on: QCA6174 hw3.2 WLAN.RM.4.4.1-00288-
>> 
>> Signed-off-by: James Prestwood <prestwoj@gmail.com>

[...]

>> --- a/drivers/net/wireless/ath/ath10k/core.c
>> +++ b/drivers/net/wireless/ath/ath10k/core.c
>> @@ -381,6 +381,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
>>  		.hw_restart_disconnect = false,
>>  		.use_fw_tx_credits = true,
>>  		.delay_unmap_buffer = false,
>> +		.mcast_frame_registration = true,

I forgot to mention that I prefer explicitly setting the false cases as
well so I added those in the pending branch:

https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git/commit/?h=pending&id=51daeadfbecc13b2ce8a9a4b7697e4056cbb358f
Kalle Valo Dec. 7, 2023, 10:15 a.m. UTC | #6
James Prestwood <prestwoj@gmail.com> wrote:

> Broadcast action frames are needed for the Device Provisioning
> Protocol (DPP) for Presence and PKEX Exchange requests. Currently
> just ath9k has this capability so this is being enabled for
> ath10k (for at least one hardware variant).
> 
> Add a new capability flag in ath10k_hw_params to indicate support
> for receiving multicast action frames. This bit is then checked
> when configuring the RX filter and (if set) multicast action frame
> registration is enabled.
> 
> Until more hardware can be tested only the "qca6174 hw3.2" variant
> is enabling this feature.
> 
> Note: I went ahead and removed the 'changed_flags' mask operation
> since it had no effect, that parameter was not being used anywhere.
> 
> Tested-on: QCA6174 hw3.2 WLAN.RM.4.4.1-00288-
> 
> Signed-off-by: James Prestwood <prestwoj@gmail.com>
> Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>

Patch applied to ath-next branch of ath.git, thanks.

63b896629353 wifi: ath10k: add support to allow broadcast action frame RX
diff mbox series

Patch

diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
index 5eb131ab916f..f2077756ffdf 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -381,6 +381,7 @@  static const struct ath10k_hw_params ath10k_hw_params_list[] = {
 		.hw_restart_disconnect = false,
 		.use_fw_tx_credits = true,
 		.delay_unmap_buffer = false,
+		.mcast_frame_registration = true,
 	},
 	{
 		.id = QCA99X0_HW_2_0_DEV_VERSION,
diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h
index 9643031a4427..2aeb52c7f189 100644
--- a/drivers/net/wireless/ath/ath10k/hw.h
+++ b/drivers/net/wireless/ath/ath10k/hw.h
@@ -639,6 +639,9 @@  struct ath10k_hw_params {
 	bool use_fw_tx_credits;
 
 	bool delay_unmap_buffer;
+
+	/* The hardware support multicast frame registrations */
+	bool mcast_frame_registration;
 };
 
 struct htt_resp;
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index ec8d5b29bc72..0d0de3646d31 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -1249,7 +1249,7 @@  static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
 	return ar->monitor ||
 	       (!test_bit(ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST,
 			  ar->running_fw->fw_file.fw_features) &&
-		(ar->filter_flags & FIF_OTHER_BSS)) ||
+		(ar->filter_flags & (FIF_OTHER_BSS | FIF_MCAST_ACTION))) ||
 	       test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
 }
 
@@ -6027,11 +6027,15 @@  static void ath10k_configure_filter(struct ieee80211_hw *hw,
 {
 	struct ath10k *ar = hw->priv;
 	int ret;
+	unsigned int supported = SUPPORTED_FILTERS;
 
 	mutex_lock(&ar->conf_mutex);
 
-	changed_flags &= SUPPORTED_FILTERS;
-	*total_flags &= SUPPORTED_FILTERS;
+	if (ar->hw_params.mcast_frame_registration)
+		supported |= FIF_MCAST_ACTION;
+
+	*total_flags &= supported;
+
 	ar->filter_flags = *total_flags;
 
 	ret = ath10k_monitor_recalc(ar);
@@ -10114,6 +10118,10 @@  int ath10k_mac_register(struct ath10k *ar)
 			      NL80211_EXT_FEATURE_SET_SCAN_DWELL);
 	wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_AQL);
 
+	if (ar->hw_params.mcast_frame_registration)
+		wiphy_ext_feature_set(ar->hw->wiphy,
+				      NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS);
+
 	if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map) ||
 	    test_bit(WMI_SERVICE_HTT_MGMT_TX_COMP_VALID_FLAGS, ar->wmi.svc_map))
 		wiphy_ext_feature_set(ar->hw->wiphy,