Skip to content

Instantly share code, notes, and snippets.

@dvalter
Last active February 6, 2023 05:49
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dvalter/a9fe454e3ff7c5e32ed1df2b841eec99 to your computer and use it in GitHub Desktop.
Save dvalter/a9fe454e3ff7c5e32ed1df2b841eec99 to your computer and use it in GitHub Desktop.
Openwrt 21.02.5 patch for MIR4A
diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile
index 8210478c37..d9548d66cf 100644
--- a/package/kernel/mt76/Makefile
+++ b/package/kernel/mt76/Makefile
@@ -8,9 +8,9 @@ PKG_LICENSE_FILES:=
PKG_SOURCE_URL:=https://github.com/openwrt/mt76
PKG_SOURCE_PROTO:=git
-PKG_SOURCE_DATE:=2021-12-03
-PKG_SOURCE_VERSION:=678071ef70297b7264661c356ddb3c8cf7f3c87b
-PKG_MIRROR_HASH:=b1f8613f7c65ca6a893f83ed9efc3f7ce72b9b4904fd11b89264f57f4f2a3b5e
+PKG_SOURCE_DATE:=2022-02-03
+PKG_SOURCE_VERSION:=ab9b8078427a9a886b11516d5725190f0e7763b0
+PKG_MIRROR_HASH:=60562cf2ac2e97e654a8202bd6af2c928ca96b129edb168af29f227b6ffbc873
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
PKG_USE_NINJA:=0
diff --git a/package/kernel/mt76/patches/102-revert-background-radar-detection.patch b/package/kernel/mt76/patches/102-revert-background-radar-detection.patch
new file mode 100644
index 0000000000..ed2321f067
--- /dev/null
+++ b/package/kernel/mt76/patches/102-revert-background-radar-detection.patch
@@ -0,0 +1,393 @@
+diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
+index 7b9d82dd..1ebe02f5 100644
+--- a/mt76_connac_mcu.h
++++ b/mt76_connac_mcu.h
+@@ -977,7 +977,6 @@ enum {
+ MCU_EXT_CMD_SCS_CTRL = 0x82,
+ MCU_EXT_CMD_TWT_AGRT_UPDATE = 0x94,
+ MCU_EXT_CMD_FW_DBG_CTRL = 0x95,
+- MCU_EXT_CMD_OFFCH_SCAN_CTRL = 0x9a,
+ MCU_EXT_CMD_SET_RDD_TH = 0x9d,
+ MCU_EXT_CMD_MURU_CTRL = 0x9f,
+ MCU_EXT_CMD_SET_SPR = 0xa8,
+diff --git a/mt76x02_dfs.c b/mt76x02_dfs.c
+index 024a5c0a..a6013505 100644
+--- a/mt76x02_dfs.c
++++ b/mt76x02_dfs.c
+@@ -823,7 +823,10 @@ EXPORT_SYMBOL_GPL(mt76x02_phy_dfs_adjust_agc);
+
+ void mt76x02_dfs_init_params(struct mt76x02_dev *dev)
+ {
+- if (mt76_phy_dfs_state(&dev->mphy) > MT_DFS_STATE_DISABLED) {
++ struct cfg80211_chan_def *chandef = &dev->mphy.chandef;
++
++ if ((chandef->chan->flags & IEEE80211_CHAN_RADAR) &&
++ dev->mt76.region != NL80211_DFS_UNSET) {
+ mt76x02_dfs_init_sw_detector(dev);
+ mt76x02_dfs_set_bbp_params(dev);
+ /* enable debug mode */
+diff --git a/mt7915/debugfs.c b/mt7915/debugfs.c
+index 280823fc..464d2b42 100644
+--- a/mt7915/debugfs.c
++++ b/mt7915/debugfs.c
+@@ -79,11 +79,7 @@ mt7915_radar_trigger(void *data, u64 val)
+ {
+ struct mt7915_dev *dev = data;
+
+- if (val > MT_RX_SEL2)
+- return -EINVAL;
+-
+- return mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_RADAR_EMULATE,
+- val, 0, 0);
++ return mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_RADAR_EMULATE, 1, 0, 0);
+ }
+
+ DEFINE_DEBUGFS_ATTRIBUTE(fops_radar_trigger, NULL,
+@@ -308,53 +304,6 @@ exit:
+ }
+ DEFINE_SHOW_ATTRIBUTE(mt7915_muru_stats);
+
+-static int
+-mt7915_rdd_monitor(struct seq_file *s, void *data)
+-{
+- struct mt7915_dev *dev = dev_get_drvdata(s->private);
+- struct cfg80211_chan_def *chandef = &dev->rdd2_chandef;
+- const char *bw;
+- int ret = 0;
+-
+- mutex_lock(&dev->mt76.mutex);
+-
+- if (!cfg80211_chandef_valid(chandef)) {
+- ret = -EINVAL;
+- goto out;
+- }
+-
+- if (!dev->rdd2_phy) {
+- seq_puts(s, "not running\n");
+- goto out;
+- }
+-
+- switch (chandef->width) {
+- case NL80211_CHAN_WIDTH_40:
+- bw = "40";
+- break;
+- case NL80211_CHAN_WIDTH_80:
+- bw = "80";
+- break;
+- case NL80211_CHAN_WIDTH_160:
+- bw = "160";
+- break;
+- case NL80211_CHAN_WIDTH_80P80:
+- bw = "80P80";
+- break;
+- default:
+- bw = "20";
+- break;
+- }
+-
+- seq_printf(s, "channel %d (%d MHz) width %s MHz center1: %d MHz\n",
+- chandef->chan->hw_value, chandef->chan->center_freq,
+- bw, chandef->center_freq1);
+-out:
+- mutex_unlock(&dev->mt76.mutex);
+-
+- return ret;
+-}
+-
+ static int
+ mt7915_fw_debug_wm_set(void *data, u64 val)
+ {
+@@ -903,8 +852,6 @@ int mt7915_init_debugfs(struct mt7915_phy *phy)
+ &dev->hw_pattern);
+ debugfs_create_file("radar_trigger", 0200, dir, dev,
+ &fops_radar_trigger);
+- debugfs_create_devm_seqfile(dev->mt76.dev, "rdd_monitor", dir,
+- mt7915_rdd_monitor);
+ }
+
+ if (!ext_phy)
+diff --git a/mt7915/init.c b/mt7915/init.c
+index f8df66de..83835635 100644
+--- a/mt7915/init.c
++++ b/mt7915/init.c
+@@ -292,9 +292,6 @@ mt7915_regd_notifier(struct wiphy *wiphy,
+ memcpy(dev->mt76.alpha2, request->alpha2, sizeof(dev->mt76.alpha2));
+ dev->mt76.region = request->dfs_region;
+
+- if (dev->mt76.region == NL80211_DFS_UNSET)
+- mt7915_mcu_rdd_background_enable(phy, NULL);
+-
+ mt7915_init_txpower(dev, &mphy->sband_2g.sband);
+ mt7915_init_txpower(dev, &mphy->sband_5g.sband);
+
+@@ -306,7 +303,6 @@ static void
+ mt7915_init_wiphy(struct ieee80211_hw *hw)
+ {
+ struct mt7915_phy *phy = mt7915_hw_phy(hw);
+- struct mt76_dev *mdev = &phy->dev->mt76;
+ struct wiphy *wiphy = hw->wiphy;
+ struct mt7915_dev *dev = phy->dev;
+
+@@ -335,12 +331,6 @@ mt7915_init_wiphy(struct ieee80211_hw *hw)
+ wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_VHT);
+ wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_HE);
+
+- if (!mdev->dev->of_node ||
+- !of_property_read_bool(mdev->dev->of_node,
+- "mediatek,disable-radar-background"))
+- wiphy_ext_feature_set(wiphy,
+- NL80211_EXT_FEATURE_RADAR_BACKGROUND);
+-
+ ieee80211_hw_set(hw, HAS_RATE_CONTROL);
+ ieee80211_hw_set(hw, SUPPORTS_TX_ENCAP_OFFLOAD);
+ ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD);
+diff --git a/mt7915/main.c b/mt7915/main.c
+index dee7fc01..fa5e195f 100644
+--- a/mt7915/main.c
++++ b/mt7915/main.c
+@@ -1335,55 +1335,6 @@ mt7915_twt_teardown_request(struct ieee80211_hw *hw,
+ mutex_unlock(&dev->mt76.mutex);
+ }
+
+-static int
+-mt7915_set_radar_background(struct ieee80211_hw *hw,
+- struct cfg80211_chan_def *chandef)
+-{
+- struct mt7915_phy *phy = mt7915_hw_phy(hw);
+- struct mt7915_dev *dev = phy->dev;
+- int ret = -EINVAL;
+- bool running;
+-
+- mutex_lock(&dev->mt76.mutex);
+-
+- if (dev->mt76.region == NL80211_DFS_UNSET)
+- goto out;
+-
+- if (dev->rdd2_phy && dev->rdd2_phy != phy) {
+- /* rdd2 is already locked */
+- ret = -EBUSY;
+- goto out;
+- }
+-
+- /* rdd2 already configured on a radar channel */
+- running = dev->rdd2_phy &&
+- cfg80211_chandef_valid(&dev->rdd2_chandef) &&
+- !!(dev->rdd2_chandef.chan->flags & IEEE80211_CHAN_RADAR);
+-
+- if (!chandef || running ||
+- !(chandef->chan->flags & IEEE80211_CHAN_RADAR)) {
+- ret = mt7915_mcu_rdd_background_enable(phy, NULL);
+- if (ret)
+- goto out;
+-
+- if (!running)
+- goto update_phy;
+- }
+-
+- ret = mt7915_mcu_rdd_background_enable(phy, chandef);
+- if (ret)
+- goto out;
+-
+-update_phy:
+- dev->rdd2_phy = chandef ? phy : NULL;
+- if (chandef)
+- dev->rdd2_chandef = *chandef;
+-out:
+- mutex_unlock(&dev->mt76.mutex);
+-
+- return ret;
+-}
+-
+ const struct ieee80211_ops mt7915_ops = {
+ .tx = mt7915_tx,
+ .start = mt7915_start,
+@@ -1430,5 +1381,4 @@ const struct ieee80211_ops mt7915_ops = {
+ #ifdef CONFIG_MAC80211_DEBUGFS
+ .sta_add_debugfs = mt7915_sta_add_debugfs,
+ #endif
+- .set_radar_background = mt7915_set_radar_background,
+ };
+diff --git a/mt7915/mcu.c b/mt7915/mcu.c
+index 94837edf..1d71e6a2 100644
+--- a/mt7915/mcu.c
++++ b/mt7915/mcu.c
+@@ -346,12 +346,7 @@ mt7915_mcu_rx_radar_detected(struct mt7915_dev *dev, struct sk_buff *skb)
+ if (r->band_idx && dev->mt76.phy2)
+ mphy = dev->mt76.phy2;
+
+- if (r->band_idx == MT_RX_SEL2)
+- cfg80211_background_radar_event(mphy->hw->wiphy,
+- &dev->rdd2_chandef,
+- GFP_ATOMIC);
+- else
+- ieee80211_radar_detected(mphy->hw);
++ ieee80211_radar_detected(mphy->hw);
+ dev->hw_pattern++;
+ }
+
+@@ -2643,99 +2638,6 @@ int mt7915_mcu_set_radar_th(struct mt7915_dev *dev, int index,
+ sizeof(req), true);
+ }
+
+-static int
+-mt7915_mcu_background_chain_ctrl(struct mt7915_phy *phy,
+- struct cfg80211_chan_def *chandef,
+- int cmd)
+-{
+- struct mt7915_dev *dev = phy->dev;
+- struct mt76_phy *mphy = phy->mt76;
+- struct ieee80211_channel *chan = mphy->chandef.chan;
+- int freq = mphy->chandef.center_freq1;
+- struct mt7915_mcu_background_chain_ctrl req = {
+- .monitor_scan_type = 2, /* simple rx */
+- };
+-
+- if (!chandef && cmd != CH_SWITCH_BACKGROUND_SCAN_STOP)
+- return -EINVAL;
+-
+- if (!cfg80211_chandef_valid(&mphy->chandef))
+- return -EINVAL;
+-
+- switch (cmd) {
+- case CH_SWITCH_BACKGROUND_SCAN_START: {
+- req.chan = chan->hw_value;
+- req.central_chan = ieee80211_frequency_to_channel(freq);
+- req.bw = mt76_connac_chan_bw(&mphy->chandef);
+- req.monitor_chan = chandef->chan->hw_value;
+- req.monitor_central_chan =
+- ieee80211_frequency_to_channel(chandef->center_freq1);
+- req.monitor_bw = mt76_connac_chan_bw(chandef);
+- req.band_idx = phy != &dev->phy;
+- req.scan_mode = 1;
+- break;
+- }
+- case CH_SWITCH_BACKGROUND_SCAN_RUNNING:
+- req.monitor_chan = chandef->chan->hw_value;
+- req.monitor_central_chan =
+- ieee80211_frequency_to_channel(chandef->center_freq1);
+- req.band_idx = phy != &dev->phy;
+- req.scan_mode = 2;
+- break;
+- case CH_SWITCH_BACKGROUND_SCAN_STOP:
+- req.chan = chan->hw_value;
+- req.central_chan = ieee80211_frequency_to_channel(freq);
+- req.bw = mt76_connac_chan_bw(&mphy->chandef);
+- req.tx_stream = hweight8(mphy->antenna_mask);
+- req.rx_stream = mphy->antenna_mask;
+- break;
+- default:
+- return -EINVAL;
+- }
+- req.band = chandef ? chandef->chan->band == NL80211_BAND_5GHZ : 1;
+-
+- return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(OFFCH_SCAN_CTRL),
+- &req, sizeof(req), false);
+-}
+-
+-int mt7915_mcu_rdd_background_enable(struct mt7915_phy *phy,
+- struct cfg80211_chan_def *chandef)
+-{
+- struct mt7915_dev *dev = phy->dev;
+- int err, region;
+-
+- if (!chandef) { /* disable offchain */
+- err = mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_STOP, MT_RX_SEL2,
+- 0, 0);
+- if (err)
+- return err;
+-
+- return mt7915_mcu_background_chain_ctrl(phy, NULL,
+- CH_SWITCH_BACKGROUND_SCAN_STOP);
+- }
+-
+- err = mt7915_mcu_background_chain_ctrl(phy, chandef,
+- CH_SWITCH_BACKGROUND_SCAN_START);
+- if (err)
+- return err;
+-
+- switch (dev->mt76.region) {
+- case NL80211_DFS_ETSI:
+- region = 0;
+- break;
+- case NL80211_DFS_JP:
+- region = 2;
+- break;
+- case NL80211_DFS_FCC:
+- default:
+- region = 1;
+- break;
+- }
+-
+- return mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_START, MT_RX_SEL2,
+- 0, region);
+-}
+-
+ int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd)
+ {
+ struct mt7915_dev *dev = phy->dev;
+diff --git a/mt7915/mcu.h b/mt7915/mcu.h
+index 9417f7bc..aa05c6ce 100644
+--- a/mt7915/mcu.h
++++ b/mt7915/mcu.h
+@@ -131,29 +131,6 @@ struct mt7915_mcu_rdd_report {
+ } hw_pulse[32];
+ } __packed;
+
+-struct mt7915_mcu_background_chain_ctrl {
+- u8 chan; /* primary channel */
+- u8 central_chan; /* central channel */
+- u8 bw;
+- u8 tx_stream;
+- u8 rx_stream;
+-
+- u8 monitor_chan; /* monitor channel */
+- u8 monitor_central_chan;/* monitor central channel */
+- u8 monitor_bw;
+- u8 monitor_tx_stream;
+- u8 monitor_rx_stream;
+-
+- u8 scan_mode; /* 0: ScanStop
+- * 1: ScanStart
+- * 2: ScanRunning
+- */
+- u8 band_idx; /* DBDC */
+- u8 monitor_scan_type;
+- u8 band; /* 0: 2.4GHz, 1: 5GHz */
+- u8 rsv[2];
+-} __packed;
+-
+ struct mt7915_mcu_eeprom {
+ u8 buffer_mode;
+ u8 format;
+diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
+index 96653d64..af0b9f02 100644
+--- a/mt7915/mt7915.h
++++ b/mt7915/mt7915.h
+@@ -268,10 +268,6 @@ struct mt7915_dev {
+ struct tasklet_struct irq_tasklet;
+ struct mt7915_phy phy;
+
+- /* monitor rx chain configured channel */
+- struct cfg80211_chan_def rdd2_chandef;
+- struct mt7915_phy *rdd2_phy;
+-
+ u16 chainmask;
+ u32 hif_idx;
+
+@@ -331,7 +327,6 @@ enum {
+ enum {
+ MT_RX_SEL0,
+ MT_RX_SEL1,
+- MT_RX_SEL2, /* monitor chain */
+ };
+
+ enum mt7915_rdd_cmd {
+@@ -459,8 +454,6 @@ int mt7915_mcu_get_temperature(struct mt7915_phy *phy);
+ int mt7915_mcu_set_thermal_throttling(struct mt7915_phy *phy, u8 state);
+ int mt7915_mcu_get_rx_rate(struct mt7915_phy *phy, struct ieee80211_vif *vif,
+ struct ieee80211_sta *sta, struct rate_info *rate);
+-int mt7915_mcu_rdd_background_enable(struct mt7915_phy *phy,
+- struct cfg80211_chan_def *chandef);
+ int mt7915_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3);
+ int mt7915_mcu_fw_log_2_host(struct mt7915_dev *dev, u8 type, u8 ctrl);
+ int mt7915_mcu_fw_dbg_ctrl(struct mt7915_dev *dev, u32 module, u8 level);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment