[ TOP | Recently ]

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