summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlain Lamar <alain_lamar@yahoo.de>2026-04-17 17:20:26 +0200
committerChristian Breunig <christian@breunig.cc>2026-05-21 07:42:00 +0200
commitd3a26fceb0369fb78875ffff87036bfc4cc18a78 (patch)
treee0e0f0f902674fec9d14862e8bf94b577f1696e9
parentd8aab03bc85d9a01289bd400dee256ca8647f032 (diff)
downloadvyos-1x-d3a26fceb0369fb78875ffff87036bfc4cc18a78.tar.gz
vyos-1x-d3a26fceb0369fb78875ffff87036bfc4cc18a78.zip
wireless: T8528: add module config code for mt7916 based cards
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_wireless.py35
-rwxr-xr-xsrc/conf_mode/interfaces_wireless.py61
2 files changed, 95 insertions, 1 deletions
diff --git a/smoketest/scripts/cli/test_interfaces_wireless.py b/smoketest/scripts/cli/test_interfaces_wireless.py
index a61c7740e..6b2d3842d 100755
--- a/smoketest/scripts/cli/test_interfaces_wireless.py
+++ b/smoketest/scripts/cli/test_interfaces_wireless.py
@@ -82,6 +82,17 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):
cls.cli_set(cls, wifi_cc_path + [country])
+ def tearDown(self):
+ # Remove mt7915e module configuration file after each test
+ mt7915e_conf = f'/etc/modprobe.d/mt7915e.conf'
+ if os.path.isfile(mt7915e_conf):
+ tmp = call(f'sudo rm -f {mt7915e_conf}')
+ # Fail the test if file cannot be removed
+ if tmp != 0:
+ self.fail(f'Failed to remove {mt7915e_conf}')
+ # Call tearDown method from super class...
+ super().tearDown()
+
def test_wireless_add_single_ip_address(self):
# derived method to check if member interfaces are enslaved properly
super().test_add_single_ip_address()
@@ -218,6 +229,9 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):
for key in vht_opt:
self.cli_set(self._base_path + [interface, 'capabilities', 'vht'] + key.split())
+ # Load mt7915e to test module config generation
+ check_kmod('mt7915e')
+
self.cli_commit()
#
@@ -242,6 +256,11 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):
for key, value in vht_opt.items():
self.assertIn(value, tmp)
+ # mt7916 card configuration
+ tmp = read_file(f'/etc/modprobe.d/mt7915e.conf')
+ self.assertIsNotNone(tmp)
+ self.assertEqual('options mt7915e enable_6ghz=0', tmp)
+
def test_wireless_hostapd_vht_su_beamformer_config(self):
# Single-User-Beamformer
interface = self._interfaces[1] # wlan1
@@ -287,6 +306,9 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):
for key in vht_opt:
self.cli_set(self._base_path + [interface, 'capabilities', 'vht'] + key.split())
+ # Load mt7915e to test module config generation
+ check_kmod('mt7915e')
+
self.cli_commit()
#
@@ -311,6 +333,11 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):
for key, value in vht_opt.items():
self.assertIn(value, tmp)
+ # mt7916 card configuration
+ tmp = read_file(f'/etc/modprobe.d/mt7915e.conf')
+ self.assertIsNotNone(tmp)
+ self.assertEqual('options mt7915e enable_6ghz=0', tmp)
+
def test_wireless_hostapd_he_2ghz_config(self):
# Only set the hostapd (access-point) options - HE mode for 802.11ax at 2.4GHz
interface = self._interfaces[1] # wlan1
@@ -420,6 +447,9 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):
self.cli_set(self._base_path + [interface, 'capabilities', 'he', 'beamform', 'multi-user-beamformer'])
self.cli_set(self._base_path + [interface, 'capabilities', 'he', 'beamform', 'single-user-beamformer'])
+ # Load mt7915e to test module config generation
+ check_kmod('mt7915e')
+
self.cli_commit()
#
@@ -479,6 +509,11 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):
# Check for running process
self.assertTrue(process_named_running('hostapd'))
+ # mt7916 card configuration
+ tmp = read_file(f'/etc/modprobe.d/mt7915e.conf')
+ self.assertIsNotNone(tmp)
+ self.assertEqual('options mt7915e enable_6ghz=1', tmp)
+
def test_wireless_hostapd_wpa_config(self):
# Only set the hostapd (access-point) options
interface = self._interfaces[1] # wlan1
diff --git a/src/conf_mode/interfaces_wireless.py b/src/conf_mode/interfaces_wireless.py
index e1a2b22bf..c8a6c8dd7 100755
--- a/src/conf_mode/interfaces_wireless.py
+++ b/src/conf_mode/interfaces_wireless.py
@@ -36,10 +36,14 @@ from vyos.ifconfig import WiFiIf
from vyos.template import render
from vyos.utils.dict import dict_search
from vyos.utils.kernel import check_kmod
+from vyos.utils.kernel import is_module_loaded
+from vyos.utils.file import read_file
+from vyos.utils.file import write_file
from vyos.utils.process import call
from vyos.utils.process import is_systemd_service_active
from vyos.utils.process import is_systemd_service_running
from vyos.utils.network import interface_exists
+from vyos.base import Warning
from vyos import ConfigError
from vyos import airbag
airbag.enable()
@@ -232,7 +236,9 @@ def verify(wifi):
phy = wifi['physical_device']
if phy in wifi['station_interfaces']:
if len(wifi['station_interfaces'][phy]) > 0:
- raise ConfigError('Only one station per wireless physical interface possible!')
+ raise ConfigError(
+ 'Only one station per wireless physical interface possible!'
+ )
verify_address(wifi)
verify_vrf(wifi)
@@ -320,6 +326,59 @@ def apply(wifi):
w = WiFiIf(**wifi)
w.update(wifi)
+ # Set up the mt7915e module according to new wifi configuration.
+ # For this card, the decision is made for the 5GHz/6GHz-capable phy:
+ # 5GHz uses VHT (802.11ac) op_modes and 6GHz uses HE (802.11ax)
+ # op_modes. The card does not support WiFi-7 (802.11be).
+ # There is a race condition in the order the two phys on that card
+ # are configured. Sometimes, the 5/6GHz phy is configured first and
+ # the 2.4GHz phy is configured last, which would overwrite the module
+ # parameter definition. Only the Wi-Fi configuration for the 5/6GHz phy
+ # must write the file!
+ # op_modes as configured in interfaces_wireless.xml.in
+ five_ghz_op_modes_vht = ['0', '1', '2', '3']
+ six_ghz_op_modes_he = ['131', '132', '133', '134', '135']
+ # Make sure to act only when VHT or HE modes are used
+ module_options = None
+ if 'capabilities' in wifi:
+ if 'he' in wifi['capabilities']:
+ if 'channel_set_width' in wifi['capabilities']['he']:
+ if wifi['capabilities']['he']['channel_set_width'] in six_ghz_op_modes_he:
+ # 6GHz band required (802.11ax, WiFi-6e)
+ module_options = 'options mt7915e enable_6ghz=1'
+ if 'vht' in wifi['capabilities']:
+ if 'channel_set_width' in wifi['capabilities']['vht']:
+ if wifi['capabilities']['vht']['channel_set_width'] in five_ghz_op_modes_vht:
+ # 5GHz band required...
+ module_options = 'options mt7915e enable_6ghz=0'
+ if module_options:
+ # Only if the mt7915e module is loaded (card present)...
+ if is_module_loaded('mt7915e'):
+ tmp = None
+ try:
+ tmp = read_file(f'/etc/modprobe.d/mt7915e.conf')
+ except FileNotFoundError:
+ # Module config does not exist yet.
+ # Fail silently as it is written later in any case.
+ pass
+ finally:
+ # Write the module config in any case, so that there always is a
+ # valid module config which is mandatory to load the mt7916 firmware.
+ write_file(
+ f'/etc/modprobe.d/mt7915e.conf',
+ module_options,
+ user='root',
+ group='root',
+ mode=0o644
+ )
+ # Issue a warning if module options have changed.
+ # A warning is necessary even if this is the first time
+ # this module is configured. The firmware must be reloaded.
+ if tmp != module_options:
+ Warning(
+ 'Change to firmware 5GHz/6GHz configuration detected. The system must be rebooted to correctly reload the mt7916 firmware. The card will not work otherwise!'
+ )
+
# Enable/Disable interface - interface is always placed in
# administrative down state in WiFiIf class
if 'disable' not in wifi: