From d3a26fceb0369fb78875ffff87036bfc4cc18a78 Mon Sep 17 00:00:00 2001 From: Alain Lamar Date: Fri, 17 Apr 2026 17:20:26 +0200 Subject: wireless: T8528: add module config code for mt7916 based cards --- src/conf_mode/interfaces_wireless.py | 61 +++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) (limited to 'src') 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: -- cgit v1.2.3 From 87cb7ec09799047f71b22ede4f3c5ef241930c15 Mon Sep 17 00:00:00 2001 From: Christian Breunig Date: Thu, 21 May 2026 07:42:32 +0200 Subject: wireless: mt7915e: de-nest code for firmware configuration file Generation of the firmware configuration file can be made contitional only if the card is present/driver is loaded. The firmware configuration file itself must not be explicitly set to be owned as root as the default is user root and group vyattacfg. --- src/conf_mode/interfaces_wireless.py | 83 +++++++++++++++++------------------- 1 file changed, 40 insertions(+), 43 deletions(-) (limited to 'src') diff --git a/src/conf_mode/interfaces_wireless.py b/src/conf_mode/interfaces_wireless.py index c8a6c8dd7..68aa71474 100755 --- a/src/conf_mode/interfaces_wireless.py +++ b/src/conf_mode/interfaces_wireless.py @@ -54,6 +54,8 @@ hostapd_conf = '/run/hostapd/{ifname}.conf' hostapd_accept_station_conf = '/run/hostapd/{ifname}_station_accept.conf' hostapd_deny_station_conf = '/run/hostapd/{ifname}_station_deny.conf' +mt7915e_conf = f'/etc/modprobe.d/mt7915e.conf' + country_code_path = ['system', 'wireless', 'country-code'] def find_other_stations(conf, base, ifname): @@ -335,49 +337,44 @@ def apply(wifi): # 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!' - ) + # + # Only if the mt7915e module is loaded (card present)... + if is_module_loaded('mt7915e'): + # 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 = '' + if 'capabilities' in wifi: + mt7915e_options_string = 'options mt7915e' + 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 = f'{mt7915e_options_string} 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 = f'{mt7915e_options_string} enable_6ghz=0' + + tmp = None + if os.path.isfile(mt7915e_conf): + tmp = read_file(mt7915e_conf) + + # Write the module config, so that there always is a valid module + # config which is mandatory to load the mt7916 firmware. + write_file(mt7915e_conf, module_options, mode=0o644) + # Issue warning if module options have changed. Warning is necessary + # even if this is the first time this module is configured, + # 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!') + # Instead of reboot - can we unload and re-load the driver? + elif os.path.isfile(mt7915e_conf): + os.remove(mt7915e_conf) # Enable/Disable interface - interface is always placed in # administrative down state in WiFiIf class -- cgit v1.2.3