Commit 57af267d authored by Shayne Chen's avatar Shayne Chen Committed by Felix Fietkau
Browse files

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



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: b4d093e3 ("mt76: mt7915: add 6 GHz support")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarShayne Chen <shayne.chen@mediatek.com>
Link: https://patch.msgid.link/20241010083816.51880-1-nbd@nbd.name


Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 126a516f
Loading
Loading
Loading
Loading
+19 −2
Original line number Diff line number Diff line
@@ -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;
@@ -170,8 +175,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;
			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;
+2 −2
Original line number Diff line number Diff line
@@ -1239,14 +1239,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);