[dpdk-dev,RFC,13/14] szedata: use _rte_eth_link_update

Message ID 20170714183027.16021-14-stephen@networkplumber.org (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail Compilation issues

Commit Message

Stephen Hemminger July 14, 2017, 6:30 p.m. UTC
  Yet another driver which was not returing correct value on
link change.

Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
---
 drivers/net/szedata2/rte_eth_szedata2.c | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)
  

Comments

Andrew Rybchenko July 16, 2017, 12:46 p.m. UTC | #1
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@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
  

Patch

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;
 
 	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;
+	_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