1999-07-17 packet transmission
やっと packet が出せるようになった...一週間もかかった...。むー。
DP83932 は Packet Desctiptor Area を使って packet を送受信する。
構造は
┌─────────┘ └→┌─────┐ │ status │ │ frag_cnt │ │ pkt_size │ │ : │ │ ptr ───→ packet の中身を指す ptr │ link ───┐ └─────┘ │ ┌─────────┘ └→┌─────┐ │ status │ │ frag_cnt │ │ pkt_size │ │ : │ │ ptr ───→ packet の中身を指す ptr │ link ───┐ └─────┘ │
のようになっている。かなり端折ってるけど。
で、これが ring になってて、End Of Link を指定して、
どっからどこまで送れとか、そんな風になっている。
DP8390(NE2000) の RING BUFFER 部分が、更に programmable になった感じ。
(X68000 の DMA Link Array Chain にも似てるね)。
これを使えば mbuf chain で保持されてるパケットも一発で送れる...
はずだが、if_sn.c はそこまではやっていなかった。
常に frag_cnt = 1 として、
mbuf を連続領域に bcopy してから送る。
まぁ、いろいろ問題があるからいいんだけど。
NEWS-OS もそうみたいだし...。
#うまく書けば bcopy 使わなくて済むと思うんだけどな
で、ポインタの類は当然物理アドレスで SONIC に教えてやらなければいけないのだが、
どうやら NEWS5000 はメインメモリ領域は SONIC から見えないらしく、
SONIC 用の packet descriptor/packet buffer用のメモリが用意されていて、そこを使う。
つまり NEWS5000 の EtherBoard は「MACROM + DP83930 + MEMORY」で一つのデバイスとなっているわけだ。
で、packet data もそのメモリ領域からしか送受信できない。
つまり絶対に、一旦 mbuf からそこへ bcopy しなければならない。
で、さらにサイズは 32kbyte。
#arch/pica/dev/if_sn.c も hardwire って書いてるからそういうハードウェアを
#してるのかと思ったけど、こっちは単に手抜きなだけらしい?
arch/mac68k/dev/if_sn.c にはそんな制限ないので、
当然 attach の際に descriptor/buffer 用のメモリを alloc し、
その領域を cache disable にし、
DP83932 にはその領域の physical address な pointer を渡している。
さらに NBPG 境界には desctiptor とか packet buffer がまたがないようにしたり、
それはそれで余計な気を使わなきゃいけなかったりするんだけど。
その代わりメモリ使う量は自由だよな。もちろん 32kbyte 以上メモリを使っている、
だから最初は arch/mac68k/dev/if_sn.c を適当に手直しして使おうと思ったのだが、
上のような障壁がいろいろあって、そのまま持ってくるのはやっぱり面倒...なのでパス。
そんなわけで、descriptor/buffer まわり大幅に書き直しつつも、
cut & paste でツギハギして作る。
が、動かん...う〜ん...
* * *
3〜4日ちまちまデバグしてみる。
* * *
で、なかなか動かなかったんだけど、なんとか
送信は完璧にできるようになった。おぉ〜〜。
というわけで記念に log っておこう。:D
(attach/kernel / attach/tcpdump)
次は割り込みと受信。また時間かかりそうな...
EOF