wlan-ap-Telecominfraproject/feeds/wifi-ax/mac80211/patches/qca/305-001-mac80211-Add-support-to-handle-AWGN-interference-for-6G.patch
John Crispin 8cd26b4b50 ipq807x: update to 11.4-CS
Signed-off-by: John Crispin <john@phrozen.org>
2021-09-14 09:16:23 +02:00

119 lines
4.2 KiB
Diff

From 8903b905962c705a1dc46eed60c162b7346497f9 Mon Sep 17 00:00:00 2001
From: Lavanya Suresh <lavaks@codeaurora.org>
Date: Thu, 6 May 2021 13:31:49 +0530
Subject: [PATCH] mac80211: Add support to handle AWGN interference for 6G
On receiving AWGN interference indication, mac80211 triggers actions
to bringdown the interface and indicates the same to userspace using
existing NL80211_CMD_STOP_AP interface, so as to avoid transmission
in that channel.
Signed-off-by: Lavanya Suresh <lavaks@codeaurora.org>
---
include/net/mac80211.h | 7 +++++++
net/mac80211/ieee80211_i.h | 4 ++++
net/mac80211/iface.c | 2 ++
net/mac80211/util.c | 26 ++++++++++++++++++++++++++
4 files changed, 39 insertions(+)
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index df3c728..a91a7f9 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -6245,6 +6245,13 @@ void ieee80211_radar_detected(struct ieee80211_hw *hw);
void ieee80211_chswitch_done(struct ieee80211_vif *vif, bool success);
/**
+ * ieee80211_awgn_detected - inform that awgn interference is detected
+ *
+ * @vif: &struct ieee80211_vif pointer from the add_interface callback.
+ */
+void ieee80211_awgn_detected(struct ieee80211_vif *vif);
+
+/**
* ieee80211_request_smps - request SM PS transition
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
* @smps_mode: new SM PS mode
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 448e8bd..200d325 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -952,6 +952,8 @@ struct ieee80211_sub_if_data {
bool csa_block_tx; /* write-protected by sdata_lock and local->mtx */
struct cfg80211_chan_def csa_chandef;
+ struct work_struct awgn_detected_work;
+
struct work_struct color_change_finalize_work;
struct list_head assigned_chanctx_list; /* protected by chanctx_mtx */
@@ -1778,6 +1780,8 @@ int ieee80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
void ieee80211_csa_finalize_work(struct work_struct *work);
int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
struct cfg80211_csa_settings *params);
+/* awgn interference handling */
+void ieee80211_awgn_interference_detected_work(struct work_struct *work);
/* color change handling */
void ieee80211_color_change_finalize_work(struct work_struct *work);
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index 1169a1c..7d441ac 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -471,6 +471,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_do
sdata_unlock(sdata);
cancel_work_sync(&sdata->csa_finalize_work);
+ cancel_work_sync(&sdata->awgn_detected_work);
cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
@@ -1660,6 +1661,7 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
INIT_WORK(&sdata->work, ieee80211_iface_work);
INIT_WORK(&sdata->recalc_smps, ieee80211_recalc_smps_work);
INIT_WORK(&sdata->csa_finalize_work, ieee80211_csa_finalize_work);
+ INIT_WORK(&sdata->awgn_detected_work, ieee80211_awgn_interference_detected_work);
INIT_WORK(&sdata->color_change_finalize_work, ieee80211_color_change_finalize_work);
INIT_LIST_HEAD(&sdata->assigned_chanctx_list);
INIT_LIST_HEAD(&sdata->reserved_chanctx_list);
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index a00ed23..56f490b 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -3929,6 +3929,32 @@ u32 ieee80211_chandef_downgrade(struct cfg80211_chan_def *c)
return ret;
}
+void ieee80211_awgn_interference_detected_work(struct work_struct *work)
+{
+ struct ieee80211_sub_if_data *sdata =
+ container_of(work, struct ieee80211_sub_if_data, awgn_detected_work);
+
+ sdata_lock(sdata);
+
+ if (!ieee80211_sdata_running(sdata))
+ goto unlock;
+
+ cfg80211_stop_iface(sdata->local->hw.wiphy, &sdata->wdev,
+ GFP_KERNEL);
+
+unlock:
+ sdata_unlock(sdata);
+}
+
+void ieee80211_awgn_detected(struct ieee80211_vif *vif)
+{
+ struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
+
+ ieee80211_queue_work(&sdata->local->hw,
+ &sdata->awgn_detected_work);
+}
+EXPORT_SYMBOL(ieee80211_awgn_detected);
+
/*
* Returns true if smps_mode_new is strictly more restrictive than
* smps_mode_old.
--
2.7.4