おせわになります。もう といいます。
今、当社設計RZカスタムボードにてLinuxを組み込もうとしています。
ポーティングマニュアルに従い、BSP1.3.0をポーティングし、Linuxはブートできているのですが、
pingコマンドにてWindowsPC-カスタムボード間LAN通信でパケットロスが10~20%ぐらい発生してしまいます。
RSKボードなど評価ボードと比較してLAN関連で異なる部品といえば、
・PHYがTI社のDP83848Kであること。
・PHYのアドレスが1番であること
ぐらいです。
パケットロスの原因を調査するため、Linuxイーサネットドライバのsh_eth.c(関数sh_eth_rx)を調べると
受信ディスクリプタRD0のRACT、RDLEが0のとき、
受信フレーム位置(RFP1、RFP2)が00となっており、
また、そのときRFEビットは0なのに、RFS9、RFS4のビットが1となっています。
(受信FIFOオーバフロー、端数ビットフレーム受信エラー)
RFS9、RFS4のビットが立っているため、フレーム異常として破棄されて
パケットロスとなっているみたいです。
ハード要因も疑いましたが、PHY-CPU間の通信波形には異常が見られずお手上げ状態です。
なにか調査すべき点、考えられる原因ありませんでしょうか?
まだ、未確認ですが、私の投稿したソースを見る限り、mdp->rx_desc_dma への代入を忘れていました。
- 1222 mdp->rx_ring = dma_alloc_coherent(NULL, rx_ringsize, &mdp->rx_desc_dma, - 1223 GFP_KERNEL); + BUG_ON(rx_ringsize > (16 * 64)); + mdp->rx_desc_dma = 0x20XXXXXX; + mdp->rx_ring = ioremap_nocache(mdp->rx_desc_dma, rx_ringsize);
これでは、全然、動かないです。申し訳ありません。
もう さん
上の修正したコードで、RSK ボードでの動作を確認しました。受信ディスクリプタは、0x209ff000 以降に割り当てています。
Welcome to Buildrootbuildroot login: root # cat /proc/iomem00000000-03ffffff : physmap-flash.1 00000000-03ffffff : physmap-flash.108000000-09ffffff : System RAM 08008000-0805ff5f : Kernel data18000000-1bffffff : physmap-flash.0 18000000-1bffffff : physmap-flash.0 ... (snip) # ping 192.168.0.253PING 192.168.0.253 (192.168.0.253): 56 data bytes64 bytes from 192.168.0.253: seq=0 ttl=128 time=0.000 ms64 bytes from 192.168.0.253: seq=1 ttl=128 time=0.000 ms ... (snip)64 bytes from 192.168.0.253: seq=25 ttl=128 time=0.000 ms64 bytes from 192.168.0.253: seq=26 ttl=128 time=0.000 ms --- 192.168.0.253 ping statistics ---27 packets transmitted, 27 packets received, 0% packet lossround-trip min/avg/max = 0.000/0.000/0.000 ms # ./mem r l 0x209ff000 0x410209ff000: b0000000 06100156 0927dea0 00000000209ff010: b0000000 0610003c 0927e5e0 00000000 ... (snip)209ff3e0: b0000000 06100000 0927d020 00000000209ff3f0: f0000000 06100000 0927d760 00000000209ff400: 63922f63 418775e1 24bca11e b1998f06#
大丈夫だと思いますので、これで試してみてください。
もう です。 RD1の32ビット境界の件、回答ありがとうございました。また、 わかりやすく説明いただきありがとうございました。 実用上は問題ないこと、了解いたしました。 でも、ハードウェアマニュアルに、「32ビット境界で指定」と書いてあるからには、 0x600(余裕を見るなら0x620)にすべきとは思うですが・・・・。 でも今回のエラーと関係なさそうですし深堀やめときます。