[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: please review the diff against SMC 91Cxx driver



先ほど subscribe した筒井です。

#なので引用が変なのはご容赦下さい。

> smc91c92を使っているmac68k用のNuBus NICのドライバーを書いた
> のですが、fragmented packetをうまく組み立てることができない
> ため、NFSが使えない状態です(netbsd,04650)。rloginなどは動き
> ます。

実物は持ってないのでテストはできないのですが、ちょっと気づいた点を。

> ○NuBus NICではSMC91C92のレジスターが不連続なアドレスに割り
> 当てられているため、dp8390.cを参考にreg_map[]を通してアクセ
> スするようにした

デバイスが不連続なアドレス割りつけを持つ時 bus_space(9) の
引数をどうするかって話ですが、 macppc の wdc サポートの時にも
tech-kern で議論になりました。

このときの結論としては、 atari のように bus_space(9) の
bus_space_tag 中に stride の値を設定して sparse な
アドレス空間を持つ bus の場合はそれを使う、ということになり、
最初提示した reg_map[] を使う案はボツになりました。

なので mac68k でも同じように bus_space(9) に stride の
support を追加するのが consistent な気がします。たぶん
MI wdc を使う場合にも必要だと思いますし。

dp8390.c の場合はアドレス間隔が違うだけでなく
アドレスの並びが逆になっているものがありますので、
(mac68k/nubus/if_ae_nubus.c の一部)
これは reg_map[] で対処しないとどうしようもないです。
#if_sm_nubus.c がどうなのかはわかりませんが。

> ○mac68kはbig endianなので、レジスターのアクセスにle16toh()、
> htole16()を使うようにした

endian の差異については bus_space(9) の中で吸収されるべきで、
bus_space(9) の入出力をさらに bswap するのはよろしくないでしょう。
MI のドライバ中で endian をひっくり返してるのは DMA bus master が
host の endian を無条件に仮定していてメモリ上に特定の endian で
データを用意する必要がある場合だけだと思います。

これも atari のように各 endian に対応する bus_space 関数群を
用意してやるのが正しい対処に思えます。
#macppc の場合は無条件に endian ひっくり返してますが……

ただ mac68k の場合、同じバスでもデバイスによって CPU バスとデバイスの
バスのビットの対応が違うという話も聞いているので簡単にはいかないの
かもしれません。
(if_sn_nubus.c を見ると上位 word と下位 word とを入れ換えてはいるが
 bus_space_{read,write}_2() についてはそのまま使っているように見える)

> ○起動時にNICのROMからMAC addressを読み込んでレジスターに書
> き込む機能を追加した

これってすべて MD 側に処理を移動してしまってもよい
ように見えますが、 MI に置いた方がよいでしょうか?
---
Izumi Tsutsui
tsutsui@ceres.dti.ne.jp