This new LSO offload version facilitates how firmware implements
this functionality and helps improving the performance.

Signed-off-by: Alejandro Lucero <alejandro.luc...@netronome.com>
---
 drivers/net/nfp/nfp_net.c      | 31 ++++++++++++++++++++++---------
 drivers/net/nfp/nfp_net_ctrl.h |  3 +++
 drivers/net/nfp/nfp_net_pmd.h  | 24 +++++++++++++++++-------
 3 files changed, 42 insertions(+), 16 deletions(-)

diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
index e030bbf..f9227b4 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -498,7 +498,7 @@ enum nfp_qcp_ptr {
        }
 
        if ((txmode->offloads & DEV_TX_OFFLOAD_TCP_TSO) &&
-           !(hw->cap & NFP_NET_CFG_CTRL_LSO)) {
+           !(hw->cap & NFP_NET_CFG_CTRL_LSO_ANY)) {
                PMD_INIT_LOG(INFO, "TSO TCP offload not supported");
                return -EINVAL;
        }
@@ -774,8 +774,12 @@ enum nfp_qcp_ptr {
                ctrl |= NFP_NET_CFG_CTRL_TXCSUM;
 
        /* LSO offload */
-       if (txmode->offloads & DEV_TX_OFFLOAD_TCP_TSO)
-               ctrl |= NFP_NET_CFG_CTRL_LSO;
+       if (txmode->offloads & DEV_TX_OFFLOAD_TCP_TSO) {
+               if (hw->cap & NFP_NET_CFG_CTRL_LSO)
+                       ctrl |= NFP_NET_CFG_CTRL_LSO;
+               else
+                       ctrl |= NFP_NET_CFG_CTRL_LSO2;
+       }
 
        /* RX gather */
        if (txmode->offloads & DEV_TX_OFFLOAD_MULTI_SEGS)
@@ -1278,7 +1282,7 @@ enum nfp_qcp_ptr {
                                             DEV_TX_OFFLOAD_UDP_CKSUM |
                                             DEV_TX_OFFLOAD_TCP_CKSUM;
 
-       if (hw->cap & NFP_NET_CFG_CTRL_LSO)
+       if (hw->cap & NFP_NET_CFG_CTRL_LSO_ANY)
                dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO;
 
        if (hw->cap & NFP_NET_CFG_CTRL_GATHER)
@@ -1847,7 +1851,7 @@ enum nfp_qcp_ptr {
        uint64_t ol_flags;
        struct nfp_net_hw *hw = txq->hw;
 
-       if (!(hw->cap & NFP_NET_CFG_CTRL_LSO))
+       if (!(hw->cap & NFP_NET_CFG_CTRL_LSO_ANY))
                goto clean_txd;
 
        ol_flags = mb->ol_flags;
@@ -1855,15 +1859,19 @@ enum nfp_qcp_ptr {
        if (!(ol_flags & PKT_TX_TCP_SEG))
                goto clean_txd;
 
-       txd->l4_offset = mb->l2_len + mb->l3_len + mb->l4_len;
-       txd->lso = rte_cpu_to_le_16(mb->tso_segsz);
+       txd->l3_offset = mb->l2_len;
+       txd->l4_offset = mb->l2_len + mb->l3_len;
+       txd->lso_hdrlen = mb->l2_len + mb->l3_len + mb->l4_len;
+       txd->mss = rte_cpu_to_le_16(mb->tso_segsz);
        txd->flags = PCIE_DESC_TX_LSO;
        return;
 
 clean_txd:
        txd->flags = 0;
+       txd->l3_offset = 0;
        txd->l4_offset = 0;
-       txd->lso = 0;
+       txd->lso_hdrlen = 0;
+       txd->mss = 0;
 }
 
 /* nfp_net_tx_cksum - Set TX CSUM offload flags in TX descriptor */
@@ -2935,6 +2943,10 @@ uint32_t nfp_net_txq_full(struct nfp_net_txq *txq)
        hw->max_mtu = nn_cfg_readl(hw, NFP_NET_CFG_MAX_MTU);
        hw->mtu = ETHER_MTU;
 
+       /* VLAN insertion is incompatible with LSOv2 */
+       if (hw->cap & NFP_NET_CFG_CTRL_LSO2)
+               hw->cap &= ~NFP_NET_CFG_CTRL_TXVLAN;
+
        if (NFD_CFG_MAJOR_VERSION_of(hw->ver) < 2)
                hw->rx_offset = NFP_NET_RX_OFFSET;
        else
@@ -2942,7 +2954,7 @@ uint32_t nfp_net_txq_full(struct nfp_net_txq *txq)
 
        PMD_INIT_LOG(INFO, "VER: %#x, Maximum supported MTU: %d",
                     hw->ver, hw->max_mtu);
-       PMD_INIT_LOG(INFO, "CAP: %#x, %s%s%s%s%s%s%s%s%s%s%s", hw->cap,
+       PMD_INIT_LOG(INFO, "CAP: %#x, %s%s%s%s%s%s%s%s%s%s%s%s", hw->cap,
                     hw->cap & NFP_NET_CFG_CTRL_PROMISC ? "PROMISC " : "",
                     hw->cap & NFP_NET_CFG_CTRL_L2BC    ? "L2BCFILT " : "",
                     hw->cap & NFP_NET_CFG_CTRL_L2MC    ? "L2MCFILT " : "",
@@ -2953,6 +2965,7 @@ uint32_t nfp_net_txq_full(struct nfp_net_txq *txq)
                     hw->cap & NFP_NET_CFG_CTRL_SCATTER ? "SCATTER " : "",
                     hw->cap & NFP_NET_CFG_CTRL_GATHER  ? "GATHER "  : "",
                     hw->cap & NFP_NET_CFG_CTRL_LSO     ? "TSO "     : "",
+                    hw->cap & NFP_NET_CFG_CTRL_LSO2     ? "TSOv2 "     : "",
                     hw->cap & NFP_NET_CFG_CTRL_RSS     ? "RSS "     : "");
 
        hw->ctrl = 0;
diff --git a/drivers/net/nfp/nfp_net_ctrl.h b/drivers/net/nfp/nfp_net_ctrl.h
index 1ebd99c..7d242d3 100644
--- a/drivers/net/nfp/nfp_net_ctrl.h
+++ b/drivers/net/nfp/nfp_net_ctrl.h
@@ -120,6 +120,7 @@
 #define   NFP_NET_CFG_CTRL_VXLAN          (0x1 << 24) /* Enable VXLAN */
 #define   NFP_NET_CFG_CTRL_NVGRE          (0x1 << 25) /* Enable NVGRE */
 #define   NFP_NET_CFG_CTRL_MSIX_TX_OFF    (0x1 << 26) /* Disable MSIX for TX */
+#define   NFP_NET_CFG_CTRL_LSO2           (0x1 << 28) /* LSO/TSO (version 2) */
 #define NFP_NET_CFG_UPDATE              0x0004
 #define   NFP_NET_CFG_UPDATE_GEN          (0x1 <<  0) /* General update */
 #define   NFP_NET_CFG_UPDATE_RING         (0x1 <<  1) /* Ring config change */
@@ -140,6 +141,8 @@
 #define NFP_NET_CFG_LSC                 0x0020
 #define NFP_NET_CFG_MACADDR             0x0024
 
+#define NFP_NET_CFG_CTRL_LSO_ANY (NFP_NET_CFG_CTRL_LSO | NFP_NET_CFG_CTRL_LSO2)
+
 /*
  * Read-only words (0x0030 - 0x0050):
  * @NFP_NET_CFG_VERSION:     Firmware version number
diff --git a/drivers/net/nfp/nfp_net_pmd.h b/drivers/net/nfp/nfp_net_pmd.h
index 3c80702..c1b044e 100644
--- a/drivers/net/nfp/nfp_net_pmd.h
+++ b/drivers/net/nfp/nfp_net_pmd.h
@@ -185,18 +185,28 @@ static inline void nn_writeq(uint64_t val, volatile void 
*addr)
 struct nfp_net_tx_desc {
        union {
                struct {
-                       uint8_t dma_addr_hi;   /* High bits of host buf address 
*/
+                       uint8_t dma_addr_hi; /* High bits of host buf address */
                        __le16 dma_len;     /* Length to DMA for this desc */
-                       uint8_t offset_eop;    /* Offset in buf where pkt 
starts +
+                       uint8_t offset_eop; /* Offset in buf where pkt starts +
                                             * highest bit is eop flag.
                                             */
                        __le32 dma_addr_lo; /* Low 32bit of host buf addr */
 
-                       __le16 lso;         /* MSS to be used for LSO */
-                       uint8_t l4_offset;     /* LSO, where the L4 data starts 
*/
-                       uint8_t flags;         /* TX Flags, see @PCIE_DESC_TX_* 
*/
-
-                       __le16 vlan;        /* VLAN tag to add if indicated */
+                       __le16 mss;         /* MSS to be used for LSO */
+                       uint8_t lso_hdrlen; /* LSO, where the data starts */
+                       uint8_t flags;      /* TX Flags, see @PCIE_DESC_TX_* */
+
+                       union {
+                               struct {
+                                       /*
+                                        * L3 and L4 header offsets required
+                                        * for TSOv2
+                                        */
+                                       uint8_t l3_offset;
+                                       uint8_t l4_offset;
+                               };
+                               __le16 vlan; /* VLAN tag to add if indicated */
+                       };
                        __le16 data_len;    /* Length of frame + meta data */
                } __attribute__((__packed__));
                __le32 vals[4];
-- 
1.9.1

Reply via email to