Hi Russell,

On Mon, Jun 29 2020, Russell King - ARM Linux admin wrote:
> On Sun, Jun 28, 2020 at 10:04:51AM +0300, Baruch Siach wrote:
>> When the hardware MACTYPE hardware configuration pins are set to "XFI
>> with Rate Matching" the PHY interface operate at fixed 10Gbps speed. The
>> MAC buffer packets in both directions to match various wire speeds.
>> 
>> Read the MAC Type field in the Port Control register, and set the MAC
>> interface speed accordingly.
>> 
>> Signed-off-by: Baruch Siach <bar...@tkos.co.il>
>> ---
>> v2: Move rate matching state read to config_init (RMK)
>
> Not quite what I was after, but it'll do for now.

Thanks for you review.

> My only system which has a 3310 PHY and is configured for rate matching
> (using an XAUI interface, mode 1) seems to be sick - the 3310 no longer
> correctly negotiates on the media side (will only link at 100M/Half and
> only passes traffic in one direction), which makes any development with
> it rather difficult.  Either the media side drivers have failed or the
> magnetics.
>
> I was also hoping for some discussion, as I bought up a few points
> about the 3310's rate matching - unless you have the version with
> MACsec, the PHY expects the host side to rate limit the egress rate to
> the media rate and will _not_ send pause frames.  If you have MACsec,
> and the MACsec hardware is enabled (although may not be encrypting),
> then the PHY will send pause frames to the host as the internal buffer
> fills.

Flow control is disabled anyway in my use case (vpp).

> Then there's the whole question of what phydev->speed etc should be set
> to - the media speed or the host side link speed with the PHY, and then
> how the host side should configure itself.  At least the 88E6390x
> switch will force itself to the media side speed using that while in
> XAUI mode, resulting in a non-functioning speed.  So should the host
> side force itself to 10G whenever in something like XAUI mode?

How does the switch discover the media side speed? Is there some sort of
in-band information exchange?

> What do we do about the egress rate - ignore that statement and hope
> that the 3310 doesn't create bad packets on the wire if we fill up its
> internal buffer?

I will keep that in mind when stress testing the network. We might need
a way to set IPG on the MAC side if the MAC supports that (mvpp2 in this
case).

baruch

>>  drivers/net/phy/marvell10g.c | 22 ++++++++++++++++++++++
>>  1 file changed, 22 insertions(+)
>> 
>> diff --git a/drivers/net/phy/marvell10g.c b/drivers/net/phy/marvell10g.c
>> index d4c2e62b2439..a7610eb55f30 100644
>> --- a/drivers/net/phy/marvell10g.c
>> +++ b/drivers/net/phy/marvell10g.c
>> @@ -80,6 +80,8 @@ enum {
>>      MV_V2_PORT_CTRL         = 0xf001,
>>      MV_V2_PORT_CTRL_SWRST   = BIT(15),
>>      MV_V2_PORT_CTRL_PWRDOWN = BIT(11),
>> +    MV_V2_PORT_MAC_TYPE_MASK = 0x7,
>> +    MV_V2_PORT_MAC_TYPE_RATE_MATCH = 0x6,
>>      /* Temperature control/read registers (88X3310 only) */
>>      MV_V2_TEMP_CTRL         = 0xf08a,
>>      MV_V2_TEMP_CTRL_MASK    = 0xc000,
>> @@ -91,6 +93,7 @@ enum {
>>  
>>  struct mv3310_priv {
>>      u32 firmware_ver;
>> +    bool rate_match;
>>  
>>      struct device *hwmon_dev;
>>      char *hwmon_name;
>> @@ -458,7 +461,9 @@ static bool mv3310_has_pma_ngbaset_quirk(struct 
>> phy_device *phydev)
>>  
>>  static int mv3310_config_init(struct phy_device *phydev)
>>  {
>> +    struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev);
>>      int err;
>> +    int val;
>>  
>>      /* Check that the PHY interface type is compatible */
>>      if (phydev->interface != PHY_INTERFACE_MODE_SGMII &&
>> @@ -475,6 +480,12 @@ static int mv3310_config_init(struct phy_device *phydev)
>>      if (err)
>>              return err;
>>  
>> +    val = phy_read_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL);
>> +    if (val < 0)
>> +            return val;
>> +    priv->rate_match = ((val & MV_V2_PORT_MAC_TYPE_MASK) ==
>> +                    MV_V2_PORT_MAC_TYPE_RATE_MATCH);
>> +
>>      /* Enable EDPD mode - saving 600mW */
>>      return mv3310_set_edpd(phydev, ETHTOOL_PHY_EDPD_DFLT_TX_MSECS);
>>  }
>> @@ -581,6 +592,17 @@ static int mv3310_aneg_done(struct phy_device *phydev)
>>  
>>  static void mv3310_update_interface(struct phy_device *phydev)
>>  {
>> +    struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev);
>> +
>> +    /* In "XFI with Rate Matching" mode the PHY interface is fixed at
>> +     * 10Gb. The PHY adapts the rate to actual wire speed with help of
>> +     * internal 16KB buffer.
>> +     */
>> +    if (priv->rate_match) {
>> +            phydev->interface = PHY_INTERFACE_MODE_10GBASER;
>> +            return;
>> +    }
>> +
>>      if ((phydev->interface == PHY_INTERFACE_MODE_SGMII ||
>>           phydev->interface == PHY_INTERFACE_MODE_2500BASEX ||
>>           phydev->interface == PHY_INTERFACE_MODE_10GBASER) &&
>> -- 
>> 2.27.0
>> 
>> 


-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - bar...@tkos.co.il - tel: +972.52.368.4656, http://www.tkos.co.il -

Reply via email to