From patchwork Fri Oct 20 03:23:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chas Williams <3chas3@gmail.com> X-Patchwork-Id: 30623 X-Patchwork-Delegate: helin.zhang@intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 82D6C1B1B3; Fri, 20 Oct 2017 05:23:47 +0200 (CEST) Received: from mail-qk0-f196.google.com (mail-qk0-f196.google.com [209.85.220.196]) by dpdk.org (Postfix) with ESMTP id 068E11B1B1 for ; Fri, 20 Oct 2017 05:23:46 +0200 (CEST) Received: by mail-qk0-f196.google.com with SMTP id q83so12853303qke.6 for ; Thu, 19 Oct 2017 20:23:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZrNH5KhyGasVTuuHCh08g1UQviItLyuFVegQP5mATBA=; b=q3JJXUiO3UJqStQvEBAAgEvpX9nXul/mhYuPgFTM1gRNwklIGoMchrnJHH2eZ6V0ws Z8di1xPqU8o3uHE98anTzJT0NiPYmWN+Eh9rjOaBKnsOCxbSQEGA5DBl61f09jT6n3NG eJCUdpnjaEQ+YouHpdYYdngdLoldJJ8LMJeGlEKXsfUzU2wWWqNdCb5uU8o/tEKAnNn/ oEfiYo9mZvAgjb8wtOAHxaEd5aTdyrHIZr5MZB0EbwikIXpdxEU6+6xHxh/WWHeuj6jj ho4QosuX+clgtT5p0bN177D7UhUh/eGyPh3CX/UziYgWNPr4JnnvxeGwEQKMZ5J6+tSL bC2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ZrNH5KhyGasVTuuHCh08g1UQviItLyuFVegQP5mATBA=; b=PJTzioUxBKxVUb2ttHdnjVn7twRREFPKy7Gwyp+kX/B/dvPDWJlDLSubwk50U7yenQ zmXC0rZzEewRuY7NY1S5kLtArgJkFiQF4eFhRXEHDUOuOpU2CFtl/QHD/a0/3ERZ9SuC GcjOcjB1gV0h+K3rpwGuwAo6pPDWYc1xTXGGV+DG9tFZa4jubW/rxgodY3Y2N8eSdwtV K23ZKr2ppnzu49DfccO6jDQSx6sVErkkcvmwNy3EVF0RdmqwHXNtzIkgXCuMvS9Z9/Bh IThWvRhWTQXf+XeNFF00qsHp2168egqU2uyuSbjHfmT3N/VY6pMV6gg4HN/2R+hUpjYm oWHw== X-Gm-Message-State: AMCzsaX7rz/VfZRMjjAcUBtrV5VA850QA57g5vBOXiWxFd+/KSrm200g dBej7JWfD0mrYF32Gbbb61OWdw== X-Google-Smtp-Source: ABhQp+TVcqNY6bR9LtKlNDAb5iPbNUyudbkAhOi09CqOytk2MWWOPSKu+QARLhmW4BzjSdrjVAChpA== X-Received: by 10.55.166.77 with SMTP id p74mr5072027qke.264.1508469825267; Thu, 19 Oct 2017 20:23:45 -0700 (PDT) Received: from monolith.home (pool-96-255-82-208.washdc.fios.verizon.net. [96.255.82.208]) by smtp.gmail.com with ESMTPSA id s14sm1612qtc.65.2017.10.19.20.23.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 19 Oct 2017 20:23:44 -0700 (PDT) From: Chas Williams <3chas3@gmail.com> To: dev@dpdk.org Cc: wenzhuo.lu@intel.com, Chas Williams Date: Thu, 19 Oct 2017 23:23:39 -0400 Message-Id: <20171020032339.24079-1-3chas3@gmail.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <1500319133-16815-1-git-send-email-ciwillia@brocade.com> References: <1500319133-16815-1-git-send-email-ciwillia@brocade.com> Subject: [dpdk-dev] [PATCH v2] net/e1000: always enable receive and transmit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Chas Williams The transmit and receive controller state machines are only enabled after receiving an interrupt and the link status is now valid. If an adapter is being used in conjunction with NC-SI, network controller sideband interface, the adapter may never get a link state change interrupt since the adapter's PHY is always link up and never changes state. To fix this, always enable and disable the transmit and receive with .dev_start and .dev_stop. This is a better match for what is typically done with the other PMD's. Since we may never get an interrupt to check the link state, we also poll once at the end of .dev_start to get the current link status. Signed-off-by: Chas Williams Acked-by: Wenzhuo Lu --- drivers/net/e1000/em_ethdev.c | 44 ++++++++++++++++++++++++++--------------- drivers/net/e1000/igb_ethdev.c | 45 ++++++++++++++++++++++++++++-------------- 2 files changed, 58 insertions(+), 31 deletions(-) diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c index 6ebfa6d..f2493f2 100644 --- a/drivers/net/e1000/em_ethdev.c +++ b/drivers/net/e1000/em_ethdev.c @@ -587,6 +587,30 @@ em_set_pba(struct e1000_hw *hw) E1000_WRITE_REG(hw, E1000_PBA, pba); } +static void +eth_em_rxtx_control(struct rte_eth_dev *dev, + bool enable) +{ + struct e1000_hw *hw = + E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); + uint32_t tctl, rctl; + + tctl = E1000_READ_REG(hw, E1000_TCTL); + rctl = E1000_READ_REG(hw, E1000_RCTL); + if (enable) { + /* enable Tx/Rx */ + tctl |= E1000_TCTL_EN; + rctl |= E1000_RCTL_EN; + } else { + /* disable Tx/Rx */ + tctl &= ~E1000_TCTL_EN; + rctl &= ~E1000_RCTL_EN; + } + E1000_WRITE_REG(hw, E1000_TCTL, tctl); + E1000_WRITE_REG(hw, E1000_RCTL, rctl); + E1000_WRITE_FLUSH(hw); +} + static int eth_em_start(struct rte_eth_dev *dev) { @@ -755,6 +779,9 @@ eth_em_start(struct rte_eth_dev *dev) adapter->stopped = 0; + eth_em_rxtx_control(dev, true); + eth_em_link_update(dev, 0); + PMD_INIT_LOG(DEBUG, "<<"); return 0; @@ -780,6 +807,7 @@ eth_em_stop(struct rte_eth_dev *dev) struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); struct rte_intr_handle *intr_handle = &pci_dev->intr_handle; + eth_em_rxtx_control(dev, false); em_rxq_intr_disable(hw); em_lsc_intr_disable(hw); @@ -1604,7 +1632,6 @@ eth_em_interrupt_action(struct rte_eth_dev *dev, E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); struct e1000_interrupt *intr = E1000_DEV_PRIVATE_TO_INTR(dev->data->dev_private); - uint32_t tctl, rctl; struct rte_eth_link link; int ret; @@ -1636,21 +1663,6 @@ eth_em_interrupt_action(struct rte_eth_dev *dev, pci_dev->addr.domain, pci_dev->addr.bus, pci_dev->addr.devid, pci_dev->addr.function); - tctl = E1000_READ_REG(hw, E1000_TCTL); - rctl = E1000_READ_REG(hw, E1000_RCTL); - if (link.link_status) { - /* enable Tx/Rx */ - tctl |= E1000_TCTL_EN; - rctl |= E1000_RCTL_EN; - } else { - /* disable Tx/Rx */ - tctl &= ~E1000_TCTL_EN; - rctl &= ~E1000_RCTL_EN; - } - E1000_WRITE_REG(hw, E1000_TCTL, tctl); - E1000_WRITE_REG(hw, E1000_RCTL, rctl); - E1000_WRITE_FLUSH(hw); - return 0; } diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c index 003bdf0..391bd3e 100644 --- a/drivers/net/e1000/igb_ethdev.c +++ b/drivers/net/e1000/igb_ethdev.c @@ -1303,6 +1303,31 @@ eth_igb_configure(struct rte_eth_dev *dev) return 0; } +static void +eth_igb_rxtx_control(struct rte_eth_dev *dev, + bool enable) +{ + struct e1000_hw *hw = + E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private); + uint32_t tctl, rctl; + + tctl = E1000_READ_REG(hw, E1000_TCTL); + rctl = E1000_READ_REG(hw, E1000_RCTL); + + if (enable) { + /* enable Tx/Rx */ + tctl |= E1000_TCTL_EN; + rctl |= E1000_RCTL_EN; + } else { + /* disable Tx/Rx */ + tctl &= ~E1000_TCTL_EN; + rctl &= ~E1000_RCTL_EN; + } + E1000_WRITE_REG(hw, E1000_TCTL, tctl); + E1000_WRITE_REG(hw, E1000_RCTL, rctl); + E1000_WRITE_FLUSH(hw); +} + static int eth_igb_start(struct rte_eth_dev *dev) { @@ -1501,6 +1526,9 @@ eth_igb_start(struct rte_eth_dev *dev) /* restore all types filter */ igb_filter_restore(dev); + eth_igb_rxtx_control(dev, true); + eth_igb_link_update(dev, 0); + PMD_INIT_LOG(DEBUG, "<<"); return 0; @@ -1526,6 +1554,8 @@ eth_igb_stop(struct rte_eth_dev *dev) struct rte_eth_link link; struct rte_intr_handle *intr_handle = &pci_dev->intr_handle; + eth_igb_rxtx_control(dev, false); + igb_intr_disable(hw); /* disable intr eventfd mapping */ @@ -2854,7 +2884,6 @@ eth_igb_interrupt_action(struct rte_eth_dev *dev, struct e1000_interrupt *intr = E1000_DEV_PRIVATE_TO_INTR(dev->data->dev_private); struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); - uint32_t tctl, rctl; struct rte_eth_link link; int ret; @@ -2896,20 +2925,6 @@ eth_igb_interrupt_action(struct rte_eth_dev *dev, pci_dev->addr.bus, pci_dev->addr.devid, pci_dev->addr.function); - tctl = E1000_READ_REG(hw, E1000_TCTL); - rctl = E1000_READ_REG(hw, E1000_RCTL); - if (link.link_status) { - /* enable Tx/Rx */ - tctl |= E1000_TCTL_EN; - rctl |= E1000_RCTL_EN; - } else { - /* disable Tx/Rx */ - tctl &= ~E1000_TCTL_EN; - rctl &= ~E1000_RCTL_EN; - } - E1000_WRITE_REG(hw, E1000_TCTL, tctl); - E1000_WRITE_REG(hw, E1000_RCTL, rctl); - E1000_WRITE_FLUSH(hw); _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL, NULL); }