• Vladimir Oltean's avatar
    net: enetc: workaround for unresponsive pMAC after receiving express traffic · 5b7be2d4
    Vladimir Oltean authored
    I have observed an issue where the RX direction of the LS1028A ENETC pMAC
    seems unresponsive. The minimal procedure to reproduce the issue is:
    
    1. Connect ENETC port 0 with a loopback RJ45 cable to one of the Felix
       switch ports (0).
    
    2. Bring the ports up (MAC Merge layer is not enabled on either end).
    
    3. Send a large quantity of unidirectional (express) traffic from Felix
       to ENETC. I tried altering frame size and frame count, and it doesn't
       appear to be specific to either of them, but rather, to the quantity
       of octets received. Lowering the frame count, the minimum quantity of
       packets to reproduce relatively consistently seems to be around 37000
       frames at 1514 octets (w/o FCS) each.
    
    4. Using ethtool --set-mm, enable the pMAC in the Felix and in the ENETC
       ports, in both RX and TX directions, and with verification on both
       ends.
    
    5. Wait for verification to complete on both sides.
    
    6. Configure a traffic class as preemptible on both ends.
    
    7. Send some packets again.
    
    The issue is at step 5, where the verification process of ENETC ends
    (meaning that Felix responds with an SMD-R and ENETC sees the response),
    but the verification process of Felix never ends (it remains VERIFYING).
    
    If step 3 is skipped or if ENETC receives less traffic than
    approximately that threshold, the test runs all the way through
    (verification succeeds on both ends, preemptible traffic passes fine).
    
    If, between step 4 and 5, the step below is also introduced:
    
    4.1. Disable and re-enable PM0_COMMAND_CONFIG bit RX_EN
    
    then again, the sequence of steps runs all the way through, and
    verification succeeds, even if there was the previous RX traffic
    injected into ENETC.
    
    Traffic sent *by* the ENETC port prior to enabling the MAC Merge layer
    does not seem to influence the verification result, only received
    traffic does.
    
    The LS1028A manual does not mention any relationship between
    PM0_COMMAND_CONFIG and MMCSR, and the hardware people don't seem to
    know for now either.
    
    The bit that is toggled to work around the issue is also toggled
    by enetc_mac_enable(), called from phylink's mac_link_down() and
    mac_link_up() methods - which is how the workaround was found:
    verification would work after a link down/up.
    
    Fixes: c7b9e808 ("net: enetc: add support for MAC Merge layer")
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: default avatarJacob Keller <jacob.e.keller@intel.com>
    Link: https://lore.kernel.org/r/20230411192645.1896048-1-vladimir.oltean@nxp.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    5b7be2d4
enetc_ethtool.c 33.6 KB