ConnectX-3（OEM）のファームウェア更新

ConnectX-3が届いたので、動作確認含めてwin10上でカードの認識と簡単なセットアップを実施。
セットアップに使ったwin10には事前に、ConnectX-3とwin10をサポートしているOFED(WinOF)とMFTをインストール済み。

##ConnectX-3の動作確認
入手したConnectX-3カードをPCIスロットに差して、デバイスマネージャーで無事に認識したので、カードのプロパティを確認する。
![CX3_20200812-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312242/b6fd3749-6e87-e4f9-0e9b-f792b9d4c6c6.png)
プロパティーでは
- ファームウェア： 2.10.700
となっているので、古すぎるファームウェアを更新する。

##状態の確認
デバイスとしては認識しているので、最初にHCAのファームウェアバージョンの確認を兼ねてWinMFTコマンドでHCAの情報をもう少し収集する。

```sh
C:\>cd "\Program Files\Mellanox\WinMFT"
C:\Program Files\Mellanox\WinMFT>mst status -v
MST devices:
------------
  mt4099_pci_cr0         bus:dev.fn=01:00.0
  mt4099_pciconf0        bus:dev.fn=01:00.0

C:\Program Files\Mellanox\WinMFT>flint -d mt4099_pci_cr0 query
Image type:            FS2
FW Version:            2.10.0700
Device ID:             4099
Description:           Node             Port1            Port2            Sys image
GUIDs:                 0002c903001a0da0 0002c903001a0da1 0002c903001a0da2 0002c903001a0da3
MACs:                                       0002c91a0da0     0002c91a0da1
VSD:
PSID:                  FJT1060100019

C:\Program Files\Mellanox\WinMFT>
```

MST device情報はConnectX-3(mt4099)と認識していることを確認。
ファームウェアバージョンは、2.10.0700ということで相当古い...（う～む）
PSIDはFJTで始まるので、富士通のOEM品と確認。これは注文時に理解していたことなので問題なし。
もう少し情報を取りたいので、mlxconfigで設定内容を確認してみたら

```shell
C:\Program Files\Mellanox\WinMFT>mlxconfig -d mt4099_pci_cr0 query
-E- Failed to open device: mt4099_pci_cr0. Unsupported FW (version 2.31.5000 or above required for CX3/PRO)
```
とファームが古すぎるからmlxconfigコマンドをサポートしていない模様

##ファームウェアダウンロード
富士通のOEM品なので、富士通のサポートサイトからファームウェアを入手。
HCAの動作確認をしているのはwin10なのだけど直近のターゲットはwin2008R2なので、OSがサポートしているファームウェアのバージョンを入手
[IB HCAカード(56Gb)(PY-HC301/302) ファームウェア アップデートツール V2.34.5000](https://azby.fmworld.net/app/customer/driversearch/ia/drviadownload?driverNumber=F1020874)
から、1世代古いファームウェアを入手したら、適当なフォルダを作成してそこでexeファイルを実行する。

```shell
C:\Program Files\Mellanox\WinMFT\cx3>cd 2.34.5000
C:\Program Files\Mellanox\WinMFT\cx3\2.34.5000>.\F1020874.exe
Arcmanager(SLC 32)  Self-Extractor V01L09
　~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 234500F1.bin
               : done.
 234500F2.bin
               : done.
 IB_cx3f2345000.iso
               : done.
 ファームウェアアップデート手順書.pdf
               : done.

C:\Program Files\Mellanox\WinMFT\cx3\2.34.5000>
```

ConnectX-3用の最後のファームウェアは、V2.42.5000だが、富士通OEMカード向けのファームウェアは以下の富士通のサポートページから入手可能。
　[IB HCAカード(56Gb)(PY-HC301/302) ファームウェア アップデートツール V2.42.5000](https://azby.fmworld.net/app/customer/driversearch/ia/drviadownload?driverNumber=F1025573)
探した範囲では、今回、適用しているV2.34.5000の他に
　[IB HCAカード(56Gb)(PY-HC301/302) ファームウェア アップデートツール V2.36.5000](https://azby.fmworld.net/app/customer/driversearch/ia/drviadownload?driverNumber=F1023147)
が提供されている。（リンク先ページからダウンロード可能）
win2008R2に対応しているV2.40.5030を探しているが見つかっていない。

##ファームウェア更新

（念のため）動いているファームウェアと設定ファイルのバックアップを取得しておく。

```shell
C:\Program Files\Mellanox\WinMFT\cx3\2.34.5000>..\..\flint -d mt4099_pci_cr0 ri org_fw.bin

C:\Program Files\Mellanox\WinMFT\cx3\2.34.5000>..\..\flint -d mt4099_pci_cr0 dc org_fw.ini

C:\Program Files\Mellanox\WinMFT\cx3\2.34.5000>
```

ダウンロードしたファームウェアに問題無いか確認する。

```shell-session
C:\Program Files\Mellanox\WinMFT\cx3\2.34.5000>..\..\flint -i 234500F1.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-0x00002adb (0x002480)/ (BOOT2) - OK
     /0x00002adc-0x00003a5b (0x000f80)/ (Configuration) - OK
     /0x00003a5c-0x00003a9f (0x000044)/ (GUID) - OK
     /0x00003aa0-0x00003c0b (0x00016c)/ (Image Info) - OK
     /0x00003c0c-0x00010b0f (0x00cf04)/ (DDR) - OK
     /0x00010b10-0x00011b63 (0x001054)/ (DDR) - OK
     /0x00011b64-0x00011f33 (0x0003d0)/ (DDR) - OK
     /0x00011f34-0x0004eb6b (0x03cc38)/ (DDR) - OK
     /0x0004eb6c-0x00054093 (0x005528)/ (DDR) - OK
     /0x00054094-0x00058927 (0x004894)/ (DDR) - OK
     /0x00058928-0x0005941f (0x000af8)/ (DDR) - OK
     /0x00059420-0x0008b993 (0x032574)/ (DDR) - OK
     /0x0008b994-0x0008f53f (0x003bac)/ (DDR) - OK
     /0x0008f540-0x000a3e43 (0x014904)/ (DDR) - OK
     /0x000a3e44-0x000a3f4b (0x000108)/ (DDR) - OK
     /0x000a3f4c-0x000ae47f (0x00a534)/ (DDR) - OK
     /0x000ae480-0x000afc63 (0x0017e4)/ (Configuration) - OK
     /0x000afc64-0x000afcd7 (0x000074)/ (Jump addresses) - OK
     /0x000afcd8-0x000b0547 (0x000870)/ (FW Configuration) - OK
     /0x00000000-0x000b0547 (0x0b0548)/ (Full Image) - OK
　
　-I- FW image verification succeeded. Image is bootable.
　
　
C:\Program Files\Mellanox\WinMFT\cx3\2.34.5000>
```

問題無いようなので、このファームに更新する。

```shell
C:\Program Files\Mellanox\WinMFT\cx3\2.34.5000>..\..\flint -d mt4099_pci_cr0 -i 234500F1.bin burn

    Current FW version on flash:  2.10.0700
    New FW version:               2.34.5000

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

C:\Program Files\Mellanox\WinMFT\cx3\2.34.5000>
```

2.10.0700から2.34.5000へ更新出来たので、一度、リブートする。

##ファームウェア更新の確認
再起動後、ConnectX-3の状態を確認
デバイスマネージャーで2.34.5000に更新されていることを確認。
![CX3_20200812-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312242/f61b6530-8f04-ea80-d730-5b51c51812ee.png)

WinMFTコマンドで再度確認

```shell-session
C:\Program Files\Mellanox\WinMFT>.\flint -d mt4099_pci_cr0 query
Image type:            FS2
FW Version:            2.34.5000
FW Release Date:       12.5.2015
Product Version:       02.34.50.00
Device ID:             4099
Description:           Node             Port1            Port2            Sys image
GUIDs:                 0002c903001a0da0 0002c903001a0da1 0002c903001a0da2 0002c903001a0da3
MACs:                                       0002c91a0da0     0002c91a0da1
VSD:
PSID:                  FJT1060100019

C:\Program Files\Mellanox\WinMFT>
C:\Program Files\Mellanox\WinMFT>.\mlxconfig -d mt4099_pci_cr0 query

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

Device type:    ConnectX3
Device:         mt4099_pci_cr0

Configurations:                              Next Boot
         SRIOV_EN                            False(0)
         NUM_OF_VFS                          8
         LINK_TYPE_P1                        VPI(3)
         LINK_TYPE_P2                        VPI(3)
         LOG_BAR_SIZE                        3
         BOOT_OPTION_ROM_EN_P1               True(1)
         BOOT_VLAN_EN_P1                     False(0)
         BOOT_RETRY_CNT_P1                   0
         LEGACY_BOOT_PROTOCOL_P1             PXE(1)
         BOOT_VLAN_P1                        1
         BOOT_OPTION_ROM_EN_P2               True(1)
         BOOT_VLAN_EN_P2                     False(0)
         BOOT_RETRY_CNT_P2                   0
         LEGACY_BOOT_PROTOCOL_P2             PXE(1)
         BOOT_VLAN_P2                        1

C:\Program Files\Mellanox\WinMFT>
```
ファームウェアが更新されたことを確認できた。また、古いファームではエラーとなっていたmlxconfigコマンドも正常に動作し、既存の設定値を確認出来た。

##SR-IOVの設定
mlxconfigコマンドで設定を確認したが、SR-IOVがFalse（無効）になっていたので、これをmlxconfigコマンドを使って有効にする。

```shell-session
C:\Program Files\Mellanox\WinMFT>.\mlxconfig -d mt4099_pci_cr0 query

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

Device type:    ConnectX3
Device:         mt4099_pci_cr0

Configurations:                              Next Boot
         SRIOV_EN                            False(0)
         NUM_OF_VFS                          8
         LINK_TYPE_P1                        VPI(3)
         LINK_TYPE_P2                        VPI(3)
         LOG_BAR_SIZE                        3
         BOOT_OPTION_ROM_EN_P1               True(1)
         BOOT_VLAN_EN_P1                     False(0)
         BOOT_RETRY_CNT_P1                   0
         LEGACY_BOOT_PROTOCOL_P1             PXE(1)
         BOOT_VLAN_P1                        1
         BOOT_OPTION_ROM_EN_P2               True(1)
         BOOT_VLAN_EN_P2                     False(0)
         BOOT_RETRY_CNT_P2                   0
         LEGACY_BOOT_PROTOCOL_P2             PXE(1)
         BOOT_VLAN_P2                        1

C:\Program Files\Mellanox\WinMFT>
C:\Program Files\Mellanox\WinMFT>.\mlxconfig -d mt4099_pci_cr0 set SRIOV_EN=1

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

Device type:    ConnectX3
Device:         mt4099_pci_cr0

Configurations:                              Next Boot       New
         SRIOV_EN                            False(0)        True(1)

 Apply new Configuration? (y/n) [n] : y
Applying... Done!
-I- Please reboot machine to load new configurations.

C:\Program Files\Mellanox\WinMFT>
```

再起動後に新しい設定が読み込まれるとのことなので、もう一度リブートする。

##SR-IOVの確認
起動後、設定状態を（再度）mlxconfigコマンドでSR-IOVが有効になっていることを確認する。

```shell-session
C:\Program Files\Mellanox\WinMFT>.\mlxconfig -d mt4099_pci_cr0 query

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

Device type:    ConnectX3
Device:         mt4099_pci_cr0

Configurations:                              Next Boot
         SRIOV_EN                            True(1)
         NUM_OF_VFS                          8
         LINK_TYPE_P1                        VPI(3)
         LINK_TYPE_P2                        VPI(3)
         LOG_BAR_SIZE                        3
         BOOT_OPTION_ROM_EN_P1               True(1)
         BOOT_VLAN_EN_P1                     False(0)
         BOOT_RETRY_CNT_P1                   0
         LEGACY_BOOT_PROTOCOL_P1             PXE(1)
         BOOT_VLAN_P1                        1
         BOOT_OPTION_ROM_EN_P2               True(1)
         BOOT_VLAN_EN_P2                     False(0)
         BOOT_RETRY_CNT_P2                   0
         LEGACY_BOOT_PROTOCOL_P2             PXE(1)
         BOOT_VLAN_P2                        1

C:\Program Files\Mellanox\WinMFT>
```

SRIOV_ENがTrue(1)になっているので、SR-IOVが有効になっていることを確認できた。NUM_OF_VFSは8になっているので、HCAでのVFSの最大は8個となっている。これは実装されているメモリの制限を受ける（と思う）が、増やす必要があれば、mlxconfigコマンドでSRIOV_ENと同様に設定変更が可能。

##OFEDコマンドでHCAの状態を確認（オプション）
HCAとしての動作は問題なさそうなので、OFEDコマンドでHCAの状態を（メモ的に）確認＆記録しておく。

```shell-session
C:\Program Files\Mellanox\MLNX_VPI\IB\Tools>ibv_devinfo.exe
hca_id: ibv_device0
        fw_ver:                         2.34.5000
        node_guid:                      0002:c903:001a:0da0
        sys_image_guid:                 0002:c903:001a:0da3
        vendor_id:                      0x02c9
        vendor_part_id:                 4099
        hw_ver:                         0x0
        phys_port_cnt:                  1
                port:   1
                        state:                  PORT_DOWN (1)
                        max_mtu:                4096 (5)
                        active_mtu:             4096 (5)
                        sm_lid:                 0
                        port_lid:               0
                        port_lmc:               0x00
                        transport:              IB

C:\Program Files\Mellanox\MLNX_VPI\IB\Tools>
C:\Program Files\Mellanox\MLNX_VPI\IB\Tools>vstat.exe

        hca_idx=0
        uplink={BUS=PCI_E Gen3, SPEED=8.0 Gbps, WIDTH=x8, CAPS=8.0*x8}
        MSI-X={ENABLED=1, SUPPORTED=128, GRANTED=4, ALL_MASKED=N}
        vendor_id=0x02c9
        vendor_part_id=4099
        hw_ver=0x0
        fw_ver=2.34.5000
        PSID=FJT1060100019
        node_guid=0002:c903:001a:0da0
        num_phys_ports=1
                port=1
                port_guid=0002:c903:001a:0da1
                port_state=PORT_DOWN (1)
                link_speed=NA
                link_width=NA
                rate=NA
                port_phys_state=POLLING (2)
                active_speed=10.00 Gbps
                sm_lid=0x0000
                port_lid=0x0000
                port_lmc=0x0
                transport=IB
                max_mtu=4096 (5)
                active_mtu=4096 (5)
                GID[0]=fe80:0000:0000:0000:0002:c903:001a:0da1

C:\Program Files\Mellanox\MLNX_VPI\IB\Tools>
C:\Program Files\Mellanox\MLNX_VPI\IB\Tools>iblinkinfo.exe
CA: PROD:
      0x0002c903001a0da1      0    1[  ] ==(                Down/ Polling)==>             [  ] "" ( )

C:\Program Files\Mellanox\MLNX_VPI\IB\Tools>
C:\Program Files\Mellanox\MLNX_VPI\IB\Tools>ibstat.exe
CA 'ibv_device0'
        CA type:
        Number of ports: 1
        Firmware version: 2.34.5000
        Hardware version: 0x0
        Node GUID: 0x0002c903001a0da0
        System image GUID: 0x0002c903001a0da3
    Port 1:
        State: Down
        Physical state: Polling
        Rate: 40
        Base lid: 0
        LMC: 0
        SM lid: 0
        Capability mask: 0x90580000
        Port GUID: 0x0002c903001a0da1
        Link layer: IB
        Transport: IB

C:\Program Files\Mellanox\MLNX_VPI\IB\Tools>
```

MLNXのshow系コマンドで問題無く情報を取得出来ているので、HCAとしては問題なさそう、また、vstatコマンドでPCIe 3.0 x8となっていることも確認出来た。
ConnectX-3は、OEMでも余り苦労することなく利用可能そう。(2020/08）
既にConnectX-3　VPIはサポート外となっているので、必要なファームウェアやOFEDを確保しておく方が良さそう。（誰かがアーカイブしてくれていそうな気がするが...）