From patchwork Wed Dec 17 05:13:13 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 2042 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 90DA47F10; Wed, 17 Dec 2014 06:13:51 +0100 (CET) Received: from mail-pd0-f180.google.com (mail-pd0-f180.google.com [209.85.192.180]) by dpdk.org (Postfix) with ESMTP id 8E2AA8043 for ; Wed, 17 Dec 2014 06:13:43 +0100 (CET) Received: by mail-pd0-f180.google.com with SMTP id w10so15281656pde.25 for ; Tue, 16 Dec 2014 21:13:42 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=GTkQO/WwCyN8uCdQGBJIJaLmrhuDnm/FpBgJX4IBCGA=; b=jaAy2LzLI+lDZoZBW/jphW7TUUQLrx7lBYvH7rHAUnNkaf1pHYAJG87T78y+7aG/mI NkiVadWcH0YCK7tBk+gQIh5aaUyCqLHiQoxay3LfSPnmNnaypqU0OTTFRbDAGmM1Pd4a dJxQB9m883xqhmvNe5jKzineQPa5twTzZXDLXo6078p5MQXx58gqgvbxZZjbp6ADQD2t mF4280Ng2OLZWO0crA8plQ8ht2OOAy4/CGF5UpNvQQLdZ6rpJfO1M1nl6P+Zp9QUWvZM bTJcYIpPBH9bUEnNMjYLtPzoex59u4TCjoXizt3BKaGQJESxquJi/25CobJCUrVAX0no ed/Q== X-Gm-Message-State: ALoCoQl0b2QHjQAyMy31ppmKN2jdYVaxfRtmooHzGktuTosEtXCqtGIPn10DkpSQ/cj4qZvHA8Ag X-Received: by 10.68.216.167 with SMTP id or7mr65881704pbc.166.1418793222762; Tue, 16 Dec 2014 21:13:42 -0800 (PST) Received: from urahara.brocade.com (static-50-53-82-155.bvtn.or.frontiernet.net. [50.53.82.155]) by mx.google.com with ESMTPSA id gd1sm2518208pbd.67.2014.12.16.21.13.39 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 16 Dec 2014 21:13:41 -0800 (PST) From: Stephen Hemminger To: dev@dpdk.org Date: Tue, 16 Dec 2014 21:13:13 -0800 Message-Id: <1418793196-17953-5-git-send-email-stephen@networkplumber.org> X-Mailer: git-send-email 2.1.3 In-Reply-To: <1418793196-17953-1-git-send-email-stephen@networkplumber.org> References: <1418793196-17953-1-git-send-email-stephen@networkplumber.org> Cc: Stephen Hemminger Subject: [dpdk-dev] [PATCH 4/7] vmxnet3: fix link state handling X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- 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 = link; + struct rte_eth_link *src = &(dev->data->dev_link); + + if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst, + *(uint64_t *)src) == 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. + * - 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 = &(dev->data->dev_link); struct rte_eth_link *src = link; @@ -576,7 +603,7 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev) /* 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); } /* @@ -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 = dev->data->dev_private; - struct rte_eth_link link; + struct rte_eth_link old, link; uint32_t ret; + 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 = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_CMD); - if (!ret) { - PMD_INIT_LOG(ERR, "Link Status Negative : %s()", __func__); - return -1; - } - if (ret & 0x1) { link.link_status = 1; link.link_duplex = ETH_LINK_FULL_DUPLEX; link.link_speed = ETH_LINK_SPEED_10000; - - rte_vmxnet3_dev_atomic_write_link_status(dev, &link); - - return 0; } - return -1; + vmxnet3_dev_atomic_write_link_status(dev, &link); + + return (old.link_status == link.link_status) ? -1 : 0; } /* Updating rxmode through Vmxnet3_DriverShared structure in adapter */