LinuxBSP1.3.0でのLAN通信

おせわになります。もう といいます。

 

今、当社設計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 Buildroot
    buildroot login: root
    # cat /proc/iomem
    00000000-03ffffff : physmap-flash.1
    00000000-03ffffff : physmap-flash.1
    08000000-09ffffff : System RAM
    08008000-0805ff5f : Kernel data
    18000000-1bffffff : physmap-flash.0
    18000000-1bffffff : physmap-flash.0
       ... (snip)
    # ping 192.168.0.253
    PING 192.168.0.253 (192.168.0.253): 56 data bytes
    64 bytes from 192.168.0.253: seq=0 ttl=128 time=0.000 ms
    64 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 ms
    64 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 loss
    round-trip min/avg/max = 0.000/0.000/0.000 ms
    # ./mem r l 0x209ff000 0x410
    209ff000: b0000000 06100156 0927dea0 00000000
    209ff010: b0000000 0610003c 0927e5e0 00000000
       ... (snip)
    209ff3e0: b0000000 06100000 0927d020 00000000
    209ff3f0: f0000000 06100000 0927d760 00000000
    209ff400: 63922f63 418775e1 24bca11e b1998f06
    #

    大丈夫だと思いますので、これで試してみてください。

  • どうもありがとうございます。
    もう です。
    教えていただいたコードで試したら、RD0のエラーは出なくなり、正常に通信できるようになりました。
    内蔵RAMならうまくいきます。
    それで、やはりSD-RAMのバスステートコントローラ設定(CS3を使用しています)を疑い、
    設定を変えてみると、

    CS3BCRの設定を、0x30004E00 (IWWを4アイドルサイクル/SD-RAM32ビットバス設定)

    にすると、エラーが出なくなりました。(もともとは0x00004E00と設定)
    0x20004E00にすると再びエラーが出ます。
    アイドルサイクルは全て不要と思っていたのですが、
    当社ボードでは、ライト-リード/ライトサイクル間アイドルが4サイクル以上ないと、
    E-DMACでのSD-RAM書き込みがおかしくなるということになります。

    SD-RAMは、MICRON社製のMT48LC16M16A2P-6AITGを使用しています。

    RSK用コードを見ると、アイドルサイクルなし(0x00004C00)で設定されています。
    当社ボード使用の上記SD-RAMとスペック的には大きな違いはないように見えるのですが、
    なぜ、IWWアイドルサイクルが必要になると思われますか?
    なぜ、E-DMAC使用時のみエラー発生するのでしょう?
    (DMAの書き込みは通常とは異なるのですか?)

    回路図ないので、なんともいえないとは思います。すいません。
    一般的な話でも結構です。

    今、エラーが発生しない状況で、SD-RAM関係の設定値は

    #define CS3BCR_D 0x30004E00  ← もともとは、0x00004E00としていました。
    #define CS3WCR_D 0x00004912

    #define SDCR_D 0x00110811
    #define RTCOR_D 0xA55A0060
    #define RTCSR_D 0xA55A0008

    となっています。
    よろしくお願いいたします。
  • もう です。
    RD1の32ビット境界の件、回答ありがとうございました。
    また、 わかりやすく説明いただきありがとうございました。
    実用上は問題ないこと、了解いたしました。

    でも、ハードウェアマニュアルに、「32ビット境界で指定」と書いてあるからには、
    0x600(余裕を見るなら0x620)にすべきとは思うですが・・・・。
    でも今回のエラーと関係なさそうですし深堀やめときます。