家のインターネット回線の10Gbps化に向け、XG-C100Cを購入しました。Linux対応が謳われていましたが、ドライバのインストールで躓いたので解決策を忘備録として残しておきます。また6Gbpsしか出ない場合の原因もあとがきに記しておきます。

対象

Debian系とRedHat系以外のディストロで下記のようなAquantia(Marvell)なチップが乗ったNICを利用したいユーザー

  • XG-C100C
  • XG-C100C V2 (筆者所有)
  • GC-AQC113C
  • TX401

発生するエラー

そもそも、ドライバ付属のシェルスクリプトではDebian系とRedHat系以外のディストロでは動作しないような記述になっています。

	if [ "${DISTRO}" = "debian" ] ; then
		PACKET_MNG="${APT_GET}"
		LINUX_HEADERS="linux-headers-`uname -r`"
		TOOLS="build-essential"
		CMD="dpkg-query -l"
	elif [ "${DISTRO}" = "redhat" ] ; then
		PACKET_MNG="${YUM}"
		LINUX_HEADERS="kernel-devel-`uname -r`"
		TOOLS="gcc gcc-c++ make"
		CMD="${YUM} list installed"
	else
		echo "Sorry, your operating system ${DISTRO} is not supported."
		exit ${ERR_SCRIPT}
	fi

シェルスクリプトを参考に手動でDKMSを叩いていくと、 dkms add までは成功しますが次のビルドで落ちます。

Error! Bad return status for module build on kernel : 6.0.x

TL;DR

いわゆる開発版のソースコードが下記リポジトリで提供されているのでそれを使いましょう。

https://github.com/Aquantia/AQtion

var.h を参考にバージョン番号を確認したら、下記のようなコマンドでDKMSでのインストールができるはずです。筆者は後述のAURを用いたのでこの内容は未確認です。気になる人は dkms.sh を見てみるとよいと思います。

$ cd AQtion
# バージョン番号は適時置き換えてください
$ mkdir -p /usr/src/atlantic-2.5.5
$ cp -r * /usr/src/atlantic-2.5.5

/usr/src/atlantic-2.5.5/dkms.conf を作成し内容を記入します。

PACKAGE_NAME="atlantic"
BUILT_MODULE_NAME[0]="atlantic"
PACKAGE_VERSION="2.5.5"
DEST_MODULE_LOCATION[0]="/kernel/drivers/net/ethernet/aquantia/atlantic"
AUTOINSTALL="yes"

完了したら dkms を叩いていきます。

$ dkms add atlantic/2.5.5
# 依存関係が足りないとビルド時にエラーが出るかもしれません。
# カーネルヘッダとgcc gcc-c++ makeあたりが入っているか確認しましょう。
$ dkms build atlantic/2.5.5
$ dkms install atlantic/2.5.5

Archユーザーの場合はAURにてPKGBUILDが公開されていますのでそちらも利用できます。

https://aur.archlinux.org/packages/atlantic-dkms

あとがきとXG-C100C V2の物理的制約

私が入手したXG-C100C V2ですが、PCIe x4の形をしておきながら利用できるのはPCIe x2のみです。そのため、PCIe Gen3以上に対応しているポートでないと10Gbpsフルでの動作は見込めません。私のマザーボードは一つしかないGen3のポートがグラフィックボードで埋まってしまっていたので、仕方なくPCIe Gen2のポートにNICを挿しました。この状態ではGen2x2でのリンクとなり、実測で6Gbpsちょい程度の速度となります。

Ryzen3000世代のマザーボードですらそんな感じなので、皆様はお気を付けください。

以上です。