[dpdk-dev] [RFC 13/14] szedata: use _rte_eth_link_update
Andrew Rybchenko
arybchenko at solarflare.com
Sun Jul 16 14:46:02 CEST 2017
On 07/14/2017 09:30 PM, Stephen Hemminger wrote:
> Yet another driver which was not returing correct value on
> link change.
>
> Signed-off-by: Stephen Hemminger <sthemmin at microsoft.com>
> ---
> drivers/net/szedata2/rte_eth_szedata2.c | 18 ++++++++----------
> 1 file changed, 8 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
> index 9c0d57cc14c0..b81ba8e79c64 100644
> --- a/drivers/net/szedata2/rte_eth_szedata2.c
> +++ b/drivers/net/szedata2/rte_eth_szedata2.c
> @@ -50,7 +50,6 @@
> #include <rte_memcpy.h>
> #include <rte_kvargs.h>
> #include <rte_dev.h>
> -#include <rte_atomic.h>
>
> #include "rte_eth_szedata2.h"
> #include "szedata2_iobuf.h"
> @@ -1171,9 +1170,7 @@ static int
> eth_link_update(struct rte_eth_dev *dev,
> int wait_to_complete __rte_unused)
> {
> - struct rte_eth_link link;
> - struct rte_eth_link *link_ptr = &link;
> - struct rte_eth_link *dev_link = &dev->data->dev_link;
> + struct rte_eth_link link, old;
> struct pmd_internals *internals = (struct pmd_internals *)
> dev->data->dev_private;
> const volatile struct szedata2_ibuf *ibuf;
> @@ -1195,8 +1192,12 @@ eth_link_update(struct rte_eth_dev *dev,
> break;
> }
>
> + _rte_eth_link_read(dev, &old);
> + memset(&link, 0, sizeof(link));
> +
> /* szedata2 uses only full duplex */
> link.link_duplex = ETH_LINK_FULL_DUPLEX;
> + link.link_autoneg = ETH_LINK_SPEED_FIXED;
See my comment for net/virtio patch. It is applicable here as well.
>
> for (i = 0; i < szedata2_ibuf_count; i++) {
> ibuf = ibuf_ptr_by_index(internals->pci_rsc, i);
> @@ -1210,14 +1211,11 @@ eth_link_update(struct rte_eth_dev *dev,
> }
> }
>
> - link.link_status = (link_is_up) ? ETH_LINK_UP : ETH_LINK_DOWN;
> + link.link_status = link_is_up ? ETH_LINK_UP : ETH_LINK_DOWN;
>
> - link.link_autoneg = ETH_LINK_SPEED_FIXED;
In fact, the bug was here before the patch.
> + _rte_eth_link_write(dev, &link);
>
> - rte_atomic64_cmpset((uint64_t *)dev_link, *(uint64_t *)dev_link,
> - *(uint64_t *)link_ptr);
> -
> - return 0;
> + return (old.link_status == link.link_status) ? -1 : 0;
> }
>
> static int
More information about the dev
mailing list