diff options
| author | Alain Lamar <alain_lamar@yahoo.de> | 2026-04-17 17:20:26 +0200 |
|---|---|---|
| committer | Christian Breunig <christian@breunig.cc> | 2026-05-21 07:42:00 +0200 |
| commit | d3a26fceb0369fb78875ffff87036bfc4cc18a78 (patch) | |
| tree | e0e0f0f902674fec9d14862e8bf94b577f1696e9 | |
| parent | d8aab03bc85d9a01289bd400dee256ca8647f032 (diff) | |
| download | vyos-1x-d3a26fceb0369fb78875ffff87036bfc4cc18a78.tar.gz vyos-1x-d3a26fceb0369fb78875ffff87036bfc4cc18a78.zip | |
wireless: T8528: add module config code for mt7916 based cards
| -rwxr-xr-x | smoketest/scripts/cli/test_interfaces_wireless.py | 35 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces_wireless.py | 61 |
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: |
