Для соединения пары домашних серверов мне захотелось выйти за пределы привычных 1Гбит/с и при этом сильно не переплачивать за сетевое оборудование. На известном сайте были приобретены недорогие серверные адаптеры HP 764285-B21, по сути являющиеся ОЕМ аналогами Mellanox ConnectX-3 Pro, и QSFP+ медный кабель (DAC). Эти двухпортовые адаптеры могут работать на скоростях 10 и 40 Гбит/с в режиме Ethernet портов и до 56 Гбит/с в режиме InfiniBand. Низкая цена на вторичном рынке обусловлена нестандартным интерфейсом HP FlexibleLOM, разъем которого хотя и похож на стандартный PCIe x8, но имеет иное расположение линий PCIe и поэтому может использоваться только в совместимых серверах HP. Тем не менее выход есть - Tobias Schramm спроектировал специальный адаптер для установки карт HP FlexibleLOM в обычный слот PCIe. Я заказал платы адаптера на jlcpcb.com и 8х коннекторы на алиэкспресс. После монтажа коннектора на плату адаптера и установки всей конструкции в слот она успешно определилась как устройство на шине PCIe:

lspci | grep Mellanox
23:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]

Однако после установки Ethernet драйвера Mellanox (я использовал Ubuntu 16.04 и 20.04, предполагаю для других версий и для Windows порядок действий будет аналогичен) Ethernet интерфейсы не появились в системе. Это означало, что драйвер по какой-либо причине не смог распознать адаптер и скорее всего потребуется перепрошивка. Изучая вывод dmesg можно примерно установить причину ошибки, в моём случае в прошивке адаптеров была включена опция SR-IOV, несовместимая с используемой материнской платой.

Для перепрошивки адаптера скачиваем и распаковываем Mellanox firmware tools для вашей ОС. Установку производим с ключом --oem (sudo ./install --oem), это позволит сразу установить дополнительные утилиты для сборки новой прошивки.

После установки MFT определяем текущую версию прошивки:

mlxfwmanager -d 23:00.0
Querying Mellanox devices firmware ...

Device #1:
----------

  Device Type:      ConnectX3Pro
  Part Number:      764285-B21_Ax
  Description:      HP InfiniBand FDR/Ethernet 10Gb/40Gb 2-port 544+FLR-QSFP Adapter
  PSID:             HP_1380110017
  PCI Device Name:  23:00.0
  Port1 MAC:        24be05c557c1
  Port2 MAC:        24be05c557c2
  Versions:         Current        Available     
     FW             2.42.5700      N/A           

  Status:           No matching image found

...и делаем бэкап текущей прошивки и конфигурации адаптера:

flint -d 23:00.0 ri original_firmware.bin
flint -d 23:00.0 dc original_config.ini

Изучив раздел [HCA] файла конфигурации находим требуемый параметр sriov_en и, предварительно скопировав конфигурацию в новый файл new_config.ini, выставляем ему нулевое значение. Также проверяем, что eth_xfi_en равен единице - это позволит активировать Ethernet режим портов:

[HCA]
...
eth_xfi_en = 1
sriov_en = 0
...

Далее нам потребуется исходный файл прошивки .mlx для нашего чипсета (в моём случае это ConnectX-3 Pro), как выяснилось раньше их можно было свободно скачать с сайта Mellanox, однако сейчас лавочку прикрыли, оставив только готовые бинарные прошивки, которые, к сожалению, нам не подходят. В результате поисков мне удалось найти прямую ссылку на скачивание исходной прошивки предыдущей версии 2.36:

wget http://www.mellanox.com/downloads/firmware/ConnectX3Pro-rel-2_36_5000-web.tgz

Распаковываем архив и извлекаем искомый fw-ConnectX3Pro-rel.mlx, затем собираем новую прошивку с помощью mlxburn:

mlxburn -fw fw-ConnectX3Pro-rel.mlx -conf new_config.ini -wrimage new_firmware.bin

На всякий случай проверяем новую прошивку:

flint -i new_firmware.bin verify

     FS2 failsafe image. Start address: 0x0. Chunk size 0x80000:

     NOTE: The addresses below are contiguous logical addresses. Physical addresses on
           flash may be different, based on the image start address and chunk size

     /0x00000038-0x0000065b (0x000624)/ (BOOT2) - OK
     /0x0000065c-0x00002b9b (0x002540)/ (BOOT2) - OK
     /0x00002b9c-0x00003b27 (0x000f8c)/ (Configuration) - OK
     /0x00003b28-0x00003b6b (0x000044)/ (GUID) - OK
     /0x00003b6c-0x00003cc3 (0x000158)/ (Image Info) - OK
     /0x00003cc4-0x00010fc3 (0x00d300)/ (DDR) - OK
     /0x00010fc4-0x00012027 (0x001064)/ (DDR) - OK
     /0x00012028-0x000123f7 (0x0003d0)/ (DDR) - OK
     /0x000123f8-0x0005008b (0x03dc94)/ (DDR) - OK
     /0x0005008c-0x00054f0f (0x004e84)/ (DDR) - OK
     /0x00054f10-0x00059103 (0x0041f4)/ (DDR) - OK
     /0x00059104-0x00059bfb (0x000af8)/ (DDR) - OK
     /0x00059bfc-0x0008915f (0x02f564)/ (DDR) - OK
     /0x00089160-0x0008cd0b (0x003bac)/ (DDR) - OK
     /0x0008cd0c-0x000a1d7f (0x015074)/ (DDR) - OK
     /0x000a1d80-0x000a1e87 (0x000108)/ (DDR) - OK
     /0x000a1e88-0x000a6a8b (0x004c04)/ (DDR) - OK
     /0x000a6a8c-0x000a827b (0x0017f0)/ (Configuration) - OK
     /0x000a827c-0x000a82ef (0x000074)/ (Jump addresses) - OK
     /0x000a82f0-0x000a8e03 (0x000b14)/ (FW Configuration) - OK
     /0x00000000-0x000a8e03 (0x0a8e04)/ (Full Image) - OK

-I- FW image verification succeeded. Image is bootable.

...и затем прошиваем в адаптер:

flint -d 23:00.0 -i new_firmware.bin -allow_psid_change burn

    Current FW version on flash:  2.42.5700
    New FW version:               2.36.5000

    Note: The new FW version is older than the current FW version on flash.

 Do you want to continue ? (y/n) [n] : y

Burning FS2 FW image without signatures - OK  
Restoring signature                     - OK

После перепрошивки адаптера обязательно перезагружаем сервер.

В моём случае после всех вышеперечисленных манипуляций драйвер mlx4_core успешно распознал адаптер и сетевые интерфейсы появились в системе. Для ускорения процесса загрузки я дополнительно отключил boot options:

mlxconfig -d 23:00.0 set BOOT_OPTION_ROM_EN_P1=false
mlxconfig -d 23:00.0 set BOOT_OPTION_ROM_EN_P2=false
mlxconfig -d 23:00.0 set LEGACY_BOOT_PROTOCOL_P1=0
mlxconfig -d 23:00.0 set LEGACY_BOOT_PROTOCOL_P2=0

...и удалил BootROM:

flint -d 23:00.0 --allow_rom_change drom

Кроме того, если не планируется использование интерфейсов InfiniBand, можно принудительно перевести оба порта в режим Ethernet:

mlxconfig -d 23:00.0 set LINK_TYPE_P1=2
mlxconfig -d 23:00.0 set LINK_TYPE_P2=2