All of lore.kernel.org
 help / color / mirror / Atom feed
From: Igor Russkikh <Igor.Russkikh@aquantia.com>
To: "dev@dpdk.org" <dev@dpdk.org>
Cc: Pavel Belous <Pavel.Belous@aquantia.com>,
	Igor Russkikh <Igor.Russkikh@aquantia.com>,
	"ferruh.yigit@intel.com" <ferruh.yigit@intel.com>,
	Pavel Belous <Pavel.Belous@aquantia.com>
Subject: [PATCH v6 16/22] net/atlantic: add flow control configuration
Date: Fri, 12 Oct 2018 11:09:41 +0000	[thread overview]
Message-ID: <ea04e33c2533ab9e49f8932411a8862e3a1719c7.1539338074.git.igor.russkikh@aquantia.com> (raw)
In-Reply-To: <cover.1539338074.git.igor.russkikh@aquantia.com>

From: Pavel Belous <Pavel.Belous@aquantia.com>

Add support for flow control feature.

Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.com>
Signed-off-by: Pavel Belous <Pavel.Belous@aquantia.com>
---
 doc/guides/nics/features/atlantic.ini |  1 +
 drivers/net/atlantic/atl_ethdev.c     | 54 +++++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+)

diff --git a/doc/guides/nics/features/atlantic.ini b/doc/guides/nics/features/atlantic.ini
index 592af817931e..e86707ea5c0a 100644
--- a/doc/guides/nics/features/atlantic.ini
+++ b/doc/guides/nics/features/atlantic.ini
@@ -14,6 +14,7 @@ Allmulticast mode    = Y
 RSS hash             = Y
 RSS key update       = Y
 RSS reta update      = Y
+Flow control         = Y
 CRC offload          = Y
 L3 checksum offload  = Y
 L4 checksum offload  = Y
diff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c
index 2f365844752c..6ce4454fe2f3 100644
--- a/drivers/net/atlantic/atl_ethdev.c
+++ b/drivers/net/atlantic/atl_ethdev.c
@@ -48,6 +48,12 @@ static void atl_dev_info_get(struct rte_eth_dev *dev,
 
 static const uint32_t *atl_dev_supported_ptypes_get(struct rte_eth_dev *dev);
 
+/* Flow control */
+static int atl_flow_ctrl_get(struct rte_eth_dev *dev,
+			       struct rte_eth_fc_conf *fc_conf);
+static int atl_flow_ctrl_set(struct rte_eth_dev *dev,
+			       struct rte_eth_fc_conf *fc_conf);
+
 static void atl_dev_link_status_print(struct rte_eth_dev *dev);
 
 /* Interrupts */
@@ -219,6 +225,10 @@ static const struct eth_dev_ops atl_eth_dev_ops = {
 	.rx_descriptor_status = atl_dev_rx_descriptor_status,
 	.tx_descriptor_status = atl_dev_tx_descriptor_status,
 
+	/* Flow Control */
+	.flow_ctrl_get	      = atl_flow_ctrl_get,
+	.flow_ctrl_set	      = atl_flow_ctrl_set,
+
 	.rxq_info_get	      = atl_rxq_info_get,
 	.txq_info_get	      = atl_txq_info_get,
 
@@ -287,6 +297,7 @@ eth_atl_dev_init(struct rte_eth_dev *eth_dev)
 			  AQ_NIC_RATE_1G |
 			  AQ_NIC_RATE_100M;
 
+	adapter->hw_cfg.flow_control = (AQ_NIC_FC_RX | AQ_NIC_FC_TX);
 	adapter->hw_cfg.aq_rss.indirection_table_size =
 		HW_ATL_B0_RSS_REDIRECTION_MAX;
 
@@ -1026,6 +1037,49 @@ atl_dev_interrupt_handler(void *param)
 	atl_dev_interrupt_action(dev, dev->intr_handle);
 }
 
+
+static int
+atl_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
+{
+	struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+
+	if (hw->aq_nic_cfg->flow_control == AQ_NIC_FC_OFF)
+		fc_conf->mode = RTE_FC_NONE;
+	else if (hw->aq_nic_cfg->flow_control & (AQ_NIC_FC_RX | AQ_NIC_FC_TX))
+		fc_conf->mode = RTE_FC_FULL;
+	else if (hw->aq_nic_cfg->flow_control & AQ_NIC_FC_RX)
+		fc_conf->mode = RTE_FC_RX_PAUSE;
+	else if (hw->aq_nic_cfg->flow_control & AQ_NIC_FC_RX)
+		fc_conf->mode = RTE_FC_TX_PAUSE;
+
+	return 0;
+}
+
+static int
+atl_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
+{
+	struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	uint32_t old_flow_control = hw->aq_nic_cfg->flow_control;
+
+
+	if (hw->aq_fw_ops->set_flow_control == NULL)
+		return -ENOTSUP;
+
+	if (fc_conf->mode == RTE_FC_NONE)
+		hw->aq_nic_cfg->flow_control = AQ_NIC_FC_OFF;
+	else if (fc_conf->mode == RTE_FC_RX_PAUSE)
+		hw->aq_nic_cfg->flow_control = AQ_NIC_FC_RX;
+	else if (fc_conf->mode == RTE_FC_TX_PAUSE)
+		hw->aq_nic_cfg->flow_control = AQ_NIC_FC_TX;
+	else if (fc_conf->mode == RTE_FC_FULL)
+		hw->aq_nic_cfg->flow_control = (AQ_NIC_FC_RX | AQ_NIC_FC_TX);
+
+	if (old_flow_control != hw->aq_nic_cfg->flow_control)
+		return hw->aq_fw_ops->set_flow_control(hw);
+
+	return 0;
+}
+
 static int
 atl_reta_update(struct rte_eth_dev *dev,
 		   struct rte_eth_rss_reta_entry64 *reta_conf,
-- 
2.7.4

  parent reply	other threads:[~2018-10-12 11:09 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-12 11:09 [PATCH v6 00/22] net/atlantic: Aquantia aQtion 10G NIC Family DPDK PMD driver Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 01/22] net/atlantic: add atlantic PMD driver skeleton Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 02/22] net/atlantic: add logging structure Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 03/22] net/atlantic: add hardware registers access routines Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 04/22] net/atlantic: add hardware access layer Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 05/22] net/atlantic: implement firmware operations Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 06/22] net/atlantic: add b0 hardware layer Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 07/22] net/atlantic: configure rte device start/stop Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 08/22] net/atlantic: implement core logic for Tx/Rx Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 09/22] net/atlantic: implement Rx path Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 10/22] net/atlantic: implement Tx path Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 11/22] net/atlantic: add link status and interrupt management Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 12/22] net/atlantic: implement device statistics Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 13/22] net/atlantic: add Rx/Tx descriptors information Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 14/22] net/atlantic: implement promisc and allmulti modes Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 15/22] net/atlantic: implement RSS and RETA manipulation API Igor Russkikh
2018-10-12 11:09 ` Igor Russkikh [this message]
2018-10-12 11:09 ` [PATCH v6 17/22] net/atlantic: implement MAC address manipulations Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 18/22] net/atlantic: implement MTU configuration Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 19/22] net/atlantic: implement VLAN filters and offloads Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 20/22] net/atlantic: implement EEPROM get/set Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 21/22] net/atlantic: read MAC registers for debug purposes Igor Russkikh
2018-10-12 11:09 ` [PATCH v6 22/22] net/atlantic: add release notes Igor Russkikh
2018-10-12 16:22 ` [PATCH v6 00/22] net/atlantic: Aquantia aQtion 10G NIC Family DPDK PMD driver Ferruh Yigit
2018-10-12 17:28   ` Igor Russkikh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ea04e33c2533ab9e49f8932411a8862e3a1719c7.1539338074.git.igor.russkikh@aquantia.com \
    --to=igor.russkikh@aquantia.com \
    --cc=Pavel.Belous@aquantia.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.