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:
committed by
Mehmet Basaran
parent
062235dc11
commit
baf5a72d51
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user