Intel® 8254x/8256x/8257x
PCIのBase Address Register (BAR)を読み込み,Memory Mapped I/Oのアドレスを取得する.PCI/PCIeについては,[OSDev Wiki:PCI] および [OSDev Wiki:PCI Express] を参照.PCIのvendor/device IDリストは PCIDatabase.com で調べられる(有名なものはおおよそ載っている?).
Intel® 8254xの開発者マニュアルは, PCI/PCI-X GbE Family of Controllers: Software Developer's Manual, Intel® 8256x/8257xの開発者マニュアルは, PCIe* GbE Controllers Open Source Software Developer's Manual にそれぞれありますので,こちらを参考にすると良いと思います.Intel® 8254xについては, [OSDev Wiki:Intel 8254x] も多少参考になります.
初期化
- 割り込みの禁止:IMC = 0
- リセット:CTRL.RST = 1
- NICのMACアドレスの取得
- リンクの有効化:CTRL.SLU = 1
- 受信リングバッファの設定(RCTL, RDBAH/RDBAL, RDLEN, RDH, RDT,RXDCTL)
- 送信リングバッファの設定(TCTL, TDBAH/TDBAL, TDLEN, TDH, TDT,TXDCTL)
パケットの送出
Intel® 8254x, 82573Lなどであれば,マニュアル通り.Intel® 82567LM, 82577LMは,長さが0よりも大きいディスクリプタのTDESC.CMDにEOPフラグを立てるとパケットが送出されない(謎).代わりに,長さが0よりも大きいディスクリプタにはTDESC.CMDにEOPフラグを立てずに,次のディスクリプタを長さ0(Nullディスクリプタ)にしてTDESC.CMDにEOPフラグを立てる.
ほぼ同じコードでリファクタリングしたらパケットごとにEOPを立てても送出されました(謎).