Intel unsupported sfp: различия между версиями
Материал из noname.com.ua
Перейти к навигацииПерейти к поискуSirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) (→x520) |
||
| Строка 25: | Строка 25: | ||
Тут нужно указать список если более чем одна карта (или порт?) |
Тут нужно указать список если более чем одна карта (или порт?) |
||
| + | |||
| + | ==<code>x520 Unlocker</code>== |
||
| + | |||
| + | <BR> |
||
| + | Последний бит должен быть установлен 1 (в примере уже установлен, в обоих случаях ) |
||
| + | <PRE> |
||
| + | ethtool -e enp3s0f1 offset 0x58 length 1 |
||
| + | Offset Values |
||
| + | ------ ------ |
||
| + | 0x0058: fd |
||
| + | </PRE> |
||
| + | <PRE> |
||
| + | ethtool -e enp7s0f0 offset 0x58 length 1 |
||
| + | Offset Values |
||
| + | ------ ------ |
||
| + | 0x0058: ff |
||
| + | </PRE> |
||
| + | |||
| + | Все манипуляции проводить только с 1 битом, например если было значение <code>fe</code> |
||
| + | <BR> |
||
| + | ( Бинарное <code>11111110</code> ) то записать следует <code>ff</code>( Бинарное <code>11111111</code> |
||
| + | |||
| + | Что бы не возиться руками все те же манипуляции можно сделать скриптом |
||
{{#spoiler:show=1| |
{{#spoiler:show=1| |
||
<PRE> |
<PRE> |
||
| + | cat intel_x520_patcher.py |
||
| + | #!/usr/bin/env python3 |
||
| + | # |
||
| + | # Simple Intel x520 EEPROM patcher |
||
| + | # Modifies the EEPROM to unlock the card for non-intel branded SFP modules. |
||
| + | # |
||
| + | # Copyright 2020,2021,2022 Andreas Thienemann <andreas@bawue.net> |
||
| + | # |
||
| + | # Licensed under the GPLv3 |
||
| + | # |
||
| + | # Based on research described at https://forums.servethehome.com/index.php?threads/patching-intel-x520-eeprom-to-unlock-all-sfp-transceivers.24634/ |
||
| + | # |
||
| + | # Quick explanation of what's going on: |
||
| + | # Looking at the Intel driver at e.g. https://elixir.bootlin.com/linux/v5.8/source/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h#L2140 we can see |
||
| + | # that the bit 0x1 at Address 0x58 contains a configuration setting whether the card allows any SFP modules or if Intel specific ones are enforced |
||
| + | # by the driver. |
||
| + | # |
||
| + | # Addr Bitstring |
||
| + | # 0x58 xxxxxxx0 means Intel specific SFPs |
||
| + | # 0x58 xxxxxxx1 means any SFP is allowed. |
||
| + | # |
||
| + | # Using the parameter allow_unsupported_sfp for the kernel module we can tell the driver to accept any SFPs. |
||
| + | # But this tool will flip the right bit 1 to make that change permanent in the configuration bits in the EEPROM, |
||
| + | # thus making kernel module parameters unnecessary. |
||
| + | # |
||
| + | |||
| + | import subprocess |
||
| + | import sys |
||
| + | |||
| + | try: |
||
| + | intf = sys.argv[1] |
||
| + | except IndexError: |
||
| + | print("%s <interface>" % sys.argv[0]) |
||
| + | sys.exit(255) |
||
| + | |||
| + | try: |
||
| + | with open("/sys/class/net/%s/device/vendor" % intf) as f: |
||
| + | vdr_id = f.read().strip() |
||
| + | |||
| + | with open("/sys/class/net/%s/device/device" % intf) as f: |
||
| + | dev_id = f.read().strip() |
||
| + | except IOError: |
||
| + | print("Can't read interface data.") |
||
| + | sys.exit(2) |
||
| + | |||
| + | if vdr_id not in ('0x8086') or dev_id not in ('0x10fb', '0x154d'): |
||
| + | print("Not a recognized Intel x520 card.") |
||
| + | sys.exit(3) |
||
| + | |||
| + | |||
| + | output = subprocess.check_output(['ethtool', '-e', intf, 'offset', '0x58', 'length', '1']) |
||
| + | print(output) |
||
| + | v = output.strip().decode('utf-8').split('\n') |
||
| + | print(v) |
||
| + | val = output.strip().decode('utf-8').split('\n')[-1].split()[-1] |
||
| + | val_bin = int(val, 16) |
||
| + | |||
| + | |||
| + | print("EEPROM Value at 0x58 is 0x%s (%s)" % (val, bin(val_bin))) |
||
| + | if val_bin & 0b00000001 == 1: |
||
| + | print("Card is already unlocked for all SFP modules. Nothing to do.") |
||
| + | exit(1) |
||
| + | if val_bin & 0b00000001 == 0: |
||
| + | print("Card is locked to Intel only SFP modules. Patching EEPROM...") |
||
| + | new_val = val_bin | 0b00000001 |
||
| + | print("New EEPROM Value at 0x58 will be %s (%s)" % (hex(new_val), bin(new_val))) |
||
| + | |||
| + | magic = "%s%s" % (dev_id, vdr_id[2:]) |
||
| + | cmd = ['ethtool', '-E', intf, 'magic', magic, 'offset', '0x58', 'value', hex(new_val), 'length', 1] |
||
| + | print("Running %s" % " ".join(cmd)) |
||
| + | #subprocess.call(cmd) |
||
| + | print("Reboot the machine for changes to take effect...") |
||
</PRE> |
</PRE> |
||
}} |
}} |
||
Версия 11:05, 25 февраля 2024
Ошибка ixgbe failed to load because an unsupported SFP+ module type was detected
x520
- файл
/etc/default/grub.d/60_custom.cfg
GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX ixgbe.allow_unsupported_sfp=1"
Или если более чем одна карта - ixgbe.allow_unsupported_sfp=1,1,1,1
- Запустить
update-grub
- Файл
/etc/modprobe.d/ixgbe.conf
options ixgbe allow_unsupported_sfp=1,1,1,1
Тут нужно указать список если более чем одна карта (или порт?)
x520 Unlocker
Последний бит должен быть установлен 1 (в примере уже установлен, в обоих случаях )
ethtool -e enp3s0f1 offset 0x58 length 1 Offset Values ------ ------ 0x0058: fd
ethtool -e enp7s0f0 offset 0x58 length 1 Offset Values ------ ------ 0x0058: ff
Все манипуляции проводить только с 1 битом, например если было значение fe
( Бинарное 11111110 ) то записать следует ff( Бинарное 11111111
Что бы не возиться руками все те же манипуляции можно сделать скриптом
xl710