DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 0/3] net/szedata2: patch set for new card support
@ 2018-04-06 14:12 Matej Vido
  2018-04-06 14:12 ` [dpdk-dev] [PATCH 1/3] net/szedata2: do not affect Ethernet interfaces Matej Vido
                   ` (6 more replies)
  0 siblings, 7 replies; 23+ messages in thread
From: Matej Vido @ 2018-04-06 14:12 UTC (permalink / raw)
  To: dev; +Cc: remes

This patch set adds support for new card NFB-200G2QL.

Matej Vido (3):
  net/szedata2: remove operations affecting Ethernet interfaces
  net/szedata2: add support for new NIC
  net/szedata2: add kernel module dependency

 config/common_base                                 |   5 -
 .../nics/img/szedata2_nfb200g_architecture.svg     | 171 ++++++
 doc/guides/nics/szedata2.rst                       |  66 +-
 doc/guides/rel_notes/release_18_05.rst             |   4 +
 drivers/net/szedata2/Makefile                      |   1 -
 drivers/net/szedata2/rte_eth_szedata2.c            | 684 ++++++++++++++-------
 drivers/net/szedata2/rte_eth_szedata2.h            |   4 +-
 drivers/net/szedata2/szedata2_iobuf.c              | 174 ------
 drivers/net/szedata2/szedata2_iobuf.h              | 327 ----------
 9 files changed, 667 insertions(+), 769 deletions(-)
 create mode 100644 doc/guides/nics/img/szedata2_nfb200g_architecture.svg
 delete mode 100644 drivers/net/szedata2/szedata2_iobuf.c
 delete mode 100644 drivers/net/szedata2/szedata2_iobuf.h

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [dpdk-dev] [PATCH 1/3] net/szedata2: do not affect Ethernet interfaces
  2018-04-06 14:12 [dpdk-dev] [PATCH 0/3] net/szedata2: patch set for new card support Matej Vido
@ 2018-04-06 14:12 ` Matej Vido
  2018-04-10 15:28   ` Ferruh Yigit
  2018-04-06 14:12 ` [dpdk-dev] [PATCH 2/3] net/szedata2: add support for new NIC Matej Vido
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 23+ messages in thread
From: Matej Vido @ 2018-04-06 14:12 UTC (permalink / raw)
  To: dev; +Cc: remes

NFB cards employ multiple Ethernet ports.
Until now, Ethernet port-related operations were performed on all of them
(since the whole card was represented as a single port).
With new NFB-200G2QL card, this is no longer viable.

Since there is no fixed mapping between the queues and Ethernet ports,
and since a single card can be represented as two ports in DPDK,
there is no way of telling which (if any) physical ports should be
associated with individual ports in DPDK.

This is also described in documentation in more detail.

Signed-off-by: Matej Vido <vido@cesnet.cz>
Signed-off-by: Jan Remes <remes@netcope.com>
---
 config/common_base                                 |   5 -
 .../nics/img/szedata2_nfb200g_architecture.svg     | 171 +++++++++++
 doc/guides/nics/szedata2.rst                       |  66 +++--
 drivers/net/szedata2/Makefile                      |   1 -
 drivers/net/szedata2/rte_eth_szedata2.c            | 137 +--------
 drivers/net/szedata2/szedata2_iobuf.c              | 174 -----------
 drivers/net/szedata2/szedata2_iobuf.h              | 327 ---------------------
 7 files changed, 225 insertions(+), 656 deletions(-)
 create mode 100644 doc/guides/nics/img/szedata2_nfb200g_architecture.svg
 delete mode 100644 drivers/net/szedata2/szedata2_iobuf.c
 delete mode 100644 drivers/net/szedata2/szedata2_iobuf.h

diff --git a/config/common_base b/config/common_base
index 7abf7c6..b182b01 100644
--- a/config/common_base
+++ b/config/common_base
@@ -307,11 +307,6 @@ CONFIG_RTE_LIBRTE_SFC_EFX_DEBUG=n
 # Compile software PMD backed by SZEDATA2 device
 #
 CONFIG_RTE_LIBRTE_PMD_SZEDATA2=n
-#
-# Defines firmware type address space.
-# See documentation for supported values.
-# Other values raise compile time error.
-CONFIG_RTE_LIBRTE_PMD_SZEDATA2_AS=0
 
 #
 # Compile burst-oriented Cavium Thunderx NICVF PMD driver
diff --git a/doc/guides/nics/img/szedata2_nfb200g_architecture.svg b/doc/guides/nics/img/szedata2_nfb200g_architecture.svg
new file mode 100644
index 0000000..6ee536b
--- /dev/null
+++ b/doc/guides/nics/img/szedata2_nfb200g_architecture.svg
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   id="svg2"
+   stroke-miterlimit="10"
+   stroke-linecap="square"
+   stroke="none"
+   fill="none"
+   viewBox="0.0 0.0 568.7322834645669 352.3937007874016"
+   version="1.1">
+  <metadata
+     id="metadata65">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs63" />
+  <clipPath
+     id="p.0">
+    <path
+       id="path5"
+       clip-rule="nonzero"
+       d="m0 0l568.7323 0l0 352.3937l-568.7323 0l0 -352.3937z" />
+  </clipPath>
+  <g
+     id="g7"
+     clip-path="url(#p.0)">
+    <path
+       id="path9"
+       fill-rule="evenodd"
+       d="m0 0l568.7323 0l0 352.3937l-568.7323 0z"
+       fill-opacity="0.0"
+       fill="#000000" />
+    <path
+       id="path11"
+       fill-rule="evenodd"
+       d="m40.564304 14.364829l254.36221 0l0 131.84253l-254.36221 0z"
+       fill="#47c3d3" />
+    <path
+       id="path13"
+       fill-rule="nonzero"
+       d="m109.54107 87.20609l0 -13.359375l1.8125 0l7.015625 10.484375l0 -10.484375l1.6875 0l0 13.359375l-1.8125 0l-7.015625 -10.5l0 10.5l-1.6875 0zm13.582321 0l0 -13.359375l9.015617 0l0 1.578125l-7.2499924 0l0 4.140625l6.2656174 0l0 1.578125l-6.2656174 0l0 6.0625l-1.765625 0zm11.224098 0l0 -13.359375l5.015625 0q1.53125 0 2.453125 0.40625q0.921875 0.40625 1.4375 1.25q0.53125 0.84375 0.53125 1.765625q0 0.859375 -0.46875 1.625q-0.453125 0.75 -1.390625 1.203125q1.203125 0.359375 1.859375 1.21875q0.65625 0.859375 0.65625 2.015625q0 0.9375 -0.40625 1.75q-0.390625 0.796875 -0.984375 1.234375q-0.578125 0.4375 -1.453125 0.671875q-0.875 0.21875 -2.15625 0.21875l-5.09375 0zm1.78125 -7.75l2.875 0q1.1875 0 1.6875 -0.140625q0.671875 -0.203125 1.015625 -0.671875q0.34375 -0.46875 0.34375 -1.171875q0 -0.65625 -0.328125 -1.15625q-0.3125 -0.515625 -0.90625 -0.703125q-0.59375 -0.1875 -2.03125 -0.1875l-2.65625 0l0 4.03125zm0 6.171875l3.3125 0q0.859375 0 1.203125 -0.0625q0.609375 -0.109375 1.015625 -0.3
 59375q0.421875 -0.265625 0.6875 -0.75q0.265625 -0.484375 0.265625 -1.125q0 -0.75 -0.390625 -1.296875q-0.375 -0.546875 -1.0625 -0.765625q-0.671875 -0.234375 -1.953125 -0.234375l-3.078125 0l0 4.59375zm9.896698 -2.4375l0 -1.640625l5.03125 0l0 1.640625l-5.03125 0zm15.009552 2.4375l0 1.578125l-8.828125 0q-0.015625 -0.59375 0.1875 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.15625 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.90625 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.140625 -0.984375 3.03125 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.421875 0.4375 -0.6875 0.875l6.546875 0zm1.7663422 -5.015625q0 -2.359375 0.484375 -3.796875q0.484375 -1.453125 
 1.4375 -2.234375q0.96875 -0.78125 2.421875 -0.78125q1.078125 0 1.890625 0.4375q0.8125 0.421875 1.328125 1.25q0.53125 0.8125 0.828125 1.984375q0.3125 1.15625 0.3125 3.140625q0 2.359375 -0.484375 3.8125q-0.484375 1.4375 -1.453125 2.234375q-0.953125 0.78125 -2.421875 0.78125q-1.921875 0 -3.03125 -1.390625q-1.3125 -1.671875 -1.3125 -5.4375zm1.671875 0q0 3.296875 0.765625 4.390625q0.78125 1.078125 1.90625 1.078125q1.140625 0 1.90625 -1.09375q0.765625 -1.09375 0.765625 -4.375q0 -3.296875 -0.765625 -4.375q-0.765625 -1.078125 -1.921875 -1.078125q-1.125 0 -1.796875 0.953125q-0.859375 1.21875 -0.859375 4.5zm8.703842 0q0 -2.359375 0.484375 -3.796875q0.484375 -1.453125 1.4375 -2.234375q0.96875 -0.78125 2.421875 -0.78125q1.078125 0 1.890625 0.4375q0.8125 0.421875 1.328125 1.25q0.53125 0.8125 0.828125 1.984375q0.3125 1.15625 0.3125 3.140625q0 2.359375 -0.484375 3.8125q-0.484375 1.4375 -1.453125 2.234375q-0.953125 0.78125 -2.421875 0.78125q-1.921875 0 -3.03125 -1.390625q-1.3125 -1.671875 -1.3125 -
 5.4375zm1.671875 0q0 3.296875 0.765625 4.390625q0.78125 1.078125 1.90625 1.078125q1.140625 0 1.90625 -1.09375q0.765625 -1.09375 0.765625 -4.375q0 -3.296875 -0.765625 -4.375q-0.765625 -1.078125 -1.921875 -1.078125q-1.125 0 -1.796875 0.953125q-0.859375 1.21875 -0.859375 4.5zm15.610092 1.359375l0 -1.578125l5.65625 0l0 4.953125q-1.296875 1.046875 -2.6875 1.578125q-1.375 0.515625 -2.84375 0.515625q-1.96875 0 -3.578125 -0.84375q-1.609375 -0.84375 -2.421875 -2.4375q-0.8125 -1.59375 -0.8125 -3.5625q0 -1.953125 0.8125 -3.640625q0.8125 -1.6875 2.34375 -2.5q1.53125 -0.828125 3.515625 -0.828125q1.453125 0 2.625 0.46875q1.171875 0.46875 1.828125 1.3125q0.671875 0.828125 1.015625 2.171875l-1.59375 0.4375q-0.296875 -1.015625 -0.75 -1.59375q-0.4375 -0.59375 -1.265625 -0.9375q-0.828125 -0.34375 -1.84375 -0.34375q-1.203125 0 -2.09375 0.375q-0.890625 0.359375 -1.4375 0.96875q-0.53125 0.59375 -0.828125 1.3125q-0.515625 1.234375 -0.515625 2.6875q0 1.78125 0.609375 2.984375q0.625 1.203125 1.796875 1.7968
 75q1.171875 0.578125 2.5 0.578125q1.140625 0 2.234375 -0.4375q1.09375 -0.453125 1.65625 -0.953125l0 -2.484375l-3.921875 0zm16.214554 3.65625l0 1.578125l-8.828125 0q-0.015625 -0.59375 0.1875 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.15625 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.90625 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.140625 -0.984375 3.03125 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.421875 0.4375 -0.6875 0.875l6.546875 0zm12.547592 0.140625q1.234375 0.859375 2.265625 1.25l-0.515625 1.21875q-1.4375 -0.515625 -2.875 -1.625q-1.484375 0.828125 -3.28125 0.828125q-1.8125 0 -3.296875 -0.875q-1.46875 -0.875 -2.265625 -2.453125q-0.796
 875 -1.59375 -0.796875 -3.578125q0 -1.984375 0.796875 -3.59375q0.8125 -1.625 2.28125 -2.46875q1.484375 -0.859375 3.328125 -0.859375q1.84375 0 3.328125 0.890625q1.484375 0.875 2.265625 2.453125q0.78125 1.578125 0.78125 3.5625q0 1.65625 -0.5 2.96875q-0.5 1.3125 -1.515625 2.28125zm-3.890625 -2.25q1.53125 0.421875 2.515625 1.28125q1.5625 -1.421875 1.5625 -4.28125q0 -1.625 -0.546875 -2.828125q-0.546875 -1.21875 -1.609375 -1.875q-1.0625 -0.671875 -2.390625 -0.671875q-1.96875 0 -3.28125 1.359375q-1.296875 1.34375 -1.296875 4.03125q0 2.59375 1.28125 4.0q1.296875 1.390625 3.296875 1.390625q0.953125 0 1.78125 -0.359375q-0.828125 -0.53125 -1.75 -0.765625l0.4375 -1.28125zm8.198929 3.6875l0 -13.359375l1.78125 0l0 11.78125l6.5625 0l0 1.578125l-8.34375 0zm21.746521 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -
 0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.328125 2.359375q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.
 140625 0.734375q0.375 0.4375 0.51564026 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.7031403 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.188217 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.493927 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0
  -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125z"
+       fill="#000000" />
+    <path
+       id="path15"
+       fill-rule="evenodd"
+       d="m54.076115 146.20735l227.3386 0l0 32.944885l-227.3386 0z"
+       fill="#c2c2c2" />
+    <path
+       id="path17"
+       fill-rule="nonzero"
+       d="m96.09741 169.5998l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm20.209198 2.3125l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 
 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm4.238571 4.6875l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm4.042679 -4.015625l0 -1.640625l5.03125 0l0 1.640625l-5.03125 0zm7.087677 4.015625l0 -13.359375l9.65625 0l0 1.578125l-7.875 0l0 4.09375l7.375 0l0 1.5625l-7.375 0l0 4.546875l8.1875 0l0 1.578125l-9.96875 0zm17.392502 0l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640
 625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0zm21.853302 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328
 125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm3.5475922 1.96875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.468
 75 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm13.5625 1.421875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm8.230164 -1.640625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625
  -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm10.755341 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 
 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm9.9375 2.890625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm3.5823364 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.
 5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm12.875702 3.375l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625z"
+       fill="#000000" />
+    <path
+       id="path19"
+       fill-rule="evenodd"
+       d="m321.90552 146.20735l227.33856 0l0 32.944885l-227.33856 0z"
+       fill="#c2c2c2" />
+    <path
+       id="path21"
+       fill-rule="nonzero"
+       d="m370.65872 169.5998l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm20.209198 2.3125l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125
  1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm4.2385864 4.6875l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm4.0426636 -4.015625l0 -1.640625l5.03125 0l0 1.640625l-5.03125 0zm7.087677 4.015625l0 -13.359375l9.65625 0l0 1.578125l-7.875 0l0 4.09375l7.375 0l0 1.5625l-7.375 0l0 4.546875l8.1875 0l0 1.578125l-9.96875 0zm16.736267 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0
 .5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm9.9375 2.890625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.504181 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1
 .15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm6.8913574 4.859375l-3.6875 -9.671875l1.734375 0l2.078125 5.796875q0.328125 0.9375 0.625 1.9375q0.203125 -0.765625 0.609375 -1.828125l2.140625 -5.90625l1.6875 0l-3.65625 9.671875l-1.53125 0zm13.265625 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.48437
 5 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm13.668396 2.875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421
 875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm9.9375 2.890625l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm3.582306 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0
 .921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm12.875732 3.375l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625z"
+       fill="#000000" />
+    <path
+       id="path23"
+       fill-rule="evenodd"
+       d="m440.30234 145.3517l-11.823639 -20.283455l6.8631287 0l0 -44.06624l-120.12924 0l0 6.8631134l-20.283447 -11.823631l20.283447 -11.823639l0 6.8631134l130.0503 0l0 53.98728l6.863098 0z"
+       fill="#9a9a9a" />
+    <path
+       id="path25"
+       fill-rule="evenodd"
+       d="m112.3937 263.0974l0 0c0 -8.088745 6.5572205 -14.645966 14.645966 -14.645966l58.582085 0l0 0c3.8843536 0 7.609619 1.543045 10.356262 4.2897034c2.7466583 2.746643 4.2897034 6.4718933 4.2897034 10.356262l0 58.582092c0 8.088745 -6.5572205 14.645966 -14.645966 14.645966l-58.582085 0c-8.088745 0 -14.645966 -6.5572205 -14.645966 -14.645966z"
+       fill="#c2c2c2" />
+    <path
+       id="path27"
+       fill-rule="nonzero"
+       d="m139.82521 294.62094l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm3.9416962 4.6875l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 
 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm19.443573 -6.359375l1.765625 0l0 7.71875q0 2.015625 -0.453125 3.203125q-0.453125 1.1875 -1.640625 1.9375q-1.1875 0.734375 -3.125 0.734375q-1.875 0 -3.078125 -0.640625q-1.1875 -0.65625 -1.703125 -1.875q-0.5 -1.234375 -0.5 -3.359375l0 -7.71875l1.765625 0l0 7.71875q0 1.734375 0.3125 2.5625q0.328125 0.8125 1.109375 1.265625q0.796875 0.453125 1.9375 0.453125q1.953125 0 2.78125 -0.890625q0.828125 -0.890625 0.828125 -3.390625l0 -7.71875zm9.234375 6.765625q0 -2.359375 0.484375 -3.796875q0.484375 -1.453125 1.4375 -2.234375q0.96875 -0.78125 2.421875 -0.78125q1.078125 0 1.890625 0.4375q0.8125 0.421875 1.328125 1.25q0.53125 0.8125 0.828125 1.984375q0.3125 1.15625 0.3125 3.140625q0 2.359375 -0.484375 3.8125q-0.484375 1.4375 -1.453125 2.234375q-0.953125 0.78125 -2.421875 0.78125q-1.921875 0 -3.03125 -1
 .390625q-1.3125 -1.671875 -1.3125 -5.4375zm1.671875 0q0 3.296875 0.765625 4.390625q0.78125 1.078125 1.90625 1.078125q1.140625 0 1.90625 -1.09375q0.765625 -1.09375 0.765625 -4.375q0 -3.296875 -0.765625 -4.375q-0.765625 -1.078125 -1.921875 -1.078125q-1.125 0 -1.796875 0.953125q-0.859375 1.21875 -0.859375 4.5z"
+       fill="#000000" />
+    <path
+       id="path29"
+       fill-rule="evenodd"
+       d="m391.6378 263.0974l0 0c0 -8.088745 6.5572205 -14.645966 14.645966 -14.645966l58.582092 0l0 0c3.884369 0 7.609619 1.543045 10.356262 4.2897034c2.746643 2.746643 4.2897034 6.4718933 4.2897034 10.356262l0 58.582092c0 8.088745 -6.5572205 14.645966 -14.645966 14.645966l-58.582092 0c-8.088745 0 -14.645966 -6.5572205 -14.645966 -14.645966z"
+       fill="#c2c2c2" />
+    <path
+       id="path31"
+       fill-rule="nonzero"
+       d="m419.0693 294.62094l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm3.9417114 4.6875l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -
 7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm19.443573 -6.359375l1.765625 0l0 7.71875q0 2.015625 -0.453125 3.203125q-0.453125 1.1875 -1.640625 1.9375q-1.1875 0.734375 -3.125 0.734375q-1.875 0 -3.078125 -0.640625q-1.1875 -0.65625 -1.703125 -1.875q-0.5 -1.234375 -0.5 -3.359375l0 -7.71875l1.765625 0l0 7.71875q0 1.734375 0.3125 2.5625q0.328125 0.8125 1.109375 1.265625q0.796875 0.453125 1.9375 0.453125q1.953125 0 2.78125 -0.890625q0.828125 -0.890625 0.828125 -3.390625l0 -7.71875zm15.40625 13.359375l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625z"
+       fill="#000000" />
+    <path
+       id="path33"
+       fill-rule="evenodd"
+       d="m135.20998 199.0105l19.858261 -19.858261l19.858276 19.858261l-9.929138 0l0 29.574799l9.929138 0l-19.858276 19.858276l-19.858261 -19.858276l9.929138 0l0 -29.574799z"
+       fill="#9a9a9a" />
+    <path
+       id="path35"
+       fill-rule="evenodd"
+       d="m415.71652 199.86613l19.858276 -19.858261l19.858276 19.858261l-9.929138 0l0 29.574814l9.929138 0l-19.858276 19.858261l-19.858276 -19.858261l9.929138 0l0 -29.574814z"
+       fill="#9a9a9a" />
+    <path
+       id="path37"
+       fill-rule="evenodd"
+       d="m15.205167 31.272966l74.362206 0l0 32.944885l-74.362206 0z"
+       fill="#ff8434" />
+    <path
+       id="path39"
+       fill-rule="nonzero"
+       d="m27.41926 54.665405l0 -13.359375l9.656248 0l0 1.578125l-7.874998 0l0 4.09375l7.374998 0l0 1.5625l-7.374998 0l0 4.546875l8.187498 0l0 1.578125l-9.968748 0zm15.818571 0l0 -11.78125l-4.40625 0l0 -1.578125l10.578125 0l0 1.578125l-4.40625 0l0 11.78125l-1.765625 0zm8.052231 0l0 -13.359375l1.765625 0l0 5.484375l6.9375 0l0 -5.484375l1.765625 0l0 13.359375l-1.765625 0l0 -6.296875l-6.9375 0l0 6.296875l-1.765625 0zm17.9375 -6.59375q0 -2.359375 0.484375 -3.796875q0.484375 -1.453125 1.4375 -2.234375q0.96875 -0.78125 2.421875 -0.78125q1.078125 0 1.890625 0.4375q0.8125 0.421875 1.328125 1.25q0.53125 0.8125 0.828125 1.984375q0.3125 1.15625 0.3125 3.140625q0 2.359375 -0.484375 3.8125q-0.484375 1.4375 -1.453125 2.234375q-0.953125 0.78125 -2.421875 0.78125q-1.921875 0 -3.03125 -1.390625q-1.3125 -1.671875 -1.3125 -5.4375zm1.671875 0q0 3.296875 0.765625 4.390625q0.78125 1.078125 1.90625 1.078125q1.140625 0 1.90625 -1.09375q0.765625 -1.09375 0.765625 -4.375q0 -3.296875 -0.765625 -4.375q-0.76562
 5 -1.078125 -1.921875 -1.078125q-1.125 0 -1.796875 0.953125q-0.859375 1.21875 -0.859375 4.5z"
+       fill="#000000" />
+    <path
+       id="path41"
+       fill-rule="evenodd"
+       d="m16.055477 80.23097l74.3622 0l0 32.944878l-74.3622 0z"
+       fill="#ff8434" />
+    <path
+       id="path43"
+       fill-rule="nonzero"
+       d="m28.26957 103.62341l0 -13.359375l9.65625 0l0 1.578125l-7.875 0l0 4.09375l7.375 0l0 1.5625l-7.375 0l0 4.546875l8.1875 0l0 1.578125l-9.96875 0zm15.818573 0l0 -11.78125l-4.40625 0l0 -1.578125l10.578125 0l0 1.578125l-4.40625 0l0 11.78125l-1.765625 0zm8.052231 0l0 -13.359375l1.765625 0l0 5.484375l6.9375 0l0 -5.484375l1.765625 0l0 13.359375l-1.765625 0l0 -6.296875l-6.9375 0l0 6.296875l-1.765625 0zm24.109375 0l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625z"
+       fill="#000000" />
+    <path
+       id="path45"
+       fill-rule="evenodd"
+       d="m275.44394 174.07086l0 111.55905l-37.16536 0l0 -111.55905z"
+       fill="#ff8434" />
+    <path
+       id="path47"
+       fill-rule="nonzero"
+       d="m251.37877 194.63336q-0.859375 1.234375 -1.25 2.265625l-1.21875 -0.515625q0.515625 -1.4375 1.625 -2.875q-0.828125 -1.484375 -0.828125 -3.28125q0 -1.8125 0.875 -3.296875q0.875 -1.46875 2.453125 -2.265625q1.59375 -0.796875 3.5781097 -0.796875q1.984375 0 3.59375 0.796875q1.625 0.8125 2.46875 2.28125q0.859375 1.484375 0.859375 3.328125q0 1.84375 -0.890625 3.328125q-0.875 1.484375 -2.453125 2.265625q-1.578125 0.78125 -3.5625 0.78125q-1.6562347 0 -2.9687347 -0.5q-1.3125 -0.5 -2.28125 -1.515625zm2.25 -3.890625q-0.421875 1.53125 -1.28125 2.515625q1.421875 1.5625 4.2812347 1.5625q1.625 0 2.828125 -0.546875q1.21875 -0.546875 1.875 -1.609375q0.671875 -1.0625 0.671875 -2.390625q0 -1.96875 -1.359375 -3.28125q-1.34375 -1.296875 -4.03125 -1.296875q-2.5937347 0 -3.9999847 1.28125q-1.390625 1.296875 -1.390625 3.296875q0 0.953125 0.359375 1.78125q0.53125 -0.828125 0.765625 -1.75l1.28125 0.4375zm9.67186 17.042679l0 1.765625l-7.7187347 0q-2.015625 0 -3.203125 -0.453125q-1.1875 -0.453125 -1.93
 75 -1.640625q-0.734375 -1.1875 -0.734375 -3.125q0 -1.875 0.640625 -3.078125q0.65625 -1.1875 1.875 -1.703125q1.234375 -0.5 3.359375 -0.5l7.7187347 0l0 1.765625l-7.7187347 0q-1.734375 0 -2.5625 0.3125q-0.8125 0.328125 -1.265625 1.109375q-0.453125 0.796875 -0.453125 1.9375q0 1.953125 0.890625 2.78125q0.890625 0.828125 3.390625 0.828125l7.7187347 0zm-13.35936 4.738571l13.35936 0l0 9.65625l-1.578125 0l0 -7.875l-4.09375 0l0 7.375l-1.5625 0l0 -7.375l-4.5468597 0l0 8.1875l-1.578125 0l0 -9.96875zm13.35936 21.177948l0 1.765625l-7.7187347 0q-2.015625 0 -3.203125 -0.453125q-1.1875 -0.453125 -1.9375 -1.640625q-0.734375 -1.1875 -0.734375 -3.125q0 -1.875 0.640625 -3.078125q0.65625 -1.1875 1.875 -1.703125q1.234375 -0.5 3.359375 -0.5l7.7187347 0l0 1.765625l-7.7187347 0q-1.734375 0 -2.5625 0.3125q-0.8125 0.328125 -1.265625 1.109375q-0.453125 0.796875 -0.453125 1.9375q0 1.953125 0.890625 2.78125q0.890625 0.828125 3.390625 0.828125l7.7187347 0zm-13.35936 4.738571l13.35936 0l0 9.65625l-1.578125 0l0 -7.8
 75l-4.09375 0l0 7.375l-1.5625 0l0 -7.375l-4.5468597 0l0 8.1875l-1.578125 0l0 -9.96875zm0 23.111252l0 -1.640625l10.45311 0q-0.5625 -0.59375 -1.140625 -1.5625q-0.5625 -0.953125 -0.84375 -1.71875l1.59375 0q0.640625 1.375 1.5625 2.40625q0.921875 1.03125 1.78125 1.453125l0 1.0625l-13.406235 0zm3.5 4.2038574l0.140625 1.71875q-1.25 0.1875 -1.890625 0.875q-0.625 0.703125 -0.625 1.6875q0 1.1875 0.890625 2.0q0.890625 0.828125 2.359375 0.828125q1.40625 0 2.2187347 -0.796875q0.8125 -0.78125 0.8125 -2.0625q0 -0.78125 -0.359375 -1.421875q-0.359375 -0.640625 -0.9375 -1.0l0.203125 -1.546875l6.859375 1.296875l0 6.640625l-1.5625 0l0 -5.328125l-3.59375 -0.71875q0.84375 1.203125 0.84375 2.515625q0 1.75 -1.21875 2.953125q-1.203125 1.203125 -3.1093597 1.203125q-1.8125 0 -3.140625 -1.046875q-1.625 -1.296875 -1.625 -3.515625q0 -1.8125 1.015625 -2.96875q1.03125 -1.15625 2.71875 -1.3125z"
+       fill="#000000" />
+    <path
+       id="path49"
+       fill-rule="evenodd"
+       d="m97.92366 174.07086l0 111.55905l-37.16535 0l0 -111.55905z"
+       fill="#ff8434" />
+    <path
+       id="path51"
+       fill-rule="nonzero"
+       d="m73.85849 194.63336q-0.859375 1.234375 -1.25 2.265625l-1.21875 -0.515625q0.515625 -1.4375 1.625 -2.875q-0.828125 -1.484375 -0.828125 -3.28125q0 -1.8125 0.875 -3.296875q0.875 -1.46875 2.453125 -2.265625q1.59375 -0.796875 3.578125 -0.796875q1.984375 0 3.59375 0.796875q1.625 0.8125 2.46875 2.28125q0.859375 1.484375 0.859375 3.328125q0 1.84375 -0.890625 3.328125q-0.875 1.484375 -2.453125 2.265625q-1.578125 0.78125 -3.5625 0.78125q-1.65625 0 -2.96875 -0.5q-1.3125 -0.5 -2.28125 -1.515625zm2.25 -3.890625q-0.421875 1.53125 -1.28125 2.515625q1.421875 1.5625 4.28125 1.5625q1.625 0 2.828125 -0.546875q1.21875 -0.546875 1.875 -1.609375q0.671875 -1.0625 0.671875 -2.390625q0 -1.96875 -1.359375 -3.28125q-1.34375 -1.296875 -4.03125 -1.296875q-2.59375 0 -4.0 1.28125q-1.390625 1.296875 -1.390625 3.296875q0 0.953125 0.359375 1.78125q0.53125 -0.828125 0.765625 -1.75l1.28125 0.4375zm9.671875 17.042679l0 1.765625l-7.71875 0q-2.015625 0 -3.203125 -0.453125q-1.1875 -0.453125 -1.9375 -1.640625q-0.7
 34375 -1.1875 -0.734375 -3.125q0 -1.875 0.640625 -3.078125q0.65625 -1.1875 1.875 -1.703125q1.234375 -0.5 3.359375 -0.5l7.71875 0l0 1.765625l-7.71875 0q-1.734375 0 -2.5625 0.3125q-0.8125 0.328125 -1.265625 1.109375q-0.453125 0.796875 -0.453125 1.9375q0 1.953125 0.890625 2.78125q0.890625 0.828125 3.390625 0.828125l7.71875 0zm-13.359375 4.738571l13.359375 0l0 9.65625l-1.578125 0l0 -7.875l-4.09375 0l0 7.375l-1.5625 0l0 -7.375l-4.546875 0l0 8.1875l-1.578125 0l0 -9.96875zm13.359375 21.177948l0 1.765625l-7.71875 0q-2.015625 0 -3.203125 -0.453125q-1.1875 -0.453125 -1.9375 -1.640625q-0.734375 -1.1875 -0.734375 -3.125q0 -1.875 0.640625 -3.078125q0.65625 -1.1875 1.875 -1.703125q1.234375 -0.5 3.359375 -0.5l7.71875 0l0 1.765625l-7.71875 0q-1.734375 0 -2.5625 0.3125q-0.8125 0.328125 -1.265625 1.109375q-0.453125 0.796875 -0.453125 1.9375q0 1.953125 0.890625 2.78125q0.890625 0.828125 3.390625 0.828125l7.71875 0zm-13.359375 4.738571l13.359375 0l0 9.65625l-1.578125 0l0 -7.875l-4.09375 0l0 7.375l-1.56
 25 0l0 -7.375l-4.546875 0l0 8.1875l-1.578125 0l0 -9.96875zm6.59375 16.939377q2.359375 0 3.796875 0.484375q1.453125 0.484375 2.234375 1.4375q0.78125 0.96875 0.78125 2.421875q0 1.078125 -0.4375 1.890625q-0.421875 0.8125 -1.25 1.328125q-0.8125 0.53125 -1.984375 0.828125q-1.15625 0.3125 -3.140625 0.3125q-2.359375 0 -3.8125 -0.484375q-1.4375 -0.484375 -2.234375 -1.453125q-0.78125 -0.953125 -0.78125 -2.421875q0 -1.921875 1.390625 -3.03125q1.671875 -1.3125 5.4375 -1.3125zm0 1.671875q-3.296875 0 -4.390625 0.765625q-1.078125 0.78125 -1.078125 1.90625q0 1.140625 1.09375 1.90625q1.09375 0.765625 4.375 0.765625q3.296875 0 4.375 -0.765625q1.078125 -0.765625 1.078125 -1.921875q0 -1.125 -0.953125 -1.796875q-1.21875 -0.859375 -4.5 -0.859375z"
+       fill="#000000" />
+    <path
+       id="path53"
+       fill-rule="evenodd"
+       d="m366.2756 174.07086l0 111.55905l-37.165375 0l0 -111.55905z"
+       fill="#ff8434" />
+    <path
+       id="path55"
+       fill-rule="nonzero"
+       d="m342.21042 194.63336q-0.859375 1.234375 -1.25 2.265625l-1.21875 -0.515625q0.515625 -1.4375 1.625 -2.875q-0.828125 -1.484375 -0.828125 -3.28125q0 -1.8125 0.875 -3.296875q0.875 -1.46875 2.453125 -2.265625q1.59375 -0.796875 3.578125 -0.796875q1.984375 0 3.59375 0.796875q1.625 0.8125 2.46875 2.28125q0.859375 1.484375 0.859375 3.328125q0 1.84375 -0.890625 3.328125q-0.875 1.484375 -2.453125 2.265625q-1.578125 0.78125 -3.5625 0.78125q-1.65625 0 -2.96875 -0.5q-1.3125 -0.5 -2.28125 -1.515625zm2.25 -3.890625q-0.421875 1.53125 -1.28125 2.515625q1.421875 1.5625 4.28125 1.5625q1.625 0 2.828125 -0.546875q1.21875 -0.546875 1.875 -1.609375q0.671875 -1.0625 0.671875 -2.390625q0 -1.96875 -1.359375 -3.28125q-1.34375 -1.296875 -4.03125 -1.296875q-2.59375 0 -4.0 1.28125q-1.390625 1.296875 -1.390625 3.296875q0 0.953125 0.359375 1.78125q0.53125 -0.828125 0.765625 -1.75l1.28125 0.4375zm9.671875 17.042679l0 1.765625l-7.71875 0q-2.015625 0 -3.203125 -0.453125q-1.1875 -0.453125 -1.9375 -1.640625q-0.
 734375 -1.1875 -0.734375 -3.125q0 -1.875 0.640625 -3.078125q0.65625 -1.1875 1.875 -1.703125q1.234375 -0.5 3.359375 -0.5l7.71875 0l0 1.765625l-7.71875 0q-1.734375 0 -2.5625 0.3125q-0.8125 0.328125 -1.265625 1.109375q-0.453125 0.796875 -0.453125 1.9375q0 1.953125 0.890625 2.78125q0.890625 0.828125 3.390625 0.828125l7.71875 0zm-13.359375 4.738571l13.359375 0l0 9.65625l-1.578125 0l0 -7.875l-4.09375 0l0 7.375l-1.5625 0l0 -7.375l-4.546875 0l0 8.1875l-1.578125 0l0 -9.96875zm13.359375 21.177948l0 1.765625l-7.71875 0q-2.015625 0 -3.203125 -0.453125q-1.1875 -0.453125 -1.9375 -1.640625q-0.734375 -1.1875 -0.734375 -3.125q0 -1.875 0.640625 -3.078125q0.65625 -1.1875 1.875 -1.703125q1.234375 -0.5 3.359375 -0.5l7.71875 0l0 1.765625l-7.71875 0q-1.734375 0 -2.5625 0.3125q-0.8125 0.328125 -1.265625 1.109375q-0.453125 0.796875 -0.453125 1.9375q0 1.953125 0.890625 2.78125q0.890625 0.828125 3.390625 0.828125l7.71875 0zm-13.359375 4.738571l13.359375 0l0 9.65625l-1.578125 0l0 -7.875l-4.09375 0l0 7.375l-1.5
 625 0l0 -7.375l-4.546875 0l0 8.1875l-1.578125 0l0 -9.96875zm0 23.111252l0 -1.640625l10.453125 0q-0.5625 -0.59375 -1.140625 -1.5625q-0.5625 -0.953125 -0.84375 -1.71875l1.59375 0q0.640625 1.375 1.5625 2.40625q0.921875 1.03125 1.78125 1.453125l0 1.0625l-13.40625 0zm10.078125 12.703857l-0.125 -1.625q0.96875 -0.21875 1.40625 -0.625q0.703125 -0.65625 0.703125 -1.640625q0 -0.78125 -0.4375 -1.375q-0.5625 -0.765625 -1.65625 -1.21875q-1.078125 -0.453125 -3.078125 -0.46875q0.890625 0.59375 1.328125 1.453125q0.4375 0.859375 0.4375 1.796875q0 1.640625 -1.203125 2.78125q-1.203125 1.15625 -3.109375 1.15625q-1.265625 0 -2.34375 -0.546875q-1.078125 -0.53125 -1.65625 -1.484375q-0.578125 -0.9375 -0.578125 -2.140625q0 -2.0625 1.5 -3.359375q1.515625 -1.28125 4.984375 -1.28125q3.875 0 5.625 1.421875q1.53125 1.25 1.53125 3.375q0 1.5625 -0.890625 2.5625q-0.875 1.015625 -2.4375 1.21875zm-5.75 -6.6875q-0.84375 0 -1.625 0.359375q-0.765625 0.359375 -1.171875 1.0q-0.40625 0.640625 -0.40625 1.359375q0 1.03125 0.
 828125 1.78125q0.84375 0.75 2.28125 0.75q1.390625 0 2.1875 -0.734375q0.796875 -0.734375 0.796875 -1.859375q0 -1.109375 -0.796875 -1.890625q-0.796875 -0.765625 -2.09375 -0.765625z"
+       fill="#000000" />
+    <path
+       id="path57"
+       fill-rule="evenodd"
+       d="m542.03937 174.07086l0 111.55905l-37.165344 0l0 -111.55905z"
+       fill="#ff8434" />
+    <path
+       id="path59"
+       fill-rule="nonzero"
+       d="m517.9742 194.63336q-0.859375 1.234375 -1.25 2.265625l-1.21875 -0.515625q0.515625 -1.4375 1.625 -2.875q-0.828125 -1.484375 -0.828125 -3.28125q0 -1.8125 0.875 -3.296875q0.875 -1.46875 2.453125 -2.265625q1.59375 -0.796875 3.578125 -0.796875q1.984375 0 3.59375 0.796875q1.625 0.8125 2.46875 2.28125q0.859375 1.484375 0.859375 3.328125q0 1.84375 -0.890625 3.328125q-0.875 1.484375 -2.453125 2.265625q-1.578125 0.78125 -3.5625 0.78125q-1.65625 0 -2.96875 -0.5q-1.3125 -0.5 -2.28125 -1.515625zm2.25 -3.890625q-0.421875 1.53125 -1.28125 2.515625q1.421875 1.5625 4.28125 1.5625q1.625 0 2.828125 -0.546875q1.21875 -0.546875 1.875 -1.609375q0.671875 -1.0625 0.671875 -2.390625q0 -1.96875 -1.359375 -3.28125q-1.34375 -1.296875 -4.03125 -1.296875q-2.59375 0 -4.0 1.28125q-1.390625 1.296875 -1.390625 3.296875q0 0.953125 0.359375 1.78125q0.53125 -0.828125 0.765625 -1.75l1.28125 0.4375zm9.671875 17.042679l0 1.765625l-7.71875 0q-2.015625 0 -3.203125 -0.453125q-1.1875 -0.453125 -1.9375 -1.640625q-0.7
 34375 -1.1875 -0.734375 -3.125q0 -1.875 0.640625 -3.078125q0.65625 -1.1875 1.875 -1.703125q1.234375 -0.5 3.359375 -0.5l7.71875 0l0 1.765625l-7.71875 0q-1.734375 0 -2.5625 0.3125q-0.8125 0.328125 -1.265625 1.109375q-0.453125 0.796875 -0.453125 1.9375q0 1.953125 0.890625 2.78125q0.890625 0.828125 3.390625 0.828125l7.71875 0zm-13.359375 4.738571l13.359375 0l0 9.65625l-1.578125 0l0 -7.875l-4.09375 0l0 7.375l-1.5625 0l0 -7.375l-4.546875 0l0 8.1875l-1.578125 0l0 -9.96875zm13.359375 21.177948l0 1.765625l-7.71875 0q-2.015625 0 -3.203125 -0.453125q-1.1875 -0.453125 -1.9375 -1.640625q-0.734375 -1.1875 -0.734375 -3.125q0 -1.875 0.640625 -3.078125q0.65625 -1.1875 1.875 -1.703125q1.234375 -0.5 3.359375 -0.5l7.71875 0l0 1.765625l-7.71875 0q-1.734375 0 -2.5625 0.3125q-0.8125 0.328125 -1.265625 1.109375q-0.453125 0.796875 -0.453125 1.9375q0 1.953125 0.890625 2.78125q0.890625 0.828125 3.390625 0.828125l7.71875 0zm-13.359375 4.738571l13.359375 0l0 9.65625l-1.578125 0l0 -7.875l-4.09375 0l0 7.375l-1.56
 25 0l0 -7.375l-4.546875 0l0 8.1875l-1.578125 0l0 -9.96875zm3.53125 16.939377l0.21875 1.640625q-1.40625 0.28125 -2.015625 0.953125q-0.609375 0.6875 -0.609375 1.65625q0 1.15625 0.796875 1.953125q0.796875 0.796875 1.984375 0.796875q1.125 0 1.859375 -0.734375q0.734375 -0.734375 0.734375 -1.875q0 -0.46875 -0.171875 -1.15625l1.4375 0.1875q-0.015625 0.15625 -0.015625 0.265625q0 1.046875 0.546875 1.875q0.546875 0.84375 1.671875 0.84375q0.90625 0 1.5 -0.609375q0.59375 -0.609375 0.59375 -1.578125q0 -0.953125 -0.609375 -1.59375q-0.59375 -0.640625 -1.796875 -0.8125l0.296875 -1.640625q1.640625 0.296875 2.546875 1.359375q0.90625 1.0625 0.90625 2.65625q0 1.09375 -0.46875 2.0q-0.46875 0.921875 -1.28125 1.40625q-0.8125 0.5 -1.71875 0.5q-0.859375 0 -1.578125 -0.46875q-0.703125 -0.46875 -1.125 -1.375q-0.28125 1.1875 -1.140625 1.84375q-0.859375 0.65625 -2.15625 0.65625q-1.734375 0 -2.953125 -1.28125q-1.21875 -1.265625 -1.21875 -3.21875q0 -1.765625 1.046875 -2.921875q1.046875 -1.15625 2.71875 -1.328125z
 m-1.953125 18.985107l-1.578125 0l0 -8.828125q0.59375 -0.015625 1.140625 0.1875q0.90625 0.34375 1.78125 1.078125q0.875 0.75 2.015625 2.15625q1.78125 2.171875 2.828125 2.9375q1.046875 0.765625 1.96875 0.765625q0.984375 0 1.640625 -0.703125q0.671875 -0.6875 0.671875 -1.8125q0 -1.1875 -0.71875 -1.90625q-0.703125 -0.703125 -1.953125 -0.703125l0.171875 -1.6875q1.890625 0.171875 2.875 1.296875q0.984375 1.140625 0.984375 3.03125q0 1.921875 -1.0625 3.046875q-1.0625 1.125 -2.640625 1.125q-0.796875 0 -1.578125 -0.328125q-0.78125 -0.328125 -1.640625 -1.09375q-0.84375 -0.75 -2.34375 -2.53125q-1.234375 -1.46875 -1.6875 -1.890625q-0.4375 -0.421875 -0.875 -0.6875l0 6.546875z"
+       fill="#000000" />
+  </g>
+</svg>
diff --git a/doc/guides/nics/szedata2.rst b/doc/guides/nics/szedata2.rst
index 4327e4e..1b4b3eb 100644
--- a/doc/guides/nics/szedata2.rst
+++ b/doc/guides/nics/szedata2.rst
@@ -43,8 +43,10 @@ separately:
 
 *  **Kernel modules**
 
+   * combo6core
    * combov3
-   * szedata2_cv3
+   * szedata2
+   * szedata2_cv3 or szedata2_cv3_fdt
 
    Kernel modules manage initialization of hardware, allocation and
    sharing of resources for user space applications.
@@ -62,45 +64,53 @@ These configuration options can be modified before compilation in the
 
    Value **y** enables compilation of szedata2 PMD.
 
-*  ``CONFIG_RTE_LIBRTE_PMD_SZEDATA2_AS`` default value: **0**
-
-   This option defines type of firmware address space and must be set
-   according to the used card and mode.
-   Currently supported values are:
-
-   * **0** - for cards (modes):
-
-      * NFB-100G1 (100G1)
+Using the SZEDATA2 PMD
+----------------------
 
-   * **1** - for cards (modes):
+From DPDK version 16.04 the type of SZEDATA2 PMD is changed to PMD_PDEV.
+SZEDATA2 device is automatically recognized during EAL initialization.
+No special command line options are needed.
 
-      * NFB-100G2Q (100G1)
+Kernel modules have to be loaded before running the DPDK application.
 
-   * **2** - for cards (modes):
+NFB card architecture
+---------------------
 
-      * NFB-40G2 (40G2)
-      * NFB-100G2C (100G2)
-      * NFB-100G2Q (40G2)
+The NFB cards are multi-port multi-queue cards, where (generally) data from any
+Ethernet port may be sent to any queue.
+They were historically represented in DPDK as a single port.
 
-   * **3** - for cards (modes):
+However, the new NFB-200G2QL card employs an addon cable which allows to connect
+it to two physical PCI-E slots at the same time (see the diagram below).
+This is done to allow 200 Gbps of traffic to be transferred through the PCI-E
+bus (note that a single PCI-E 3.0 x16 slot provides only 125 Gbps theoretical
+throughput).
 
-      * NFB-40G2 (10G8)
-      * NFB-100G2Q (10G8)
+Since each slot may be connected to a different CPU and therefore to a different
+NUMA node, the card is represented as two ports in DPDK (each with half of the
+queues), which allows DPDK to work with data from the individual queues on the
+right NUMA node.
 
-   * **4** - for cards (modes):
+.. figure:: img/szedata2_nfb200g_architecture.svg
+    :align: center
 
-      * NFB-100G1 (10G10)
+    NFB-200G2QL high-level diagram
 
-   * **5** - for experimental firmwares and future use
+Limitations
+-----------
 
-Using the SZEDATA2 PMD
-----------------------
+The SZEDATA2 PMD does not support operations related to Ethernet ports
+(link_up, link_down, set_mac_address, etc.).
 
-From DPDK version 16.04 the type of SZEDATA2 PMD is changed to PMD_PDEV.
-SZEDATA2 device is automatically recognized during EAL initialization.
-No special command line options are needed.
+NFB cards employ multiple Ethernet ports.
+Until now, Ethernet port-related operations were performed on all of them
+(since the whole card was represented as a single port).
+With NFB-200G2QL card, this is no longer viable (see above).
 
-Kernel modules have to be loaded before running the DPDK application.
+Since there is no fixed mapping between the queues and Ethernet ports, and since
+a single card can be represented as two ports in DPDK, there is no way of
+telling which (if any) physical ports should be associated with individual
+ports in DPDK.
 
 Example of usage
 ----------------
diff --git a/drivers/net/szedata2/Makefile b/drivers/net/szedata2/Makefile
index c5204cb..b77fae1 100644
--- a/drivers/net/szedata2/Makefile
+++ b/drivers/net/szedata2/Makefile
@@ -23,7 +23,6 @@ LIBABIVER := 1
 # all source are stored in SRCS-y
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_SZEDATA2) += rte_eth_szedata2.c
-SRCS-$(CONFIG_RTE_LIBRTE_PMD_SZEDATA2) += szedata2_iobuf.c
 
 #
 # Export include files
diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
index fb9aac0..0f3ee94 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.c
+++ b/drivers/net/szedata2/rte_eth_szedata2.c
@@ -24,7 +24,6 @@
 
 #include "rte_eth_szedata2.h"
 #include "szedata2_logs.h"
-#include "szedata2_iobuf.h"
 
 #define RTE_ETH_SZEDATA2_MAX_RX_QUEUES 32
 #define RTE_ETH_SZEDATA2_MAX_TX_QUEUES 32
@@ -1142,78 +1141,17 @@ struct szedata2_tx_queue {
 	dev->data->nb_tx_queues = 0;
 }
 
-/**
- * Function takes value from first IBUF status register.
- * Values in IBUF and OBUF should be same.
- *
- * @param internals
- *     Pointer to device private structure.
- * @return
- *     Link speed constant.
- */
-static inline enum szedata2_link_speed
-get_link_speed(const struct pmd_internals *internals)
-{
-	const volatile struct szedata2_ibuf *ibuf =
-		ibuf_ptr_by_index(internals->pci_rsc, 0);
-	uint32_t speed = (szedata2_read32(&ibuf->ibuf_st) & 0x70) >> 4;
-	switch (speed) {
-	case 0x03:
-		return SZEDATA2_LINK_SPEED_10G;
-	case 0x04:
-		return SZEDATA2_LINK_SPEED_40G;
-	case 0x05:
-		return SZEDATA2_LINK_SPEED_100G;
-	default:
-		return SZEDATA2_LINK_SPEED_DEFAULT;
-	}
-}
-
 static int
 eth_link_update(struct rte_eth_dev *dev,
 		int wait_to_complete __rte_unused)
 {
 	struct rte_eth_link link;
-	struct pmd_internals *internals = (struct pmd_internals *)
-		dev->data->dev_private;
-	const volatile struct szedata2_ibuf *ibuf;
-	uint32_t i;
-	bool link_is_up = false;
 
 	memset(&link, 0, sizeof(link));
 
-	switch (get_link_speed(internals)) {
-	case SZEDATA2_LINK_SPEED_10G:
-		link.link_speed = ETH_SPEED_NUM_10G;
-		break;
-	case SZEDATA2_LINK_SPEED_40G:
-		link.link_speed = ETH_SPEED_NUM_40G;
-		break;
-	case SZEDATA2_LINK_SPEED_100G:
-		link.link_speed = ETH_SPEED_NUM_100G;
-		break;
-	default:
-		link.link_speed = ETH_SPEED_NUM_10G;
-		break;
-	}
-
-	/* szedata2 uses only full duplex */
+	link.link_speed = ETH_SPEED_NUM_100G;
 	link.link_duplex = ETH_LINK_FULL_DUPLEX;
-
-	for (i = 0; i < szedata2_ibuf_count; i++) {
-		ibuf = ibuf_ptr_by_index(internals->pci_rsc, i);
-		/*
-		 * Link is considered up if at least one ibuf is enabled
-		 * and up.
-		 */
-		if (ibuf_is_enabled(ibuf) && ibuf_is_link_up(ibuf)) {
-			link_is_up = true;
-			break;
-		}
-	}
-
-	link.link_status = link_is_up ? ETH_LINK_UP : ETH_LINK_DOWN;
-
+	link.link_status = ETH_LINK_UP;
 	link.link_autoneg = ETH_LINK_FIXED;
 
 	rte_eth_linkstatus_set(dev, &link);
@@ -1221,30 +1159,16 @@ struct szedata2_tx_queue {
 }
 
 static int
-eth_dev_set_link_up(struct rte_eth_dev *dev)
+eth_dev_set_link_up(struct rte_eth_dev *dev __rte_unused)
 {
-	struct pmd_internals *internals = (struct pmd_internals *)
-		dev->data->dev_private;
-	uint32_t i;
-
-	for (i = 0; i < szedata2_ibuf_count; i++)
-		ibuf_enable(ibuf_ptr_by_index(internals->pci_rsc, i));
-	for (i = 0; i < szedata2_obuf_count; i++)
-		obuf_enable(obuf_ptr_by_index(internals->pci_rsc, i));
+	PMD_DRV_LOG(WARNING, "Setting link up is not supported.");
 	return 0;
 }
 
 static int
-eth_dev_set_link_down(struct rte_eth_dev *dev)
+eth_dev_set_link_down(struct rte_eth_dev *dev __rte_unused)
 {
-	struct pmd_internals *internals = (struct pmd_internals *)
-		dev->data->dev_private;
-	uint32_t i;
-
-	for (i = 0; i < szedata2_ibuf_count; i++)
-		ibuf_disable(ibuf_ptr_by_index(internals->pci_rsc, i));
-	for (i = 0; i < szedata2_obuf_count; i++)
-		obuf_disable(obuf_ptr_by_index(internals->pci_rsc, i));
+	PMD_DRV_LOG(WARNING, "Setting link down is not supported.");
 	return 0;
 }
 
@@ -1368,55 +1292,29 @@ struct szedata2_tx_queue {
 }
 
 static void
-eth_promiscuous_enable(struct rte_eth_dev *dev)
+eth_promiscuous_enable(struct rte_eth_dev *dev __rte_unused)
 {
-	struct pmd_internals *internals = (struct pmd_internals *)
-		dev->data->dev_private;
-	uint32_t i;
-
-	for (i = 0; i < szedata2_ibuf_count; i++) {
-		ibuf_mac_mode_write(ibuf_ptr_by_index(internals->pci_rsc, i),
-				SZEDATA2_MAC_CHMODE_PROMISC);
-	}
+	PMD_DRV_LOG(WARNING, "Enabling promiscuous mode is not supported. "
+			"The card is always in promiscuous mode.");
 }
 
 static void
-eth_promiscuous_disable(struct rte_eth_dev *dev)
+eth_promiscuous_disable(struct rte_eth_dev *dev __rte_unused)
 {
-	struct pmd_internals *internals = (struct pmd_internals *)
-		dev->data->dev_private;
-	uint32_t i;
-
-	for (i = 0; i < szedata2_ibuf_count; i++) {
-		ibuf_mac_mode_write(ibuf_ptr_by_index(internals->pci_rsc, i),
-				SZEDATA2_MAC_CHMODE_ONLY_VALID);
-	}
+	PMD_DRV_LOG(WARNING, "Disabling promiscuous mode is not supported. "
+			"The card is always in promiscuous mode.");
 }
 
 static void
-eth_allmulticast_enable(struct rte_eth_dev *dev)
+eth_allmulticast_enable(struct rte_eth_dev *dev __rte_unused)
 {
-	struct pmd_internals *internals = (struct pmd_internals *)
-		dev->data->dev_private;
-	uint32_t i;
-
-	for (i = 0; i < szedata2_ibuf_count; i++) {
-		ibuf_mac_mode_write(ibuf_ptr_by_index(internals->pci_rsc, i),
-				SZEDATA2_MAC_CHMODE_ALL_MULTICAST);
-	}
+	PMD_DRV_LOG(WARNING, "Enabling allmulticast mode is not supported.");
 }
 
 static void
-eth_allmulticast_disable(struct rte_eth_dev *dev)
+eth_allmulticast_disable(struct rte_eth_dev *dev __rte_unused)
 {
-	struct pmd_internals *internals = (struct pmd_internals *)
-		dev->data->dev_private;
-	uint32_t i;
-
-	for (i = 0; i < szedata2_ibuf_count; i++) {
-		ibuf_mac_mode_write(ibuf_ptr_by_index(internals->pci_rsc, i),
-				SZEDATA2_MAC_CHMODE_ONLY_VALID);
-	}
+	PMD_DRV_LOG(WARNING, "Disabling allmulticast mode is not supported.");
 }
 
 static const struct eth_dev_ops ops = {
@@ -1626,9 +1524,6 @@ struct szedata2_tx_queue {
 
 	ether_addr_copy(&eth_addr, data->mac_addrs);
 
-	/* At initial state COMBO card is in promiscuous mode so disable it */
-	eth_promiscuous_disable(dev);
-
 	PMD_INIT_LOG(INFO, "szedata2 device ("
 			PCI_PRI_FMT ") successfully initialized",
 			pci_addr->domain, pci_addr->bus, pci_addr->devid,
diff --git a/drivers/net/szedata2/szedata2_iobuf.c b/drivers/net/szedata2/szedata2_iobuf.c
deleted file mode 100644
index 2d18989..0000000
--- a/drivers/net/szedata2/szedata2_iobuf.c
+++ /dev/null
@@ -1,174 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 CESNET
- */
-
-#include <stdint.h>
-
-#include <rte_common.h>
-
-#include "szedata2_iobuf.h"
-
-/*
- * IBUFs and OBUFs can generally be located at different offsets in different
- * firmwares (modes).
- * This part defines base offsets of IBUFs and OBUFs for various cards
- * and firmwares (modes).
- * Type of firmware (mode) is set through configuration option
- * CONFIG_RTE_LIBRTE_PMD_SZEDATA2_AS.
- * Possible values are:
- * 0 - for cards (modes):
- *     NFB-100G1 (100G1)
- *
- * 1 - for cards (modes):
- *     NFB-100G2Q (100G1)
- *
- * 2 - for cards (modes):
- *     NFB-40G2 (40G2)
- *     NFB-100G2C (100G2)
- *     NFB-100G2Q (40G2)
- *
- * 3 - for cards (modes):
- *     NFB-40G2 (10G8)
- *     NFB-100G2Q (10G8)
- *
- * 4 - for cards (modes):
- *     NFB-100G1 (10G10)
- *
- * 5 - for experimental firmwares and future use
- */
-#if !defined(RTE_LIBRTE_PMD_SZEDATA2_AS)
-#error "RTE_LIBRTE_PMD_SZEDATA2_AS has to be defined"
-#elif RTE_LIBRTE_PMD_SZEDATA2_AS == 0
-
-/*
- * Cards (modes):
- *     NFB-100G1 (100G1)
- */
-
-const uint32_t szedata2_ibuf_base_table[] = {
-	0x8000
-};
-const uint32_t szedata2_obuf_base_table[] = {
-	0x9000
-};
-
-#elif RTE_LIBRTE_PMD_SZEDATA2_AS == 1
-
-/*
- * Cards (modes):
- *     NFB-100G2Q (100G1)
- */
-
-const uint32_t szedata2_ibuf_base_table[] = {
-	0x8800
-};
-const uint32_t szedata2_obuf_base_table[] = {
-	0x9800
-};
-
-#elif RTE_LIBRTE_PMD_SZEDATA2_AS == 2
-
-/*
- * Cards (modes):
- *     NFB-40G2 (40G2)
- *     NFB-100G2C (100G2)
- *     NFB-100G2Q (40G2)
- */
-
-const uint32_t szedata2_ibuf_base_table[] = {
-	0x8000,
-	0x8800
-};
-const uint32_t szedata2_obuf_base_table[] = {
-	0x9000,
-	0x9800
-};
-
-#elif RTE_LIBRTE_PMD_SZEDATA2_AS == 3
-
-/*
- * Cards (modes):
- *     NFB-40G2 (10G8)
- *     NFB-100G2Q (10G8)
- */
-
-const uint32_t szedata2_ibuf_base_table[] = {
-	0x8000,
-	0x8200,
-	0x8400,
-	0x8600,
-	0x8800,
-	0x8A00,
-	0x8C00,
-	0x8E00
-};
-const uint32_t szedata2_obuf_base_table[] = {
-	0x9000,
-	0x9200,
-	0x9400,
-	0x9600,
-	0x9800,
-	0x9A00,
-	0x9C00,
-	0x9E00
-};
-
-#elif RTE_LIBRTE_PMD_SZEDATA2_AS == 4
-
-/*
- * Cards (modes):
- *     NFB-100G1 (10G10)
- */
-
-const uint32_t szedata2_ibuf_base_table[] = {
-	0x8000,
-	0x8200,
-	0x8400,
-	0x8600,
-	0x8800,
-	0x8A00,
-	0x8C00,
-	0x8E00,
-	0x9000,
-	0x9200
-};
-const uint32_t szedata2_obuf_base_table[] = {
-	0xA000,
-	0xA200,
-	0xA400,
-	0xA600,
-	0xA800,
-	0xAA00,
-	0xAC00,
-	0xAE00,
-	0xB000,
-	0xB200
-};
-
-#elif RTE_LIBRTE_PMD_SZEDATA2_AS == 5
-
-/*
- * Future use and experimental firmwares.
- */
-
-const uint32_t szedata2_ibuf_base_table[] = {
-	0x8000,
-	0x8200,
-	0x8400,
-	0x8600,
-	0x8800
-};
-const uint32_t szedata2_obuf_base_table[] = {
-	0x9000,
-	0x9200,
-	0x9400,
-	0x9600,
-	0x9800
-};
-
-#else
-#error "RTE_LIBRTE_PMD_SZEDATA2_AS has wrong value, see comments in config file"
-#endif
-
-const uint32_t szedata2_ibuf_count = RTE_DIM(szedata2_ibuf_base_table);
-const uint32_t szedata2_obuf_count = RTE_DIM(szedata2_obuf_base_table);
diff --git a/drivers/net/szedata2/szedata2_iobuf.h b/drivers/net/szedata2/szedata2_iobuf.h
deleted file mode 100644
index 795f0f5..0000000
--- a/drivers/net/szedata2/szedata2_iobuf.h
+++ /dev/null
@@ -1,327 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 CESNET
- */
-
-#ifndef _SZEDATA2_IOBUF_H_
-#define _SZEDATA2_IOBUF_H_
-
-#include <stdint.h>
-#include <stdbool.h>
-
-#include <rte_byteorder.h>
-#include <rte_io.h>
-#include <rte_dev.h>
-
-/* IBUF offsets from the beginning of the PCI resource address space. */
-extern const uint32_t szedata2_ibuf_base_table[];
-extern const uint32_t szedata2_ibuf_count;
-
-/* OBUF offsets from the beginning of the PCI resource address space. */
-extern const uint32_t szedata2_obuf_base_table[];
-extern const uint32_t szedata2_obuf_count;
-
-enum szedata2_link_speed {
-	SZEDATA2_LINK_SPEED_DEFAULT = 0,
-	SZEDATA2_LINK_SPEED_10G,
-	SZEDATA2_LINK_SPEED_40G,
-	SZEDATA2_LINK_SPEED_100G,
-};
-
-enum szedata2_mac_check_mode {
-	SZEDATA2_MAC_CHMODE_PROMISC       = 0x0,
-	SZEDATA2_MAC_CHMODE_ONLY_VALID    = 0x1,
-	SZEDATA2_MAC_CHMODE_ALL_BROADCAST = 0x2,
-	SZEDATA2_MAC_CHMODE_ALL_MULTICAST = 0x3,
-};
-
-/**
- * Macro takes pointer to pci resource structure (rsc)
- * and returns pointer to mapped resource memory at
- * specified offset (offset) typecast to the type (type).
- */
-#define SZEDATA2_PCI_RESOURCE_PTR(rsc, offset, type) \
-	((type)(((uint8_t *)(rsc)->addr) + (offset)))
-
-/**
- * Maximum possible number of MAC addresses (limited by IBUF status
- * register value MAC_COUNT which has 5 bits).
- */
-#define SZEDATA2_IBUF_MAX_MAC_COUNT 32
-
-/**
- * Structure describes IBUF address space.
- */
-struct szedata2_ibuf {
-	/** Total Received Frames Counter low part */
-	uint32_t trfcl; /**< 0x00 */
-	/** Correct Frames Counter low part */
-	uint32_t cfcl; /**< 0x04 */
-	/** Discarded Frames Counter low part */
-	uint32_t dfcl; /**< 0x08 */
-	/** Counter of frames discarded due to buffer overflow low part */
-	uint32_t bodfcl; /**< 0x0C */
-	/** Total Received Frames Counter high part */
-	uint32_t trfch; /**< 0x10 */
-	/** Correct Frames Counter high part */
-	uint32_t cfch; /**< 0x14 */
-	/** Discarded Frames Counter high part */
-	uint32_t dfch; /**< 0x18 */
-	/** Counter of frames discarded due to buffer overflow high part */
-	uint32_t bodfch; /**< 0x1C */
-	/** IBUF enable register */
-	uint32_t ibuf_en; /**< 0x20 */
-	/** Error mask register */
-	uint32_t err_mask; /**< 0x24 */
-	/** IBUF status register */
-	uint32_t ibuf_st; /**< 0x28 */
-	/** IBUF command register */
-	uint32_t ibuf_cmd; /**< 0x2C */
-	/** Minimum frame length allowed */
-	uint32_t mfla; /**< 0x30 */
-	/** Frame MTU */
-	uint32_t mtu; /**< 0x34 */
-	/** MAC address check mode */
-	uint32_t mac_chmode; /**< 0x38 */
-	/** Octets Received OK Counter low part */
-	uint32_t orocl; /**< 0x3C */
-	/** Octets Received OK Counter high part */
-	uint32_t oroch; /**< 0x40 */
-	/** reserved */
-	uint8_t reserved[60]; /**< 0x4C */
-	/** IBUF memory for MAC addresses */
-	uint32_t mac_mem[2 * SZEDATA2_IBUF_MAX_MAC_COUNT]; /**< 0x80 */
-} __rte_packed;
-
-/**
- * Structure describes OBUF address space.
- */
-struct szedata2_obuf {
-	/** Total Sent Frames Counter low part */
-	uint32_t tsfcl; /**< 0x00 */
-	/** Octets Sent Counter low part */
-	uint32_t oscl; /**< 0x04 */
-	/** Total Discarded Frames Counter low part */
-	uint32_t tdfcl; /**< 0x08 */
-	/** reserved */
-	uint32_t reserved1; /**< 0x0C */
-	/** Total Sent Frames Counter high part */
-	uint32_t tsfch; /**< 0x10 */
-	/** Octets Sent Counter high part */
-	uint32_t osch; /**< 0x14 */
-	/** Total Discarded Frames Counter high part */
-	uint32_t tdfch; /**< 0x18 */
-	/** reserved */
-	uint32_t reserved2; /**< 0x1C */
-	/** OBUF enable register */
-	uint32_t obuf_en; /**< 0x20 */
-	/** reserved */
-	uint64_t reserved3; /**< 0x24 */
-	/** OBUF control register */
-	uint32_t ctrl; /**< 0x2C */
-	/** OBUF status register */
-	uint32_t obuf_st; /**< 0x30 */
-} __rte_packed;
-
-/**
- * Wrapper for reading 4 bytes from device memory in correct endianness.
- *
- * @param addr
- *     Address for reading.
- * @return
- *     4 B value.
- */
-static inline uint32_t
-szedata2_read32(const volatile void *addr)
-{
-	return rte_le_to_cpu_32(rte_read32(addr));
-}
-
-/**
- * Wrapper for writing 4 bytes to device memory in correct endianness.
- *
- * @param value
- *     Value to write.
- * @param addr
- *     Address for writing.
- */
-static inline void
-szedata2_write32(uint32_t value, volatile void *addr)
-{
-	rte_write32(rte_cpu_to_le_32(value), addr);
-}
-
-/**
- * Get pointer to IBUF structure according to specified index.
- *
- * @param rsc
- *     Pointer to base address of memory resource.
- * @param index
- *     Index of IBUF.
- * @return
- *     Pointer to IBUF structure.
- */
-static inline struct szedata2_ibuf *
-ibuf_ptr_by_index(struct rte_mem_resource *rsc, uint32_t index)
-{
-	if (index >= szedata2_ibuf_count)
-		index = szedata2_ibuf_count - 1;
-	return SZEDATA2_PCI_RESOURCE_PTR(rsc, szedata2_ibuf_base_table[index],
-		struct szedata2_ibuf *);
-}
-
-/**
- * Get pointer to OBUF structure according to specified idnex.
- *
- * @param rsc
- *     Pointer to base address of memory resource.
- * @param index
- *     Index of OBUF.
- * @return
- *     Pointer to OBUF structure.
- */
-static inline struct szedata2_obuf *
-obuf_ptr_by_index(struct rte_mem_resource *rsc, uint32_t index)
-{
-	if (index >= szedata2_obuf_count)
-		index = szedata2_obuf_count - 1;
-	return SZEDATA2_PCI_RESOURCE_PTR(rsc, szedata2_obuf_base_table[index],
-		struct szedata2_obuf *);
-}
-
-/**
- * Checks if IBUF is enabled.
- *
- * @param ibuf
- *     Pointer to IBUF structure.
- * @return
- *     true if IBUF is enabled.
- *     false if IBUF is disabled.
- */
-static inline bool
-ibuf_is_enabled(const volatile struct szedata2_ibuf *ibuf)
-{
-	return ((szedata2_read32(&ibuf->ibuf_en) & 0x1) != 0) ? true : false;
-}
-
-/**
- * Enables IBUF.
- *
- * @param ibuf
- *     Pointer to IBUF structure.
- */
-static inline void
-ibuf_enable(volatile struct szedata2_ibuf *ibuf)
-{
-	szedata2_write32(szedata2_read32(&ibuf->ibuf_en) | 0x1, &ibuf->ibuf_en);
-}
-
-/**
- * Disables IBUF.
- *
- * @param ibuf
- *     Pointer to IBUF structure.
- */
-static inline void
-ibuf_disable(volatile struct szedata2_ibuf *ibuf)
-{
-	szedata2_write32(szedata2_read32(&ibuf->ibuf_en) & ~0x1,
-			&ibuf->ibuf_en);
-}
-
-/**
- * Checks if link is up.
- *
- * @param ibuf
- *     Pointer to IBUF structure.
- * @return
- *     true if ibuf link is up.
- *     false if ibuf link is down.
- */
-static inline bool
-ibuf_is_link_up(const volatile struct szedata2_ibuf *ibuf)
-{
-	return ((szedata2_read32(&ibuf->ibuf_st) & 0x80) != 0) ? true : false;
-}
-
-/**
- * Get current MAC address check mode from IBUF.
- *
- * @param ibuf
- *     Pointer to IBUF structure.
- * @return
- *     MAC address check mode constant.
- */
-static inline enum szedata2_mac_check_mode
-ibuf_mac_mode_read(const volatile struct szedata2_ibuf *ibuf)
-{
-	switch (szedata2_read32(&ibuf->mac_chmode) & 0x3) {
-	case 0x0:
-		return SZEDATA2_MAC_CHMODE_PROMISC;
-	case 0x1:
-		return SZEDATA2_MAC_CHMODE_ONLY_VALID;
-	case 0x2:
-		return SZEDATA2_MAC_CHMODE_ALL_BROADCAST;
-	case 0x3:
-		return SZEDATA2_MAC_CHMODE_ALL_MULTICAST;
-	default:
-		return SZEDATA2_MAC_CHMODE_PROMISC;
-	}
-}
-
-/**
- * Writes mode in MAC address check mode register in IBUF.
- *
- * @param ibuf
- *     Pointer to IBUF structure.
- * @param mode
- *     MAC address check mode to set.
- */
-static inline void
-ibuf_mac_mode_write(volatile struct szedata2_ibuf *ibuf,
-		enum szedata2_mac_check_mode mode)
-{
-	szedata2_write32((szedata2_read32(&ibuf->mac_chmode) & ~0x3) | mode,
-			&ibuf->mac_chmode);
-}
-
-/**
- * Checks if obuf is enabled.
- *
- * @param obuf
- *     Pointer to OBUF structure.
- * @return
- *     true if OBUF is enabled.
- *     false if OBUF is disabled.
- */
-static inline bool
-obuf_is_enabled(const volatile struct szedata2_obuf *obuf)
-{
-	return ((szedata2_read32(&obuf->obuf_en) & 0x1) != 0) ? true : false;
-}
-
-/**
- * Enables OBUF.
- *
- * @param obuf
- *     Pointer to OBUF structure.
- */
-static inline void
-obuf_enable(volatile struct szedata2_obuf *obuf)
-{
-	szedata2_write32(szedata2_read32(&obuf->obuf_en) | 0x1, &obuf->obuf_en);
-}
-
-/**
- * Disables OBUF.
- *
- * @param obuf
- *     Pointer to OBUF structure.
- */
-static inline void
-obuf_disable(volatile struct szedata2_obuf *obuf)
-{
-	szedata2_write32(szedata2_read32(&obuf->obuf_en) & ~0x1,
-			&obuf->obuf_en);
-}
-
-#endif /* _SZEDATA2_IOBUF_H_ */
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [dpdk-dev] [PATCH 2/3] net/szedata2: add support for new NIC
  2018-04-06 14:12 [dpdk-dev] [PATCH 0/3] net/szedata2: patch set for new card support Matej Vido
  2018-04-06 14:12 ` [dpdk-dev] [PATCH 1/3] net/szedata2: do not affect Ethernet interfaces Matej Vido
@ 2018-04-06 14:12 ` Matej Vido
  2018-04-06 14:12 ` [dpdk-dev] [PATCH 3/3] net/szedata2: add kernel module dependency Matej Vido
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 23+ messages in thread
From: Matej Vido @ 2018-04-06 14:12 UTC (permalink / raw)
  To: dev; +Cc: remes

This patch adds support for new NIC NFB-200G2QL.

At the probing stage numa nodes for the DMA queues are identified
and the appropriate number of ports is allocated.
DMA queues residing on the same numa node are grouped in the same
port.

Signed-off-by: Matej Vido <vido@cesnet.cz>
---
 doc/guides/rel_notes/release_18_05.rst  |   4 +
 drivers/net/szedata2/rte_eth_szedata2.c | 545 +++++++++++++++++++++++++-------
 drivers/net/szedata2/rte_eth_szedata2.h |   4 +-
 3 files changed, 441 insertions(+), 112 deletions(-)

diff --git a/doc/guides/rel_notes/release_18_05.rst b/doc/guides/rel_notes/release_18_05.rst
index 9cc77f8..87e36cf 100644
--- a/doc/guides/rel_notes/release_18_05.rst
+++ b/doc/guides/rel_notes/release_18_05.rst
@@ -58,6 +58,10 @@ New Features
   * Added support for NVGRE, VXLAN and GENEVE filters in flow API.
   * Added support for DROP action in flow API.
 
+* **Updated szedata2 PMD.**
+
+  Added support for new NFB-200G2QL card.
+
 
 API Changes
 -----------
diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
index 0f3ee94..c4b34e0 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.c
+++ b/drivers/net/szedata2/rte_eth_szedata2.c
@@ -38,18 +38,53 @@
 
 #define SZEDATA2_DEV_PATH_FMT "/dev/szedataII%u"
 
+/**
+ * Format string for suffix used to differentiate between Ethernet ports
+ * on the same PCI device.
+ */
+#define SZEDATA2_ETH_DEV_NAME_SUFFIX_FMT "-port%u"
+
+/**
+ * Maximum number of ports for one device.
+ */
+#define SZEDATA2_MAX_PORTS 2
+
+/**
+ * Entry in list of PCI devices for this driver.
+ */
+struct pci_dev_list_entry;
+struct pci_dev_list_entry {
+	LIST_ENTRY(pci_dev_list_entry) next;
+	struct rte_pci_device *pci_dev;
+	unsigned int port_count;
+};
+
+/* List of PCI devices with number of ports for this driver. */
+LIST_HEAD(pci_dev_list, pci_dev_list_entry) szedata2_pci_dev_list =
+	LIST_HEAD_INITIALIZER(szedata2_pci_dev_list);
+
+struct port_info {
+	unsigned int rx_base_id;
+	unsigned int tx_base_id;
+	unsigned int rx_count;
+	unsigned int tx_count;
+	int numa_node;
+};
+
 struct pmd_internals {
 	struct rte_eth_dev *dev;
 	uint16_t max_rx_queues;
 	uint16_t max_tx_queues;
-	char sze_dev[PATH_MAX];
-	struct rte_mem_resource *pci_rsc;
+	unsigned int rxq_base_id;
+	unsigned int txq_base_id;
+	char *sze_dev_path;
 };
 
 struct szedata2_rx_queue {
 	struct pmd_internals *priv;
 	struct szedata *sze;
 	uint8_t rx_channel;
+	uint16_t qid;
 	uint16_t in_port;
 	struct rte_mempool *mb_pool;
 	volatile uint64_t rx_pkts;
@@ -61,6 +96,7 @@ struct szedata2_tx_queue {
 	struct pmd_internals *priv;
 	struct szedata *sze;
 	uint8_t tx_channel;
+	uint16_t qid;
 	volatile uint64_t tx_pkts;
 	volatile uint64_t tx_bytes;
 	volatile uint64_t err_pkts;
@@ -870,7 +906,7 @@ struct szedata2_tx_queue {
 	if (rxq->sze == NULL) {
 		uint32_t rx = 1 << rxq->rx_channel;
 		uint32_t tx = 0;
-		rxq->sze = szedata_open(internals->sze_dev);
+		rxq->sze = szedata_open(internals->sze_dev_path);
 		if (rxq->sze == NULL)
 			return -EINVAL;
 		ret = szedata_subscribe3(rxq->sze, &rx, &tx);
@@ -915,7 +951,7 @@ struct szedata2_tx_queue {
 	if (txq->sze == NULL) {
 		uint32_t rx = 0;
 		uint32_t tx = 1 << txq->tx_channel;
-		txq->sze = szedata_open(internals->sze_dev);
+		txq->sze = szedata_open(internals->sze_dev_path);
 		if (txq->sze == NULL)
 			return -EINVAL;
 		ret = szedata_subscribe3(txq->sze, &rx, &tx);
@@ -1180,12 +1216,15 @@ struct szedata2_tx_queue {
 		const struct rte_eth_rxconf *rx_conf __rte_unused,
 		struct rte_mempool *mb_pool)
 {
-	struct pmd_internals *internals = dev->data->dev_private;
 	struct szedata2_rx_queue *rxq;
 	int ret;
-	uint32_t rx = 1 << rx_queue_id;
+	struct pmd_internals *internals = dev->data->dev_private;
+	uint8_t rx_channel = internals->rxq_base_id + rx_queue_id;
+	uint32_t rx = 1 << rx_channel;
 	uint32_t tx = 0;
 
+	PMD_INIT_FUNC_TRACE();
+
 	if (dev->data->rx_queues[rx_queue_id] != NULL) {
 		eth_rx_queue_release(dev->data->rx_queues[rx_queue_id]);
 		dev->data->rx_queues[rx_queue_id] = NULL;
@@ -1201,7 +1240,7 @@ struct szedata2_tx_queue {
 	}
 
 	rxq->priv = internals;
-	rxq->sze = szedata_open(internals->sze_dev);
+	rxq->sze = szedata_open(internals->sze_dev_path);
 	if (rxq->sze == NULL) {
 		PMD_INIT_LOG(ERR, "szedata_open() failed for rx queue id "
 				"%" PRIu16 "!", rx_queue_id);
@@ -1215,7 +1254,8 @@ struct szedata2_tx_queue {
 		eth_rx_queue_release(rxq);
 		return -EINVAL;
 	}
-	rxq->rx_channel = rx_queue_id;
+	rxq->rx_channel = rx_channel;
+	rxq->qid = rx_queue_id;
 	rxq->in_port = dev->data->port_id;
 	rxq->mb_pool = mb_pool;
 	rxq->rx_pkts = 0;
@@ -1225,7 +1265,8 @@ struct szedata2_tx_queue {
 	dev->data->rx_queues[rx_queue_id] = rxq;
 
 	PMD_INIT_LOG(DEBUG, "Configured rx queue id %" PRIu16 " on socket "
-			"%u.", rx_queue_id, socket_id);
+			"%u (channel id %u).", rxq->qid, socket_id,
+			rxq->rx_channel);
 
 	return 0;
 }
@@ -1237,11 +1278,14 @@ struct szedata2_tx_queue {
 		unsigned int socket_id,
 		const struct rte_eth_txconf *tx_conf __rte_unused)
 {
-	struct pmd_internals *internals = dev->data->dev_private;
 	struct szedata2_tx_queue *txq;
 	int ret;
+	struct pmd_internals *internals = dev->data->dev_private;
+	uint8_t tx_channel = internals->txq_base_id + tx_queue_id;
 	uint32_t rx = 0;
-	uint32_t tx = 1 << tx_queue_id;
+	uint32_t tx = 1 << tx_channel;
+
+	PMD_INIT_FUNC_TRACE();
 
 	if (dev->data->tx_queues[tx_queue_id] != NULL) {
 		eth_tx_queue_release(dev->data->tx_queues[tx_queue_id]);
@@ -1258,7 +1302,7 @@ struct szedata2_tx_queue {
 	}
 
 	txq->priv = internals;
-	txq->sze = szedata_open(internals->sze_dev);
+	txq->sze = szedata_open(internals->sze_dev_path);
 	if (txq->sze == NULL) {
 		PMD_INIT_LOG(ERR, "szedata_open() failed for tx queue id "
 				"%" PRIu16 "!", tx_queue_id);
@@ -1272,7 +1316,8 @@ struct szedata2_tx_queue {
 		eth_tx_queue_release(txq);
 		return -EINVAL;
 	}
-	txq->tx_channel = tx_queue_id;
+	txq->tx_channel = tx_channel;
+	txq->qid = tx_queue_id;
 	txq->tx_pkts = 0;
 	txq->tx_bytes = 0;
 	txq->err_pkts = 0;
@@ -1280,7 +1325,8 @@ struct szedata2_tx_queue {
 	dev->data->tx_queues[tx_queue_id] = txq;
 
 	PMD_INIT_LOG(DEBUG, "Configured tx queue id %" PRIu16 " on socket "
-			"%u.", tx_queue_id, socket_id);
+			"%u (channel id %u).", txq->qid, socket_id,
+			txq->tx_channel);
 
 	return 0;
 }
@@ -1408,59 +1454,51 @@ struct szedata2_tx_queue {
 	return -1;
 }
 
+/**
+ * @brief Initializes rte_eth_dev device.
+ * @param dev Device to initialize.
+ * @param pi Structure with info about DMA queues.
+ * @return 0 on success, negative error code on error.
+ */
 static int
-rte_szedata2_eth_dev_init(struct rte_eth_dev *dev)
+rte_szedata2_eth_dev_init(struct rte_eth_dev *dev, struct port_info *pi)
 {
+	int ret;
+	uint32_t szedata2_index;
+	char name[PATH_MAX];
 	struct rte_eth_dev_data *data = dev->data;
 	struct pmd_internals *internals = (struct pmd_internals *)
 		data->dev_private;
-	struct szedata *szedata_temp;
-	int ret;
-	uint32_t szedata2_index;
 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
-	struct rte_pci_addr *pci_addr = &pci_dev->addr;
-	struct rte_mem_resource *pci_rsc =
-		&pci_dev->mem_resource[PCI_RESOURCE_NUMBER];
-	char rsc_filename[PATH_MAX];
-	void *pci_resource_ptr = NULL;
-	int fd;
 
-	PMD_INIT_LOG(INFO, "Initializing szedata2 device (" PCI_PRI_FMT ")",
-			pci_addr->domain, pci_addr->bus, pci_addr->devid,
-			pci_addr->function);
+	PMD_INIT_FUNC_TRACE();
 
-	internals->dev = dev;
+	PMD_INIT_LOG(INFO, "Initializing eth_dev %s (driver %s)", data->name,
+			dev->device->driver->name);
 
+	/* Fill internal private structure. */
+	internals->dev = dev;
 	/* Get index of szedata2 device file and create path to device file */
-	ret = get_szedata2_index(pci_addr, &szedata2_index);
+	ret = get_szedata2_index(&pci_dev->addr, &szedata2_index);
 	if (ret != 0) {
 		PMD_INIT_LOG(ERR, "Failed to get szedata2 device index!");
 		return -ENODEV;
 	}
-	snprintf(internals->sze_dev, PATH_MAX, SZEDATA2_DEV_PATH_FMT,
-			szedata2_index);
-
-	PMD_INIT_LOG(INFO, "SZEDATA2 path: %s", internals->sze_dev);
-
-	/*
-	 * Get number of available DMA RX and TX channels, which is maximum
-	 * number of queues that can be created and store it in private device
-	 * data structure.
-	 */
-	szedata_temp = szedata_open(internals->sze_dev);
-	if (szedata_temp == NULL) {
-		PMD_INIT_LOG(ERR, "szedata_open(): failed to open %s",
-				internals->sze_dev);
-		return -EINVAL;
+	snprintf(name, PATH_MAX, SZEDATA2_DEV_PATH_FMT, szedata2_index);
+	internals->sze_dev_path = strdup(name);
+	if (internals->sze_dev_path == NULL) {
+		PMD_INIT_LOG(ERR, "strdup() failed!");
+		return -ENOMEM;
 	}
-	internals->max_rx_queues = szedata_ifaces_available(szedata_temp,
-			SZE2_DIR_RX);
-	internals->max_tx_queues = szedata_ifaces_available(szedata_temp,
-			SZE2_DIR_TX);
-	szedata_close(szedata_temp);
-
-	PMD_INIT_LOG(INFO, "Available DMA channels RX: %u TX: %u",
-			internals->max_rx_queues, internals->max_tx_queues);
+	PMD_INIT_LOG(INFO, "SZEDATA2 path: %s", internals->sze_dev_path);
+	internals->max_rx_queues = pi->rx_count;
+	internals->max_tx_queues = pi->tx_count;
+	internals->rxq_base_id = pi->rx_base_id;
+	internals->txq_base_id = pi->tx_base_id;
+	PMD_INIT_LOG(INFO, "%u RX DMA channels from id %u",
+			internals->max_rx_queues, internals->rxq_base_id);
+	PMD_INIT_LOG(INFO, "%u TX DMA channels from id %u",
+			internals->max_tx_queues, internals->txq_base_id);
 
 	/* Set rx, tx burst functions */
 	if (data->scattered_rx == 1)
@@ -1472,43 +1510,6 @@ struct szedata2_tx_queue {
 	/* Set function callbacks for Ethernet API */
 	dev->dev_ops = &ops;
 
-	rte_eth_copy_pci_info(dev, pci_dev);
-
-	/* mmap pci resource0 file to rte_mem_resource structure */
-	if (pci_dev->mem_resource[PCI_RESOURCE_NUMBER].phys_addr ==
-			0) {
-		PMD_INIT_LOG(ERR, "Missing resource%u file",
-				PCI_RESOURCE_NUMBER);
-		return -EINVAL;
-	}
-	snprintf(rsc_filename, PATH_MAX,
-		"%s/" PCI_PRI_FMT "/resource%u", rte_pci_get_sysfs_path(),
-		pci_addr->domain, pci_addr->bus,
-		pci_addr->devid, pci_addr->function, PCI_RESOURCE_NUMBER);
-	fd = open(rsc_filename, O_RDWR);
-	if (fd < 0) {
-		PMD_INIT_LOG(ERR, "Could not open file %s", rsc_filename);
-		return -EINVAL;
-	}
-
-	pci_resource_ptr = mmap(0,
-			pci_dev->mem_resource[PCI_RESOURCE_NUMBER].len,
-			PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-	close(fd);
-	if (pci_resource_ptr == MAP_FAILED) {
-		PMD_INIT_LOG(ERR, "Could not mmap file %s (fd = %d)",
-				rsc_filename, fd);
-		return -EINVAL;
-	}
-	pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr = pci_resource_ptr;
-	internals->pci_rsc = pci_rsc;
-
-	PMD_INIT_LOG(DEBUG, "resource%u phys_addr = 0x%llx len = %llu "
-			"virt addr = %llx", PCI_RESOURCE_NUMBER,
-			(unsigned long long)pci_rsc->phys_addr,
-			(unsigned long long)pci_rsc->len,
-			(unsigned long long)pci_rsc->addr);
-
 	/* Get link state */
 	eth_link_update(dev, 0);
 
@@ -1517,36 +1518,36 @@ struct szedata2_tx_queue {
 			RTE_CACHE_LINE_SIZE);
 	if (data->mac_addrs == NULL) {
 		PMD_INIT_LOG(ERR, "Could not alloc space for MAC address!");
-		munmap(pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr,
-		       pci_dev->mem_resource[PCI_RESOURCE_NUMBER].len);
-		return -EINVAL;
+		free(internals->sze_dev_path);
+		return -ENOMEM;
 	}
 
 	ether_addr_copy(&eth_addr, data->mac_addrs);
 
-	PMD_INIT_LOG(INFO, "szedata2 device ("
-			PCI_PRI_FMT ") successfully initialized",
-			pci_addr->domain, pci_addr->bus, pci_addr->devid,
-			pci_addr->function);
+	PMD_INIT_LOG(INFO, "%s device %s successfully initialized",
+			dev->device->driver->name, data->name);
 
 	return 0;
 }
 
+/**
+ * @brief Unitializes rte_eth_dev device.
+ * @param dev Device to uninitialize.
+ * @return 0 on success, negative error code on error.
+ */
 static int
 rte_szedata2_eth_dev_uninit(struct rte_eth_dev *dev)
 {
-	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
-	struct rte_pci_addr *pci_addr = &pci_dev->addr;
+	struct pmd_internals *internals = (struct pmd_internals *)
+		dev->data->dev_private;
+
+	PMD_INIT_FUNC_TRACE();
 
+	free(internals->sze_dev_path);
 	rte_free(dev->data->mac_addrs);
-	dev->data->mac_addrs = NULL;
-	munmap(pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr,
-	       pci_dev->mem_resource[PCI_RESOURCE_NUMBER].len);
 
-	PMD_DRV_LOG(INFO, "szedata2 device ("
-			PCI_PRI_FMT ") successfully uninitialized",
-			pci_addr->domain, pci_addr->bus, pci_addr->devid,
-			pci_addr->function);
+	PMD_DRV_LOG(INFO, "%s device %s successfully uninitialized",
+			dev->device->driver->name, dev->data->name);
 
 	return 0;
 }
@@ -1565,21 +1566,347 @@ struct szedata2_tx_queue {
 				PCI_DEVICE_ID_NETCOPE_COMBO100G2)
 	},
 	{
+		RTE_PCI_DEVICE(PCI_VENDOR_ID_NETCOPE,
+				PCI_DEVICE_ID_NETCOPE_NFB200G2QL)
+	},
+	{
 		.vendor_id = 0,
 	}
 };
 
+/**
+ * @brief Gets info about DMA queues for ports.
+ * @param pci_dev PCI device structure.
+ * @param port_count Pointer to variable set with number of ports.
+ * @param pi Pointer to array of structures with info about DMA queues
+ *           for ports.
+ * @param max_ports Maximum number of ports.
+ * @return 0 on success, negative error code on error.
+ */
+static int
+get_port_info(struct rte_pci_device *pci_dev, unsigned int *port_count,
+		struct port_info *pi, unsigned int max_ports)
+{
+	struct szedata *szedata_temp;
+	char sze_dev_path[PATH_MAX];
+	uint32_t szedata2_index;
+	int ret;
+	uint16_t max_rx_queues;
+	uint16_t max_tx_queues;
+
+	if (max_ports == 0)
+		return -EINVAL;
+
+	memset(pi, 0, max_ports * sizeof(struct port_info));
+	*port_count = 0;
+
+	/* Get index of szedata2 device file and create path to device file */
+	ret = get_szedata2_index(&pci_dev->addr, &szedata2_index);
+	if (ret != 0) {
+		PMD_INIT_LOG(ERR, "Failed to get szedata2 device index!");
+		return -ENODEV;
+	}
+	snprintf(sze_dev_path, PATH_MAX, SZEDATA2_DEV_PATH_FMT, szedata2_index);
+
+	/*
+	 * Get number of available DMA RX and TX channels, which is maximum
+	 * number of queues that can be created.
+	 */
+	szedata_temp = szedata_open(sze_dev_path);
+	if (szedata_temp == NULL) {
+		PMD_INIT_LOG(ERR, "szedata_open(%s) failed", sze_dev_path);
+		return -EINVAL;
+	}
+	max_rx_queues = szedata_ifaces_available(szedata_temp, SZE2_DIR_RX);
+	max_tx_queues = szedata_ifaces_available(szedata_temp, SZE2_DIR_TX);
+	PMD_INIT_LOG(INFO, "Available DMA channels RX: %u TX: %u",
+			max_rx_queues, max_tx_queues);
+	if (max_rx_queues > RTE_ETH_SZEDATA2_MAX_RX_QUEUES) {
+		PMD_INIT_LOG(ERR, "%u RX queues exceeds supported number %u",
+				max_rx_queues, RTE_ETH_SZEDATA2_MAX_RX_QUEUES);
+		szedata_close(szedata_temp);
+		return -EINVAL;
+	}
+	if (max_tx_queues > RTE_ETH_SZEDATA2_MAX_TX_QUEUES) {
+		PMD_INIT_LOG(ERR, "%u TX queues exceeds supported number %u",
+				max_tx_queues, RTE_ETH_SZEDATA2_MAX_TX_QUEUES);
+		szedata_close(szedata_temp);
+		return -EINVAL;
+	}
+
+	if (pci_dev->id.device_id == PCI_DEVICE_ID_NETCOPE_NFB200G2QL) {
+		unsigned int i;
+		unsigned int rx_queues = max_rx_queues / max_ports;
+		unsigned int tx_queues = max_tx_queues / max_ports;
+
+		/*
+		 * Number of queues reported by szedata_ifaces_available()
+		 * is the number of all queues from all DMA controllers which
+		 * may reside at different numa locations.
+		 * All queues from the same DMA controller have the same numa
+		 * node.
+		 * Numa node from the first queue of each DMA controller is
+		 * retrieved.
+		 * If the numa node differs from the numa node of the queues
+		 * from the previous DMA controller the queues are assigned
+		 * to the next port.
+		 */
+
+		for (i = 0; i < max_ports; i++) {
+			int numa_rx = szedata_get_area_numa_node(szedata_temp,
+				SZE2_DIR_RX, rx_queues * i);
+			int numa_tx = szedata_get_area_numa_node(szedata_temp,
+				SZE2_DIR_TX, tx_queues * i);
+			unsigned int port_rx_queues = numa_rx != -1 ?
+				rx_queues : 0;
+			unsigned int port_tx_queues = numa_tx != -1 ?
+				tx_queues : 0;
+			PMD_INIT_LOG(DEBUG, "%u rx queues from id %u, numa %d",
+					rx_queues, rx_queues * i, numa_rx);
+			PMD_INIT_LOG(DEBUG, "%u tx queues from id %u, numa %d",
+					tx_queues, tx_queues * i, numa_tx);
+
+			if (port_rx_queues != 0 && port_tx_queues != 0 &&
+					numa_rx != numa_tx) {
+				PMD_INIT_LOG(ERR, "RX queue %u numa %d differs "
+						"from TX queue %u numa %d "
+						"unexpectedly",
+						rx_queues * i, numa_rx,
+						tx_queues * i, numa_tx);
+				szedata_close(szedata_temp);
+				return -EINVAL;
+			} else if (port_rx_queues == 0 && port_tx_queues == 0) {
+				continue;
+			} else {
+				unsigned int j;
+				unsigned int current = *port_count;
+				int port_numa = port_rx_queues != 0 ?
+					numa_rx : numa_tx;
+
+				for (j = 0; j < *port_count; j++) {
+					if (pi[j].numa_node ==
+							port_numa) {
+						current = j;
+						break;
+					}
+				}
+				if (pi[current].rx_count == 0 &&
+						pi[current].tx_count == 0) {
+					pi[current].rx_base_id = rx_queues * i;
+					pi[current].tx_base_id = tx_queues * i;
+					(*port_count)++;
+				} else if ((rx_queues * i !=
+						pi[current].rx_base_id +
+						pi[current].rx_count) ||
+						(tx_queues * i !=
+						 pi[current].tx_base_id +
+						 pi[current].tx_count)) {
+					PMD_INIT_LOG(ERR, "Queue ids does not "
+							"fulfill constraints");
+					szedata_close(szedata_temp);
+					return -EINVAL;
+				}
+				pi[current].rx_count += port_rx_queues;
+				pi[current].tx_count += port_tx_queues;
+				pi[current].numa_node = port_numa;
+			}
+		}
+	} else {
+		pi[0].rx_count = max_rx_queues;
+		pi[0].tx_count = max_tx_queues;
+		pi[0].numa_node = pci_dev->device.numa_node;
+		*port_count = 1;
+	}
+
+	szedata_close(szedata_temp);
+	return 0;
+}
+
+/**
+ * @brief Allocates rte_eth_dev device.
+ * @param pci_dev Corresponding PCI device.
+ * @param numa_node NUMA node on which device is allocated.
+ * @param port_no Id of rte_eth_device created on PCI device pci_dev.
+ * @return Pointer to allocated device or NULL on error.
+ */
+static struct rte_eth_dev *
+szedata2_eth_dev_allocate(struct rte_pci_device *pci_dev, int numa_node,
+		unsigned int port_no)
+{
+	struct rte_eth_dev *eth_dev;
+	char name[RTE_ETH_NAME_MAX_LEN];
+
+	PMD_INIT_FUNC_TRACE();
+
+	snprintf(name, RTE_ETH_NAME_MAX_LEN, "%s"
+			SZEDATA2_ETH_DEV_NAME_SUFFIX_FMT,
+			pci_dev->device.name, port_no);
+	PMD_INIT_LOG(DEBUG, "Allocating eth_dev %s", name);
+
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+		eth_dev = rte_eth_dev_allocate(name);
+		if (!eth_dev)
+			return NULL;
+
+		eth_dev->data->dev_private = rte_zmalloc_socket(name,
+			sizeof(struct pmd_internals), RTE_CACHE_LINE_SIZE,
+			numa_node);
+		if (!eth_dev->data->dev_private) {
+			rte_eth_dev_release_port(eth_dev);
+			return NULL;
+		}
+	} else {
+		eth_dev = rte_eth_dev_attach_secondary(name);
+		if (!eth_dev)
+			return NULL;
+	}
+
+	eth_dev->device = &pci_dev->device;
+	rte_eth_copy_pci_info(eth_dev, pci_dev);
+	eth_dev->data->numa_node = numa_node;
+	return eth_dev;
+}
+
+/**
+ * @brief Releases interval of rte_eth_dev devices from array.
+ * @param eth_devs Array of pointers to rte_eth_dev devices.
+ * @param from Index in array eth_devs to start with.
+ * @param to Index in array right after the last element to release.
+ *
+ * Used for releasing at failed initialization.
+ */
+static void
+szedata2_eth_dev_release_interval(struct rte_eth_dev **eth_devs,
+		unsigned int from, unsigned int to)
+{
+	unsigned int i;
+
+	PMD_INIT_FUNC_TRACE();
+
+	for (i = from; i < to; i++) {
+		rte_szedata2_eth_dev_uninit(eth_devs[i]);
+		rte_eth_dev_pci_release(eth_devs[i]);
+	}
+}
+
+/**
+ * @brief Callback .probe for struct rte_pci_driver.
+ */
 static int szedata2_eth_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	struct rte_pci_device *pci_dev)
 {
-	return rte_eth_dev_pci_generic_probe(pci_dev,
-		sizeof(struct pmd_internals), rte_szedata2_eth_dev_init);
+	struct port_info port_info[SZEDATA2_MAX_PORTS];
+	unsigned int port_count;
+	int ret;
+	unsigned int i;
+	struct pci_dev_list_entry *list_entry;
+	struct rte_eth_dev *eth_devs[SZEDATA2_MAX_PORTS] = {NULL,};
+
+	PMD_INIT_FUNC_TRACE();
+
+	ret = get_port_info(pci_dev, &port_count, port_info,
+			SZEDATA2_MAX_PORTS);
+	if (ret != 0)
+		return ret;
+
+	if (port_count == 0) {
+		PMD_INIT_LOG(ERR, "No available ports!");
+		return -ENODEV;
+	}
+
+	list_entry = rte_zmalloc(NULL, sizeof(struct pci_dev_list_entry),
+			RTE_CACHE_LINE_SIZE);
+	if (list_entry == NULL) {
+		PMD_INIT_LOG(ERR, "rte_zmalloc() failed!");
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < port_count; i++) {
+		eth_devs[i] = szedata2_eth_dev_allocate(pci_dev,
+				port_info[i].numa_node, i);
+		if (eth_devs[i] == NULL) {
+			PMD_INIT_LOG(ERR, "Failed to alloc eth_dev for port %u",
+					i);
+			szedata2_eth_dev_release_interval(eth_devs, 0, i);
+			rte_free(list_entry);
+			return -ENOMEM;
+		}
+
+		ret = rte_szedata2_eth_dev_init(eth_devs[i], &port_info[i]);
+		if (ret != 0) {
+			PMD_INIT_LOG(ERR, "Failed to init eth_dev for port %u",
+					i);
+			rte_eth_dev_pci_release(eth_devs[i]);
+			szedata2_eth_dev_release_interval(eth_devs, 0, i);
+			rte_free(list_entry);
+			return ret;
+		}
+	}
+
+	/*
+	 * Add pci_dev to list of PCI devices for this driver
+	 * which is used at remove callback to release all created eth_devs.
+	 */
+	list_entry->pci_dev = pci_dev;
+	list_entry->port_count = port_count;
+	LIST_INSERT_HEAD(&szedata2_pci_dev_list, list_entry, next);
+	return 0;
 }
 
+/**
+ * @brief Callback .remove for struct rte_pci_driver.
+ */
 static int szedata2_eth_pci_remove(struct rte_pci_device *pci_dev)
 {
-	return rte_eth_dev_pci_generic_remove(pci_dev,
-		rte_szedata2_eth_dev_uninit);
+	unsigned int i;
+	unsigned int port_count;
+	char name[RTE_ETH_NAME_MAX_LEN];
+	struct rte_eth_dev *eth_dev;
+	int ret;
+	int retval = 0;
+	bool found = false;
+	struct pci_dev_list_entry *list_entry = NULL;
+
+	PMD_INIT_FUNC_TRACE();
+
+	LIST_FOREACH(list_entry, &szedata2_pci_dev_list, next) {
+		if (list_entry->pci_dev == pci_dev) {
+			port_count = list_entry->port_count;
+			found = true;
+			break;
+		}
+	}
+	LIST_REMOVE(list_entry, next);
+	rte_free(list_entry);
+
+	if (!found) {
+		PMD_DRV_LOG(ERR, "PCI device " PCI_PRI_FMT " not found",
+				pci_dev->addr.domain, pci_dev->addr.bus,
+				pci_dev->addr.devid, pci_dev->addr.function);
+		return -ENODEV;
+	}
+
+	for (i = 0; i < port_count; i++) {
+		snprintf(name, RTE_ETH_NAME_MAX_LEN, "%s"
+				SZEDATA2_ETH_DEV_NAME_SUFFIX_FMT,
+				pci_dev->device.name, i);
+		PMD_DRV_LOG(DEBUG, "Removing eth_dev %s", name);
+		eth_dev = rte_eth_dev_allocated(name);
+		if (!eth_dev) {
+			PMD_DRV_LOG(ERR, "eth_dev %s not found", name);
+			retval = retval ? retval : -ENODEV;
+		}
+
+		ret = rte_szedata2_eth_dev_uninit(eth_dev);
+		if (ret != 0) {
+			PMD_DRV_LOG(ERR, "eth_dev %s uninit failed", name);
+			retval = retval ? retval : ret;
+		}
+
+		rte_eth_dev_pci_release(eth_dev);
+	}
+
+	return retval;
 }
 
 static struct rte_pci_driver szedata2_eth_driver = {
diff --git a/drivers/net/szedata2/rte_eth_szedata2.h b/drivers/net/szedata2/rte_eth_szedata2.h
index 147d3d9..26a82b3 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.h
+++ b/drivers/net/szedata2/rte_eth_szedata2.h
@@ -18,9 +18,7 @@
 #define PCI_DEVICE_ID_NETCOPE_COMBO80G 0xcb80
 #define PCI_DEVICE_ID_NETCOPE_COMBO100G 0xc1c1
 #define PCI_DEVICE_ID_NETCOPE_COMBO100G2 0xc2c1
-
-/* number of PCI resource used by COMBO card */
-#define PCI_RESOURCE_NUMBER 0
+#define PCI_DEVICE_ID_NETCOPE_NFB200G2QL 0xc250
 
 /* szedata2_packet header length == 4 bytes == 2B segment size + 2B hw size */
 #define RTE_SZE2_PACKET_HEADER_SIZE 4
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [dpdk-dev] [PATCH 3/3] net/szedata2: add kernel module dependency
  2018-04-06 14:12 [dpdk-dev] [PATCH 0/3] net/szedata2: patch set for new card support Matej Vido
  2018-04-06 14:12 ` [dpdk-dev] [PATCH 1/3] net/szedata2: do not affect Ethernet interfaces Matej Vido
  2018-04-06 14:12 ` [dpdk-dev] [PATCH 2/3] net/szedata2: add support for new NIC Matej Vido
@ 2018-04-06 14:12 ` Matej Vido
  2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 0/3] net/szedata2: patch set for new card support Matej Vido
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 23+ messages in thread
From: Matej Vido @ 2018-04-06 14:12 UTC (permalink / raw)
  To: dev; +Cc: remes

New kernel module dependency is required to support NFB-200G2QL card.

Signed-off-by: Matej Vido <vido@cesnet.cz>
---
 drivers/net/szedata2/rte_eth_szedata2.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
index c4b34e0..c2a149a 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.c
+++ b/drivers/net/szedata2/rte_eth_szedata2.c
@@ -1918,7 +1918,7 @@ static int szedata2_eth_pci_remove(struct rte_pci_device *pci_dev)
 RTE_PMD_REGISTER_PCI(RTE_SZEDATA2_DRIVER_NAME, szedata2_eth_driver);
 RTE_PMD_REGISTER_PCI_TABLE(RTE_SZEDATA2_DRIVER_NAME, rte_szedata2_pci_id_table);
 RTE_PMD_REGISTER_KMOD_DEP(RTE_SZEDATA2_DRIVER_NAME,
-	"* combo6core & combov3 & szedata2 & szedata2_cv3");
+	"* combo6core & combov3 & szedata2 & ( szedata2_cv3 | szedata2_cv3_fdt )");
 
 RTE_INIT(szedata2_init_log);
 static void
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [dpdk-dev] [PATCH 1/3] net/szedata2: do not affect Ethernet interfaces
  2018-04-06 14:12 ` [dpdk-dev] [PATCH 1/3] net/szedata2: do not affect Ethernet interfaces Matej Vido
@ 2018-04-10 15:28   ` Ferruh Yigit
  2018-04-11  9:36     ` Matej Vido
  0 siblings, 1 reply; 23+ messages in thread
From: Ferruh Yigit @ 2018-04-10 15:28 UTC (permalink / raw)
  To: Matej Vido, dev; +Cc: remes

On 4/6/2018 3:12 PM, Matej Vido wrote:
> NFB cards employ multiple Ethernet ports.
> Until now, Ethernet port-related operations were performed on all of them
> (since the whole card was represented as a single port).
> With new NFB-200G2QL card, this is no longer viable.
> 
> Since there is no fixed mapping between the queues and Ethernet ports,
> and since a single card can be represented as two ports in DPDK,
> there is no way of telling which (if any) physical ports should be
> associated with individual ports in DPDK.
> 
> This is also described in documentation in more detail.
> 
> Signed-off-by: Matej Vido <vido@cesnet.cz>
> Signed-off-by: Jan Remes <remes@netcope.com>
> ---
>  config/common_base                                 |   5 -
>  .../nics/img/szedata2_nfb200g_architecture.svg     | 171 +++++++++++

Hi Matej,

This patch fails to apply [1], can you please confirm you can apply it?

[1]
$ git apply --check
dpdk-dev-1-3-net-szedata2-do-not-affect-Ethernet-interfaces.patch
error: corrupt patch at line 270

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [dpdk-dev] [PATCH 1/3] net/szedata2: do not affect Ethernet interfaces
  2018-04-10 15:28   ` Ferruh Yigit
@ 2018-04-11  9:36     ` Matej Vido
  2018-04-11 10:51       ` Ferruh Yigit
  0 siblings, 1 reply; 23+ messages in thread
From: Matej Vido @ 2018-04-11  9:36 UTC (permalink / raw)
  To: Ferruh Yigit, dev; +Cc: remes

On 10.04.2018 17:28, Ferruh Yigit wrote:
> On 4/6/2018 3:12 PM, Matej Vido wrote:
>> NFB cards employ multiple Ethernet ports.
>> Until now, Ethernet port-related operations were performed on all of them
>> (since the whole card was represented as a single port).
>> With new NFB-200G2QL card, this is no longer viable.
>>
>> Since there is no fixed mapping between the queues and Ethernet ports,
>> and since a single card can be represented as two ports in DPDK,
>> there is no way of telling which (if any) physical ports should be
>> associated with individual ports in DPDK.
>>
>> This is also described in documentation in more detail.
>>
>> Signed-off-by: Matej Vido <vido@cesnet.cz>
>> Signed-off-by: Jan Remes <remes@netcope.com>
>> ---
>>   config/common_base                                 |   5 -
>>   .../nics/img/szedata2_nfb200g_architecture.svg     | 171 +++++++++++
> Hi Matej,
>
> This patch fails to apply [1], can you please confirm you can apply it?
>
> [1]
> $ git apply --check
> dpdk-dev-1-3-net-szedata2-do-not-affect-Ethernet-interfaces.patch
> error: corrupt patch at line 270
Hi Ferruh,

I've got same error on patch downloaded from patchwork. It seems that 
the difference between the downloaded patch and the patch generated from 
git is that the long lines in svg file are split into multiple lines in 
the patch downloaded from patchwork. I suppose this could be the 
problem. Any idea how to send a patch containing svg file correctly?

Thanks,
Matej

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [dpdk-dev] [PATCH 1/3] net/szedata2: do not affect Ethernet interfaces
  2018-04-11  9:36     ` Matej Vido
@ 2018-04-11 10:51       ` Ferruh Yigit
  2018-04-12  7:38         ` Matej Vido
  0 siblings, 1 reply; 23+ messages in thread
From: Ferruh Yigit @ 2018-04-11 10:51 UTC (permalink / raw)
  To: Matej Vido, dev; +Cc: remes, Yasufumi Ogawa

On 4/11/2018 10:36 AM, Matej Vido wrote:
> On 10.04.2018 17:28, Ferruh Yigit wrote:
>> On 4/6/2018 3:12 PM, Matej Vido wrote:
>>> NFB cards employ multiple Ethernet ports.
>>> Until now, Ethernet port-related operations were performed on all of them
>>> (since the whole card was represented as a single port).
>>> With new NFB-200G2QL card, this is no longer viable.
>>>
>>> Since there is no fixed mapping between the queues and Ethernet ports,
>>> and since a single card can be represented as two ports in DPDK,
>>> there is no way of telling which (if any) physical ports should be
>>> associated with individual ports in DPDK.
>>>
>>> This is also described in documentation in more detail.
>>>
>>> Signed-off-by: Matej Vido <vido@cesnet.cz>
>>> Signed-off-by: Jan Remes <remes@netcope.com>
>>> ---
>>>   config/common_base                                 |   5 -
>>>   .../nics/img/szedata2_nfb200g_architecture.svg     | 171 +++++++++++
>> Hi Matej,
>>
>> This patch fails to apply [1], can you please confirm you can apply it?
>>
>> [1]
>> $ git apply --check
>> dpdk-dev-1-3-net-szedata2-do-not-affect-Ethernet-interfaces.patch
>> error: corrupt patch at line 270
> Hi Ferruh,
> 
> I've got same error on patch downloaded from patchwork. It seems that 
> the difference between the downloaded patch and the patch generated from 
> git is that the long lines in svg file are split into multiple lines in 
> the patch downloaded from patchwork. I suppose this could be the 
> problem. Any idea how to send a patch containing svg file correctly?

cc'ed Ogawa-san for support,

I remember he fixed similar issue in the past for spp, but I don't remember how?

> 
> Thanks,
> Matej
> 

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [dpdk-dev] [PATCH 1/3] net/szedata2: do not affect Ethernet interfaces
  2018-04-11 10:51       ` Ferruh Yigit
@ 2018-04-12  7:38         ` Matej Vido
  2018-04-13  4:25           ` Yasufumi Ogawa
  0 siblings, 1 reply; 23+ messages in thread
From: Matej Vido @ 2018-04-12  7:38 UTC (permalink / raw)
  To: Ferruh Yigit, dev; +Cc: remes, Yasufumi Ogawa

On 11.04.2018 12:51, Ferruh Yigit wrote:
> On 4/11/2018 10:36 AM, Matej Vido wrote:
>> On 10.04.2018 17:28, Ferruh Yigit wrote:
>>> On 4/6/2018 3:12 PM, Matej Vido wrote:
>>>> NFB cards employ multiple Ethernet ports.
>>>> Until now, Ethernet port-related operations were performed on all of them
>>>> (since the whole card was represented as a single port).
>>>> With new NFB-200G2QL card, this is no longer viable.
>>>>
>>>> Since there is no fixed mapping between the queues and Ethernet ports,
>>>> and since a single card can be represented as two ports in DPDK,
>>>> there is no way of telling which (if any) physical ports should be
>>>> associated with individual ports in DPDK.
>>>>
>>>> This is also described in documentation in more detail.
>>>>
>>>> Signed-off-by: Matej Vido <vido@cesnet.cz>
>>>> Signed-off-by: Jan Remes <remes@netcope.com>
>>>> ---
>>>>    config/common_base                                 |   5 -
>>>>    .../nics/img/szedata2_nfb200g_architecture.svg     | 171 +++++++++++
>>> Hi Matej,
>>>
>>> This patch fails to apply [1], can you please confirm you can apply it?
>>>
>>> [1]
>>> $ git apply --check
>>> dpdk-dev-1-3-net-szedata2-do-not-affect-Ethernet-interfaces.patch
>>> error: corrupt patch at line 270
>> Hi Ferruh,
>>
>> I've got same error on patch downloaded from patchwork. It seems that
>> the difference between the downloaded patch and the patch generated from
>> git is that the long lines in svg file are split into multiple lines in
>> the patch downloaded from patchwork. I suppose this could be the
>> problem. Any idea how to send a patch containing svg file correctly?
> cc'ed Ogawa-san for support,
>
> I remember he fixed similar issue in the past for spp, but I don't remember how?
Anyways I've hopefully fixed this by redrawing the image to avoid those 
long lines. I'm sending v2.

Thanks,
Matej
>
>> Thanks,
>> Matej
>>

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [dpdk-dev] [PATCH v2 0/3] net/szedata2: patch set for new card support
  2018-04-06 14:12 [dpdk-dev] [PATCH 0/3] net/szedata2: patch set for new card support Matej Vido
                   ` (2 preceding siblings ...)
  2018-04-06 14:12 ` [dpdk-dev] [PATCH 3/3] net/szedata2: add kernel module dependency Matej Vido
@ 2018-04-12  7:41 ` Matej Vido
  2018-04-13 16:32   ` Ferruh Yigit
  2018-04-27  8:57   ` [dpdk-dev] [PATCH 1/1] doc: update doc and release notes for szedata2 driver Matej Vido
  2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 1/3] net/szedata2: do not affect Ethernet interfaces Matej Vido
                   ` (2 subsequent siblings)
  6 siblings, 2 replies; 23+ messages in thread
From: Matej Vido @ 2018-04-12  7:41 UTC (permalink / raw)
  To: dev; +Cc: remes, ferruh.yigit

This patch set adds support for new card NFB-200G2QL.

v2:
Rebased on top of dpdk-next-net/master (conflict in release notes
for patch 2).
Svg image in patch 1 replaced by redrawn image to avoid too long lines.

Matej Vido (3):
  net/szedata2: do not affect Ethernet interfaces
  net/szedata2: add support for new NIC
  net/szedata2: add kernel module dependency

 config/common_base                                 |   5 -
 .../nics/img/szedata2_nfb200g_architecture.svg     | 214 +++++++
 doc/guides/nics/szedata2.rst                       |  66 +-
 doc/guides/rel_notes/release_18_05.rst             |   4 +
 drivers/net/szedata2/Makefile                      |   1 -
 drivers/net/szedata2/rte_eth_szedata2.c            | 684 ++++++++++++++-------
 drivers/net/szedata2/rte_eth_szedata2.h            |   4 +-
 drivers/net/szedata2/szedata2_iobuf.c              | 174 ------
 drivers/net/szedata2/szedata2_iobuf.h              | 327 ----------
 9 files changed, 710 insertions(+), 769 deletions(-)
 create mode 100644 doc/guides/nics/img/szedata2_nfb200g_architecture.svg
 delete mode 100644 drivers/net/szedata2/szedata2_iobuf.c
 delete mode 100644 drivers/net/szedata2/szedata2_iobuf.h

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [dpdk-dev] [PATCH v2 1/3] net/szedata2: do not affect Ethernet interfaces
  2018-04-06 14:12 [dpdk-dev] [PATCH 0/3] net/szedata2: patch set for new card support Matej Vido
                   ` (3 preceding siblings ...)
  2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 0/3] net/szedata2: patch set for new card support Matej Vido
@ 2018-04-12  7:41 ` Matej Vido
  2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 2/3] net/szedata2: add support for new NIC Matej Vido
  2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 3/3] net/szedata2: add kernel module dependency Matej Vido
  6 siblings, 0 replies; 23+ messages in thread
From: Matej Vido @ 2018-04-12  7:41 UTC (permalink / raw)
  To: dev; +Cc: remes, ferruh.yigit

NFB cards employ multiple Ethernet ports.
Until now, Ethernet port-related operations were performed on all of them
(since the whole card was represented as a single port).
With new NFB-200G2QL card, this is no longer viable.

Since there is no fixed mapping between the queues and Ethernet ports,
and since a single card can be represented as two ports in DPDK,
there is no way of telling which (if any) physical ports should be
associated with individual ports in DPDK.

This is also described in documentation in more detail.

Signed-off-by: Matej Vido <vido@cesnet.cz>
Signed-off-by: Jan Remes <remes@netcope.com>
---
v2:
Rebased on top of dpdk-next-net/master.
Svg image replaced by redrawn image to avoid too long lines.
---
 config/common_base                                 |   5 -
 .../nics/img/szedata2_nfb200g_architecture.svg     | 214 ++++++++++++++
 doc/guides/nics/szedata2.rst                       |  66 +++--
 drivers/net/szedata2/Makefile                      |   1 -
 drivers/net/szedata2/rte_eth_szedata2.c            | 137 +--------
 drivers/net/szedata2/szedata2_iobuf.c              | 174 -----------
 drivers/net/szedata2/szedata2_iobuf.h              | 327 ---------------------
 7 files changed, 268 insertions(+), 656 deletions(-)
 create mode 100644 doc/guides/nics/img/szedata2_nfb200g_architecture.svg
 delete mode 100644 drivers/net/szedata2/szedata2_iobuf.c
 delete mode 100644 drivers/net/szedata2/szedata2_iobuf.h

diff --git a/config/common_base b/config/common_base
index 6c7e7fd..8d948c3 100644
--- a/config/common_base
+++ b/config/common_base
@@ -310,11 +310,6 @@ CONFIG_RTE_LIBRTE_SFC_EFX_DEBUG=n
 # Compile software PMD backed by SZEDATA2 device
 #
 CONFIG_RTE_LIBRTE_PMD_SZEDATA2=n
-#
-# Defines firmware type address space.
-# See documentation for supported values.
-# Other values raise compile time error.
-CONFIG_RTE_LIBRTE_PMD_SZEDATA2_AS=0
 
 #
 # Compile burst-oriented Cavium Thunderx NICVF PMD driver
diff --git a/doc/guides/nics/img/szedata2_nfb200g_architecture.svg b/doc/guides/nics/img/szedata2_nfb200g_architecture.svg
new file mode 100644
index 0000000..e152e4a
--- /dev/null
+++ b/doc/guides/nics/img/szedata2_nfb200g_architecture.svg
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   id="svg2"
+   stroke-miterlimit="10"
+   stroke-linecap="square"
+   stroke="none"
+   fill="none"
+   viewBox="0.0 0.0 568.7322834645669 352.3937007874016"
+   version="1.1">
+  <metadata
+     id="metadata65">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs63" />
+  <clipPath
+     id="p.0">
+    <path
+       id="path5"
+       clip-rule="nonzero"
+       d="m0 0l568.7323 0l0 352.3937l-568.7323 0l0 -352.3937z" />
+  </clipPath>
+  <g
+     id="g7"
+     clip-path="url(#p.0)">
+    <path
+       id="path9"
+       fill-rule="evenodd"
+       d="m0 0l568.7323 0l0 352.3937l-568.7323 0z"
+       fill-opacity="0.0"
+       fill="#000000" />
+    <path
+       id="path11"
+       d="m 40.564137,14.365075 254.362203,0 0,131.842535 -254.362203,0 z"
+       style="fill:#47c3d3;fill-rule:evenodd" />
+    <path
+       id="path15"
+       d="m 54.075948,146.2076 227.338592,0 0,32.94488 -227.338592,0 z"
+       style="fill:#c2c2c2;fill-rule:evenodd" />
+    <path
+       id="path19"
+       d="m 321.90535,146.2076 227.33856,0 0,32.94488 -227.33856,0 z"
+       style="fill:#c2c2c2;fill-rule:evenodd" />
+    <path
+       id="path23"
+       d="m 440.30217,146.24338 -11.82364,-20.50632 6.86313,0 0,-44.550399 -120.12924,0 0,6.938519 -20.28345,-11.953539 20.28345,-11.953547 0,6.93852 130.0503,0 0,54.580446 6.8631,0 z"
+       style="fill:#9a9a9a;fill-rule:evenodd" />
+    <path
+       id="path25"
+       d="m 112.39353,263.09765 0,0 c 0,-8.08875 6.55722,-14.64597 14.64597,-14.64597 l 58.58208,0 0,0 c 3.88435,0 7.60962,1.54305 10.35626,4.28971 2.74666,2.74664 4.28971,6.47189 4.28971,10.35626 l 0,58.58209 c 0,8.08875 -6.55722,14.64597 -14.64597,14.64597 l -58.58208,0 c -8.08875,0 -14.64597,-6.55722 -14.64597,-14.64597 z"
+       style="fill:#c2c2c2;fill-rule:evenodd" />
+    <path
+       id="path29"
+       d="m 391.63763,263.09765 0,0 c 0,-8.08875 6.55722,-14.64597 14.64597,-14.64597 l 58.58209,0 0,0 c 3.88437,0 7.60962,1.54305 10.35626,4.28971 2.74664,2.74664 4.2897,6.47189 4.2897,10.35626 l 0,58.58209 c 0,8.08875 -6.55722,14.64597 -14.64596,14.64597 l -58.58209,0 c -8.08875,0 -14.64597,-6.55722 -14.64597,-14.64597 z"
+       style="fill:#c2c2c2;fill-rule:evenodd" />
+    <path
+       id="path33"
+       d="m 135.20981,199.01075 19.85826,-19.85826 19.85828,19.85826 -9.92914,0 0,29.5748 9.92914,0 -19.85828,19.85827 -19.85826,-19.85827 9.92914,0 0,-29.5748 z"
+       style="fill:#9a9a9a;fill-rule:evenodd" />
+    <path
+       id="path35"
+       d="m 415.71635,199.01064 19.85828,-19.85826 19.85827,19.85826 -9.92914,0 0,29.57481 9.92914,0 -19.85827,19.85826 -19.85828,-19.85826 9.92914,0 0,-29.57481 z"
+       style="fill:#9a9a9a;fill-rule:evenodd" />
+    <path
+       id="path37"
+       d="m 15.205,31.273212 74.362206,0 0,32.944885 -74.362206,0 z"
+       style="fill:#ff8434;fill-rule:evenodd" />
+    <path
+       id="path41"
+       d="m 16.05531,80.231216 74.3622,0 0,32.944884 -74.3622,0 z"
+       style="fill:#ff8434;fill-rule:evenodd" />
+    <path
+       id="path45"
+       d="m 275.44377,174.07111 0,111.55905 -37.16536,0 0,-111.55905 z"
+       style="fill:#ff8434;fill-rule:evenodd" />
+    <path
+       id="path49"
+       d="m 97.923493,174.07111 0,111.55905 -37.16535,0 0,-111.55905 z"
+       style="fill:#ff8434;fill-rule:evenodd" />
+    <path
+       id="path53"
+       d="m 366.27543,174.07111 0,111.55905 -37.16537,0 0,-111.55905 z"
+       style="fill:#ff8434;fill-rule:evenodd" />
+    <path
+       id="path57"
+       d="m 542.0392,174.07111 0,111.55905 -37.16534,0 0,-111.55905 z"
+       style="fill:#ff8434;fill-rule:evenodd" />
+    <text
+       id="text4480"
+       y="54.570911"
+       x="24.425898"
+       style="font-style:normal;font-weight:normal;font-size:18.75px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         y="54.570911"
+         x="24.425898"
+         id="tspan4482">ETH 0</tspan></text>
+    <text
+       id="text4480-3"
+       y="103.53807"
+       x="25.51882"
+       style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="font-size:18.75px"
+         id="tspan4502"
+         y="103.53807"
+         x="25.51882">ETH 1</tspan></text>
+    <text
+       id="text4480-7"
+       y="86.200645"
+       x="103.15979"
+       style="font-style:normal;font-weight:normal;font-size:18.75px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         id="tspan4524"
+         y="86.200645"
+         x="103.15979">NFB-200G2QL card</tspan></text>
+    <text
+       id="text4480-7-3"
+       y="169.2041"
+       x="92.195312"
+       style="font-style:normal;font-weight:normal;font-size:18.75px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="font-size:18.75px"
+         id="tspan4546"
+         y="169.2041"
+         x="92.195312">PCI-E master slot</tspan></text>
+    <text
+       id="text4480-7-3-6"
+       y="169.20409"
+       x="367.98856"
+       style="font-style:normal;font-weight:normal;font-size:18.75px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="font-size:18.75px"
+         id="tspan4546-2"
+         y="169.20409"
+         x="367.98856">PCI-E slave slot</tspan></text>
+    <text
+       transform="matrix(0,1,-1,0,0,0)"
+       id="text4480-3-9"
+       y="-73.591309"
+       x="182.29367"
+       style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="font-size:18.75px"
+         id="tspan4502-1"
+         y="-73.591309"
+         x="182.29367">QUEUE 0</tspan></text>
+    <text
+       transform="matrix(0,1.0000002,-0.99999976,0,0,0)"
+       id="text4480-3-9-2"
+       y="-251.11163"
+       x="182.29283"
+       style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="font-size:18.75px"
+         id="tspan4502-1-7"
+         y="-251.11163"
+         x="182.29283">QUEUE 15</tspan></text>
+    <text
+       transform="matrix(0,1,-1,0,0,0)"
+       id="text4480-3-9-2-0"
+       y="-341.94324"
+       x="182.29311"
+       style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="font-size:18.75px"
+         id="tspan4502-1-7-9"
+         y="-341.94324"
+         x="182.29311">QUEUE 16</tspan></text>
+    <text
+       transform="matrix(0,1,-1,0,0,0)"
+       id="text4480-3-9-2-3"
+       y="-517.70703"
+       x="182.29356"
+       style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="font-size:18.75px"
+         id="tspan4502-1-7-6"
+         y="-517.70703"
+         x="182.29356">QUEUE 31</tspan></text>
+    <text
+       id="text4480-3-0"
+       y="299.21396"
+       x="128.3978"
+       style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="font-size:18.75px"
+         id="tspan4502-6"
+         y="299.21396"
+         x="128.3978">CPU 0</tspan></text>
+    <text
+       id="text4480-3-0-2"
+       y="299.21396"
+       x="407.88452"
+       style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="font-size:18.75px"
+         id="tspan4502-6-6"
+         y="299.21396"
+         x="407.88452">CPU 1</tspan></text>
+  </g>
+</svg>
diff --git a/doc/guides/nics/szedata2.rst b/doc/guides/nics/szedata2.rst
index 4327e4e..1b4b3eb 100644
--- a/doc/guides/nics/szedata2.rst
+++ b/doc/guides/nics/szedata2.rst
@@ -43,8 +43,10 @@ separately:
 
 *  **Kernel modules**
 
+   * combo6core
    * combov3
-   * szedata2_cv3
+   * szedata2
+   * szedata2_cv3 or szedata2_cv3_fdt
 
    Kernel modules manage initialization of hardware, allocation and
    sharing of resources for user space applications.
@@ -62,45 +64,53 @@ These configuration options can be modified before compilation in the
 
    Value **y** enables compilation of szedata2 PMD.
 
-*  ``CONFIG_RTE_LIBRTE_PMD_SZEDATA2_AS`` default value: **0**
-
-   This option defines type of firmware address space and must be set
-   according to the used card and mode.
-   Currently supported values are:
-
-   * **0** - for cards (modes):
-
-      * NFB-100G1 (100G1)
+Using the SZEDATA2 PMD
+----------------------
 
-   * **1** - for cards (modes):
+From DPDK version 16.04 the type of SZEDATA2 PMD is changed to PMD_PDEV.
+SZEDATA2 device is automatically recognized during EAL initialization.
+No special command line options are needed.
 
-      * NFB-100G2Q (100G1)
+Kernel modules have to be loaded before running the DPDK application.
 
-   * **2** - for cards (modes):
+NFB card architecture
+---------------------
 
-      * NFB-40G2 (40G2)
-      * NFB-100G2C (100G2)
-      * NFB-100G2Q (40G2)
+The NFB cards are multi-port multi-queue cards, where (generally) data from any
+Ethernet port may be sent to any queue.
+They were historically represented in DPDK as a single port.
 
-   * **3** - for cards (modes):
+However, the new NFB-200G2QL card employs an addon cable which allows to connect
+it to two physical PCI-E slots at the same time (see the diagram below).
+This is done to allow 200 Gbps of traffic to be transferred through the PCI-E
+bus (note that a single PCI-E 3.0 x16 slot provides only 125 Gbps theoretical
+throughput).
 
-      * NFB-40G2 (10G8)
-      * NFB-100G2Q (10G8)
+Since each slot may be connected to a different CPU and therefore to a different
+NUMA node, the card is represented as two ports in DPDK (each with half of the
+queues), which allows DPDK to work with data from the individual queues on the
+right NUMA node.
 
-   * **4** - for cards (modes):
+.. figure:: img/szedata2_nfb200g_architecture.svg
+    :align: center
 
-      * NFB-100G1 (10G10)
+    NFB-200G2QL high-level diagram
 
-   * **5** - for experimental firmwares and future use
+Limitations
+-----------
 
-Using the SZEDATA2 PMD
-----------------------
+The SZEDATA2 PMD does not support operations related to Ethernet ports
+(link_up, link_down, set_mac_address, etc.).
 
-From DPDK version 16.04 the type of SZEDATA2 PMD is changed to PMD_PDEV.
-SZEDATA2 device is automatically recognized during EAL initialization.
-No special command line options are needed.
+NFB cards employ multiple Ethernet ports.
+Until now, Ethernet port-related operations were performed on all of them
+(since the whole card was represented as a single port).
+With NFB-200G2QL card, this is no longer viable (see above).
 
-Kernel modules have to be loaded before running the DPDK application.
+Since there is no fixed mapping between the queues and Ethernet ports, and since
+a single card can be represented as two ports in DPDK, there is no way of
+telling which (if any) physical ports should be associated with individual
+ports in DPDK.
 
 Example of usage
 ----------------
diff --git a/drivers/net/szedata2/Makefile b/drivers/net/szedata2/Makefile
index c5204cb..b77fae1 100644
--- a/drivers/net/szedata2/Makefile
+++ b/drivers/net/szedata2/Makefile
@@ -23,7 +23,6 @@ LIBABIVER := 1
 # all source are stored in SRCS-y
 #
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_SZEDATA2) += rte_eth_szedata2.c
-SRCS-$(CONFIG_RTE_LIBRTE_PMD_SZEDATA2) += szedata2_iobuf.c
 
 #
 # Export include files
diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
index 41a6fb4..a9dc1c7 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.c
+++ b/drivers/net/szedata2/rte_eth_szedata2.c
@@ -24,7 +24,6 @@
 
 #include "rte_eth_szedata2.h"
 #include "szedata2_logs.h"
-#include "szedata2_iobuf.h"
 
 #define RTE_ETH_SZEDATA2_MAX_RX_QUEUES 32
 #define RTE_ETH_SZEDATA2_MAX_TX_QUEUES 32
@@ -1141,78 +1140,17 @@ struct szedata2_tx_queue {
 	dev->data->nb_tx_queues = 0;
 }
 
-/**
- * Function takes value from first IBUF status register.
- * Values in IBUF and OBUF should be same.
- *
- * @param internals
- *     Pointer to device private structure.
- * @return
- *     Link speed constant.
- */
-static inline enum szedata2_link_speed
-get_link_speed(const struct pmd_internals *internals)
-{
-	const volatile struct szedata2_ibuf *ibuf =
-		ibuf_ptr_by_index(internals->pci_rsc, 0);
-	uint32_t speed = (szedata2_read32(&ibuf->ibuf_st) & 0x70) >> 4;
-	switch (speed) {
-	case 0x03:
-		return SZEDATA2_LINK_SPEED_10G;
-	case 0x04:
-		return SZEDATA2_LINK_SPEED_40G;
-	case 0x05:
-		return SZEDATA2_LINK_SPEED_100G;
-	default:
-		return SZEDATA2_LINK_SPEED_DEFAULT;
-	}
-}
-
 static int
 eth_link_update(struct rte_eth_dev *dev,
 		int wait_to_complete __rte_unused)
 {
 	struct rte_eth_link link;
-	struct pmd_internals *internals = (struct pmd_internals *)
-		dev->data->dev_private;
-	const volatile struct szedata2_ibuf *ibuf;
-	uint32_t i;
-	bool link_is_up = false;
 
 	memset(&link, 0, sizeof(link));
 
-	switch (get_link_speed(internals)) {
-	case SZEDATA2_LINK_SPEED_10G:
-		link.link_speed = ETH_SPEED_NUM_10G;
-		break;
-	case SZEDATA2_LINK_SPEED_40G:
-		link.link_speed = ETH_SPEED_NUM_40G;
-		break;
-	case SZEDATA2_LINK_SPEED_100G:
-		link.link_speed = ETH_SPEED_NUM_100G;
-		break;
-	default:
-		link.link_speed = ETH_SPEED_NUM_10G;
-		break;
-	}
-
-	/* szedata2 uses only full duplex */
+	link.link_speed = ETH_SPEED_NUM_100G;
 	link.link_duplex = ETH_LINK_FULL_DUPLEX;
-
-	for (i = 0; i < szedata2_ibuf_count; i++) {
-		ibuf = ibuf_ptr_by_index(internals->pci_rsc, i);
-		/*
-		 * Link is considered up if at least one ibuf is enabled
-		 * and up.
-		 */
-		if (ibuf_is_enabled(ibuf) && ibuf_is_link_up(ibuf)) {
-			link_is_up = true;
-			break;
-		}
-	}
-
-	link.link_status = link_is_up ? ETH_LINK_UP : ETH_LINK_DOWN;
-
+	link.link_status = ETH_LINK_UP;
 	link.link_autoneg = ETH_LINK_FIXED;
 
 	rte_eth_linkstatus_set(dev, &link);
@@ -1220,30 +1158,16 @@ struct szedata2_tx_queue {
 }
 
 static int
-eth_dev_set_link_up(struct rte_eth_dev *dev)
+eth_dev_set_link_up(struct rte_eth_dev *dev __rte_unused)
 {
-	struct pmd_internals *internals = (struct pmd_internals *)
-		dev->data->dev_private;
-	uint32_t i;
-
-	for (i = 0; i < szedata2_ibuf_count; i++)
-		ibuf_enable(ibuf_ptr_by_index(internals->pci_rsc, i));
-	for (i = 0; i < szedata2_obuf_count; i++)
-		obuf_enable(obuf_ptr_by_index(internals->pci_rsc, i));
+	PMD_DRV_LOG(WARNING, "Setting link up is not supported.");
 	return 0;
 }
 
 static int
-eth_dev_set_link_down(struct rte_eth_dev *dev)
+eth_dev_set_link_down(struct rte_eth_dev *dev __rte_unused)
 {
-	struct pmd_internals *internals = (struct pmd_internals *)
-		dev->data->dev_private;
-	uint32_t i;
-
-	for (i = 0; i < szedata2_ibuf_count; i++)
-		ibuf_disable(ibuf_ptr_by_index(internals->pci_rsc, i));
-	for (i = 0; i < szedata2_obuf_count; i++)
-		obuf_disable(obuf_ptr_by_index(internals->pci_rsc, i));
+	PMD_DRV_LOG(WARNING, "Setting link down is not supported.");
 	return 0;
 }
 
@@ -1367,55 +1291,29 @@ struct szedata2_tx_queue {
 }
 
 static void
-eth_promiscuous_enable(struct rte_eth_dev *dev)
+eth_promiscuous_enable(struct rte_eth_dev *dev __rte_unused)
 {
-	struct pmd_internals *internals = (struct pmd_internals *)
-		dev->data->dev_private;
-	uint32_t i;
-
-	for (i = 0; i < szedata2_ibuf_count; i++) {
-		ibuf_mac_mode_write(ibuf_ptr_by_index(internals->pci_rsc, i),
-				SZEDATA2_MAC_CHMODE_PROMISC);
-	}
+	PMD_DRV_LOG(WARNING, "Enabling promiscuous mode is not supported. "
+			"The card is always in promiscuous mode.");
 }
 
 static void
-eth_promiscuous_disable(struct rte_eth_dev *dev)
+eth_promiscuous_disable(struct rte_eth_dev *dev __rte_unused)
 {
-	struct pmd_internals *internals = (struct pmd_internals *)
-		dev->data->dev_private;
-	uint32_t i;
-
-	for (i = 0; i < szedata2_ibuf_count; i++) {
-		ibuf_mac_mode_write(ibuf_ptr_by_index(internals->pci_rsc, i),
-				SZEDATA2_MAC_CHMODE_ONLY_VALID);
-	}
+	PMD_DRV_LOG(WARNING, "Disabling promiscuous mode is not supported. "
+			"The card is always in promiscuous mode.");
 }
 
 static void
-eth_allmulticast_enable(struct rte_eth_dev *dev)
+eth_allmulticast_enable(struct rte_eth_dev *dev __rte_unused)
 {
-	struct pmd_internals *internals = (struct pmd_internals *)
-		dev->data->dev_private;
-	uint32_t i;
-
-	for (i = 0; i < szedata2_ibuf_count; i++) {
-		ibuf_mac_mode_write(ibuf_ptr_by_index(internals->pci_rsc, i),
-				SZEDATA2_MAC_CHMODE_ALL_MULTICAST);
-	}
+	PMD_DRV_LOG(WARNING, "Enabling allmulticast mode is not supported.");
 }
 
 static void
-eth_allmulticast_disable(struct rte_eth_dev *dev)
+eth_allmulticast_disable(struct rte_eth_dev *dev __rte_unused)
 {
-	struct pmd_internals *internals = (struct pmd_internals *)
-		dev->data->dev_private;
-	uint32_t i;
-
-	for (i = 0; i < szedata2_ibuf_count; i++) {
-		ibuf_mac_mode_write(ibuf_ptr_by_index(internals->pci_rsc, i),
-				SZEDATA2_MAC_CHMODE_ONLY_VALID);
-	}
+	PMD_DRV_LOG(WARNING, "Disabling allmulticast mode is not supported.");
 }
 
 static const struct eth_dev_ops ops = {
@@ -1625,9 +1523,6 @@ struct szedata2_tx_queue {
 
 	ether_addr_copy(&eth_addr, data->mac_addrs);
 
-	/* At initial state COMBO card is in promiscuous mode so disable it */
-	eth_promiscuous_disable(dev);
-
 	PMD_INIT_LOG(INFO, "szedata2 device ("
 			PCI_PRI_FMT ") successfully initialized",
 			pci_addr->domain, pci_addr->bus, pci_addr->devid,
diff --git a/drivers/net/szedata2/szedata2_iobuf.c b/drivers/net/szedata2/szedata2_iobuf.c
deleted file mode 100644
index 2d18989..0000000
--- a/drivers/net/szedata2/szedata2_iobuf.c
+++ /dev/null
@@ -1,174 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 CESNET
- */
-
-#include <stdint.h>
-
-#include <rte_common.h>
-
-#include "szedata2_iobuf.h"
-
-/*
- * IBUFs and OBUFs can generally be located at different offsets in different
- * firmwares (modes).
- * This part defines base offsets of IBUFs and OBUFs for various cards
- * and firmwares (modes).
- * Type of firmware (mode) is set through configuration option
- * CONFIG_RTE_LIBRTE_PMD_SZEDATA2_AS.
- * Possible values are:
- * 0 - for cards (modes):
- *     NFB-100G1 (100G1)
- *
- * 1 - for cards (modes):
- *     NFB-100G2Q (100G1)
- *
- * 2 - for cards (modes):
- *     NFB-40G2 (40G2)
- *     NFB-100G2C (100G2)
- *     NFB-100G2Q (40G2)
- *
- * 3 - for cards (modes):
- *     NFB-40G2 (10G8)
- *     NFB-100G2Q (10G8)
- *
- * 4 - for cards (modes):
- *     NFB-100G1 (10G10)
- *
- * 5 - for experimental firmwares and future use
- */
-#if !defined(RTE_LIBRTE_PMD_SZEDATA2_AS)
-#error "RTE_LIBRTE_PMD_SZEDATA2_AS has to be defined"
-#elif RTE_LIBRTE_PMD_SZEDATA2_AS == 0
-
-/*
- * Cards (modes):
- *     NFB-100G1 (100G1)
- */
-
-const uint32_t szedata2_ibuf_base_table[] = {
-	0x8000
-};
-const uint32_t szedata2_obuf_base_table[] = {
-	0x9000
-};
-
-#elif RTE_LIBRTE_PMD_SZEDATA2_AS == 1
-
-/*
- * Cards (modes):
- *     NFB-100G2Q (100G1)
- */
-
-const uint32_t szedata2_ibuf_base_table[] = {
-	0x8800
-};
-const uint32_t szedata2_obuf_base_table[] = {
-	0x9800
-};
-
-#elif RTE_LIBRTE_PMD_SZEDATA2_AS == 2
-
-/*
- * Cards (modes):
- *     NFB-40G2 (40G2)
- *     NFB-100G2C (100G2)
- *     NFB-100G2Q (40G2)
- */
-
-const uint32_t szedata2_ibuf_base_table[] = {
-	0x8000,
-	0x8800
-};
-const uint32_t szedata2_obuf_base_table[] = {
-	0x9000,
-	0x9800
-};
-
-#elif RTE_LIBRTE_PMD_SZEDATA2_AS == 3
-
-/*
- * Cards (modes):
- *     NFB-40G2 (10G8)
- *     NFB-100G2Q (10G8)
- */
-
-const uint32_t szedata2_ibuf_base_table[] = {
-	0x8000,
-	0x8200,
-	0x8400,
-	0x8600,
-	0x8800,
-	0x8A00,
-	0x8C00,
-	0x8E00
-};
-const uint32_t szedata2_obuf_base_table[] = {
-	0x9000,
-	0x9200,
-	0x9400,
-	0x9600,
-	0x9800,
-	0x9A00,
-	0x9C00,
-	0x9E00
-};
-
-#elif RTE_LIBRTE_PMD_SZEDATA2_AS == 4
-
-/*
- * Cards (modes):
- *     NFB-100G1 (10G10)
- */
-
-const uint32_t szedata2_ibuf_base_table[] = {
-	0x8000,
-	0x8200,
-	0x8400,
-	0x8600,
-	0x8800,
-	0x8A00,
-	0x8C00,
-	0x8E00,
-	0x9000,
-	0x9200
-};
-const uint32_t szedata2_obuf_base_table[] = {
-	0xA000,
-	0xA200,
-	0xA400,
-	0xA600,
-	0xA800,
-	0xAA00,
-	0xAC00,
-	0xAE00,
-	0xB000,
-	0xB200
-};
-
-#elif RTE_LIBRTE_PMD_SZEDATA2_AS == 5
-
-/*
- * Future use and experimental firmwares.
- */
-
-const uint32_t szedata2_ibuf_base_table[] = {
-	0x8000,
-	0x8200,
-	0x8400,
-	0x8600,
-	0x8800
-};
-const uint32_t szedata2_obuf_base_table[] = {
-	0x9000,
-	0x9200,
-	0x9400,
-	0x9600,
-	0x9800
-};
-
-#else
-#error "RTE_LIBRTE_PMD_SZEDATA2_AS has wrong value, see comments in config file"
-#endif
-
-const uint32_t szedata2_ibuf_count = RTE_DIM(szedata2_ibuf_base_table);
-const uint32_t szedata2_obuf_count = RTE_DIM(szedata2_obuf_base_table);
diff --git a/drivers/net/szedata2/szedata2_iobuf.h b/drivers/net/szedata2/szedata2_iobuf.h
deleted file mode 100644
index 795f0f5..0000000
--- a/drivers/net/szedata2/szedata2_iobuf.h
+++ /dev/null
@@ -1,327 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 CESNET
- */
-
-#ifndef _SZEDATA2_IOBUF_H_
-#define _SZEDATA2_IOBUF_H_
-
-#include <stdint.h>
-#include <stdbool.h>
-
-#include <rte_byteorder.h>
-#include <rte_io.h>
-#include <rte_dev.h>
-
-/* IBUF offsets from the beginning of the PCI resource address space. */
-extern const uint32_t szedata2_ibuf_base_table[];
-extern const uint32_t szedata2_ibuf_count;
-
-/* OBUF offsets from the beginning of the PCI resource address space. */
-extern const uint32_t szedata2_obuf_base_table[];
-extern const uint32_t szedata2_obuf_count;
-
-enum szedata2_link_speed {
-	SZEDATA2_LINK_SPEED_DEFAULT = 0,
-	SZEDATA2_LINK_SPEED_10G,
-	SZEDATA2_LINK_SPEED_40G,
-	SZEDATA2_LINK_SPEED_100G,
-};
-
-enum szedata2_mac_check_mode {
-	SZEDATA2_MAC_CHMODE_PROMISC       = 0x0,
-	SZEDATA2_MAC_CHMODE_ONLY_VALID    = 0x1,
-	SZEDATA2_MAC_CHMODE_ALL_BROADCAST = 0x2,
-	SZEDATA2_MAC_CHMODE_ALL_MULTICAST = 0x3,
-};
-
-/**
- * Macro takes pointer to pci resource structure (rsc)
- * and returns pointer to mapped resource memory at
- * specified offset (offset) typecast to the type (type).
- */
-#define SZEDATA2_PCI_RESOURCE_PTR(rsc, offset, type) \
-	((type)(((uint8_t *)(rsc)->addr) + (offset)))
-
-/**
- * Maximum possible number of MAC addresses (limited by IBUF status
- * register value MAC_COUNT which has 5 bits).
- */
-#define SZEDATA2_IBUF_MAX_MAC_COUNT 32
-
-/**
- * Structure describes IBUF address space.
- */
-struct szedata2_ibuf {
-	/** Total Received Frames Counter low part */
-	uint32_t trfcl; /**< 0x00 */
-	/** Correct Frames Counter low part */
-	uint32_t cfcl; /**< 0x04 */
-	/** Discarded Frames Counter low part */
-	uint32_t dfcl; /**< 0x08 */
-	/** Counter of frames discarded due to buffer overflow low part */
-	uint32_t bodfcl; /**< 0x0C */
-	/** Total Received Frames Counter high part */
-	uint32_t trfch; /**< 0x10 */
-	/** Correct Frames Counter high part */
-	uint32_t cfch; /**< 0x14 */
-	/** Discarded Frames Counter high part */
-	uint32_t dfch; /**< 0x18 */
-	/** Counter of frames discarded due to buffer overflow high part */
-	uint32_t bodfch; /**< 0x1C */
-	/** IBUF enable register */
-	uint32_t ibuf_en; /**< 0x20 */
-	/** Error mask register */
-	uint32_t err_mask; /**< 0x24 */
-	/** IBUF status register */
-	uint32_t ibuf_st; /**< 0x28 */
-	/** IBUF command register */
-	uint32_t ibuf_cmd; /**< 0x2C */
-	/** Minimum frame length allowed */
-	uint32_t mfla; /**< 0x30 */
-	/** Frame MTU */
-	uint32_t mtu; /**< 0x34 */
-	/** MAC address check mode */
-	uint32_t mac_chmode; /**< 0x38 */
-	/** Octets Received OK Counter low part */
-	uint32_t orocl; /**< 0x3C */
-	/** Octets Received OK Counter high part */
-	uint32_t oroch; /**< 0x40 */
-	/** reserved */
-	uint8_t reserved[60]; /**< 0x4C */
-	/** IBUF memory for MAC addresses */
-	uint32_t mac_mem[2 * SZEDATA2_IBUF_MAX_MAC_COUNT]; /**< 0x80 */
-} __rte_packed;
-
-/**
- * Structure describes OBUF address space.
- */
-struct szedata2_obuf {
-	/** Total Sent Frames Counter low part */
-	uint32_t tsfcl; /**< 0x00 */
-	/** Octets Sent Counter low part */
-	uint32_t oscl; /**< 0x04 */
-	/** Total Discarded Frames Counter low part */
-	uint32_t tdfcl; /**< 0x08 */
-	/** reserved */
-	uint32_t reserved1; /**< 0x0C */
-	/** Total Sent Frames Counter high part */
-	uint32_t tsfch; /**< 0x10 */
-	/** Octets Sent Counter high part */
-	uint32_t osch; /**< 0x14 */
-	/** Total Discarded Frames Counter high part */
-	uint32_t tdfch; /**< 0x18 */
-	/** reserved */
-	uint32_t reserved2; /**< 0x1C */
-	/** OBUF enable register */
-	uint32_t obuf_en; /**< 0x20 */
-	/** reserved */
-	uint64_t reserved3; /**< 0x24 */
-	/** OBUF control register */
-	uint32_t ctrl; /**< 0x2C */
-	/** OBUF status register */
-	uint32_t obuf_st; /**< 0x30 */
-} __rte_packed;
-
-/**
- * Wrapper for reading 4 bytes from device memory in correct endianness.
- *
- * @param addr
- *     Address for reading.
- * @return
- *     4 B value.
- */
-static inline uint32_t
-szedata2_read32(const volatile void *addr)
-{
-	return rte_le_to_cpu_32(rte_read32(addr));
-}
-
-/**
- * Wrapper for writing 4 bytes to device memory in correct endianness.
- *
- * @param value
- *     Value to write.
- * @param addr
- *     Address for writing.
- */
-static inline void
-szedata2_write32(uint32_t value, volatile void *addr)
-{
-	rte_write32(rte_cpu_to_le_32(value), addr);
-}
-
-/**
- * Get pointer to IBUF structure according to specified index.
- *
- * @param rsc
- *     Pointer to base address of memory resource.
- * @param index
- *     Index of IBUF.
- * @return
- *     Pointer to IBUF structure.
- */
-static inline struct szedata2_ibuf *
-ibuf_ptr_by_index(struct rte_mem_resource *rsc, uint32_t index)
-{
-	if (index >= szedata2_ibuf_count)
-		index = szedata2_ibuf_count - 1;
-	return SZEDATA2_PCI_RESOURCE_PTR(rsc, szedata2_ibuf_base_table[index],
-		struct szedata2_ibuf *);
-}
-
-/**
- * Get pointer to OBUF structure according to specified idnex.
- *
- * @param rsc
- *     Pointer to base address of memory resource.
- * @param index
- *     Index of OBUF.
- * @return
- *     Pointer to OBUF structure.
- */
-static inline struct szedata2_obuf *
-obuf_ptr_by_index(struct rte_mem_resource *rsc, uint32_t index)
-{
-	if (index >= szedata2_obuf_count)
-		index = szedata2_obuf_count - 1;
-	return SZEDATA2_PCI_RESOURCE_PTR(rsc, szedata2_obuf_base_table[index],
-		struct szedata2_obuf *);
-}
-
-/**
- * Checks if IBUF is enabled.
- *
- * @param ibuf
- *     Pointer to IBUF structure.
- * @return
- *     true if IBUF is enabled.
- *     false if IBUF is disabled.
- */
-static inline bool
-ibuf_is_enabled(const volatile struct szedata2_ibuf *ibuf)
-{
-	return ((szedata2_read32(&ibuf->ibuf_en) & 0x1) != 0) ? true : false;
-}
-
-/**
- * Enables IBUF.
- *
- * @param ibuf
- *     Pointer to IBUF structure.
- */
-static inline void
-ibuf_enable(volatile struct szedata2_ibuf *ibuf)
-{
-	szedata2_write32(szedata2_read32(&ibuf->ibuf_en) | 0x1, &ibuf->ibuf_en);
-}
-
-/**
- * Disables IBUF.
- *
- * @param ibuf
- *     Pointer to IBUF structure.
- */
-static inline void
-ibuf_disable(volatile struct szedata2_ibuf *ibuf)
-{
-	szedata2_write32(szedata2_read32(&ibuf->ibuf_en) & ~0x1,
-			&ibuf->ibuf_en);
-}
-
-/**
- * Checks if link is up.
- *
- * @param ibuf
- *     Pointer to IBUF structure.
- * @return
- *     true if ibuf link is up.
- *     false if ibuf link is down.
- */
-static inline bool
-ibuf_is_link_up(const volatile struct szedata2_ibuf *ibuf)
-{
-	return ((szedata2_read32(&ibuf->ibuf_st) & 0x80) != 0) ? true : false;
-}
-
-/**
- * Get current MAC address check mode from IBUF.
- *
- * @param ibuf
- *     Pointer to IBUF structure.
- * @return
- *     MAC address check mode constant.
- */
-static inline enum szedata2_mac_check_mode
-ibuf_mac_mode_read(const volatile struct szedata2_ibuf *ibuf)
-{
-	switch (szedata2_read32(&ibuf->mac_chmode) & 0x3) {
-	case 0x0:
-		return SZEDATA2_MAC_CHMODE_PROMISC;
-	case 0x1:
-		return SZEDATA2_MAC_CHMODE_ONLY_VALID;
-	case 0x2:
-		return SZEDATA2_MAC_CHMODE_ALL_BROADCAST;
-	case 0x3:
-		return SZEDATA2_MAC_CHMODE_ALL_MULTICAST;
-	default:
-		return SZEDATA2_MAC_CHMODE_PROMISC;
-	}
-}
-
-/**
- * Writes mode in MAC address check mode register in IBUF.
- *
- * @param ibuf
- *     Pointer to IBUF structure.
- * @param mode
- *     MAC address check mode to set.
- */
-static inline void
-ibuf_mac_mode_write(volatile struct szedata2_ibuf *ibuf,
-		enum szedata2_mac_check_mode mode)
-{
-	szedata2_write32((szedata2_read32(&ibuf->mac_chmode) & ~0x3) | mode,
-			&ibuf->mac_chmode);
-}
-
-/**
- * Checks if obuf is enabled.
- *
- * @param obuf
- *     Pointer to OBUF structure.
- * @return
- *     true if OBUF is enabled.
- *     false if OBUF is disabled.
- */
-static inline bool
-obuf_is_enabled(const volatile struct szedata2_obuf *obuf)
-{
-	return ((szedata2_read32(&obuf->obuf_en) & 0x1) != 0) ? true : false;
-}
-
-/**
- * Enables OBUF.
- *
- * @param obuf
- *     Pointer to OBUF structure.
- */
-static inline void
-obuf_enable(volatile struct szedata2_obuf *obuf)
-{
-	szedata2_write32(szedata2_read32(&obuf->obuf_en) | 0x1, &obuf->obuf_en);
-}
-
-/**
- * Disables OBUF.
- *
- * @param obuf
- *     Pointer to OBUF structure.
- */
-static inline void
-obuf_disable(volatile struct szedata2_obuf *obuf)
-{
-	szedata2_write32(szedata2_read32(&obuf->obuf_en) & ~0x1,
-			&obuf->obuf_en);
-}
-
-#endif /* _SZEDATA2_IOBUF_H_ */
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [dpdk-dev] [PATCH v2 2/3] net/szedata2: add support for new NIC
  2018-04-06 14:12 [dpdk-dev] [PATCH 0/3] net/szedata2: patch set for new card support Matej Vido
                   ` (4 preceding siblings ...)
  2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 1/3] net/szedata2: do not affect Ethernet interfaces Matej Vido
@ 2018-04-12  7:41 ` Matej Vido
  2018-04-12 16:11   ` Ferruh Yigit
  2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 3/3] net/szedata2: add kernel module dependency Matej Vido
  6 siblings, 1 reply; 23+ messages in thread
From: Matej Vido @ 2018-04-12  7:41 UTC (permalink / raw)
  To: dev; +Cc: remes, ferruh.yigit

This patch adds support for new NIC NFB-200G2QL.

At the probing stage numa nodes for the DMA queues are identified
and the appropriate number of ports is allocated.
DMA queues residing on the same numa node are grouped in the same
port.

Signed-off-by: Matej Vido <vido@cesnet.cz>
---
v2:
Rebased on top of dpdk-next-net/master (conflict in release notes).
---
 doc/guides/rel_notes/release_18_05.rst  |   4 +
 drivers/net/szedata2/rte_eth_szedata2.c | 545 +++++++++++++++++++++++++-------
 drivers/net/szedata2/rte_eth_szedata2.h |   4 +-
 3 files changed, 441 insertions(+), 112 deletions(-)

diff --git a/doc/guides/rel_notes/release_18_05.rst b/doc/guides/rel_notes/release_18_05.rst
index 8c0414a..e07d9b6 100644
--- a/doc/guides/rel_notes/release_18_05.rst
+++ b/doc/guides/rel_notes/release_18_05.rst
@@ -69,6 +69,10 @@ New Features
   See the :doc:`../nics/axgbe` nic driver guide for more details on this
   new driver.
 
+* **Updated szedata2 PMD.**
+
+  Added support for new NFB-200G2QL card.
+
 
 API Changes
 -----------
diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
index a9dc1c7..5a8f2ed 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.c
+++ b/drivers/net/szedata2/rte_eth_szedata2.c
@@ -38,18 +38,53 @@
 
 #define SZEDATA2_DEV_PATH_FMT "/dev/szedataII%u"
 
+/**
+ * Format string for suffix used to differentiate between Ethernet ports
+ * on the same PCI device.
+ */
+#define SZEDATA2_ETH_DEV_NAME_SUFFIX_FMT "-port%u"
+
+/**
+ * Maximum number of ports for one device.
+ */
+#define SZEDATA2_MAX_PORTS 2
+
+/**
+ * Entry in list of PCI devices for this driver.
+ */
+struct pci_dev_list_entry;
+struct pci_dev_list_entry {
+	LIST_ENTRY(pci_dev_list_entry) next;
+	struct rte_pci_device *pci_dev;
+	unsigned int port_count;
+};
+
+/* List of PCI devices with number of ports for this driver. */
+LIST_HEAD(pci_dev_list, pci_dev_list_entry) szedata2_pci_dev_list =
+	LIST_HEAD_INITIALIZER(szedata2_pci_dev_list);
+
+struct port_info {
+	unsigned int rx_base_id;
+	unsigned int tx_base_id;
+	unsigned int rx_count;
+	unsigned int tx_count;
+	int numa_node;
+};
+
 struct pmd_internals {
 	struct rte_eth_dev *dev;
 	uint16_t max_rx_queues;
 	uint16_t max_tx_queues;
-	char sze_dev[PATH_MAX];
-	struct rte_mem_resource *pci_rsc;
+	unsigned int rxq_base_id;
+	unsigned int txq_base_id;
+	char *sze_dev_path;
 };
 
 struct szedata2_rx_queue {
 	struct pmd_internals *priv;
 	struct szedata *sze;
 	uint8_t rx_channel;
+	uint16_t qid;
 	uint16_t in_port;
 	struct rte_mempool *mb_pool;
 	volatile uint64_t rx_pkts;
@@ -61,6 +96,7 @@ struct szedata2_tx_queue {
 	struct pmd_internals *priv;
 	struct szedata *sze;
 	uint8_t tx_channel;
+	uint16_t qid;
 	volatile uint64_t tx_pkts;
 	volatile uint64_t tx_bytes;
 	volatile uint64_t err_pkts;
@@ -870,7 +906,7 @@ struct szedata2_tx_queue {
 	if (rxq->sze == NULL) {
 		uint32_t rx = 1 << rxq->rx_channel;
 		uint32_t tx = 0;
-		rxq->sze = szedata_open(internals->sze_dev);
+		rxq->sze = szedata_open(internals->sze_dev_path);
 		if (rxq->sze == NULL)
 			return -EINVAL;
 		ret = szedata_subscribe3(rxq->sze, &rx, &tx);
@@ -915,7 +951,7 @@ struct szedata2_tx_queue {
 	if (txq->sze == NULL) {
 		uint32_t rx = 0;
 		uint32_t tx = 1 << txq->tx_channel;
-		txq->sze = szedata_open(internals->sze_dev);
+		txq->sze = szedata_open(internals->sze_dev_path);
 		if (txq->sze == NULL)
 			return -EINVAL;
 		ret = szedata_subscribe3(txq->sze, &rx, &tx);
@@ -1179,12 +1215,15 @@ struct szedata2_tx_queue {
 		const struct rte_eth_rxconf *rx_conf __rte_unused,
 		struct rte_mempool *mb_pool)
 {
-	struct pmd_internals *internals = dev->data->dev_private;
 	struct szedata2_rx_queue *rxq;
 	int ret;
-	uint32_t rx = 1 << rx_queue_id;
+	struct pmd_internals *internals = dev->data->dev_private;
+	uint8_t rx_channel = internals->rxq_base_id + rx_queue_id;
+	uint32_t rx = 1 << rx_channel;
 	uint32_t tx = 0;
 
+	PMD_INIT_FUNC_TRACE();
+
 	if (dev->data->rx_queues[rx_queue_id] != NULL) {
 		eth_rx_queue_release(dev->data->rx_queues[rx_queue_id]);
 		dev->data->rx_queues[rx_queue_id] = NULL;
@@ -1200,7 +1239,7 @@ struct szedata2_tx_queue {
 	}
 
 	rxq->priv = internals;
-	rxq->sze = szedata_open(internals->sze_dev);
+	rxq->sze = szedata_open(internals->sze_dev_path);
 	if (rxq->sze == NULL) {
 		PMD_INIT_LOG(ERR, "szedata_open() failed for rx queue id "
 				"%" PRIu16 "!", rx_queue_id);
@@ -1214,7 +1253,8 @@ struct szedata2_tx_queue {
 		eth_rx_queue_release(rxq);
 		return -EINVAL;
 	}
-	rxq->rx_channel = rx_queue_id;
+	rxq->rx_channel = rx_channel;
+	rxq->qid = rx_queue_id;
 	rxq->in_port = dev->data->port_id;
 	rxq->mb_pool = mb_pool;
 	rxq->rx_pkts = 0;
@@ -1224,7 +1264,8 @@ struct szedata2_tx_queue {
 	dev->data->rx_queues[rx_queue_id] = rxq;
 
 	PMD_INIT_LOG(DEBUG, "Configured rx queue id %" PRIu16 " on socket "
-			"%u.", rx_queue_id, socket_id);
+			"%u (channel id %u).", rxq->qid, socket_id,
+			rxq->rx_channel);
 
 	return 0;
 }
@@ -1236,11 +1277,14 @@ struct szedata2_tx_queue {
 		unsigned int socket_id,
 		const struct rte_eth_txconf *tx_conf __rte_unused)
 {
-	struct pmd_internals *internals = dev->data->dev_private;
 	struct szedata2_tx_queue *txq;
 	int ret;
+	struct pmd_internals *internals = dev->data->dev_private;
+	uint8_t tx_channel = internals->txq_base_id + tx_queue_id;
 	uint32_t rx = 0;
-	uint32_t tx = 1 << tx_queue_id;
+	uint32_t tx = 1 << tx_channel;
+
+	PMD_INIT_FUNC_TRACE();
 
 	if (dev->data->tx_queues[tx_queue_id] != NULL) {
 		eth_tx_queue_release(dev->data->tx_queues[tx_queue_id]);
@@ -1257,7 +1301,7 @@ struct szedata2_tx_queue {
 	}
 
 	txq->priv = internals;
-	txq->sze = szedata_open(internals->sze_dev);
+	txq->sze = szedata_open(internals->sze_dev_path);
 	if (txq->sze == NULL) {
 		PMD_INIT_LOG(ERR, "szedata_open() failed for tx queue id "
 				"%" PRIu16 "!", tx_queue_id);
@@ -1271,7 +1315,8 @@ struct szedata2_tx_queue {
 		eth_tx_queue_release(txq);
 		return -EINVAL;
 	}
-	txq->tx_channel = tx_queue_id;
+	txq->tx_channel = tx_channel;
+	txq->qid = tx_queue_id;
 	txq->tx_pkts = 0;
 	txq->tx_bytes = 0;
 	txq->err_pkts = 0;
@@ -1279,7 +1324,8 @@ struct szedata2_tx_queue {
 	dev->data->tx_queues[tx_queue_id] = txq;
 
 	PMD_INIT_LOG(DEBUG, "Configured tx queue id %" PRIu16 " on socket "
-			"%u.", tx_queue_id, socket_id);
+			"%u (channel id %u).", txq->qid, socket_id,
+			txq->tx_channel);
 
 	return 0;
 }
@@ -1407,59 +1453,51 @@ struct szedata2_tx_queue {
 	return -1;
 }
 
+/**
+ * @brief Initializes rte_eth_dev device.
+ * @param dev Device to initialize.
+ * @param pi Structure with info about DMA queues.
+ * @return 0 on success, negative error code on error.
+ */
 static int
-rte_szedata2_eth_dev_init(struct rte_eth_dev *dev)
+rte_szedata2_eth_dev_init(struct rte_eth_dev *dev, struct port_info *pi)
 {
+	int ret;
+	uint32_t szedata2_index;
+	char name[PATH_MAX];
 	struct rte_eth_dev_data *data = dev->data;
 	struct pmd_internals *internals = (struct pmd_internals *)
 		data->dev_private;
-	struct szedata *szedata_temp;
-	int ret;
-	uint32_t szedata2_index;
 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
-	struct rte_pci_addr *pci_addr = &pci_dev->addr;
-	struct rte_mem_resource *pci_rsc =
-		&pci_dev->mem_resource[PCI_RESOURCE_NUMBER];
-	char rsc_filename[PATH_MAX];
-	void *pci_resource_ptr = NULL;
-	int fd;
 
-	PMD_INIT_LOG(INFO, "Initializing szedata2 device (" PCI_PRI_FMT ")",
-			pci_addr->domain, pci_addr->bus, pci_addr->devid,
-			pci_addr->function);
+	PMD_INIT_FUNC_TRACE();
 
-	internals->dev = dev;
+	PMD_INIT_LOG(INFO, "Initializing eth_dev %s (driver %s)", data->name,
+			dev->device->driver->name);
 
+	/* Fill internal private structure. */
+	internals->dev = dev;
 	/* Get index of szedata2 device file and create path to device file */
-	ret = get_szedata2_index(pci_addr, &szedata2_index);
+	ret = get_szedata2_index(&pci_dev->addr, &szedata2_index);
 	if (ret != 0) {
 		PMD_INIT_LOG(ERR, "Failed to get szedata2 device index!");
 		return -ENODEV;
 	}
-	snprintf(internals->sze_dev, PATH_MAX, SZEDATA2_DEV_PATH_FMT,
-			szedata2_index);
-
-	PMD_INIT_LOG(INFO, "SZEDATA2 path: %s", internals->sze_dev);
-
-	/*
-	 * Get number of available DMA RX and TX channels, which is maximum
-	 * number of queues that can be created and store it in private device
-	 * data structure.
-	 */
-	szedata_temp = szedata_open(internals->sze_dev);
-	if (szedata_temp == NULL) {
-		PMD_INIT_LOG(ERR, "szedata_open(): failed to open %s",
-				internals->sze_dev);
-		return -EINVAL;
+	snprintf(name, PATH_MAX, SZEDATA2_DEV_PATH_FMT, szedata2_index);
+	internals->sze_dev_path = strdup(name);
+	if (internals->sze_dev_path == NULL) {
+		PMD_INIT_LOG(ERR, "strdup() failed!");
+		return -ENOMEM;
 	}
-	internals->max_rx_queues = szedata_ifaces_available(szedata_temp,
-			SZE2_DIR_RX);
-	internals->max_tx_queues = szedata_ifaces_available(szedata_temp,
-			SZE2_DIR_TX);
-	szedata_close(szedata_temp);
-
-	PMD_INIT_LOG(INFO, "Available DMA channels RX: %u TX: %u",
-			internals->max_rx_queues, internals->max_tx_queues);
+	PMD_INIT_LOG(INFO, "SZEDATA2 path: %s", internals->sze_dev_path);
+	internals->max_rx_queues = pi->rx_count;
+	internals->max_tx_queues = pi->tx_count;
+	internals->rxq_base_id = pi->rx_base_id;
+	internals->txq_base_id = pi->tx_base_id;
+	PMD_INIT_LOG(INFO, "%u RX DMA channels from id %u",
+			internals->max_rx_queues, internals->rxq_base_id);
+	PMD_INIT_LOG(INFO, "%u TX DMA channels from id %u",
+			internals->max_tx_queues, internals->txq_base_id);
 
 	/* Set rx, tx burst functions */
 	if (data->scattered_rx == 1)
@@ -1471,43 +1509,6 @@ struct szedata2_tx_queue {
 	/* Set function callbacks for Ethernet API */
 	dev->dev_ops = &ops;
 
-	rte_eth_copy_pci_info(dev, pci_dev);
-
-	/* mmap pci resource0 file to rte_mem_resource structure */
-	if (pci_dev->mem_resource[PCI_RESOURCE_NUMBER].phys_addr ==
-			0) {
-		PMD_INIT_LOG(ERR, "Missing resource%u file",
-				PCI_RESOURCE_NUMBER);
-		return -EINVAL;
-	}
-	snprintf(rsc_filename, PATH_MAX,
-		"%s/" PCI_PRI_FMT "/resource%u", rte_pci_get_sysfs_path(),
-		pci_addr->domain, pci_addr->bus,
-		pci_addr->devid, pci_addr->function, PCI_RESOURCE_NUMBER);
-	fd = open(rsc_filename, O_RDWR);
-	if (fd < 0) {
-		PMD_INIT_LOG(ERR, "Could not open file %s", rsc_filename);
-		return -EINVAL;
-	}
-
-	pci_resource_ptr = mmap(0,
-			pci_dev->mem_resource[PCI_RESOURCE_NUMBER].len,
-			PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-	close(fd);
-	if (pci_resource_ptr == MAP_FAILED) {
-		PMD_INIT_LOG(ERR, "Could not mmap file %s (fd = %d)",
-				rsc_filename, fd);
-		return -EINVAL;
-	}
-	pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr = pci_resource_ptr;
-	internals->pci_rsc = pci_rsc;
-
-	PMD_INIT_LOG(DEBUG, "resource%u phys_addr = 0x%llx len = %llu "
-			"virt addr = %llx", PCI_RESOURCE_NUMBER,
-			(unsigned long long)pci_rsc->phys_addr,
-			(unsigned long long)pci_rsc->len,
-			(unsigned long long)pci_rsc->addr);
-
 	/* Get link state */
 	eth_link_update(dev, 0);
 
@@ -1516,36 +1517,36 @@ struct szedata2_tx_queue {
 			RTE_CACHE_LINE_SIZE);
 	if (data->mac_addrs == NULL) {
 		PMD_INIT_LOG(ERR, "Could not alloc space for MAC address!");
-		munmap(pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr,
-		       pci_dev->mem_resource[PCI_RESOURCE_NUMBER].len);
-		return -EINVAL;
+		free(internals->sze_dev_path);
+		return -ENOMEM;
 	}
 
 	ether_addr_copy(&eth_addr, data->mac_addrs);
 
-	PMD_INIT_LOG(INFO, "szedata2 device ("
-			PCI_PRI_FMT ") successfully initialized",
-			pci_addr->domain, pci_addr->bus, pci_addr->devid,
-			pci_addr->function);
+	PMD_INIT_LOG(INFO, "%s device %s successfully initialized",
+			dev->device->driver->name, data->name);
 
 	return 0;
 }
 
+/**
+ * @brief Unitializes rte_eth_dev device.
+ * @param dev Device to uninitialize.
+ * @return 0 on success, negative error code on error.
+ */
 static int
 rte_szedata2_eth_dev_uninit(struct rte_eth_dev *dev)
 {
-	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
-	struct rte_pci_addr *pci_addr = &pci_dev->addr;
+	struct pmd_internals *internals = (struct pmd_internals *)
+		dev->data->dev_private;
+
+	PMD_INIT_FUNC_TRACE();
 
+	free(internals->sze_dev_path);
 	rte_free(dev->data->mac_addrs);
-	dev->data->mac_addrs = NULL;
-	munmap(pci_dev->mem_resource[PCI_RESOURCE_NUMBER].addr,
-	       pci_dev->mem_resource[PCI_RESOURCE_NUMBER].len);
 
-	PMD_DRV_LOG(INFO, "szedata2 device ("
-			PCI_PRI_FMT ") successfully uninitialized",
-			pci_addr->domain, pci_addr->bus, pci_addr->devid,
-			pci_addr->function);
+	PMD_DRV_LOG(INFO, "%s device %s successfully uninitialized",
+			dev->device->driver->name, dev->data->name);
 
 	return 0;
 }
@@ -1564,21 +1565,347 @@ struct szedata2_tx_queue {
 				PCI_DEVICE_ID_NETCOPE_COMBO100G2)
 	},
 	{
+		RTE_PCI_DEVICE(PCI_VENDOR_ID_NETCOPE,
+				PCI_DEVICE_ID_NETCOPE_NFB200G2QL)
+	},
+	{
 		.vendor_id = 0,
 	}
 };
 
+/**
+ * @brief Gets info about DMA queues for ports.
+ * @param pci_dev PCI device structure.
+ * @param port_count Pointer to variable set with number of ports.
+ * @param pi Pointer to array of structures with info about DMA queues
+ *           for ports.
+ * @param max_ports Maximum number of ports.
+ * @return 0 on success, negative error code on error.
+ */
+static int
+get_port_info(struct rte_pci_device *pci_dev, unsigned int *port_count,
+		struct port_info *pi, unsigned int max_ports)
+{
+	struct szedata *szedata_temp;
+	char sze_dev_path[PATH_MAX];
+	uint32_t szedata2_index;
+	int ret;
+	uint16_t max_rx_queues;
+	uint16_t max_tx_queues;
+
+	if (max_ports == 0)
+		return -EINVAL;
+
+	memset(pi, 0, max_ports * sizeof(struct port_info));
+	*port_count = 0;
+
+	/* Get index of szedata2 device file and create path to device file */
+	ret = get_szedata2_index(&pci_dev->addr, &szedata2_index);
+	if (ret != 0) {
+		PMD_INIT_LOG(ERR, "Failed to get szedata2 device index!");
+		return -ENODEV;
+	}
+	snprintf(sze_dev_path, PATH_MAX, SZEDATA2_DEV_PATH_FMT, szedata2_index);
+
+	/*
+	 * Get number of available DMA RX and TX channels, which is maximum
+	 * number of queues that can be created.
+	 */
+	szedata_temp = szedata_open(sze_dev_path);
+	if (szedata_temp == NULL) {
+		PMD_INIT_LOG(ERR, "szedata_open(%s) failed", sze_dev_path);
+		return -EINVAL;
+	}
+	max_rx_queues = szedata_ifaces_available(szedata_temp, SZE2_DIR_RX);
+	max_tx_queues = szedata_ifaces_available(szedata_temp, SZE2_DIR_TX);
+	PMD_INIT_LOG(INFO, "Available DMA channels RX: %u TX: %u",
+			max_rx_queues, max_tx_queues);
+	if (max_rx_queues > RTE_ETH_SZEDATA2_MAX_RX_QUEUES) {
+		PMD_INIT_LOG(ERR, "%u RX queues exceeds supported number %u",
+				max_rx_queues, RTE_ETH_SZEDATA2_MAX_RX_QUEUES);
+		szedata_close(szedata_temp);
+		return -EINVAL;
+	}
+	if (max_tx_queues > RTE_ETH_SZEDATA2_MAX_TX_QUEUES) {
+		PMD_INIT_LOG(ERR, "%u TX queues exceeds supported number %u",
+				max_tx_queues, RTE_ETH_SZEDATA2_MAX_TX_QUEUES);
+		szedata_close(szedata_temp);
+		return -EINVAL;
+	}
+
+	if (pci_dev->id.device_id == PCI_DEVICE_ID_NETCOPE_NFB200G2QL) {
+		unsigned int i;
+		unsigned int rx_queues = max_rx_queues / max_ports;
+		unsigned int tx_queues = max_tx_queues / max_ports;
+
+		/*
+		 * Number of queues reported by szedata_ifaces_available()
+		 * is the number of all queues from all DMA controllers which
+		 * may reside at different numa locations.
+		 * All queues from the same DMA controller have the same numa
+		 * node.
+		 * Numa node from the first queue of each DMA controller is
+		 * retrieved.
+		 * If the numa node differs from the numa node of the queues
+		 * from the previous DMA controller the queues are assigned
+		 * to the next port.
+		 */
+
+		for (i = 0; i < max_ports; i++) {
+			int numa_rx = szedata_get_area_numa_node(szedata_temp,
+				SZE2_DIR_RX, rx_queues * i);
+			int numa_tx = szedata_get_area_numa_node(szedata_temp,
+				SZE2_DIR_TX, tx_queues * i);
+			unsigned int port_rx_queues = numa_rx != -1 ?
+				rx_queues : 0;
+			unsigned int port_tx_queues = numa_tx != -1 ?
+				tx_queues : 0;
+			PMD_INIT_LOG(DEBUG, "%u rx queues from id %u, numa %d",
+					rx_queues, rx_queues * i, numa_rx);
+			PMD_INIT_LOG(DEBUG, "%u tx queues from id %u, numa %d",
+					tx_queues, tx_queues * i, numa_tx);
+
+			if (port_rx_queues != 0 && port_tx_queues != 0 &&
+					numa_rx != numa_tx) {
+				PMD_INIT_LOG(ERR, "RX queue %u numa %d differs "
+						"from TX queue %u numa %d "
+						"unexpectedly",
+						rx_queues * i, numa_rx,
+						tx_queues * i, numa_tx);
+				szedata_close(szedata_temp);
+				return -EINVAL;
+			} else if (port_rx_queues == 0 && port_tx_queues == 0) {
+				continue;
+			} else {
+				unsigned int j;
+				unsigned int current = *port_count;
+				int port_numa = port_rx_queues != 0 ?
+					numa_rx : numa_tx;
+
+				for (j = 0; j < *port_count; j++) {
+					if (pi[j].numa_node ==
+							port_numa) {
+						current = j;
+						break;
+					}
+				}
+				if (pi[current].rx_count == 0 &&
+						pi[current].tx_count == 0) {
+					pi[current].rx_base_id = rx_queues * i;
+					pi[current].tx_base_id = tx_queues * i;
+					(*port_count)++;
+				} else if ((rx_queues * i !=
+						pi[current].rx_base_id +
+						pi[current].rx_count) ||
+						(tx_queues * i !=
+						 pi[current].tx_base_id +
+						 pi[current].tx_count)) {
+					PMD_INIT_LOG(ERR, "Queue ids does not "
+							"fulfill constraints");
+					szedata_close(szedata_temp);
+					return -EINVAL;
+				}
+				pi[current].rx_count += port_rx_queues;
+				pi[current].tx_count += port_tx_queues;
+				pi[current].numa_node = port_numa;
+			}
+		}
+	} else {
+		pi[0].rx_count = max_rx_queues;
+		pi[0].tx_count = max_tx_queues;
+		pi[0].numa_node = pci_dev->device.numa_node;
+		*port_count = 1;
+	}
+
+	szedata_close(szedata_temp);
+	return 0;
+}
+
+/**
+ * @brief Allocates rte_eth_dev device.
+ * @param pci_dev Corresponding PCI device.
+ * @param numa_node NUMA node on which device is allocated.
+ * @param port_no Id of rte_eth_device created on PCI device pci_dev.
+ * @return Pointer to allocated device or NULL on error.
+ */
+static struct rte_eth_dev *
+szedata2_eth_dev_allocate(struct rte_pci_device *pci_dev, int numa_node,
+		unsigned int port_no)
+{
+	struct rte_eth_dev *eth_dev;
+	char name[RTE_ETH_NAME_MAX_LEN];
+
+	PMD_INIT_FUNC_TRACE();
+
+	snprintf(name, RTE_ETH_NAME_MAX_LEN, "%s"
+			SZEDATA2_ETH_DEV_NAME_SUFFIX_FMT,
+			pci_dev->device.name, port_no);
+	PMD_INIT_LOG(DEBUG, "Allocating eth_dev %s", name);
+
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+		eth_dev = rte_eth_dev_allocate(name);
+		if (!eth_dev)
+			return NULL;
+
+		eth_dev->data->dev_private = rte_zmalloc_socket(name,
+			sizeof(struct pmd_internals), RTE_CACHE_LINE_SIZE,
+			numa_node);
+		if (!eth_dev->data->dev_private) {
+			rte_eth_dev_release_port(eth_dev);
+			return NULL;
+		}
+	} else {
+		eth_dev = rte_eth_dev_attach_secondary(name);
+		if (!eth_dev)
+			return NULL;
+	}
+
+	eth_dev->device = &pci_dev->device;
+	rte_eth_copy_pci_info(eth_dev, pci_dev);
+	eth_dev->data->numa_node = numa_node;
+	return eth_dev;
+}
+
+/**
+ * @brief Releases interval of rte_eth_dev devices from array.
+ * @param eth_devs Array of pointers to rte_eth_dev devices.
+ * @param from Index in array eth_devs to start with.
+ * @param to Index in array right after the last element to release.
+ *
+ * Used for releasing at failed initialization.
+ */
+static void
+szedata2_eth_dev_release_interval(struct rte_eth_dev **eth_devs,
+		unsigned int from, unsigned int to)
+{
+	unsigned int i;
+
+	PMD_INIT_FUNC_TRACE();
+
+	for (i = from; i < to; i++) {
+		rte_szedata2_eth_dev_uninit(eth_devs[i]);
+		rte_eth_dev_pci_release(eth_devs[i]);
+	}
+}
+
+/**
+ * @brief Callback .probe for struct rte_pci_driver.
+ */
 static int szedata2_eth_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	struct rte_pci_device *pci_dev)
 {
-	return rte_eth_dev_pci_generic_probe(pci_dev,
-		sizeof(struct pmd_internals), rte_szedata2_eth_dev_init);
+	struct port_info port_info[SZEDATA2_MAX_PORTS];
+	unsigned int port_count;
+	int ret;
+	unsigned int i;
+	struct pci_dev_list_entry *list_entry;
+	struct rte_eth_dev *eth_devs[SZEDATA2_MAX_PORTS] = {NULL,};
+
+	PMD_INIT_FUNC_TRACE();
+
+	ret = get_port_info(pci_dev, &port_count, port_info,
+			SZEDATA2_MAX_PORTS);
+	if (ret != 0)
+		return ret;
+
+	if (port_count == 0) {
+		PMD_INIT_LOG(ERR, "No available ports!");
+		return -ENODEV;
+	}
+
+	list_entry = rte_zmalloc(NULL, sizeof(struct pci_dev_list_entry),
+			RTE_CACHE_LINE_SIZE);
+	if (list_entry == NULL) {
+		PMD_INIT_LOG(ERR, "rte_zmalloc() failed!");
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < port_count; i++) {
+		eth_devs[i] = szedata2_eth_dev_allocate(pci_dev,
+				port_info[i].numa_node, i);
+		if (eth_devs[i] == NULL) {
+			PMD_INIT_LOG(ERR, "Failed to alloc eth_dev for port %u",
+					i);
+			szedata2_eth_dev_release_interval(eth_devs, 0, i);
+			rte_free(list_entry);
+			return -ENOMEM;
+		}
+
+		ret = rte_szedata2_eth_dev_init(eth_devs[i], &port_info[i]);
+		if (ret != 0) {
+			PMD_INIT_LOG(ERR, "Failed to init eth_dev for port %u",
+					i);
+			rte_eth_dev_pci_release(eth_devs[i]);
+			szedata2_eth_dev_release_interval(eth_devs, 0, i);
+			rte_free(list_entry);
+			return ret;
+		}
+	}
+
+	/*
+	 * Add pci_dev to list of PCI devices for this driver
+	 * which is used at remove callback to release all created eth_devs.
+	 */
+	list_entry->pci_dev = pci_dev;
+	list_entry->port_count = port_count;
+	LIST_INSERT_HEAD(&szedata2_pci_dev_list, list_entry, next);
+	return 0;
 }
 
+/**
+ * @brief Callback .remove for struct rte_pci_driver.
+ */
 static int szedata2_eth_pci_remove(struct rte_pci_device *pci_dev)
 {
-	return rte_eth_dev_pci_generic_remove(pci_dev,
-		rte_szedata2_eth_dev_uninit);
+	unsigned int i;
+	unsigned int port_count;
+	char name[RTE_ETH_NAME_MAX_LEN];
+	struct rte_eth_dev *eth_dev;
+	int ret;
+	int retval = 0;
+	bool found = false;
+	struct pci_dev_list_entry *list_entry = NULL;
+
+	PMD_INIT_FUNC_TRACE();
+
+	LIST_FOREACH(list_entry, &szedata2_pci_dev_list, next) {
+		if (list_entry->pci_dev == pci_dev) {
+			port_count = list_entry->port_count;
+			found = true;
+			break;
+		}
+	}
+	LIST_REMOVE(list_entry, next);
+	rte_free(list_entry);
+
+	if (!found) {
+		PMD_DRV_LOG(ERR, "PCI device " PCI_PRI_FMT " not found",
+				pci_dev->addr.domain, pci_dev->addr.bus,
+				pci_dev->addr.devid, pci_dev->addr.function);
+		return -ENODEV;
+	}
+
+	for (i = 0; i < port_count; i++) {
+		snprintf(name, RTE_ETH_NAME_MAX_LEN, "%s"
+				SZEDATA2_ETH_DEV_NAME_SUFFIX_FMT,
+				pci_dev->device.name, i);
+		PMD_DRV_LOG(DEBUG, "Removing eth_dev %s", name);
+		eth_dev = rte_eth_dev_allocated(name);
+		if (!eth_dev) {
+			PMD_DRV_LOG(ERR, "eth_dev %s not found", name);
+			retval = retval ? retval : -ENODEV;
+		}
+
+		ret = rte_szedata2_eth_dev_uninit(eth_dev);
+		if (ret != 0) {
+			PMD_DRV_LOG(ERR, "eth_dev %s uninit failed", name);
+			retval = retval ? retval : ret;
+		}
+
+		rte_eth_dev_pci_release(eth_dev);
+	}
+
+	return retval;
 }
 
 static struct rte_pci_driver szedata2_eth_driver = {
diff --git a/drivers/net/szedata2/rte_eth_szedata2.h b/drivers/net/szedata2/rte_eth_szedata2.h
index 147d3d9..26a82b3 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.h
+++ b/drivers/net/szedata2/rte_eth_szedata2.h
@@ -18,9 +18,7 @@
 #define PCI_DEVICE_ID_NETCOPE_COMBO80G 0xcb80
 #define PCI_DEVICE_ID_NETCOPE_COMBO100G 0xc1c1
 #define PCI_DEVICE_ID_NETCOPE_COMBO100G2 0xc2c1
-
-/* number of PCI resource used by COMBO card */
-#define PCI_RESOURCE_NUMBER 0
+#define PCI_DEVICE_ID_NETCOPE_NFB200G2QL 0xc250
 
 /* szedata2_packet header length == 4 bytes == 2B segment size + 2B hw size */
 #define RTE_SZE2_PACKET_HEADER_SIZE 4
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [dpdk-dev] [PATCH v2 3/3] net/szedata2: add kernel module dependency
  2018-04-06 14:12 [dpdk-dev] [PATCH 0/3] net/szedata2: patch set for new card support Matej Vido
                   ` (5 preceding siblings ...)
  2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 2/3] net/szedata2: add support for new NIC Matej Vido
@ 2018-04-12  7:41 ` Matej Vido
  6 siblings, 0 replies; 23+ messages in thread
From: Matej Vido @ 2018-04-12  7:41 UTC (permalink / raw)
  To: dev; +Cc: remes, ferruh.yigit

New kernel module dependency is required to support NFB-200G2QL card.

Signed-off-by: Matej Vido <vido@cesnet.cz>
---
 drivers/net/szedata2/rte_eth_szedata2.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c
index 5a8f2ed..d81b777 100644
--- a/drivers/net/szedata2/rte_eth_szedata2.c
+++ b/drivers/net/szedata2/rte_eth_szedata2.c
@@ -1917,7 +1917,7 @@ static int szedata2_eth_pci_remove(struct rte_pci_device *pci_dev)
 RTE_PMD_REGISTER_PCI(RTE_SZEDATA2_DRIVER_NAME, szedata2_eth_driver);
 RTE_PMD_REGISTER_PCI_TABLE(RTE_SZEDATA2_DRIVER_NAME, rte_szedata2_pci_id_table);
 RTE_PMD_REGISTER_KMOD_DEP(RTE_SZEDATA2_DRIVER_NAME,
-	"* combo6core & combov3 & szedata2 & szedata2_cv3");
+	"* combo6core & combov3 & szedata2 & ( szedata2_cv3 | szedata2_cv3_fdt )");
 
 RTE_INIT(szedata2_init_log);
 static void
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [dpdk-dev] [PATCH v2 2/3] net/szedata2: add support for new NIC
  2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 2/3] net/szedata2: add support for new NIC Matej Vido
@ 2018-04-12 16:11   ` Ferruh Yigit
  2018-04-13  8:17     ` Jan Remeš
  0 siblings, 1 reply; 23+ messages in thread
From: Ferruh Yigit @ 2018-04-12 16:11 UTC (permalink / raw)
  To: Matej Vido, dev; +Cc: remes

On 4/12/2018 8:41 AM, Matej Vido wrote:
> +	if (pci_dev->id.device_id == PCI_DEVICE_ID_NETCOPE_NFB200G2QL) {
> +		unsigned int i;
> +		unsigned int rx_queues = max_rx_queues / max_ports;
> +		unsigned int tx_queues = max_tx_queues / max_ports;
> +
> +		/*
> +		 * Number of queues reported by szedata_ifaces_available()
> +		 * is the number of all queues from all DMA controllers which
> +		 * may reside at different numa locations.
> +		 * All queues from the same DMA controller have the same numa
> +		 * node.
> +		 * Numa node from the first queue of each DMA controller is
> +		 * retrieved.
> +		 * If the numa node differs from the numa node of the queues
> +		 * from the previous DMA controller the queues are assigned
> +		 * to the next port.
> +		 */
> +
> +		for (i = 0; i < max_ports; i++) {
> +			int numa_rx = szedata_get_area_numa_node(szedata_temp,
> +				SZE2_DIR_RX, rx_queues * i);
> +			int numa_tx = szedata_get_area_numa_node(szedata_temp,

Hi Matej,

Where szedata_get_area_numa_node() is defined?
Is it possible that you are missing a patch?

Thanks,
ferruh

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [dpdk-dev] [PATCH 1/3] net/szedata2: do not affect Ethernet interfaces
  2018-04-12  7:38         ` Matej Vido
@ 2018-04-13  4:25           ` Yasufumi Ogawa
  2018-04-13 10:39             ` Matej Vido
  0 siblings, 1 reply; 23+ messages in thread
From: Yasufumi Ogawa @ 2018-04-13  4:25 UTC (permalink / raw)
  To: Matej Vido, Ferruh Yigit, dev; +Cc: remes

On 2018/04/12 16:38, Matej Vido wrote:
> On 11.04.2018 12:51, Ferruh Yigit wrote:
>> On 4/11/2018 10:36 AM, Matej Vido wrote:
>>> On 10.04.2018 17:28, Ferruh Yigit wrote:
>>>> On 4/6/2018 3:12 PM, Matej Vido wrote:
>>>>> NFB cards employ multiple Ethernet ports.
>>>>> Until now, Ethernet port-related operations were performed on all 
>>>>> of them
>>>>> (since the whole card was represented as a single port).
>>>>> With new NFB-200G2QL card, this is no longer viable.
>>>>>
>>>>> Since there is no fixed mapping between the queues and Ethernet ports,
>>>>> and since a single card can be represented as two ports in DPDK,
>>>>> there is no way of telling which (if any) physical ports should be
>>>>> associated with individual ports in DPDK.
>>>>>
>>>>> This is also described in documentation in more detail.
>>>>>
>>>>> Signed-off-by: Matej Vido <vido@cesnet.cz>
>>>>> Signed-off-by: Jan Remes <remes@netcope.com>
>>>>> ---
>>>>>    config/common_base                                 |   5 -
>>>>>    .../nics/img/szedata2_nfb200g_architecture.svg     | 171 
>>>>> +++++++++++
>>>> Hi Matej,
>>>>
>>>> This patch fails to apply [1], can you please confirm you can apply it?
>>>>
>>>> [1]
>>>> $ git apply --check
>>>> dpdk-dev-1-3-net-szedata2-do-not-affect-Ethernet-interfaces.patch
>>>> error: corrupt patch at line 270
>>> Hi Ferruh,
>>>
>>> I've got same error on patch downloaded from patchwork. It seems that
>>> the difference between the downloaded patch and the patch generated from
>>> git is that the long lines in svg file are split into multiple lines in
>>> the patch downloaded from patchwork. I suppose this could be the
>>> problem. Any idea how to send a patch containing svg file correctly?
>> cc'ed Ogawa-san for support,
>>
>> I remember he fixed similar issue in the past for spp, but I don't 
>> remember how?
> Anyways I've hopefully fixed this by redrawing the image to avoid those 
> long lines. I'm sending v2.
> 
> Thanks,
> Matej
Hi Matej, Ferruh,

I also encountered the same problem for 998 chars limitation of SMTP. I 
fixed it by replacing objects with simpler ones.

You can check this error by using '--validate' option of git send-email.

Thanks,
Yasufumi
>>
>>> Thanks,
>>> Matej
>>>
> 
> 
> 


-- 
Yasufumi Ogawa
NTT Network Service Systems Labs

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [dpdk-dev] [PATCH v2 2/3] net/szedata2: add support for new NIC
  2018-04-12 16:11   ` Ferruh Yigit
@ 2018-04-13  8:17     ` Jan Remeš
  2018-04-13 14:26       ` Ferruh Yigit
  0 siblings, 1 reply; 23+ messages in thread
From: Jan Remeš @ 2018-04-13  8:17 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: Matej Vido, dev, fpga-sw

>
> Hi Matej,
>
> Where szedata_get_area_numa_node() is defined?
> Is it possible that you are missing a patch?
>
> Thanks,
> ferruh

Hi Ferruh,

the new PMD requires an updated version of libsze2 and drivers. We
have just published the updated packages here:
https://www.netcope.com/en/company/community-support/dpdk-libsze2.
Sorry for the hickup.

Best regards,
  Jan

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [dpdk-dev] [PATCH 1/3] net/szedata2: do not affect Ethernet interfaces
  2018-04-13  4:25           ` Yasufumi Ogawa
@ 2018-04-13 10:39             ` Matej Vido
  0 siblings, 0 replies; 23+ messages in thread
From: Matej Vido @ 2018-04-13 10:39 UTC (permalink / raw)
  To: Yasufumi Ogawa, Ferruh Yigit, dev; +Cc: remes

On 13.04.2018 06:25, Yasufumi Ogawa wrote:
> On 2018/04/12 16:38, Matej Vido wrote:
>> On 11.04.2018 12:51, Ferruh Yigit wrote:
>>> On 4/11/2018 10:36 AM, Matej Vido wrote:
>>>> On 10.04.2018 17:28, Ferruh Yigit wrote:
>>>>> On 4/6/2018 3:12 PM, Matej Vido wrote:
>>>>>> NFB cards employ multiple Ethernet ports.
>>>>>> Until now, Ethernet port-related operations were performed on all 
>>>>>> of them
>>>>>> (since the whole card was represented as a single port).
>>>>>> With new NFB-200G2QL card, this is no longer viable.
>>>>>>
>>>>>> Since there is no fixed mapping between the queues and Ethernet 
>>>>>> ports,
>>>>>> and since a single card can be represented as two ports in DPDK,
>>>>>> there is no way of telling which (if any) physical ports should be
>>>>>> associated with individual ports in DPDK.
>>>>>>
>>>>>> This is also described in documentation in more detail.
>>>>>>
>>>>>> Signed-off-by: Matej Vido <vido@cesnet.cz>
>>>>>> Signed-off-by: Jan Remes <remes@netcope.com>
>>>>>> ---
>>>>>>    config/common_base |   5 -
>>>>>>    .../nics/img/szedata2_nfb200g_architecture.svg     | 171 
>>>>>> +++++++++++
>>>>> Hi Matej,
>>>>>
>>>>> This patch fails to apply [1], can you please confirm you can 
>>>>> apply it?
>>>>>
>>>>> [1]
>>>>> $ git apply --check
>>>>> dpdk-dev-1-3-net-szedata2-do-not-affect-Ethernet-interfaces.patch
>>>>> error: corrupt patch at line 270
>>>> Hi Ferruh,
>>>>
>>>> I've got same error on patch downloaded from patchwork. It seems that
>>>> the difference between the downloaded patch and the patch generated 
>>>> from
>>>> git is that the long lines in svg file are split into multiple 
>>>> lines in
>>>> the patch downloaded from patchwork. I suppose this could be the
>>>> problem. Any idea how to send a patch containing svg file correctly?
>>> cc'ed Ogawa-san for support,
>>>
>>> I remember he fixed similar issue in the past for spp, but I don't 
>>> remember how?
>> Anyways I've hopefully fixed this by redrawing the image to avoid 
>> those long lines. I'm sending v2.
>>
>> Thanks,
>> Matej
> Hi Matej, Ferruh,
>
> I also encountered the same problem for 998 chars limitation of SMTP. 
> I fixed it by replacing objects with simpler ones.
>
> You can check this error by using '--validate' option of git send-email.
>
> Thanks,
> Yasufumi
Hi Yasufumi,

thanks for sharing your remarks. Eventually I resolved it likewise.

Regards,
Matej
>>>
>>>> Thanks,
>>>> Matej
>>>>
>>
>>
>>
>
>

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [dpdk-dev] [PATCH v2 2/3] net/szedata2: add support for new NIC
  2018-04-13  8:17     ` Jan Remeš
@ 2018-04-13 14:26       ` Ferruh Yigit
  2018-04-13 15:03         ` Jan Remeš
  0 siblings, 1 reply; 23+ messages in thread
From: Ferruh Yigit @ 2018-04-13 14:26 UTC (permalink / raw)
  To: Jan Remeš; +Cc: Matej Vido, dev, fpga-sw

On 4/13/2018 9:17 AM, Jan Remeš wrote:
>>
>> Hi Matej,
>>
>> Where szedata_get_area_numa_node() is defined?
>> Is it possible that you are missing a patch?
>>
>> Thanks,
>> ferruh
> 
> Hi Ferruh,
> 
> the new PMD requires an updated version of libsze2 and drivers. We
> have just published the updated packages here:
> https://www.netcope.com/en/company/community-support/dpdk-libsze2.

DPDK documentation mentions about libsze2 dependency but there is no version
mentioned.

And I have not seen any note that says a new version of library is required,
perhaps I missed it, is there a documentation which says which version of DPDK
requires which version of the dependencies?

What is the way of tracing this dependency?

> Sorry for the hickup.
> 
> Best regards,
>   Jan
> 

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [dpdk-dev] [PATCH v2 2/3] net/szedata2: add support for new NIC
  2018-04-13 14:26       ` Ferruh Yigit
@ 2018-04-13 15:03         ` Jan Remeš
  2018-04-13 16:29           ` Ferruh Yigit
  0 siblings, 1 reply; 23+ messages in thread
From: Jan Remeš @ 2018-04-13 15:03 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: Matej Vido, dev, fpga-sw

It is mentioned on the website with the packages itself. The current
version works with the reworked PMD - there is a headline which says:
"DPDK from 18.05" (since we expect the patches to land in the upcoming
release; we will update it if this does not happen).

The older version is still available on the website, with appropriate
installation steps and a headline that says "DPDK up to 18.02".

Is this form of documentation sufficient for you or would you like to
see it mentioned in the DPDK documentation as well?

Thanks,
  Jan
Jan Remeš | Software Developer
Netcope Technologies, a.s.

T: +420 530 510 680
A: Sochorova 3232/34, Brno, 616 00, Czech Republic
W: www.netcope.com




On Fri, Apr 13, 2018 at 4:26 PM, Ferruh Yigit <ferruh.yigit@intel.com> wrote:
> On 4/13/2018 9:17 AM, Jan Remeš wrote:
>>>
>>> Hi Matej,
>>>
>>> Where szedata_get_area_numa_node() is defined?
>>> Is it possible that you are missing a patch?
>>>
>>> Thanks,
>>> ferruh
>>
>> Hi Ferruh,
>>
>> the new PMD requires an updated version of libsze2 and drivers. We
>> have just published the updated packages here:
>> https://www.netcope.com/en/company/community-support/dpdk-libsze2.
>
> DPDK documentation mentions about libsze2 dependency but there is no version
> mentioned.
>
> And I have not seen any note that says a new version of library is required,
> perhaps I missed it, is there a documentation which says which version of DPDK
> requires which version of the dependencies?
>
> What is the way of tracing this dependency?
>
>> Sorry for the hickup.
>>
>> Best regards,
>>   Jan
>>
>

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [dpdk-dev] [PATCH v2 2/3] net/szedata2: add support for new NIC
  2018-04-13 15:03         ` Jan Remeš
@ 2018-04-13 16:29           ` Ferruh Yigit
  2018-04-18  7:21             ` Matej Vido
  0 siblings, 1 reply; 23+ messages in thread
From: Ferruh Yigit @ 2018-04-13 16:29 UTC (permalink / raw)
  To: Jan Remeš; +Cc: Matej Vido, dev, fpga-sw

On 4/13/2018 4:03 PM, Jan Remeš wrote:
> It is mentioned on the website with the packages itself. The current
> version works with the reworked PMD - there is a headline which says:
> "DPDK from 18.05" (since we expect the patches to land in the upcoming
> release; we will update it if this does not happen).
> 
> The older version is still available on the website, with appropriate
> installation steps and a headline that says "DPDK up to 18.02".
> 
> Is this form of documentation sufficient for you or would you like to
> see it mentioned in the DPDK documentation as well?

I think it is better to have some level of information in DPDK documentation too.

There is already a release note update in this set, do you think does it make
sense to mention new dependency there?

I will get patches right now, please send doc/release notes updates as
incremental patches.

> 
> Thanks,
>   Jan
> Jan Remeš | Software Developer
> Netcope Technologies, a.s.
> 
> T: +420 530 510 680
> A: Sochorova 3232/34, Brno, 616 00, Czech Republic
> W: www.netcope.com
> 
> 
> 
> 
> On Fri, Apr 13, 2018 at 4:26 PM, Ferruh Yigit <ferruh.yigit@intel.com> wrote:
>> On 4/13/2018 9:17 AM, Jan Remeš wrote:
>>>>
>>>> Hi Matej,
>>>>
>>>> Where szedata_get_area_numa_node() is defined?
>>>> Is it possible that you are missing a patch?
>>>>
>>>> Thanks,
>>>> ferruh
>>>
>>> Hi Ferruh,
>>>
>>> the new PMD requires an updated version of libsze2 and drivers. We
>>> have just published the updated packages here:
>>> https://www.netcope.com/en/company/community-support/dpdk-libsze2.
>>
>> DPDK documentation mentions about libsze2 dependency but there is no version
>> mentioned.
>>
>> And I have not seen any note that says a new version of library is required,
>> perhaps I missed it, is there a documentation which says which version of DPDK
>> requires which version of the dependencies?
>>
>> What is the way of tracing this dependency?
>>
>>> Sorry for the hickup.
>>>
>>> Best regards,
>>>   Jan
>>>
>>

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [dpdk-dev] [PATCH v2 0/3] net/szedata2: patch set for new card support
  2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 0/3] net/szedata2: patch set for new card support Matej Vido
@ 2018-04-13 16:32   ` Ferruh Yigit
  2018-04-27  8:57   ` [dpdk-dev] [PATCH 1/1] doc: update doc and release notes for szedata2 driver Matej Vido
  1 sibling, 0 replies; 23+ messages in thread
From: Ferruh Yigit @ 2018-04-13 16:32 UTC (permalink / raw)
  To: Matej Vido, dev; +Cc: remes

On 4/12/2018 8:41 AM, Matej Vido wrote:
> This patch set adds support for new card NFB-200G2QL.
> 
> v2:
> Rebased on top of dpdk-next-net/master (conflict in release notes
> for patch 2).
> Svg image in patch 1 replaced by redrawn image to avoid too long lines.
> 
> Matej Vido (3):
>   net/szedata2: do not affect Ethernet interfaces
>   net/szedata2: add support for new NIC
>   net/szedata2: add kernel module dependency

Series applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [dpdk-dev] [PATCH v2 2/3] net/szedata2: add support for new NIC
  2018-04-13 16:29           ` Ferruh Yigit
@ 2018-04-18  7:21             ` Matej Vido
  0 siblings, 0 replies; 23+ messages in thread
From: Matej Vido @ 2018-04-18  7:21 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: Jan Remeš, dev, fpga-sw

On 13.04.2018 18:29, Ferruh Yigit wrote:
> On 4/13/2018 4:03 PM, Jan Remeš wrote:
>> It is mentioned on the website with the packages itself. The current
>> version works with the reworked PMD - there is a headline which says:
>> "DPDK from 18.05" (since we expect the patches to land in the upcoming
>> release; we will update it if this does not happen).
>>
>> The older version is still available on the website, with appropriate
>> installation steps and a headline that says "DPDK up to 18.02".
>>
>> Is this form of documentation sufficient for you or would you like to
>> see it mentioned in the DPDK documentation as well?
> I think it is better to have some level of information in DPDK documentation too.
>
> There is already a release note update in this set, do you think does it make
> sense to mention new dependency there?
>
> I will get patches right now, please send doc/release notes updates as
> incremental patches.
Hi Ferruh,

we will send the follow-up patches updating both documentation and 
release notes soon.

Thanks,
Matej
>
>> Thanks,
>>    Jan
>> Jan Remeš | Software Developer
>> Netcope Technologies, a.s.
>>
>> T: +420 530 510 680
>> A: Sochorova 3232/34, Brno, 616 00, Czech Republic
>> W: www.netcope.com
>>
>>
>>
>>
>> On Fri, Apr 13, 2018 at 4:26 PM, Ferruh Yigit <ferruh.yigit@intel.com> wrote:
>>> On 4/13/2018 9:17 AM, Jan Remeš wrote:
>>>>> Hi Matej,
>>>>>
>>>>> Where szedata_get_area_numa_node() is defined?
>>>>> Is it possible that you are missing a patch?
>>>>>
>>>>> Thanks,
>>>>> ferruh
>>>> Hi Ferruh,
>>>>
>>>> the new PMD requires an updated version of libsze2 and drivers. We
>>>> have just published the updated packages here:
>>>> https://www.netcope.com/en/company/community-support/dpdk-libsze2.
>>> DPDK documentation mentions about libsze2 dependency but there is no version
>>> mentioned.
>>>
>>> And I have not seen any note that says a new version of library is required,
>>> perhaps I missed it, is there a documentation which says which version of DPDK
>>> requires which version of the dependencies?
>>>
>>> What is the way of tracing this dependency?
>>>
>>>> Sorry for the hickup.
>>>>
>>>> Best regards,
>>>>    Jan
>>>>

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [dpdk-dev] [PATCH 1/1] doc: update doc and release notes for szedata2 driver
  2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 0/3] net/szedata2: patch set for new card support Matej Vido
  2018-04-13 16:32   ` Ferruh Yigit
@ 2018-04-27  8:57   ` Matej Vido
  2018-04-27 13:11     ` Ferruh Yigit
  1 sibling, 1 reply; 23+ messages in thread
From: Matej Vido @ 2018-04-27  8:57 UTC (permalink / raw)
  To: dev; +Cc: remes, ferruh.yigit

New version of the packages with dependencies for the szedata2
driver is needed due to the new API of the libsze2 library which
is used in the driver.
The documentation and the release notes are updated to contain
the information about the required versions.

Signed-off-by: Matej Vido <vido@cesnet.cz>
Acked-by: Jan Remes <remes@netcope.com>
---
 doc/guides/nics/szedata2.rst           | 9 +++++++++
 doc/guides/rel_notes/release_18_05.rst | 4 ++++
 2 files changed, 13 insertions(+)

diff --git a/doc/guides/nics/szedata2.rst b/doc/guides/nics/szedata2.rst
index 96fed30..a34fffc 100644
--- a/doc/guides/nics/szedata2.rst
+++ b/doc/guides/nics/szedata2.rst
@@ -54,6 +54,15 @@ separately:
 Information about getting the dependencies can be found `here
 <http://www.netcope.com/en/company/community-support/dpdk-libsze2>`_.
 
+Versions of the packages
+~~~~~~~~~~~~~~~~~~~~~~~
+
+The minimum version of the provided packages:
+
+* for DPDK from 18.05: **4.4.1**
+
+* for DPDK up to 18.02 (including): **3.0.5**
+
 Configuration
 -------------
 
diff --git a/doc/guides/rel_notes/release_18_05.rst b/doc/guides/rel_notes/release_18_05.rst
index 3d18298..cce82ba 100644
--- a/doc/guides/rel_notes/release_18_05.rst
+++ b/doc/guides/rel_notes/release_18_05.rst
@@ -81,6 +81,10 @@ New Features
 * **Updated szedata2 PMD.**
 
   Added support for new NFB-200G2QL card.
+  New API was introduced in the libsze2 library which the szedata2 PMD depends
+  on thus the new version of the library was needed.
+  New versions of the packages are available and the minimum required version
+  is 4.4.1.
 
 * **Added support for Broadcom NetXtreme-S (BCM58800) family of controllers (aka Stingray)**
 
-- 
2.7.4

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [dpdk-dev] [PATCH 1/1] doc: update doc and release notes for szedata2 driver
  2018-04-27  8:57   ` [dpdk-dev] [PATCH 1/1] doc: update doc and release notes for szedata2 driver Matej Vido
@ 2018-04-27 13:11     ` Ferruh Yigit
  0 siblings, 0 replies; 23+ messages in thread
From: Ferruh Yigit @ 2018-04-27 13:11 UTC (permalink / raw)
  To: Matej Vido, dev; +Cc: remes

On 4/27/2018 9:57 AM, Matej Vido wrote:
> New version of the packages with dependencies for the szedata2
> driver is needed due to the new API of the libsze2 library which
> is used in the driver.
> The documentation and the release notes are updated to contain
> the information about the required versions.
> 
> Signed-off-by: Matej Vido <vido@cesnet.cz>
> Acked-by: Jan Remes <remes@netcope.com>

Applied to dpdk-next-net/master, thanks.

(Thanks for the update)

> @@ -54,6 +54,15 @@ separately:
>  Information about getting the dependencies can be found `here
>  <http://www.netcope.com/en/company/community-support/dpdk-libsze2>`_.
>  
> +Versions of the packages
> +~~~~~~~~~~~~~~~~~~~~~~~

Giving warning because of missing char [1], fixed while applying.

[1]
dpdk/doc/guides/nics/szedata2.rst:58: WARNING: Title underline too short.

Versions of the packages
~~~~~~~~~~~~~~~~~~~~~~~

^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2018-04-27 13:11 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-06 14:12 [dpdk-dev] [PATCH 0/3] net/szedata2: patch set for new card support Matej Vido
2018-04-06 14:12 ` [dpdk-dev] [PATCH 1/3] net/szedata2: do not affect Ethernet interfaces Matej Vido
2018-04-10 15:28   ` Ferruh Yigit
2018-04-11  9:36     ` Matej Vido
2018-04-11 10:51       ` Ferruh Yigit
2018-04-12  7:38         ` Matej Vido
2018-04-13  4:25           ` Yasufumi Ogawa
2018-04-13 10:39             ` Matej Vido
2018-04-06 14:12 ` [dpdk-dev] [PATCH 2/3] net/szedata2: add support for new NIC Matej Vido
2018-04-06 14:12 ` [dpdk-dev] [PATCH 3/3] net/szedata2: add kernel module dependency Matej Vido
2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 0/3] net/szedata2: patch set for new card support Matej Vido
2018-04-13 16:32   ` Ferruh Yigit
2018-04-27  8:57   ` [dpdk-dev] [PATCH 1/1] doc: update doc and release notes for szedata2 driver Matej Vido
2018-04-27 13:11     ` Ferruh Yigit
2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 1/3] net/szedata2: do not affect Ethernet interfaces Matej Vido
2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 2/3] net/szedata2: add support for new NIC Matej Vido
2018-04-12 16:11   ` Ferruh Yigit
2018-04-13  8:17     ` Jan Remeš
2018-04-13 14:26       ` Ferruh Yigit
2018-04-13 15:03         ` Jan Remeš
2018-04-13 16:29           ` Ferruh Yigit
2018-04-18  7:21             ` Matej Vido
2018-04-12  7:41 ` [dpdk-dev] [PATCH v2 3/3] net/szedata2: add kernel module dependency Matej Vido

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).