This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DP83867CR: Rx errors (RXDV_ER / reg 0x0015) only with particular Marvell PHY link partner

Part Number: DP83867CR

Hi,

Our design is based on a Zynq (Xilinx), Linux is running on the ARM, and MAC is implemented on the FPGA.

Our test: network trafic has 2 parts: test stream / dummy load stream
The test stream is under monitor, we check that we don't miss a frame. It's around 100Mbps.
The dummy stream can be set from 100Mbps of 64 bytes frames to 790Mbps of 1500 bytes frames.

The design is validated regarding this test with another of our board and with a few switches.

We have a lot of Rx errors with a particular switch (with a Marvell PHY, probably 88E1680).
Those errors are reported both on RXDV_ER pin and the 0x0015 register.
Amount of errors depends on the rate of the dummy traffic (a few errors per second at 790Mbps).
One more time, we don't see any error with another link partner.

We absolutely need to interface this particular switch.
According to this documentation: https://www.ti.com/lit/an/snla246b/snla246b.pdf?ts=1698646763397
it seems they are many DP83867CR's registers referenced as reserved to set up the PHY for a particular situation (short cable length for example).
Is there a documentation of those reserved registers ?
Did someone have a similar issue ?
Could you provide me with some help to address this issue ?

Thanks,
Francois

  • And of course the switch with the Marvell PHY passed our test when not connected to a DP83867CR.

  • Hi Francois,

    I would like to ask couple questions to understand your setup and provide some debug suggestion:

    Correct me if my miss understanding something on the setup:

    • FPGA <--> Marvell PHY <--> DP83867 <--> FPGA
      • FPGA is the one that generate and received the packet
      • Marvell PHY<-->  DP83867PHY at 100mbps auto negotiation mode
      • What MAC interface are you using between DP83867 and FPGA?
    • What is the length of cable and what type of cable are you using?
    • Are you able to see a link up in your system?
    • If possible, could you provide the register 0x0000 to 0x001F and 0x006E on DP83867?
    • If possible, could you probe RX_CLK, TX_CLK, and CLKOUT?

    --

    Thank you,

    Hillman Lin

  • Hi Hillman,

    Thank you for you help.

    The setup is a bit more complicated:
    FPGA + DP83867 <-> Switch with Marvell PHY <-> FPGA + DP83867
    Packets are generated and received by FPGAs.
    All at 1000Mbps, autoneg or fixed 1000Mbps in the switch
    The MAC interface is RGMII

    Our application require short cables considering the integration, but for now I use 5m Cat6 cables.

    The link is established without any problem.
    Rx errors start to appear only with the Marvell based switch and when the rate increases.
    If I replace the Marvell based switch by a cable or even by another switch, we don't have any Rx error with our test stream (100Mbps) + the stress stream (790Mbps)

    Here is a register dump I made earlier today:

    Reg Marvell switch Other Switch
    0x00
    0x01
    0x02
    0x03
    0x04
    0x05
    0x06
    0x07
    0x08
    0x09
    0x0a
    0x0b
    0x0c
    0x0d
    0x0e
    0x0f
    0x10
    0x11
    0x12
    0x13
    0x14
    0x15
    0x16
    0x17
    0x18
    0x19
    0x1a
    0x1b
    0x1c
    0x1d
    0x1e
    0x1f
    0x1140
    0x796d
    0x2000
    0xa231
    0x01e1
    0xc001
    0x006d
    0x2001
    0x6801
    0x0300
    0x3c00
    0x0000
    0x0000
    0x401f
    0x5668
    0x3000
    0x5048
    0xaf02
    0x0000
    0x0000
    0x29c7
    0x01cf
    0x0000
    0x0040
    0x6150
    0x4444
    0x0002
    0x0000
    0x0000
    0x0000
    0x0002
    0x0000
    0x1140
    0x796d
    0x2000
    0xa231
    0x01e1
    0xc1e1
    0x006d
    0x2001
    0x6801
    0x0300
    0x3800
    0x0000
    0x0000
    0x401f
    0x5668
    0x3000
    0x5048
    0xac22
    0x0000
    0x0000
    0x29c7
    0x0000
    0x0000
    0x0040
    0x6150
    0x4444
    0x0002
    0x0000
    0x0000
    0x0000
    0x0002
    0x0000

    I didn't save Reg 0x006E, I can do that after.

    So this shows the negotiation went well.
    At this time, the Marvell switch was fixed at 1000Mbps.
    The other switch has reversed polarity on D.
    I don't see anything that is a concern, except reg 0x0015.

    RX_CLK, TX_CLK, and CLKOUT was very ok last time I checked. But the RGMII interface is full validated now since we don't have any error on high bandwidth with anything but the Marvell switch.

  • In the mean time, I gave a closer look at this document:
    https://www.ti.com/lit/ahttps://www.ti.com/lit/an/snla246b/snla246b.pdf?ts=1698646763397n/snla246b/snla246b.pdf
    Section 3.8

    At first, I replaced the short cables I was using before by 5m Cat6 ones.
    It didn't change anything.

    So I gave a try to the register settings described in the app note:

    begin
    // Hard Reset
    001F 8000
    // Threshold for consecutive amount of Idle symbols for Viterbi Idle detector to assert Idle Mode
    set to 5
    0053 2054
    // CAGC DC Compensation Disable
    00EF 3840
    // Master Training Timers - increasing time in different training states
    0102 7477
    // Master Training Timers - increasing time in different training states
    0103 7777
    // Master Training Timers - increasing time in different training states
    0104 4577
    // Timing Loop Bandwidth
    010C 7777
    // Timing Loop Bandwidth
    01C2 7FDE
    // Slave Timers - increasing time in different training states
    0115 5555
    // Slave Timers - increasing time in different training states
    0118 0771
    // Timing Loop Bandwidth
    011D 6DB2
    // Timing Loop Bandwidth
    011E 3FFB
    // Timing Loop Bandwidth
    01C3 FFC6
    // Timing Loop Bandwidth
    01C4 0FC2
    // Timing Loop Bandwidth
    01C5 0FF0
    // FFE Fix
    012C 0E81
    // Soft Reset
    001F 4000
    end

    More tests have to be done but it seems to solve the Rx errors issue, but still with 5m Cat6 cables.

    This is too much magic to accept it as a solution without a better understanding of what is happening.
    Could you please (or someone closer to this specific short cable issue) give an explanation on what those settings are doing?
    And why a solution for short cables (smaller than 1m) can fix an issue with 5m cables ?

  • Hi Francois,

    Thank you for your response.

    • If my understanding is correct, using the CAT 6 cable less than 5m still see an RX_Error after programming the short cable script?
    • If possible, could you send me the schematic around the MDI traces or cable send to see if there is an variation in between?

    Meanwhile, I will look at the register description and provide you feedback after review with the team.

    --

    Regards,

    Hillman Lin

  • Hi Hillman,

    I just started a test with a very small cable (0.25m) and with the script. It does work without Rx error for now. We need a longer test but there is a big improvement already.
    So the result is the same than the 5m cable with the script.

    What I can't understand now is:
    - Why a 5m cable doesn't fix the issue with this particular partner PHY ?
    - What is the meaning of those magic values in the script ?

    Regards,

    Francois

  • Meanwhile, I will look at the register description and provide you feedback after review with the team.

    Thank you very much for that. I'm looking forward your feedback.

  • Hi Francois,

    If possible, could you also share the register 0x006E information and schematic around RJ45 connector portion to double check on the connection.

    I take a look on the register 0x0005, I see that for the Marvell PHY < -- > 867PHY condition. we are seeing link partner (867 PHY) no supporting 100mbps. This is an unusual behavior because you are able to see a link up but 867PHY is not supporting 100mbps speed so it shouldn't link up at 100mbps.

    Based on the register 0x000A, I am seeing that the PHY is still link up in 1000mbps. May I ask how did you link up at 100mbps with 867PHY in your case? What would be the register dump when you are linking up at 100mbps and seeing the RX_ER?

    Correct me if I misunderstand your concern,

    • Link up between Marvell and 867PHY in 1000mbps you are not seeing RX_ER between the communication
    • Link up between Marvell and 867PHY in 100mbps you are seeing RX_ER behavior

    Is my conclusion correct?

    --

    Thank you,

    Hillman Lin

  • Hi Hillman,

    If possible, could you also share the register 0x006E information

    Value is 0x0005 as expected (id is fixed to 5).

    The schematic is drawn such a way that I can't show publicly that part because it would show other parts that we don't want to share.
    We use Bourns SM51625EL transformers with 0.1uF from PHY's side center tap to ground, and the following center tap schematic at the connector side:

    I take a look on the register 0x0005, I see that for the Marvell PHY < -- > 867PHY condition. we are seeing link partner (867 PHY) no supporting 100mbps. This is an unusual behavior because you are able to see a link up but 867PHY is not supporting 100mbps speed so it shouldn't link up at 100mbps.

    As I said yesterday, we fixed the Marvell based switch to 1000M for application purpose. We want to be sure it can negotiate only at this speed.

    • Link up between Marvell and 867PHY in 1000mbps you are not seeing RX_ER between the communication
    • Link up between Marvell and 867PHY in 100mbps you are seeing RX_ER behavior

    Still not.
    We don't use 100M Ethernet at all. 100Mbps is the bandwidth of our test stream. And it is sent together with a 790Mbps bandwidth perturbation stream.
    At the end 890Mbps can't fit in a 100M eth anyway.

    Our problem is: we see RX_ER when we have a Marvell PHY as a link partner.

    Regards,
    Francois

  • Our problem is fixed when we apply the script documented in the www.ti.com/lit/an/snla246b/snla246b.pdf doc section 3.8.

    What we need to know is:

    1. What is the magic behind those undocumented registers?
    2. This app note is for cables shorter than 1m. Is it safe to use it on longer cables?

    Regards,
    Francois

  • Hi Francois,

    Glad that this script solve the problem.

    There is no disadvantage with the script you wrote in the debug Appnote. This scripts should also work with the cable longer than 1m. 

    --

    Regards,

    Hillman Lin

  • Hi Hillman,

    Ok, but we can not take a magic solution for another problem as a solution for our problem without further information.

    Moreover, we did have an RX_ER last night. It improves a lot, but it doesn't completely fix our problem.

    Regards,
    Francois

  • I confirm that the link partner PHY is a Marvell 88E1680-LKJ2.
    We only have the RX_ER problem on the DP83867CR with this PHY as a link partner.

    Regards,
    Francois

  • Hi Francois,

    Could we also discuss this issue in the email? We still want to confirm on the schematic everything is good on the MDI lines. I did a friend request on E2E Forum. I will send you the email privately after you accept the friend request.

    Regarding to the short cable script, it is an errata on our DP83867PHY and we recommend customer to always write this script when they are using short cable application.

    --

    Regards,

    Hillman Lin

  • Hi Hillman,

    I rearranged our schematic to show only the PHY and MDI part. Here it is:

    PHY_MDI.pdf

    Regards,
    Frnacois

  • Hi,

    It turns out that the write to 0x0053 (from the short cable script) alone is enough to fix the RX_ER problem when linked to a 88E1680 link partner.

    This one is documented:
    Viterbi Detector Idle Count Threshold
    Threshold for consecutive amount of Idle symbols for Viterbi Idle
    detector to assert Idle Mode.
    Default value 0x5 is for IPG >= 12. Set this field to 0x4: for IPG < 12.
    Please verify new register settings through system level tests if this
    field is changed.

    As I understand it, writing 0x2054 (that the short cable script does) disables the InterPacket Gap check.
    It seems that either the 88E1680 PHY or the MAC associated to it doesn't follow the InterPacket Gap length of minimum 12 rule. Disabling the IPG check in the DP83867 does fix the RX_ER issue.

    Regards,
    Francois