wifi: mt76: mt7915: add module param to select 5 GHz or 6 GHz on MT7916

BugLink: https://bugs.launchpad.net/bugs/2114239

commit 57af267d2b8f5d88485c6372761386d79c5e6a1a upstream.

Due to a limitation in available memory, the MT7916 firmware can only
handle either 5 GHz or 6 GHz at a time. It does not support runtime
switching without a full restart.

On older firmware, this accidentally worked to some degree due to missing
checks, but couldn't be supported properly, because it left the 6 GHz
channels uncalibrated.
Newer firmware refuses to start on either band if the passed EEPROM
data indicates support for both.

Deal with this limitation by using a module parameter to specify the
preferred band in case both are supported.

Fixes: b4d093e321 ("mt76: mt7915: add 6 GHz support")
Cc: stable@vger.kernel.org
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Link: https://patch.msgid.link/20241010083816.51880-1-nbd@nbd.name
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Noah Wager <noah.wager@canonical.com>
Signed-off-by: Mehmet Basaran <mehmet.basaran@canonical.com>
This commit is contained in:
Shayne Chen
2024-10-10 10:38:16 +02:00
committed by Mehmet Basaran
parent 062235dc11
commit baf5a72d51
2 changed files with 21 additions and 4 deletions
@@ -2,9 +2,14 @@
/* Copyright (C) 2020 MediaTek Inc. */
#include <linux/firmware.h>
#include <linux/moduleparam.h>
#include "mt7915.h"
#include "eeprom.h"
static bool enable_6ghz;
module_param(enable_6ghz, bool, 0644);
MODULE_PARM_DESC(enable_6ghz, "Enable 6 GHz instead of 5 GHz on hardware that supports both");
static int mt7915_eeprom_load_precal(struct mt7915_dev *dev)
{
struct mt76_dev *mdev = &dev->mt76;
@@ -164,8 +169,20 @@ static void mt7915_eeprom_parse_band_config(struct mt7915_phy *phy)
phy->mt76->cap.has_6ghz = true;
return;
case MT_EE_V2_BAND_SEL_5GHZ_6GHZ:
phy->mt76->cap.has_5ghz = true;
phy->mt76->cap.has_6ghz = true;
if (enable_6ghz) {
phy->mt76->cap.has_6ghz = true;
u8p_replace_bits(&eeprom[MT_EE_WIFI_CONF + band],
MT_EE_V2_BAND_SEL_6GHZ,
MT_EE_WIFI_CONF0_BAND_SEL);
} else {
phy->mt76->cap.has_5ghz = true;
u8p_replace_bits(&eeprom[MT_EE_WIFI_CONF + band],
MT_EE_V2_BAND_SEL_5GHZ,
MT_EE_WIFI_CONF0_BAND_SEL);
}
/* force to buffer mode */
dev->flash_mode = true;
return;
default:
phy->mt76->cap.has_2ghz = true;
@@ -1235,14 +1235,14 @@ int mt7915_register_device(struct mt7915_dev *dev)
if (ret)
goto unreg_dev;
ieee80211_queue_work(mt76_hw(dev), &dev->init_work);
if (phy2) {
ret = mt7915_register_ext_phy(dev, phy2);
if (ret)
goto unreg_thermal;
}
ieee80211_queue_work(mt76_hw(dev), &dev->init_work);
dev->recovery.hw_init_done = true;
ret = mt7915_init_debugfs(&dev->phy);