2009-07-28 ICMP6
PHY見えたーーーーーーーー。
なぜか U-Boot が起動時に (しかもご丁寧に tftp でカーネルをロードした直後に) Power Management Register (0x77000000〜) の PHY のソフトリセットビットを操作してやがった。なぜそんなことを…リンクダウンさせるため? にしては強引すぎるだろ常考
しかもETHERコントローラのレジスタではなくリセットビット…さらにリセットしっぱなしで寝かせたビットを起こさずに…。理解不能。
というわけで、無事にukphy0が見えた。
NetBSD 5.99.15 (STR81xx) #788: Tue Jul 28 00:33:30 JST 2009 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/STR81xx total memory = 32768 KB avail memory = 28288 KB mainbus0 (root) cpu0 at mainbus0: FA526 rev 1 (ARMv4 core) cpu0: DC disabled IC enabled WB enabled LABT cpu0: 8KB/16B 2-way Instruction cache cpu0: 8KB/16B 2-way write-back-locking-B Data cache star0 at mainbus0: Star STR8100 Equuleus Family SoC (0x8131eeee) starclk0 at star0 addr 0x79000000-0x79000047 irq 0: Programmable Timer com0 at star0 addr 0x78000000-0x7800001f irq 9: ns16550a, working fifo com0: console com1 at star0 addr 0x78800000-0x7880001f irq 10: ns16550a, working fifo gec0 at star0 addr 0x70000000-0x70000133 irq 18: Gigabit Ethernet Controller gec0: Ethernet address 00:aa:bb:cc:dd:10 ukphy0 at gec0 phy 0: Generic IEEE 802.3u media interface ukphy0: OUI 0x000e4e, model 0x0025, rev. 1 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto boot device: <unknown> root device:
§ § §
リンクアップさえすれば送信も余裕で動くだろうと思いつつ実行するが…全然ダメだった。うーむ。
しかし、どうも壊れてるっぽい変なパケットを観測。リングバッファのアドレスがおかしい…じゃなくて、キャッシュか? bus_dmamap_syncをきちんと挿入して再度チャレンジすると、違うパケットが出た。
00:34:06.984958 00:aa:bb:cc:dd:10 > 33:33:ff:cc:dd:10, ethertype IPv6 (0x86dd), length 86: :: > ff02::1:ffcc:dd10: HBH ICMP6, multicast listener reportmax resp delay: 0 addr: ff02::1:ffcc:dd10, length 24 0x0000: 6000 0000 0020 0001 0000 0000 0000 0000 `............... 0x0010: 0000 0000 0000 0000 ff02 0000 0000 0000 ................ 0x0020: 0000 0001 ffcc dd10 3a00 0100 0502 0000 ........:....... 0x0030: 8300 c4e9 0000 0000 ff02 0000 0000 0000 ................ 0x0040: 0000 0001 ffcc dd10 ........
なぜにIPv6…
INET6 な kernel なので、インターフェイスが UP した瞬間にリンクローカルアドレスが付いて NDP を喋ってるからだ。
いやそれはわかるんだけど、nfsboot が出力しているはずの ARP パケットはなぜ出力されないのだろう。
§ § §
気分転換していたら気がついた。IPv6のNDPだけ出て、ARPが出ないのはパケット長のせいだった。
調べてみると、CRC含む64byte未満のセグメントは、リングバッファからDMA転送されて送信完了割り込みが来てMIBカウンタまで更新するものの、実際はパケットを出力していなかった。
padding 用のセグメントを bus_dmamem_alloc しておいて、足りないパケットにはパディングセグメントを付け足してやる。
ついでにいろいろ綺麗に書き直す。bus_dmamap_t は物理アドレスだけでなく論理アドレスもMIで保存してくれればいいのに。
来週は受信。
EOF