From patchwork Wed Dec 17 13:22:34 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Balazs Nemeth X-Patchwork-Id: 2060 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 7F8497F48; Wed, 17 Dec 2014 14:19:18 +0100 (CET) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 0DED97F14 for ; Wed, 17 Dec 2014 14:19:13 +0100 (CET) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 17 Dec 2014 05:18:13 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.07,594,1413270000"; d="scan'208";a="655594214" Received: from bnemeth-mobl.ger.corp.intel.com (HELO bn-ivy12.localdomain) ([172.22.195.65]) by orsmga002.jf.intel.com with ESMTP; 17 Dec 2014 05:18:12 -0800 From: Balazs Nemeth To: dev@dpdk.org Date: Wed, 17 Dec 2014 13:22:34 +0000 Message-Id: <1418822554-1493-1-git-send-email-balazs.nemeth@intel.com> X-Mailer: git-send-email 2.1.3 Cc: Balazs Nemeth Subject: [dpdk-dev] [PATCH] ixgbe_vf: Fix getting link state 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" This patch fixes checking the link state of a virtual function. If the state has already been checked, it does not need to be checked again. Previously, get_link_status in the ixgbe_hw struct was used to track if the information had already been updated, but this field was always set to false. Signed-off-by: Balazs Nemeth --- lib/librte_pmd_ixgbe/ixgbe/ixgbe_type.h | 2 +- lib/librte_pmd_ixgbe/ixgbe/ixgbe_vf.c | 14 ++++++++------ lib/librte_pmd_ixgbe/ixgbe_ethdev.c | 8 +++++++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/librte_pmd_ixgbe/ixgbe/ixgbe_type.h b/lib/librte_pmd_ixgbe/ixgbe/ixgbe_type.h index c67d462..07bba75 100644 --- a/lib/librte_pmd_ixgbe/ixgbe/ixgbe_type.h +++ b/lib/librte_pmd_ixgbe/ixgbe/ixgbe_type.h @@ -3573,7 +3573,7 @@ struct ixgbe_mac_info { u32 max_rx_queues; u32 orig_autoc; u8 san_mac_rar_index; - bool get_link_status; + bool have_link_status; u32 orig_autoc2; u16 max_msix_vectors; bool arc_subsystem_valid; diff --git a/lib/librte_pmd_ixgbe/ixgbe/ixgbe_vf.c b/lib/librte_pmd_ixgbe/ixgbe/ixgbe_vf.c index e6b6c51..6cc7d7f 100644 --- a/lib/librte_pmd_ixgbe/ixgbe/ixgbe_vf.c +++ b/lib/librte_pmd_ixgbe/ixgbe/ixgbe_vf.c @@ -550,10 +550,13 @@ s32 ixgbe_check_mac_link_vf(struct ixgbe_hw *hw, ixgbe_link_speed *speed, UNREFERENCED_1PARAMETER(autoneg_wait_to_complete); /* If we were hit with a reset drop the link */ - if (!mbx->ops.check_for_rst(hw, 0) || !mbx->timeout) - mac->get_link_status = true; + if (!mbx->ops.check_for_rst(hw, 0) || !mbx->timeout) { + mac->have_link_status = false; + ret_val = -1; + goto out; + } - if (!mac->get_link_status) + if (mac->have_link_status) goto out; /* if link status is down no point in checking to see if pf is up */ @@ -610,10 +613,10 @@ s32 ixgbe_check_mac_link_vf(struct ixgbe_hw *hw, ixgbe_link_speed *speed, /* if we passed all the tests above then the link is up and we no * longer need to check for link */ - mac->get_link_status = false; + mac->have_link_status = true; out: - *link_up = !mac->get_link_status; + *link_up = mac->have_link_status; return ret_val; } @@ -722,4 +725,3 @@ int ixgbevf_get_queues(struct ixgbe_hw *hw, unsigned int *num_tcs, return err; } - diff --git a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c index 9401916..8e622ee 100644 --- a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c +++ b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c @@ -2064,7 +2064,7 @@ ixgbe_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete) { struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); struct rte_eth_link link, old; - ixgbe_link_speed link_speed; + ixgbe_link_speed link_speed = IXGBE_LINK_SPEED_UNKNOWN; int link_up; int diag; @@ -2088,6 +2088,12 @@ ixgbe_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete) return 0; } + if (link_speed == IXGBE_LINK_SPEED_UNKNOWN && + hw->mac.have_link_status) { + memcpy(&link, &old, sizeof(link)); + return 0; + } + if (link_up == 0) { rte_ixgbe_dev_atomic_write_link_status(dev, &link); if (link.link_status == old.link_status)