Hi Zhang, Qi Z / Zhao1, Wei,

Thanks for your comments.

I will try to submit this week a new pachset based on your 
recommandation (check LPBK feature depending of the model + disable the 
bit in the PHY register)

Best regards,
Julien Meunier

On 08/01/2019 13:39, Zhang, Qi Z wrote:
> 
> 
>> -----Original Message-----
>> From: Zhao1, Wei
>> Sent: Tuesday, January 8, 2019 6:10 PM
>> To: Meunier, Julien (Nokia - FR/Paris-Saclay) <julien.meun...@nokia.com>;
>> Zhang, Qi Z <qi.z.zh...@intel.com>; Ananyev, Konstantin
>> <konstantin.anan...@intel.com>; Lu, Wenzhuo <wenzhuo...@intel.com>
>> Cc: dev@dpdk.org
>> Subject: RE: [dpdk-dev] [PATCH] net/ixgbe: add support of loopback for
>> X540/X550
>>
>> Hi,  Meunier, Julien
>>
>>> -----Original Message-----
>>> From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Meunier, Julien
>>> (Nokia - FR/Paris-Saclay)
>>> Sent: Monday, January 7, 2019 11:53 PM
>>> To: Zhang, Qi Z <qi.z.zh...@intel.com>; Ananyev, Konstantin
>>> <konstantin.anan...@intel.com>; Lu, Wenzhuo <wenzhuo...@intel.com>
>>> Cc: dev@dpdk.org
>>> Subject: Re: [dpdk-dev] [PATCH] net/ixgbe: add support of loopback for
>>> X540/X550
>>>
>>> Hi,
>>>
>>> Mmm, you're right. However, as like for the 82599, the pmd skips the
>>> link configuration, so, it should not enable the autoneg.
>>>
>>> During my tests, I had a 10G connectivity, and I didn't notice any
>>> problem. I used the DPDK application "test", with the test 
>>> pmd_perf_autotest.
>>
>> It seems you are right, autoneg is done in function of 
>> ixgbe_setup_link()->........ ()
>> which call function
>> ixgbe_setup_phy_link_speed_generic()->ixgbe_setup_phy_link ()->
>> ixgbe_setup_phy_link_generic (),  do the work for Auto-Negotiation,  but pmd
>> code skip it.
>> But the bit C of Address 7.0 is initialized as 1 by default in datasheet,  
>> what pmd
>> code skip is just the Process of Auto-Negotiation, because we skip code of 
>> bellow
>> In ixgbe_setup_phy_link_generic (), not disable bit 7.0.c.
>> So, you had better disable 7.0.c bit when mac loopback is enable.
>>
>> "
>>      /* Restart PHY auto-negotiation. */
>>      hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
>>                           IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
>>
>>      autoneg_reg |= IXGBE_MII_RESTART;
>>
>>      hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
>>                            IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg); "
>>
>>
> 
> So, looks like PMD will not touch autoneg bit by default and we should not 
> expected this bit always be on or off, because it can be changed by kernel 
> driver before bind to dpdk.
> 
> probably a better solution could be
> 
> during dev_start if loopback is required, we disable the bit to make sure 
> loopback works and remember its original status, and during dev_stop we do 
> roll back if necessary
> 
> what do you think?
> 
> 
>>> Should I need to modify my code to be sure that autoneg is disabled
>>> (and force it to 10G) ?
>>>
>>> Thanks,
>>> Best regards,
>>> Julien Meunier
>>>
>>> On 07/01/2019 07:53, Zhang, Qi Z wrote:
>>>>
>>>>
>>>>> -----Original Message-----
>>>>> From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Julien Meunier
>>>>> Sent: Thursday, January 3, 2019 12:01 AM
>>>>> To: Ananyev, Konstantin <konstantin.anan...@intel.com>; Lu, Wenzhuo
>>>>> <wenzhuo...@intel.com>
>>>>> Cc: dev@dpdk.org
>>>>> Subject: [dpdk-dev] [PATCH] net/ixgbe: add support of loopback for
>>>>> X540/X550
>>>>>
>>>>> Loopback mode is also supported on X540 and X550 NICs, according to
>>>>> their datasheet (section 15.2). The way to set it up is a little
>>>>> different of
>>> the 82599.
>>>>
>>>> Thanks for enable this.
>>>>
>>>> one question is, Datasheet also mentioned that auto negotiation
>>>> should be disabled but I didn't see any related change with it.
>>>>
>>>> Would you share more insight on this?
>>>>
>>>>>
>>>>> Signed-off-by: Julien Meunier <julien.meun...@nokia.com>
>>>>> ---
>>>>>    drivers/net/ixgbe/ixgbe_ethdev.c | 10 ++++++---
>>>>> drivers/net/ixgbe/ixgbe_ethdev.h |  5 ++---
>>>>>    drivers/net/ixgbe/ixgbe_rxtx.c   | 47
>>>>> ++++++++++++++++++++++++++++++++++------
>>>>>    3 files changed, 49 insertions(+), 13 deletions(-)
>>>>>
>>>>> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c
>>>>> b/drivers/net/ixgbe/ixgbe_ethdev.c
>>>>> index 7493110..7eb3303 100644
>>>>> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
>>>>> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
>>>>> @@ -2652,9 +2652,13 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
>>>>>                   goto error;
>>>>>           }
>>>>>
>>>>> - /* Skip link setup if loopback mode is enabled for 82599. */
>>>>> - if (hw->mac.type == ixgbe_mac_82599EB &&
>>>>> -                 dev->data->dev_conf.lpbk_mode ==
>>> IXGBE_LPBK_82599_TX_RX)
>>>>> + /* Skip link setup if loopback mode is enabled. */
>>>>> + if ((hw->mac.type == ixgbe_mac_82599EB ||
>>>>> +      hw->mac.type == ixgbe_mac_X540 ||
>>>>> +      hw->mac.type == ixgbe_mac_X550 ||
>>>>> +      hw->mac.type == ixgbe_mac_X550EM_x ||
>>>>> +      hw->mac.type == ixgbe_mac_X550EM_a) &&
>>>>> +                 dev->data->dev_conf.lpbk_mode ==
>>> IXGBE_LPBK_TX_RX)
>>>>>                   goto skip_link_setup;
>>>>>
>>>>>           if (ixgbe_is_sfp(hw) && hw->phy.multispeed_fiber) { diff --git
>>>>> a/drivers/net/ixgbe/ixgbe_ethdev.h
>>> b/drivers/net/ixgbe/ixgbe_ethdev.h
>>>>> index 565c69c..c60a697 100644
>>>>> --- a/drivers/net/ixgbe/ixgbe_ethdev.h
>>>>> +++ b/drivers/net/ixgbe/ixgbe_ethdev.h
>>>>> @@ -65,9 +65,8 @@
>>>>>    #define IXGBE_QUEUE_ITR_INTERVAL_DEFAULT       500 /* 500us */
>>>>>
>>>>>    /* Loopback operation modes */
>>>>> -/* 82599 specific loopback operation types */
>>>>> -#define IXGBE_LPBK_82599_NONE   0x0 /* Default value. Loopback is
>>> disabled.
>>>>> */
>>>>> -#define IXGBE_LPBK_82599_TX_RX  0x1 /* Tx->Rx loopback operation
>>>>> is enabled. */
>>>>> +#define IXGBE_LPBK_NONE   0x0 /* Default value. Loopback is disabled.
>>> */
>>>>> +#define IXGBE_LPBK_TX_RX  0x1 /* Tx->Rx loopback operation is
>>> enabled.
>>>>> +*/
>>>>>
>>>>>    #define IXGBE_MAX_JUMBO_FRAME_SIZE      0x2600 /* Maximum
>>> Jumbo
>>>>> frame size. */
>>>>>
>>>>> diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c
>>>>> b/drivers/net/ixgbe/ixgbe_rxtx.c index 9a79d18..0ef7fdf 100644
>>>>> --- a/drivers/net/ixgbe/ixgbe_rxtx.c
>>>>> +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
>>>>> @@ -4879,10 +4879,14 @@ ixgbe_dev_rx_init(struct rte_eth_dev *dev)
>>>>>                   hlreg0 &= ~IXGBE_HLREG0_JUMBOEN;
>>>>>
>>>>>           /*
>>>>> -  * If loopback mode is configured for 82599, set LPBK bit.
>>>>> +  * If loopback mode is configured, set LPBK bit.
>>>>>            */
>>>>> - if (hw->mac.type == ixgbe_mac_82599EB &&
>>>>> -                 dev->data->dev_conf.lpbk_mode ==
>>> IXGBE_LPBK_82599_TX_RX)
>>>>> + if ((hw->mac.type == ixgbe_mac_82599EB ||
>>>>> +      hw->mac.type == ixgbe_mac_X540 ||
>>>>> +      hw->mac.type == ixgbe_mac_X550 ||
>>>>> +      hw->mac.type == ixgbe_mac_X550EM_x ||
>>>>> +      hw->mac.type == ixgbe_mac_X550EM_a) &&
>>>>> +                 dev->data->dev_conf.lpbk_mode ==
>>> IXGBE_LPBK_TX_RX)
>>>>>                   hlreg0 |= IXGBE_HLREG0_LPBK;
>>>>>           else
>>>>>                   hlreg0 &= ~IXGBE_HLREG0_LPBK;
>>>>> @@ -5088,6 +5092,29 @@ ixgbe_setup_loopback_link_82599(struct
>>>>> ixgbe_hw
>>>>> *hw)
>>>>>           msec_delay(50);
>>>>>    }
>>>>>
>>>>> +/*
>>>>> + * Set up link loopback for X540 / X550 mode Tx->Rx.
>>>>> + */
>>>>> +static inline void __attribute__((cold))
>>>>> +ixgbe_setup_loopback_link_x540_x550(struct ixgbe_hw *hw) {
>>>>> + uint32_t macc;
>>>>> + PMD_INIT_FUNC_TRACE();
>>>>> +
>>>>> + /* datasheet 15.2.1: MACC.FLU = 1 (force link up) */
>>>>> + macc = IXGBE_READ_REG(hw, IXGBE_MACC);
>>>>> + macc |= IXGBE_MACC_FLU;
>>>>> + IXGBE_WRITE_REG(hw, IXGBE_MACC, macc);
>>>>> +
>>>>> + /* Restart link */
>>>>> + IXGBE_WRITE_REG(hw,
>>>>> +                 IXGBE_AUTOC,
>>>>> +                 IXGBE_AUTOC_LMS_10G_LINK_NO_AN |
>>> IXGBE_AUTOC_FLU);
>>>>> +
>>>>> + hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM);
>>>>> + msec_delay(50);
>>>>> +}
>>>>> +
>>>>>
>>>>>    /*
>>>>>     * Start Transmit and Receive Units.
>>>>> @@ -5148,10 +5175,16 @@ ixgbe_dev_rxtx_start(struct rte_eth_dev
>>> *dev)
>>>>>           rxctrl |= IXGBE_RXCTRL_RXEN;
>>>>>           hw->mac.ops.enable_rx_dma(hw, rxctrl);
>>>>>
>>>>> - /* If loopback mode is enabled for 82599, set up the link accordingly
>>> */
>>>>> - if (hw->mac.type == ixgbe_mac_82599EB &&
>>>>> -                 dev->data->dev_conf.lpbk_mode ==
>>> IXGBE_LPBK_82599_TX_RX)
>>>>> -         ixgbe_setup_loopback_link_82599(hw);
>>>>> + /* If loopback mode is enabled, set up the link accordingly */
>>>>> + if (dev->data->dev_conf.lpbk_mode == IXGBE_LPBK_TX_RX) {
>>>>> +         if (hw->mac.type == ixgbe_mac_82599EB)
>>>>> +                 ixgbe_setup_loopback_link_82599(hw);
>>>>> +         else if (hw->mac.type == ixgbe_mac_X540 ||
>>>>> +              hw->mac.type == ixgbe_mac_X550 ||
>>>>> +              hw->mac.type == ixgbe_mac_X550EM_x ||
>>>>> +              hw->mac.type == ixgbe_mac_X550EM_a)
>>>>> +                 ixgbe_setup_loopback_link_x540_x550(hw);
>>>>> + }
>>>>>
>>>>>    #ifdef RTE_LIBRTE_SECURITY
>>>>>           if ((dev->data->dev_conf.rxmode.offloads &
>>>>> --
>>>>> 2.10.2
>>>>

Reply via email to