From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yong Wang Subject: Re: [PATCH 4/7] vmxnet3: fix link state handling Date: Wed, 11 Feb 2015 02:24:27 +0000 Message-ID: References: <1418793196-17953-1-git-send-email-stephen@networkplumber.org> <1418793196-17953-5-git-send-email-stephen@networkplumber.org> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Cc: Stephen Hemminger To: Stephen Hemminger , "dev-VfR2kkLFssw@public.gmane.org" Return-path: In-Reply-To: <1418793196-17953-5-git-send-email-stephen-OTpzqLSitTUnbdJkjeBofR2eb7JE58TQ@public.gmane.org> Content-Language: en-US Content-ID: <20E30E1CBF9588438FDAE150E2395836-xOhs/FgTdIXLi+/K9TH57EEOCMrvLtNR@public.gmane.org> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces-VfR2kkLFssw@public.gmane.org Sender: "dev" On 12/16/14, 9:13 PM, "Stephen Hemminger" wrote: >From: Stephen Hemminger > >This patch is a bugfx. > >The Intel version of VMXNET3 driver does not handle link state properly. >The VMXNET3 API returns 1 if connected and 0 if disconnected. >Also need to return correct value to indicate state change. > >Signed-off-by: Stephen Hemminger >--- Acked-by: Yong Wang One nit below: > lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c | 53 >+++++++++++++++++++++++---------- > 1 file changed, 38 insertions(+), 15 deletions(-) > >diff --git a/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c >b/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c >index 4947c78..7afb43f 100644 >--- a/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c >+++ b/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c >@@ -157,9 +157,36 @@ gpa_zone_reserve(struct rte_eth_dev *dev, uint32_t >size, > * - On success, zero. > * - On failure, negative value. > */ >-static inline int >-rte_vmxnet3_dev_atomic_write_link_status(struct rte_eth_dev *dev, >- struct rte_eth_link *link) >+ >+static int >+vmxnet3_dev_atomic_read_link_status(struct rte_eth_dev *dev, >+ struct rte_eth_link *link) >+{ >+ struct rte_eth_link *dst =3D link; >+ struct rte_eth_link *src =3D &(dev->data->dev_link); >+ >+ if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst, >+ *(uint64_t *)src) =3D=3D 0) >+ return -1; >+ >+ return 0; >+} >+ >+/** >+ * Atomically writes the link status information into global >+ * structure rte_eth_dev. >+ * >+ * @param dev >+ * - Pointer to the structure rte_eth_dev to read from. "to write to" here. >+ * - Pointer to the buffer to be saved with the link status. >+ * >+ * @return >+ * - On success, zero. >+ * - On failure, negative value. >+ */ >+static int >+vmxnet3_dev_atomic_write_link_status(struct rte_eth_dev *dev, >+ struct rte_eth_link *link) > { > struct rte_eth_link *dst =3D &(dev->data->dev_link); > struct rte_eth_link *src =3D link; >@@ -576,7 +603,7 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev) >=20 > /* Clear recorded link status */ > memset(&link, 0, sizeof(link)); >- rte_vmxnet3_dev_atomic_write_link_status(dev, &link); >+ vmxnet3_dev_atomic_write_link_status(dev, &link); > } >=20 > /* >@@ -658,28 +685,24 @@ static int > vmxnet3_dev_link_update(struct rte_eth_dev *dev, __attribute__((unused)) >int wait_to_complete) > { > struct vmxnet3_hw *hw =3D dev->data->dev_private; >- struct rte_eth_link link; >+ struct rte_eth_link old, link; > uint32_t ret; >=20 >+ memset(&link, 0, sizeof(link)); >+ vmxnet3_dev_atomic_read_link_status(dev, &old); >+ > VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, VMXNET3_CMD_GET_LINK); > ret =3D VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_CMD); >=20 >- if (!ret) { >- PMD_INIT_LOG(ERR, "Link Status Negative : %s()", __func__); >- return -1; >- } >- > if (ret & 0x1) { > link.link_status =3D 1; > link.link_duplex =3D ETH_LINK_FULL_DUPLEX; > link.link_speed =3D ETH_LINK_SPEED_10000; >- >- rte_vmxnet3_dev_atomic_write_link_status(dev, &link); >- >- return 0; > } >=20 >- return -1; >+ vmxnet3_dev_atomic_write_link_status(dev, &link); >+ >+ return (old.link_status =3D=3D link.link_status) ? -1 : 0; > } >=20 > /* Updating rxmode through Vmxnet3_DriverShared structure in adapter */ >--=20 >2.1.3 >