[ TOP | Recently ]

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