New upstream version 16.11.8 56/14556/1 upstream/16.11.8
authorLuca Boccassi <luca.boccassi@gmail.com>
Wed, 29 Aug 2018 17:59:44 +0000 (18:59 +0100)
committerLuca Boccassi <luca.boccassi@gmail.com>
Wed, 29 Aug 2018 18:00:12 +0000 (19:00 +0100)
Change-Id: I3d0a7da377a86fe41f3516c5a3c458746abc33fb
Signed-off-by: Luca Boccassi <luca.boccassi@gmail.com>
57 files changed:
MAINTAINERS
app/test-pmd/testpmd.c
app/test/test_cryptodev.c
app/test/test_eal_flags.c
app/test/test_hash_multiwriter.c
app/test/test_link_bonding_rssconf.c
app/test/test_pmd_ring.c
app/test/virtual_pmd.c
doc/guides/rel_notes/release_16_11.rst
doc/guides/testpmd_app_ug/testpmd_funcs.rst
drivers/crypto/qat/qat_crypto.c
drivers/net/bnx2x/bnx2x.c
drivers/net/bnxt/bnxt_ethdev.c
drivers/net/bnxt/bnxt_hwrm.c
drivers/net/bnxt/bnxt_txr.c
drivers/net/bnxt/bnxt_txr.h
drivers/net/bnxt/bnxt_vnic.c
drivers/net/bnxt/bnxt_vnic.h
drivers/net/bonding/rte_eth_bond_api.c
drivers/net/bonding/rte_eth_bond_pmd.c
drivers/net/cxgbe/base/t4_hw.c
drivers/net/ena/base/ena_plat_dpdk.h
drivers/net/ena/ena_ethdev.c
drivers/net/enic/enic_main.c
drivers/net/i40e/i40e_ethdev.c
drivers/net/i40e/i40e_ethdev_vf.c
drivers/net/ixgbe/ixgbe_ethdev.h
drivers/net/ixgbe/ixgbe_fdir.c
drivers/net/nfp/nfp_net.c
drivers/net/null/rte_eth_null.c
drivers/net/pcap/rte_eth_pcap.c
drivers/net/qede/base/ecore_int.c
drivers/net/qede/qede_ethdev.c
drivers/net/thunderx/nicvf_ethdev.c
drivers/net/thunderx/nicvf_rxtx.c
examples/exception_path/main.c
examples/ipsec-secgw/ipsec-secgw.c
examples/l3fwd/l3fwd_em.c
examples/l3fwd/l3fwd_lpm.c
examples/multi_process/Makefile
lib/librte_eal/common/include/rte_version.h
lib/librte_eal/linuxapp/eal/eal_interrupts.c
lib/librte_eal/linuxapp/eal/eal_thread.c
lib/librte_eal/linuxapp/kni/ethtool/igb/igb_ethtool.c
lib/librte_eal/linuxapp/kni/ethtool/igb/kcompat.h
lib/librte_ether/rte_ethdev.c
lib/librte_ether/rte_ethdev.h
lib/librte_hash/rte_cuckoo_hash.c
lib/librte_hash/rte_cuckoo_hash_x86.h
lib/librte_hash/rte_hash.h
lib/librte_kni/rte_kni.c
lib/librte_mbuf/rte_mbuf_ptype.h
lib/librte_net/rte_ip.h
lib/librte_sched/rte_bitmap.h
lib/librte_vhost/virtio_net.c
mk/rte.sdkinstall.mk
pkg/dpdk.spec

index a380b5d..1775e3f 100644 (file)
@@ -140,13 +140,13 @@ F: doc/guides/sample_app_ug/multi_process.rst
 
 ARM v7
 M: Jan Viktorin <viktorin@rehivetech.com>
-M: Jianbo Liu <jianbo.liu@linaro.org>
+M: Gavin Hu <gavin.hu@arm.com>
 F: lib/librte_eal/common/arch/arm/
 F: lib/librte_eal/common/include/arch/arm/
 
 ARM v8
 M: Jerin Jacob <jerin.jacob@caviumnetworks.com>
-M: Jianbo Liu <jianbo.liu@linaro.org>
+M: Gavin Hu <gavin.hu@arm.com>
 F: lib/librte_eal/common/include/arch/arm/*_64.h
 F: lib/librte_acl/acl_run_neon.*
 F: lib/librte_lpm/rte_lpm_neon.h
@@ -335,12 +335,14 @@ M: Jing Chen <jing.d.chen@intel.com>
 F: drivers/net/fm10k/
 
 Mellanox mlx4
-M: Adrien Mazarguil <adrien.mazarguil@6wind.com>
+M: Matan Azrad <matan@mellanox.com>
+M: Shahaf Shuler <shahafs@mellanox.com>
 F: drivers/net/mlx4/
 F: doc/guides/nics/mlx4.rst
 
 Mellanox mlx5
-M: Adrien Mazarguil <adrien.mazarguil@6wind.com>
+M: Shahaf Shuler <shahafs@mellanox.com>
+M: Yongseok Koh <yskoh@mellanox.com>
 F: drivers/net/mlx5/
 F: doc/guides/nics/mlx5.rst
 
index 4512ba9..e48cf8a 100644 (file)
@@ -291,7 +291,7 @@ struct rte_fdir_conf fdir_conf = {
        .pballoc = RTE_FDIR_PBALLOC_64K,
        .status = RTE_FDIR_REPORT_STATUS,
        .mask = {
-               .vlan_tci_mask = 0x0,
+               .vlan_tci_mask = 0xFFEF,
                .ipv4_mask     = {
                        .src_ip = 0xFFFFFFFF,
                        .dst_ip = 0xFFFFFFFF,
@@ -1905,12 +1905,14 @@ const uint16_t vlan_tags[] = {
 };
 
 static  int
-get_eth_dcb_conf(struct rte_eth_conf *eth_conf,
+get_eth_dcb_conf(portid_t pid, struct rte_eth_conf *eth_conf,
                 enum dcb_mode_enable dcb_mode,
                 enum rte_eth_nb_tcs num_tcs,
                 uint8_t pfc_en)
 {
        uint8_t i;
+       int32_t rc;
+       struct rte_eth_rss_conf rss_conf;
 
        /*
         * Builds up the correct configuration for dcb+vt based on the vlan tags array
@@ -1950,6 +1952,10 @@ get_eth_dcb_conf(struct rte_eth_conf *eth_conf,
                struct rte_eth_dcb_tx_conf *tx_conf =
                                &eth_conf->tx_adv_conf.dcb_tx_conf;
 
+               rc = rte_eth_dev_rss_hash_conf_get(pid, &rss_conf);
+               if (rc != 0)
+                       return rc;
+
                rx_conf->nb_tcs = num_tcs;
                tx_conf->nb_tcs = num_tcs;
 
@@ -1957,8 +1963,9 @@ get_eth_dcb_conf(struct rte_eth_conf *eth_conf,
                        rx_conf->dcb_tc[i] = i % num_tcs;
                        tx_conf->dcb_tc[i] = i % num_tcs;
                }
+
                eth_conf->rxmode.mq_mode = ETH_MQ_RX_DCB_RSS;
-               eth_conf->rx_adv_conf.rss_conf.rss_hf = rss_hf;
+               eth_conf->rx_adv_conf.rss_conf = rss_conf;
                eth_conf->txmode.mq_mode = ETH_MQ_TX_DCB;
        }
 
@@ -1989,7 +1996,7 @@ init_port_dcb_config(portid_t pid,
        dcb_config = 1;
 
        /*set configuration of DCB in vt mode and DCB in non-vt mode*/
-       retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);
+       retval = get_eth_dcb_conf(pid, &port_conf, dcb_mode, num_tcs, pfc_en);
        if (retval < 0)
                return retval;
        port_conf.rxmode.hw_vlan_filter = 1;
index 24c7296..a1f8717 100644 (file)
@@ -516,7 +516,7 @@ test_device_configure_invalid_dev_id(void)
        dev_id = ts_params->valid_devs[ts_params->valid_dev_count - 1];
 
        /* Stop the device in case it's started so it can be configured */
-       rte_cryptodev_stop(ts_params->valid_devs[dev_id]);
+       rte_cryptodev_stop(dev_id);
 
        TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
                        "Failed test for rte_cryptodev_configure: "
index 15248ea..b661322 100644 (file)
@@ -409,17 +409,17 @@ test_invalid_vdev_flag(void)
 #endif
 
        /* Test with invalid vdev option */
-       const char *vdevinval[] = {prgname, prefix, "-n", "1",
+       const char *vdevinval[] = {prgname, prefix, no_huge, "-n", "1",
                                "-c", "1", vdev, "eth_dummy"};
 
        /* Test with valid vdev option */
-       const char *vdevval1[] = {prgname, prefix, "-n", "1",
+       const char *vdevval1[] = {prgname, prefix, no_huge, "-n", "1",
        "-c", "1", vdev, "net_ring0"};
 
-       const char *vdevval2[] = {prgname, prefix, "-n", "1",
+       const char *vdevval2[] = {prgname, prefix, no_huge, "-n", "1",
        "-c", "1", vdev, "net_ring0,args=test"};
 
-       const char *vdevval3[] = {prgname, prefix, "-n", "1",
+       const char *vdevval3[] = {prgname, prefix, no_huge, "-n", "1",
        "-c", "1", vdev, "net_ring0,nodeaction=r1:0:CREATE"};
 
        if (launch_proc(vdevinval) == 0) {
@@ -948,13 +948,10 @@ test_misc_flags(void)
        const char *argv4[] = {prgname, prefix, mp_flag, "-c", "1", "--syslog"};
        /* With invalid --syslog */
        const char *argv5[] = {prgname, prefix, mp_flag, "-c", "1", "--syslog", "error"};
-       /* With no-sh-conf */
+       /* With no-sh-conf, also use no-huge to ensure this test runs on BSD */
        const char *argv6[] = {prgname, "-c", "1", "-n", "2", "-m", DEFAULT_MEM_SIZE,
-                       no_shconf, nosh_prefix };
+                       no_shconf, nosh_prefix, no_huge};
 
-#ifdef RTE_EXEC_ENV_BSDAPP
-       return 0;
-#endif
        /* With --huge-dir */
        const char *argv7[] = {prgname, "-c", "1", "-n", "2", "-m", DEFAULT_MEM_SIZE,
                        "--file-prefix=hugedir", "--huge-dir", hugepath};
@@ -988,6 +985,7 @@ test_misc_flags(void)
        const char *argv15[] = {prgname, "--file-prefix=intr",
                        "-c", "1", "-n", "2", "--vfio-intr=invalid"};
 
+       /* run all tests also applicable to FreeBSD first */
 
        if (launch_proc(argv0) == 0) {
                printf("Error - process ran ok with invalid flag\n");
@@ -1001,6 +999,16 @@ test_misc_flags(void)
                printf("Error - process did not run ok with -v flag\n");
                return -1;
        }
+       if (launch_proc(argv6) != 0) {
+               printf("Error - process did not run ok with --no-shconf flag\n");
+               return -1;
+       }
+
+#ifdef RTE_EXEC_ENV_BSDAPP
+       /* no more tests to be done on FreeBSD */
+       return 0;
+#endif
+
        if (launch_proc(argv3) != 0) {
                printf("Error - process did not run ok with --syslog flag\n");
                return -1;
@@ -1013,13 +1021,6 @@ test_misc_flags(void)
                printf("Error - process run ok with invalid --syslog flag\n");
                return -1;
        }
-       if (launch_proc(argv6) != 0) {
-               printf("Error - process did not run ok with --no-shconf flag\n");
-               return -1;
-       }
-#ifdef RTE_EXEC_ENV_BSDAPP
-       return 0;
-#endif
        if (launch_proc(argv7) != 0) {
                printf("Error - process did not run ok with --huge-dir flag\n");
                return -1;
index 4dcbd9d..0e9ac71 100644 (file)
@@ -76,18 +76,29 @@ static rte_atomic64_t ginsertions;
 static int use_htm;
 
 static int
-test_hash_multiwriter_worker(__attribute__((unused)) void *arg)
+test_hash_multiwriter_worker(void *arg)
 {
        uint64_t i, offset;
+       uint16_t pos_core;
        uint32_t lcore_id = rte_lcore_id();
        uint64_t begin, cycles;
+       uint16_t *enabled_core_ids = (uint16_t *)arg;
 
-       offset = (lcore_id - rte_get_master_lcore())
-               * tbl_multiwriter_test_params.nb_tsx_insertion;
+       for (pos_core = 0; pos_core < rte_lcore_count(); pos_core++) {
+               if (enabled_core_ids[pos_core] == lcore_id)
+                       break;
+       }
+
+       /*
+        * Calculate offset for entries based on the position of the
+        * logical core, from the master core (not counting not enabled cores)
+        */
+       offset = pos_core * tbl_multiwriter_test_params.nb_tsx_insertion;
 
        printf("Core #%d inserting %d: %'"PRId64" - %'"PRId64"\n",
               lcore_id, tbl_multiwriter_test_params.nb_tsx_insertion,
-              offset, offset + tbl_multiwriter_test_params.nb_tsx_insertion);
+              offset,
+              offset + tbl_multiwriter_test_params.nb_tsx_insertion - 1);
 
        begin = rte_rdtsc_precise();
 
@@ -116,6 +127,8 @@ test_hash_multiwriter(void)
 {
        unsigned int i, rounded_nb_total_tsx_insertion;
        static unsigned calledCount = 1;
+       uint16_t enabled_core_ids[RTE_MAX_LCORE];
+       uint16_t core_id;
 
        uint32_t *keys;
        uint32_t *found;
@@ -168,16 +181,17 @@ test_hash_multiwriter(void)
                goto err1;
        }
 
+       for (i = 0; i < nb_entries; i++)
+               keys[i] = i;
+
+       tbl_multiwriter_test_params.keys = keys;
+
        found = rte_zmalloc(NULL, sizeof(uint32_t) * nb_entries, 0);
        if (found == NULL) {
                printf("RTE_ZMALLOC failed\n");
                goto err2;
        }
 
-       for (i = 0; i < nb_entries; i++)
-               keys[i] = i;
-
-       tbl_multiwriter_test_params.keys = keys;
        tbl_multiwriter_test_params.found = found;
 
        rte_atomic64_init(&gcycles);
@@ -186,9 +200,27 @@ test_hash_multiwriter(void)
        rte_atomic64_init(&ginsertions);
        rte_atomic64_clear(&ginsertions);
 
+       /* Get list of enabled cores */
+       i = 0;
+       for (core_id = 0; core_id < RTE_MAX_LCORE; core_id++) {
+               if (i == rte_lcore_count())
+                       break;
+
+               if (rte_lcore_is_enabled(core_id)) {
+                       enabled_core_ids[i] = core_id;
+                       i++;
+               }
+       }
+
+       if (i != rte_lcore_count()) {
+               printf("Number of enabled cores in list is different from "
+                               "number given by rte_lcore_count()\n");
+               goto err3;
+       }
+
        /* Fire all threads. */
        rte_eal_mp_remote_launch(test_hash_multiwriter_worker,
-                                NULL, CALL_MASTER);
+                                enabled_core_ids, CALL_MASTER);
        rte_eal_mp_wait_lcore();
 
        while (rte_hash_iterate(handle, &next_key, &next_data, &iter) >= 0) {
index 23052a2..e7a5650 100644 (file)
@@ -533,6 +533,7 @@ test_setup(void)
        int port_id;
        char name[256];
        struct slave_conf *port;
+       struct ether_addr mac_addr = { .addr_bytes = {0} };
 
        if (test_params.mbuf_pool == NULL) {
 
@@ -565,6 +566,10 @@ test_setup(void)
                TEST_ASSERT_SUCCESS(retval, "Failed to configure virtual ethdev %s\n",
                                name);
 
+               /* assign a non-zero MAC */
+               mac_addr.addr_bytes[5] = 0x10 + port->port_id;
+               rte_eth_dev_default_mac_addr_set(port->port_id, &mac_addr);
+
                rte_eth_dev_info_get(port->port_id, &port->dev_info);
        }
 
index 2cdf60d..8d5813c 100644 (file)
@@ -247,6 +247,8 @@ test_pmd_ring_pair_create_attach(int portd, int porte)
        struct rte_mbuf buf, *pbuf = &buf;
        struct rte_eth_conf null_conf;
 
+       memset(&null_conf, 0, sizeof(struct rte_eth_conf));
+
        if ((rte_eth_dev_configure(portd, 1, 1, &null_conf) < 0)
                || (rte_eth_dev_configure(porte, 1, 1, &null_conf) < 0)) {
                printf("Configure failed for port\n");
index 65b44c6..02ac485 100644 (file)
@@ -241,6 +241,11 @@ static void
 virtual_ethdev_promiscuous_mode_disable(struct rte_eth_dev *dev __rte_unused)
 {}
 
+static void
+virtual_ethdev_mac_address_set(__rte_unused struct rte_eth_dev *dev,
+                              __rte_unused struct ether_addr *addr)
+{
+}
 
 static const struct eth_dev_ops virtual_ethdev_default_dev_ops = {
        .dev_configure = virtual_ethdev_configure_success,
@@ -253,13 +258,13 @@ static const struct eth_dev_ops virtual_ethdev_default_dev_ops = {
        .rx_queue_release = virtual_ethdev_rx_queue_release,
        .tx_queue_release = virtual_ethdev_tx_queue_release,
        .link_update = virtual_ethdev_link_update_success,
+       .mac_addr_set = virtual_ethdev_mac_address_set,
        .stats_get = virtual_ethdev_stats_get,
        .stats_reset = virtual_ethdev_stats_reset,
        .promiscuous_enable = virtual_ethdev_promiscuous_mode_enable,
        .promiscuous_disable = virtual_ethdev_promiscuous_mode_disable
 };
 
-
 void
 virtual_ethdev_start_fn_set_success(uint8_t port_id, uint8_t success)
 {
index dc52bf4..012cf73 100644 (file)
@@ -1287,3 +1287,79 @@ Fixes in 16.11 LTS Release
 * vhost: fix realloc failure
 * vhost: fix typo in comment
 * vhost: improve dirty pages logging performance
+
+16.11.8
+~~~~~~~
+
+* app/testpmd: fix DCB config
+* app/testpmd: fix VLAN TCI mask set error for FDIR
+* crypto/qat: fix checks for 3GPP algo bit params
+* doc: fix bonding command in testpmd
+* eal: fix bitmap documentation
+* eal: fix return codes on thread naming failure
+* eal/linux: fix invalid syntax in interrupts
+* ethdev: check queue stats mapping input arguments
+* ethdev: fix a doxygen comment for port allocation
+* ethdev: fix queue statistics mapping documentation
+* examples/exception_path: fix out-of-bounds read
+* examples/ipsec-secgw: fix bypass rule processing
+* examples/ipsec-secgw: fix IPv4 checksum at Tx
+* examples/l3fwd: remove useless include
+* examples/multi_process: build l2fwd_fork app
+* hash: fix a multi-writer race condition
+* hash: fix doxygen of return values
+* hash: fix key slot size accuracy
+* hash: fix multiwriter lock memory allocation
+* kni: fix build on RHEL 7.5
+* kni: fix build with gcc 8.1
+* kni: fix crash with null name
+* maintainers: claim maintainership for ARM v7 and v8
+* maintainers: update for Mellanox PMDs
+* mbuf: fix typo in IPv6 macro comment
+* mk: fix permissions when using make install
+* net/bnx2x: fix FW command timeout during stop
+* net/bnxt: check access denied for HWRM commands
+* net/bnxt: fix close operation
+* net/bnxt: fix HW Tx checksum offload check
+* net/bnxt: fix incorrect IO address handling in Tx
+* net/bnxt: fix RETA size
+* net/bnxt: fix Rx ring count limitation
+* net/bnxt: fix Tx with multiple mbuf
+* net/bonding: do not clear active slave count
+* net/bonding: fix MAC address reset
+* net/bonding: fix race condition
+* net/cxgbe/base: update flash part information
+* net/cxgbe: fix init failure due to new flash parts
+* net/ena: change memory type
+* net/ena: check pointer before memset
+* net/ena: fix GENMASK_ULL macro
+* net/ena: fix SIGFPE with 0 Rx queue
+* net/ena: set link speed as none
+* net/enic: do not overwrite admin Tx queue limit
+* net/i40e: do not reset device info data
+* net/i40e: fix check of flow director programming status
+* net/i40e: fix link speed
+* net/i40e: fix shifts of 32-bit value
+* net/i40e: revert fix of flow director check
+* net/i40e: workaround performance degradation
+* net/ixgbe: fix mask bits register set error for FDIR
+* net/ixgbe: fix tunnel id format error for FDIR
+* net/ixgbe: fix tunnel type set error for FDIR
+* net/nfp: fix field initialization in Tx descriptor
+* net/null: add MAC address setting fake operation
+* net/pcap: fix multiple queues
+* net/qede/base: fix GRC attention callback
+* net/qede: fix default extended VLAN offload config
+* net/qede: fix MAC address removal failure message
+* net: rename u16 to fix shadowed declaration
+* net/thunderx: avoid sq door bell write on zero packet
+* net/thunderx: fix build with gcc optimization on
+* Revert "net/i40e: fix packet count for PF"
+* test/bonding: assign non-zero MAC to null devices
+* test/crypto: fix device id when stopping port
+* test: fix EAL flags autotest on FreeBSD
+* test: fix uninitialized port configuration
+* test/hash: fix multiwriter with non consecutive cores
+* test/hash: fix potential memory leak
+* test/virtual_pmd: add MAC address setting fake op
+* vhost: fix missing increment of log cache count
index 70d2e4d..a906974 100644 (file)
@@ -1439,7 +1439,7 @@ Create a new bonding device::
 
 For example, to create a bonded device in mode 1 on socket 0::
 
-   testpmd> create bonded 1 0
+   testpmd> create bonded device 1 0
    created new bonded device (port X)
 
 add bonding slave
index a941679..65e11fd 100644 (file)
@@ -1004,9 +1004,8 @@ qat_write_hw_desc_entry(struct rte_crypto_op *op, uint8_t *out_msg)
                        ctx->qat_cipher_alg == ICP_QAT_HW_CIPHER_ALGO_KASUMI) {
 
                        if (unlikely(
-                               (cipher_param->cipher_length % BYTE_LENGTH != 0)
-                                || (cipher_param->cipher_offset
-                                                       % BYTE_LENGTH != 0))) {
+                           (op->sym->cipher.data.length % BYTE_LENGTH != 0) ||
+                           (op->sym->cipher.data.offset % BYTE_LENGTH != 0))) {
                                PMD_DRV_LOG(ERR,
                  "SNOW3G/KASUMI in QAT PMD only supports byte aligned values");
                                op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
@@ -1047,8 +1046,9 @@ qat_write_hw_desc_entry(struct rte_crypto_op *op, uint8_t *out_msg)
 
                if (ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_SNOW_3G_UIA2 ||
                        ctx->qat_hash_alg == ICP_QAT_HW_AUTH_ALGO_KASUMI_F9) {
-                       if (unlikely((auth_param->auth_off % BYTE_LENGTH != 0)
-                               || (auth_param->auth_len % BYTE_LENGTH != 0))) {
+                       if (unlikely(
+                           (op->sym->auth.data.offset % BYTE_LENGTH != 0) ||
+                           (op->sym->auth.data.length % BYTE_LENGTH != 0))) {
                                PMD_DRV_LOG(ERR,
                "For SNOW3G/KASUMI, QAT PMD only supports byte aligned values");
                                op->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
index c2842e3..f1de336 100644 (file)
@@ -4492,6 +4492,8 @@ static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp, int scan_fp)
        struct bnx2x_softc *sc = fp->sc;
        uint8_t more_rx = FALSE;
 
+       PMD_DRV_LOG(DEBUG, "---> FP TASK QUEUE (%d) <--", fp->index);
+
        /* update the fastpath index */
        bnx2x_update_fp_sb_idx(fp);
 
@@ -4508,7 +4510,7 @@ static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp, int scan_fp)
        }
 
        bnx2x_ack_sb(sc, fp->igu_sb_id, USTORM_ID,
-                  le16toh(fp->fp_hc_idx), IGU_INT_DISABLE, 1);
+                  le16toh(fp->fp_hc_idx), IGU_INT_ENABLE, 1);
 }
 
 /*
index 3a0b1ce..44bf6ba 100644 (file)
@@ -137,6 +137,7 @@ static struct rte_pci_id bnxt_pci_id_map[] = {
        ETH_RSS_NONFRAG_IPV6_UDP)
 
 static void bnxt_print_link_info(struct rte_eth_dev *eth_dev);
+static int bnxt_dev_uninit(struct rte_eth_dev *eth_dev);
 
 /***********************/
 
@@ -222,6 +223,17 @@ static int bnxt_init_chip(struct bnxt *bp)
        /* VNIC configuration */
        for (i = 0; i < bp->nr_vnics; i++) {
                struct bnxt_vnic_info *vnic = &bp->vnic_info[i];
+               uint32_t size = sizeof(*vnic->fw_grp_ids) * bp->max_ring_grps;
+
+               vnic->fw_grp_ids = rte_zmalloc("vnic_fw_grp_ids", size, 0);
+               if (!vnic->fw_grp_ids) {
+                       RTE_LOG(ERR, PMD,
+                                   "Failed to alloc %d bytes for group ids\n",
+                                   size);
+                       rc = -ENOMEM;
+                       goto err_out;
+               }
+               memset(vnic->fw_grp_ids, -1, size);
 
                rc = bnxt_hwrm_vnic_alloc(bp, vnic);
                if (rc) {
@@ -347,12 +359,12 @@ static void bnxt_dev_info_get_op(struct rte_eth_dev *eth_dev,
                dev_info->max_rx_queues = bp->pf.max_rx_rings;
                dev_info->max_tx_queues = bp->pf.max_tx_rings;
                dev_info->max_vfs = bp->pf.active_vfs;
-               dev_info->reta_size = bp->pf.max_rsscos_ctx;
+               dev_info->reta_size = HW_HASH_INDEX_SIZE;
                max_vnics = bp->pf.max_vnics;
        } else {
                dev_info->max_rx_queues = bp->vf.max_rx_rings;
                dev_info->max_tx_queues = bp->vf.max_tx_rings;
-               dev_info->reta_size = bp->vf.max_rsscos_ctx;
+               dev_info->reta_size = HW_HASH_INDEX_SIZE;
                max_vnics = bp->vf.max_vnics;
        }
 
@@ -575,6 +587,8 @@ static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
                rte_free(bp->grp_info);
                bp->grp_info = NULL;
        }
+
+       bnxt_dev_uninit(eth_dev);
 }
 
 static void bnxt_mac_addr_remove_op(struct rte_eth_dev *eth_dev,
index d790b99..d65e28b 100644 (file)
@@ -134,11 +134,19 @@ static int bnxt_hwrm_send_message(struct bnxt *bp, void *msg, uint32_t msg_len)
                if (rc) { \
                        RTE_LOG(ERR, PMD, "%s failed rc:%d\n", \
                                __func__, rc); \
+                       if (rc == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) \
+                               rc = -EACCES; \
+                       else if (rc > 0) \
+                               rc = -EINVAL; \
                        return rc; \
                } \
                if (resp->error_code) { \
                        rc = rte_le_to_cpu_16(resp->error_code); \
                        RTE_LOG(ERR, PMD, "%s error %d\n", __func__, rc); \
+                       if (rc == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) \
+                               rc = -EACCES; \
+                       else if (rc > 0) \
+                               rc = -EINVAL; \
                        return rc; \
                } \
        }
@@ -837,7 +845,7 @@ int bnxt_hwrm_vnic_alloc(struct bnxt *bp, struct bnxt_vnic_info *vnic)
        struct hwrm_vnic_alloc_output *resp = bp->hwrm_cmd_resp_addr;
 
        /* map ring groups to this vnic */
-       for (i = vnic->start_grp_id, j = 0; i <= vnic->end_grp_id; i++, j++) {
+       for (i = vnic->start_grp_id, j = 0; i < vnic->end_grp_id; i++, j++) {
                if (bp->grp_info[i].fw_grp_id == (uint16_t)HWRM_NA_SIGNATURE) {
                        RTE_LOG(ERR, PMD,
                                "Not enough ring groups avail:%x req:%x\n", j,
@@ -1271,6 +1279,8 @@ void bnxt_free_all_hwrm_resources(struct bnxt *bp)
 
                bnxt_hwrm_vnic_ctx_free(bp, vnic);
                bnxt_hwrm_vnic_free(bp, vnic);
+
+               rte_free(vnic->fw_grp_ids);
        }
        /* Ring resources */
        bnxt_free_all_hwrm_rings(bp);
index 9cd44a9..ff24e23 100644 (file)
@@ -161,7 +161,9 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
 
        if (tx_pkt->ol_flags & (PKT_TX_TCP_SEG | PKT_TX_TCP_CKSUM |
                                PKT_TX_UDP_CKSUM | PKT_TX_IP_CKSUM |
-                               PKT_TX_VLAN_PKT | PKT_TX_OUTER_IP_CKSUM))
+                               PKT_TX_VLAN_PKT | PKT_TX_OUTER_IP_CKSUM |
+                               PKT_TX_TUNNEL_GRE | PKT_TX_TUNNEL_VXLAN |
+                               PKT_TX_TUNNEL_GENEVE))
                long_bd = true;
 
        tx_buf = &txr->tx_buf_ring[txr->tx_prod];
@@ -177,11 +179,11 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
        txbd->opaque = txr->tx_prod;
        txbd->flags_type = tx_buf->nr_bds << TX_BD_LONG_FLAGS_BD_CNT_SFT;
        txbd->len = tx_pkt->data_len;
-       if (txbd->len >= 2014)
+       if (tx_pkt->pkt_len >= 2014)
                txbd->flags_type |= TX_BD_LONG_FLAGS_LHINT_GTE2K;
        else
-               txbd->flags_type |= lhint_arr[txbd->len >> 9];
-       txbd->addr = rte_cpu_to_le_32(RTE_MBUF_DATA_DMA_ADDR(tx_buf->mbuf));
+               txbd->flags_type |= lhint_arr[tx_pkt->pkt_len >> 9];
+       txbd->addr = rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR(tx_buf->mbuf));
 
        if (long_bd) {
                txbd->flags_type |= TX_BD_LONG_TYPE_TX_BD_LONG;
@@ -221,16 +223,46 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
                        /* Outer IP, Inner IP, Inner TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_FLG_TIP_IP_TCP_UDP_CHKSUM;
                        txbd1->mss = 0;
+               } else if ((tx_pkt->ol_flags & PKT_TX_OIP_IIP_TCP_CKSUM) ==
+                          PKT_TX_OIP_IIP_TCP_CKSUM) {
+                       /* Outer IP, Inner IP, Inner TCP/UDP CSO */
+                       txbd1->lflags |= TX_BD_FLG_TIP_IP_TCP_UDP_CHKSUM;
+                       txbd1->mss = 0;
+               } else if ((tx_pkt->ol_flags & PKT_TX_OIP_IIP_UDP_CKSUM) ==
+                          PKT_TX_OIP_IIP_UDP_CKSUM) {
+                       /* Outer IP, Inner IP, Inner TCP/UDP CSO */
+                       txbd1->lflags |= TX_BD_FLG_TIP_IP_TCP_UDP_CHKSUM;
+                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_IIP_TCP_UDP_CKSUM) ==
                           PKT_TX_IIP_TCP_UDP_CKSUM) {
                        /* (Inner) IP, (Inner) TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_FLG_IP_TCP_UDP_CHKSUM;
                        txbd1->mss = 0;
+               } else if ((tx_pkt->ol_flags & PKT_TX_IIP_UDP_CKSUM) ==
+                          PKT_TX_IIP_UDP_CKSUM) {
+                       /* (Inner) IP, (Inner) TCP/UDP CSO */
+                       txbd1->lflags |= TX_BD_FLG_IP_TCP_UDP_CHKSUM;
+                       txbd1->mss = 0;
+               } else if ((tx_pkt->ol_flags & PKT_TX_IIP_TCP_CKSUM) ==
+                          PKT_TX_IIP_TCP_CKSUM) {
+                       /* (Inner) IP, (Inner) TCP/UDP CSO */
+                       txbd1->lflags |= TX_BD_FLG_IP_TCP_UDP_CHKSUM;
+                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_OIP_TCP_UDP_CKSUM) ==
                           PKT_TX_OIP_TCP_UDP_CKSUM) {
                        /* Outer IP, (Inner) TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_FLG_TIP_TCP_UDP_CHKSUM;
                        txbd1->mss = 0;
+               } else if ((tx_pkt->ol_flags & PKT_TX_OIP_UDP_CKSUM) ==
+                          PKT_TX_OIP_UDP_CKSUM) {
+                       /* Outer IP, (Inner) TCP/UDP CSO */
+                       txbd1->lflags |= TX_BD_FLG_TIP_TCP_UDP_CHKSUM;
+                       txbd1->mss = 0;
+               } else if ((tx_pkt->ol_flags & PKT_TX_OIP_TCP_CKSUM) ==
+                          PKT_TX_OIP_TCP_CKSUM) {
+                       /* Outer IP, (Inner) TCP/UDP CSO */
+                       txbd1->lflags |= TX_BD_FLG_TIP_TCP_UDP_CHKSUM;
+                       txbd1->mss = 0;
                } else if ((tx_pkt->ol_flags & PKT_TX_OIP_IIP_CKSUM) ==
                           PKT_TX_OIP_IIP_CKSUM) {
                        /* Outer IP, Inner IP CSO */
@@ -241,11 +273,23 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
                        /* TCP/UDP CSO */
                        txbd1->lflags |= TX_BD_LONG_LFLAGS_TCP_UDP_CHKSUM;
                        txbd1->mss = 0;
-               } else if (tx_pkt->ol_flags & PKT_TX_IP_CKSUM) {
+               } else if ((tx_pkt->ol_flags & PKT_TX_TCP_CKSUM) ==
+                          PKT_TX_TCP_CKSUM) {
+                       /* TCP/UDP CSO */
+                       txbd1->lflags |= TX_BD_LONG_LFLAGS_TCP_UDP_CHKSUM;
+                       txbd1->mss = 0;
+               } else if ((tx_pkt->ol_flags & PKT_TX_UDP_CKSUM) ==
+                          PKT_TX_UDP_CKSUM) {
+                       /* TCP/UDP CSO */
+                       txbd1->lflags |= TX_BD_LONG_LFLAGS_TCP_UDP_CHKSUM;
+                       txbd1->mss = 0;
+               } else if ((tx_pkt->ol_flags & PKT_TX_IP_CKSUM) ==
+                          PKT_TX_IP_CKSUM) {
                        /* IP CSO */
                        txbd1->lflags |= TX_BD_LONG_LFLAGS_IP_CHKSUM;
                        txbd1->mss = 0;
-               } else if (tx_pkt->ol_flags & PKT_TX_OUTER_IP_CKSUM) {
+               } else if ((tx_pkt->ol_flags & PKT_TX_OUTER_IP_CKSUM) ==
+                          PKT_TX_OUTER_IP_CKSUM) {
                        /* IP CSO */
                        txbd1->lflags |= TX_BD_LONG_LFLAGS_T_IP_CHKSUM;
                        txbd1->mss = 0;
@@ -261,7 +305,7 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
                tx_buf = &txr->tx_buf_ring[txr->tx_prod];
 
                txbd = &txr->tx_desc_ring[txr->tx_prod];
-               txbd->addr = rte_cpu_to_le_32(RTE_MBUF_DATA_DMA_ADDR(m_seg));
+               txbd->addr = rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR(m_seg));
                txbd->flags_type = TX_BD_SHORT_TYPE_TX_BD_SHORT;
                txbd->len = m_seg->data_len;
 
@@ -269,6 +313,7 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt,
        }
 
        txbd->flags_type |= TX_BD_LONG_FLAGS_PACKET_END;
+       txbd1->lflags = rte_cpu_to_le_32(txbd1->lflags);
 
        txr->tx_prod = RING_NEXT(txr->tx_ring_struct, txr->tx_prod);
 
index cb961f1..d901399 100644 (file)
@@ -71,10 +71,20 @@ uint16_t bnxt_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
 
 #define PKT_TX_OIP_IIP_TCP_UDP_CKSUM   (PKT_TX_TCP_CKSUM | PKT_TX_UDP_CKSUM | \
                                        PKT_TX_IP_CKSUM | PKT_TX_OUTER_IP_CKSUM)
+#define PKT_TX_OIP_IIP_UDP_CKSUM       (PKT_TX_UDP_CKSUM | \
+                                       PKT_TX_IP_CKSUM | PKT_TX_OUTER_IP_CKSUM)
+#define PKT_TX_OIP_IIP_TCP_CKSUM       (PKT_TX_TCP_CKSUM | \
+                                       PKT_TX_IP_CKSUM | PKT_TX_OUTER_IP_CKSUM)
 #define PKT_TX_IIP_TCP_UDP_CKSUM       (PKT_TX_TCP_CKSUM | PKT_TX_UDP_CKSUM | \
                                        PKT_TX_IP_CKSUM)
+#define PKT_TX_IIP_TCP_CKSUM           (PKT_TX_TCP_CKSUM | PKT_TX_IP_CKSUM)
+#define PKT_TX_IIP_UDP_CKSUM           (PKT_TX_UDP_CKSUM | PKT_TX_IP_CKSUM)
 #define PKT_TX_OIP_TCP_UDP_CKSUM       (PKT_TX_TCP_CKSUM | PKT_TX_UDP_CKSUM | \
                                        PKT_TX_OUTER_IP_CKSUM)
+#define PKT_TX_OIP_UDP_CKSUM           (PKT_TX_UDP_CKSUM | \
+                                       PKT_TX_OUTER_IP_CKSUM)
+#define PKT_TX_OIP_TCP_CKSUM           (PKT_TX_TCP_CKSUM | \
+                                       PKT_TX_OUTER_IP_CKSUM)
 #define PKT_TX_OIP_IIP_CKSUM           (PKT_TX_IP_CKSUM |      \
                                         PKT_TX_OUTER_IP_CKSUM)
 #define PKT_TX_TCP_UDP_CKSUM           (PKT_TX_TCP_CKSUM | PKT_TX_UDP_CKSUM)
index 33fdde2..58fa4be 100644 (file)
@@ -67,7 +67,7 @@ void bnxt_init_vnics(struct bnxt *bp)
 {
        struct bnxt_vnic_info *vnic;
        uint16_t max_vnics;
-       int i, j;
+       int i;
 
        if (BNXT_PF(bp)) {
                struct bnxt_pf_info *pf = &bp->pf;
@@ -85,9 +85,6 @@ void bnxt_init_vnics(struct bnxt *bp)
                vnic->fw_rss_cos_lb_ctx = (uint16_t)HWRM_NA_SIGNATURE;
                vnic->ctx_is_rss_cos_lb = HW_CONTEXT_NONE;
 
-               for (j = 0; j < MAX_QUEUES_PER_VNIC; j++)
-                       vnic->fw_grp_ids[j] = (uint16_t)HWRM_NA_SIGNATURE;
-
                prandom_bytes(vnic->rss_hash_key, HW_HASH_KEY_SIZE);
                STAILQ_INIT(&vnic->filter);
                STAILQ_INSERT_TAIL(&bp->free_vnic_list, vnic, next);
index 9671ba4..1f9e193 100644 (file)
@@ -44,13 +44,9 @@ struct bnxt_vnic_info {
        uint16_t        fw_vnic_id; /* returned by Chimp during alloc */
        uint16_t        fw_rss_cos_lb_ctx;
        uint16_t        ctx_is_rss_cos_lb;
-#define MAX_NUM_TRAFFIC_CLASSES                8
-#define MAX_NUM_RSS_QUEUES_PER_VNIC    16
-#define MAX_QUEUES_PER_VNIC    (MAX_NUM_RSS_QUEUES_PER_VNIC + \
-                                MAX_NUM_TRAFFIC_CLASSES)
        uint16_t        start_grp_id;
        uint16_t        end_grp_id;
-       uint16_t        fw_grp_ids[MAX_QUEUES_PER_VNIC];
+       uint16_t        *fw_grp_ids;
        uint16_t        hash_type;
        phys_addr_t     rss_table_dma_addr;
        uint16_t        *rss_table;
index 7bb2fe1..fa6f958 100644 (file)
@@ -780,9 +780,21 @@ rte_eth_bond_mac_address_reset(uint8_t bonded_port_id)
        internals->user_defined_mac = 0;
 
        if (internals->slave_count > 0) {
+               int slave_port;
+               /* Get the primary slave location based on the primary port
+                * number as, while slave_add(), we will keep the primary
+                * slave based on slave_count,but not based on the primary port.
+                */
+               for (slave_port = 0; slave_port < internals->slave_count;
+                    slave_port++) {
+                       if (internals->slaves[slave_port].port_id ==
+                           internals->primary_port)
+                               break;
+               }
+
                /* Set MAC Address of Bonded Device */
                if (mac_address_set(bonded_eth_dev,
-                               &internals->slaves[internals->primary_port].persisted_mac_addr)
+                       &internals->slaves[slave_port].persisted_mac_addr)
                                != 0) {
                        RTE_BOND_LOG(ERR, "Failed to set MAC address on bonded device");
                        return -1;
index 6f8931e..6081918 100644 (file)
@@ -1545,10 +1545,6 @@ bond_ethdev_start(struct rte_eth_dev *eth_dev)
                }
        }
 
-       /* Update all slave devices MACs*/
-       if (mac_address_slaves_update(eth_dev) != 0)
-               goto out_err;
-
        /* If bonded device is configure in promiscuous mode then re-apply config */
        if (internals->promiscuous_en)
                bond_ethdev_promiscuous_enable(eth_dev);
@@ -1577,6 +1573,10 @@ bond_ethdev_start(struct rte_eth_dev *eth_dev)
                        (void *)&rte_eth_devices[internals->port_id]);
        }
 
+       /* Update all slave devices MACs*/
+       if (mac_address_slaves_update(eth_dev) != 0)
+               goto out_err;
+
        if (internals->user_defined_primary_port)
                bond_ethdev_primary_set(internals, internals->primary_port);
 
@@ -1649,7 +1649,6 @@ bond_ethdev_stop(struct rte_eth_dev *eth_dev)
                        tlb_last_obytets[internals->active_slaves[i]] = 0;
        }
 
-       internals->active_slave_count = 0;
        internals->link_status_polling_enabled = 0;
        for (i = 0; i < internals->slave_count; i++)
                internals->slaves[i].last_link_status = 0;
index 565a695..6b9f7e8 100644 (file)
@@ -3315,8 +3315,12 @@ static int t4_wait_dev_ready(struct adapter *adapter)
 
        msleep(500);
        whoami = t4_read_reg(adapter, A_PL_WHOAMI);
-       return (whoami != 0xffffffff && whoami != X_CIM_PF_NOACCESS
-                       ? 0 : -EIO);
+       if (whoami != 0xffffffff && whoami != X_CIM_PF_NOACCESS)
+               return 0;
+
+       dev_err(adapter, "Device didn't become ready for access, whoami = %#x\n",
+               whoami);
+       return -EIO;
 }
 
 struct flash_desc {
@@ -3327,52 +3331,172 @@ struct flash_desc {
 int t4_get_flash_params(struct adapter *adapter)
 {
        /*
-        * Table for non-Numonix supported flash parts.  Numonix parts are left
-        * to the preexisting well-tested code.  All flash parts have 64KB
-        * sectors.
+        * Table for non-standard supported Flash parts.  Note, all Flash
+        * parts must have 64KB sectors.
         */
        static struct flash_desc supported_flash[] = {
-               { 0x150201, 4 << 20 },       /* Spansion 4MB S25FL032P */
+               { 0x00150201, 4 << 20 },       /* Spansion 4MB S25FL032P */
        };
 
        int ret;
-       unsigned int i;
-       u32 info = 0;
-
+       u32 flashid = 0;
+       unsigned int part, manufacturer;
+       unsigned int density, size = 0;
+
+       /**
+        * Issue a Read ID Command to the Flash part.  We decode supported
+        * Flash parts and their sizes from this.  There's a newer Query
+        * Command which can retrieve detailed geometry information but
+        * many Flash parts don't support it.
+        */
        ret = sf1_write(adapter, 1, 1, 0, SF_RD_ID);
        if (!ret)
-               ret = sf1_read(adapter, 3, 0, 1, &info);
+               ret = sf1_read(adapter, 3, 0, 1, &flashid);
        t4_write_reg(adapter, A_SF_OP, 0);               /* unlock SF */
        if (ret < 0)
                return ret;
 
-       for (i = 0; i < ARRAY_SIZE(supported_flash); ++i)
-               if (supported_flash[i].vendor_and_model_id == info) {
-                       adapter->params.sf_size = supported_flash[i].size_mb;
+       /**
+        * Check to see if it's one of our non-standard supported Flash parts.
+        */
+       for (part = 0; part < ARRAY_SIZE(supported_flash); part++) {
+               if (supported_flash[part].vendor_and_model_id == flashid) {
+                       adapter->params.sf_size =
+                               supported_flash[part].size_mb;
                        adapter->params.sf_nsec =
                                adapter->params.sf_size / SF_SEC_SIZE;
-                       return 0;
+                       goto found;
                }
+       }
 
-       if ((info & 0xff) != 0x20)             /* not a Numonix flash */
-               return -EINVAL;
-       info >>= 16;                           /* log2 of size */
-       if (info >= 0x14 && info < 0x18)
-               adapter->params.sf_nsec = 1 << (info - 16);
-       else if (info == 0x18)
-               adapter->params.sf_nsec = 64;
-       else
-               return -EINVAL;
-       adapter->params.sf_size = 1 << info;
+       /**
+        * Decode Flash part size.  The code below looks repetative with
+        * common encodings, but that's not guaranteed in the JEDEC
+        * specification for the Read JADEC ID command.  The only thing that
+        * we're guaranteed by the JADEC specification is where the
+        * Manufacturer ID is in the returned result.  After that each
+        * Manufacturer ~could~ encode things completely differently.
+        * Note, all Flash parts must have 64KB sectors.
+        */
+       manufacturer = flashid & 0xff;
+       switch (manufacturer) {
+       case 0x20: { /* Micron/Numonix */
+               /**
+                * This Density -> Size decoding table is taken from Micron
+                * Data Sheets.
+                */
+               density = (flashid >> 16) & 0xff;
+               switch (density) {
+               case 0x14:
+                       size = 1 << 20; /* 1MB */
+                       break;
+               case 0x15:
+                       size = 1 << 21; /* 2MB */
+                       break;
+               case 0x16:
+                       size = 1 << 22; /* 4MB */
+                       break;
+               case 0x17:
+                       size = 1 << 23; /* 8MB */
+                       break;
+               case 0x18:
+                       size = 1 << 24; /* 16MB */
+                       break;
+               case 0x19:
+                       size = 1 << 25; /* 32MB */
+                       break;
+               case 0x20:
+                       size = 1 << 26; /* 64MB */
+                       break;
+               case 0x21:
+                       size = 1 << 27; /* 128MB */
+                       break;
+               case 0x22:
+                       size = 1 << 28; /* 256MB */
+                       break;
+               }
+               break;
+       }
+
+       case 0x9d: { /* ISSI -- Integrated Silicon Solution, Inc. */
+               /**
+                * This Density -> Size decoding table is taken from ISSI
+                * Data Sheets.
+                */
+               density = (flashid >> 16) & 0xff;
+               switch (density) {
+               case 0x16:
+                       size = 1 << 25; /* 32MB */
+                       break;
+               case 0x17:
+                       size = 1 << 26; /* 64MB */
+                       break;
+               }
+               break;
+       }
+
+       case 0xc2: { /* Macronix */
+               /**
+                * This Density -> Size decoding table is taken from Macronix
+                * Data Sheets.
+                */
+               density = (flashid >> 16) & 0xff;
+               switch (density) {
+               case 0x17:
+                       size = 1 << 23; /* 8MB */
+                       break;
+               case 0x18:
+                       size = 1 << 24; /* 16MB */
+                       break;
+               }
+               break;
+       }
+
+       case 0xef: { /* Winbond */
+               /**
+                * This Density -> Size decoding table is taken from Winbond
+                * Data Sheets.
+                */
+               density = (flashid >> 16) & 0xff;
+               switch (density) {
+               case 0x17:
+                       size = 1 << 23; /* 8MB */
+                       break;
+               case 0x18:
+                       size = 1 << 24; /* 16MB */
+                       break;
+               }
+               break;
+       }
+       }
+
+       /* If we didn't recognize the FLASH part, that's no real issue: the
+        * Hardware/Software contract says that Hardware will _*ALWAYS*_
+        * use a FLASH part which is at least 4MB in size and has 64KB
+        * sectors.  The unrecognized FLASH part is likely to be much larger
+        * than 4MB, but that's all we really need.
+        */
+       if (size == 0) {
+               dev_warn(adapter,
+                        "Unknown Flash Part, ID = %#x, assuming 4MB\n",
+                        flashid);
+               size = 1 << 22;
+       }
+
+       /**
+        * Store decoded Flash size and fall through into vetting code.
+        */
+       adapter->params.sf_size = size;
+       adapter->params.sf_nsec = size / SF_SEC_SIZE;
 
+found:
        /*
         * We should reject adapters with FLASHes which are too small. So, emit
         * a warning.
         */
-       if (adapter->params.sf_size < FLASH_MIN_SIZE) {
-               dev_warn(adapter, "WARNING!!! FLASH size %#x < %#x!!!\n",
-                        adapter->params.sf_size, FLASH_MIN_SIZE);
-       }
+       if (adapter->params.sf_size < FLASH_MIN_SIZE)
+               dev_warn(adapter, "WARNING: Flash Part ID %#x, size %#x < %#x\n",
+                        flashid, adapter->params.sf_size, FLASH_MIN_SIZE);
 
        return 0;
 }
@@ -3439,8 +3563,11 @@ int t4_prep_adapter(struct adapter *adapter)
                t4_os_find_pci_capability(adapter, PCI_CAP_ID_VPD);
 
        ret = t4_get_flash_params(adapter);
-       if (ret < 0)
+       if (ret < 0) {
+               dev_err(adapter, "Unable to retrieve Flash Parameters, ret = %d\n",
+                       -ret);
                return ret;
+       }
 
        adapter->params.cim_la_size = CIMLA_SIZE;
 
index 87c3bf1..791b44f 100644 (file)
@@ -115,11 +115,13 @@ typedef uint64_t dma_addr_t;
 #define ENA_MIN16(x, y) RTE_MIN((x), (y))
 #define ENA_MIN8(x, y) RTE_MIN((x), (y))
 
+#define BITS_PER_LONG_LONG (__SIZEOF_LONG_LONG__ * 8)
 #define U64_C(x) x ## ULL
 #define BIT(nr)         (1UL << (nr))
 #define BITS_PER_LONG  (__SIZEOF_LONG__ * 8)
 #define GENMASK(h, l)  (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
-#define GENMASK_ULL(h, l) (((U64_C(1) << ((h) - (l) + 1)) - 1) << (l))
+#define GENMASK_ULL(h, l) (((~0ULL) - (1ULL << (l)) + 1) & \
+                         (~0ULL >> (BITS_PER_LONG_LONG - 1 - (h))))
 
 #ifdef RTE_LIBRTE_ENA_COM_DEBUG
 #define ena_trc_dbg(format, arg...)                                    \
@@ -188,10 +190,15 @@ typedef uint64_t dma_addr_t;
                snprintf(z_name, sizeof(z_name),                        \
                                "ena_alloc_%d", ena_alloc_cnt++);       \
                mz = rte_memzone_reserve(z_name, size, SOCKET_ID_ANY, 0); \
-               memset(mz->addr, 0, size);                              \
-               virt = mz->addr;                                        \
-               phys = mz->phys_addr;                                   \
                handle = mz;                                            \
+               if (mz == NULL) {                                       \
+                       virt = NULL;                                    \
+                       phys = 0;                                       \
+               } else {                                                \
+                       memset(mz->addr, 0, size);                      \
+                       virt = mz->addr;                                \
+                       phys = mz->phys_addr;                           \
+               }                                                       \
        } while (0)
 #define ENA_MEM_FREE_COHERENT(dmadev, size, virt, phys, handle)        \
                ({ ENA_TOUCH(size); ENA_TOUCH(phys);                    \
@@ -206,19 +213,20 @@ typedef uint64_t dma_addr_t;
                snprintf(z_name, sizeof(z_name),                        \
                                "ena_alloc_%d", ena_alloc_cnt++);       \
                mz = rte_memzone_reserve(z_name, size, node, 0); \
-               virt = mz->addr;                                        \
-               phys = mz->phys_addr;                                   \
+               if (mz == NULL) {                                       \
+                       virt = NULL;                                    \
+                       phys = 0;                                       \
+               } else {                                                \
+                       memset(mz->addr, 0, size);                      \
+                       virt = mz->addr;                                \
+                       phys = mz->phys_addr;                           \
+               }                                                       \
        } while (0)
 
 #define ENA_MEM_ALLOC_NODE(dmadev, size, virt, node, dev_node) \
        do {                                                            \
-               const struct rte_memzone *mz;                           \
-               char z_name[RTE_MEMZONE_NAMESIZE];                      \
                ENA_TOUCH(dmadev); ENA_TOUCH(dev_node);                 \
-               snprintf(z_name, sizeof(z_name),                        \
-                               "ena_alloc_%d", ena_alloc_cnt++);       \
-               mz = rte_memzone_reserve(z_name, size, node, 0); \
-               virt = mz->addr;                                        \
+               virt = rte_zmalloc_socket(NULL, size, 0, node);         \
        } while (0)
 
 #define ENA_MEM_ALLOC(dmadev, size) rte_zmalloc(NULL, size, 1)
index 63c4236..1511c6a 100644 (file)
@@ -697,7 +697,7 @@ static int ena_link_update(struct rte_eth_dev *dev,
        struct rte_eth_link *link = &dev->data->dev_link;
 
        link->link_status = 1;
-       link->link_speed = ETH_SPEED_NUM_10G;
+       link->link_speed = ETH_SPEED_NUM_NONE;
        link->link_duplex = ETH_LINK_FULL_DUPLEX;
 
        return 0;
@@ -894,7 +894,7 @@ static int ena_start(struct rte_eth_dev *dev)
                return rc;
 
        if (adapter->rte_dev->data->dev_conf.rxmode.mq_mode &
-           ETH_MQ_RX_RSS_FLAG) {
+           ETH_MQ_RX_RSS_FLAG && adapter->rte_dev->data->nb_rx_queues > 0) {
                rc = ena_rss_init_default(adapter);
                if (rc)
                        return rc;
index ef5ecd4..1760623 100644 (file)
@@ -787,25 +787,23 @@ int enic_alloc_wq(struct enic *enic, uint16_t queue_idx,
        static int instance;
 
        wq->socket_id = socket_id;
-       if (nb_desc) {
-               if (nb_desc > enic->config.wq_desc_count) {
-                       dev_warning(enic,
-                               "WQ %d - number of tx desc in cmd line (%d)"\
-                               "is greater than that in the UCSM/CIMC adapter"\
-                               "policy.  Applying the value in the adapter "\
-                               "policy (%d)\n",
-                               queue_idx, nb_desc, enic->config.wq_desc_count);
-               } else if (nb_desc != enic->config.wq_desc_count) {
-                       enic->config.wq_desc_count = nb_desc;
-                       dev_info(enic,
-                               "TX Queues - effective number of descs:%d\n",
-                               nb_desc);
-               }
+       if (nb_desc > enic->config.wq_desc_count) {
+               dev_warning(enic,
+                           "WQ %d - number of tx desc in cmd line (%d) "
+                           "is greater than that in the UCSM/CIMC adapter "
+                           "policy.  Applying the value in the adapter "
+                           "policy (%d)\n",
+                           queue_idx, nb_desc, enic->config.wq_desc_count);
+               nb_desc = enic->config.wq_desc_count;
+       } else if (nb_desc != enic->config.wq_desc_count) {
+               dev_info(enic,
+                        "TX Queues - effective number of descs:%d\n",
+                        nb_desc);
        }
 
        /* Allocate queue resources */
        err = vnic_wq_alloc(enic->vdev, &enic->wq[queue_idx], queue_idx,
-               enic->config.wq_desc_count,
+               nb_desc,
                sizeof(struct wq_enet_desc));
        if (err) {
                dev_err(enic, "error in allocation of wq\n");
@@ -813,7 +811,7 @@ int enic_alloc_wq(struct enic *enic, uint16_t queue_idx,
        }
 
        err = vnic_cq_alloc(enic->vdev, &enic->cq[cq_index], cq_index,
-               socket_id, enic->config.wq_desc_count,
+               socket_id, nb_desc,
                sizeof(struct cq_enet_wq_desc));
        if (err) {
                vnic_wq_free(wq);
index 7e93c3e..3061296 100644 (file)
@@ -1708,27 +1708,40 @@ i40e_phy_conf_link(struct i40e_hw *hw,
        struct i40e_aq_get_phy_abilities_resp phy_ab;
        struct i40e_aq_set_phy_config phy_conf;
        enum i40e_aq_phy_type cnt;
+       uint8_t avail_speed;
        uint32_t phy_type_mask = 0;
 
        const uint8_t mask = I40E_AQ_PHY_FLAG_PAUSE_TX |
                        I40E_AQ_PHY_FLAG_PAUSE_RX |
                        I40E_AQ_PHY_FLAG_PAUSE_RX |
                        I40E_AQ_PHY_FLAG_LOW_POWER;
-       const uint8_t advt = I40E_LINK_SPEED_40GB |
-                       I40E_LINK_SPEED_25GB |
-                       I40E_LINK_SPEED_10GB |
-                       I40E_LINK_SPEED_1GB |
-                       I40E_LINK_SPEED_100MB;
        int ret = -ENOTSUP;
 
+       /* To get phy capabilities of available speeds. */
+       status = i40e_aq_get_phy_capabilities(hw, false, true, &phy_ab,
+                                             NULL);
+       if (status) {
+               PMD_DRV_LOG(ERR, "Failed to get PHY capabilities: %d\n",
+                               status);
+               return ret;
+       }
+       avail_speed = phy_ab.link_speed;
 
+       /* To get the current phy config. */
        status = i40e_aq_get_phy_capabilities(hw, false, false, &phy_ab,
                                              NULL);
-       if (status)
+       if (status) {
+               PMD_DRV_LOG(ERR, "Failed to get the current PHY config: %d\n",
+                               status);
                return ret;
+       }
 
-       /* If link already up, no need to set up again */
-       if (is_up && phy_ab.phy_type != 0)
+       /* If link needs to go up and it is in autoneg mode the speed is OK,
+        * no need to set up again.
+        */
+       if (is_up && phy_ab.phy_type != 0 &&
+                    abilities & I40E_AQ_PHY_AN_ENABLED &&
+                    phy_ab.link_speed != 0)
                return I40E_SUCCESS;
 
        memset(&phy_conf, 0, sizeof(phy_conf));
@@ -1737,18 +1750,20 @@ i40e_phy_conf_link(struct i40e_hw *hw,
        abilities &= ~mask;
        abilities |= phy_ab.abilities & mask;
 
-       /* update ablities and speed */
-       if (abilities & I40E_AQ_PHY_AN_ENABLED)
-               phy_conf.link_speed = advt;
-       else
-               phy_conf.link_speed = is_up ? force_speed : phy_ab.link_speed;
-
        phy_conf.abilities = abilities;
 
+       /* If link needs to go up, but the force speed is not supported,
+        * Warn users and config the default available speeds.
+        */
+       if (is_up && !(force_speed & avail_speed)) {
+               PMD_DRV_LOG(WARNING, "Invalid speed setting, set to default!\n");
+               phy_conf.link_speed = avail_speed;
+       } else {
+               phy_conf.link_speed = is_up ? force_speed : avail_speed;
+       }
 
-
-       /* To enable link, phy_type mask needs to include each type */
-       for (cnt = I40E_PHY_TYPE_SGMII; cnt < I40E_PHY_TYPE_MAX; cnt++)
+       /* PHY type mask needs to include each type except PHY type extension */
+       for (cnt = I40E_PHY_TYPE_SGMII; cnt < I40E_PHY_TYPE_25GBASE_KR; cnt++)
                phy_type_mask |= 1 << cnt;
 
        /* use get_phy_abilities_resp value for the rest */
@@ -1781,11 +1796,18 @@ i40e_apply_link_speed(struct rte_eth_dev *dev)
        struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        struct rte_eth_conf *conf = &dev->data->dev_conf;
 
+       if (conf->link_speeds == ETH_LINK_SPEED_AUTONEG) {
+               conf->link_speeds = ETH_LINK_SPEED_40G |
+                                   ETH_LINK_SPEED_25G |
+                                   ETH_LINK_SPEED_20G |
+                                   ETH_LINK_SPEED_10G |
+                                   ETH_LINK_SPEED_1G |
+                                   ETH_LINK_SPEED_100M;
+       }
        speed = i40e_parse_link_speeds(conf->link_speeds);
-       abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
-       if (!(conf->link_speeds & ETH_LINK_SPEED_FIXED))
-               abilities |= I40E_AQ_PHY_AN_ENABLED;
-       abilities |= I40E_AQ_PHY_LINK_ENABLED;
+       abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK |
+                    I40E_AQ_PHY_AN_ENABLED |
+                    I40E_AQ_PHY_LINK_ENABLED;
 
        return i40e_phy_conf_link(hw, abilities, speed, true);
 }
@@ -1876,13 +1898,6 @@ i40e_dev_start(struct rte_eth_dev *dev)
        }
 
        /* Apply link configure */
-       if (dev->data->dev_conf.link_speeds & ~(ETH_LINK_SPEED_100M |
-                               ETH_LINK_SPEED_1G | ETH_LINK_SPEED_10G |
-                               ETH_LINK_SPEED_20G | ETH_LINK_SPEED_25G |
-                               ETH_LINK_SPEED_40G)) {
-               PMD_DRV_LOG(ERR, "Invalid link setting");
-               goto err_up;
-       }
        ret = i40e_apply_link_speed(dev);
        if (I40E_SUCCESS != ret) {
                PMD_DRV_LOG(ERR, "Fail to apply link setting");
@@ -2563,14 +2578,13 @@ i40e_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
        /* call read registers - updates values, now write them to struct */
        i40e_read_stats_registers(pf, hw);
 
-       stats->ipackets = ns->eth.rx_unicast +
-                       ns->eth.rx_multicast +
-                       ns->eth.rx_broadcast -
-                       ns->eth.rx_discards -
+       stats->ipackets = pf->main_vsi->eth_stats.rx_unicast +
+                       pf->main_vsi->eth_stats.rx_multicast +
+                       pf->main_vsi->eth_stats.rx_broadcast -
                        pf->main_vsi->eth_stats.rx_discards;
-       stats->opackets = ns->eth.tx_unicast +
-                       ns->eth.tx_multicast +
-                       ns->eth.tx_broadcast;
+       stats->opackets = pf->main_vsi->eth_stats.tx_unicast +
+                       pf->main_vsi->eth_stats.tx_multicast +
+                       pf->main_vsi->eth_stats.tx_broadcast;
        stats->ibytes   = ns->eth.rx_bytes;
        stats->obytes   = ns->eth.tx_bytes;
        stats->oerrors  = ns->eth.tx_errors +
@@ -8669,6 +8683,60 @@ i40e_pctype_to_flowtype(enum i40e_filter_pctype pctype)
 #define I40E_GL_SWR_PM_UP_THR_SF_VALUE   0x06060606
 #define I40E_GL_SWR_PM_UP_THR            0x269FBC
 
+/*
+ * GL_SWR_PM_UP_THR:
+ * The value is not impacted from the link speed, its value is set according
+ * to the total number of ports for a better pipe-monitor configuration.
+ */
+static bool
+i40e_get_swr_pm_cfg(struct i40e_hw *hw, uint32_t *value)
+{
+#define I40E_GL_SWR_PM_EF_DEVICE(dev) \
+               .device_id = (dev),   \
+               .val = I40E_GL_SWR_PM_UP_THR_EF_VALUE
+
+#define I40E_GL_SWR_PM_SF_DEVICE(dev) \
+               .device_id = (dev),   \
+               .val = I40E_GL_SWR_PM_UP_THR_SF_VALUE
+
+       static const struct {
+               uint16_t device_id;
+               uint32_t val;
+       } swr_pm_table[] = {
+               { I40E_GL_SWR_PM_EF_DEVICE(I40E_DEV_ID_SFP_XL710) },
+               { I40E_GL_SWR_PM_EF_DEVICE(I40E_DEV_ID_KX_C) },
+               { I40E_GL_SWR_PM_EF_DEVICE(I40E_DEV_ID_10G_BASE_T) },
+               { I40E_GL_SWR_PM_EF_DEVICE(I40E_DEV_ID_10G_BASE_T4) },
+
+               { I40E_GL_SWR_PM_SF_DEVICE(I40E_DEV_ID_KX_B) },
+               { I40E_GL_SWR_PM_SF_DEVICE(I40E_DEV_ID_QSFP_A) },
+               { I40E_GL_SWR_PM_SF_DEVICE(I40E_DEV_ID_QSFP_B) },
+               { I40E_GL_SWR_PM_SF_DEVICE(I40E_DEV_ID_20G_KR2) },
+               { I40E_GL_SWR_PM_SF_DEVICE(I40E_DEV_ID_20G_KR2_A) },
+               { I40E_GL_SWR_PM_SF_DEVICE(I40E_DEV_ID_25G_B) },
+               { I40E_GL_SWR_PM_SF_DEVICE(I40E_DEV_ID_25G_SFP28) },
+       };
+       uint32_t i;
+
+       if (value == NULL) {
+               PMD_DRV_LOG(ERR, "value is NULL");
+               return false;
+       }
+
+       for (i = 0; i < RTE_DIM(swr_pm_table); i++) {
+               if (hw->device_id == swr_pm_table[i].device_id) {
+                       *value = swr_pm_table[i].val;
+
+                       PMD_DRV_LOG(DEBUG, "Device 0x%x with GL_SWR_PM_UP_THR "
+                                   "value - 0x%08x",
+                                   hw->device_id, *value);
+                       return true;
+               }
+       }
+
+       return false;
+}
+
 static int
 i40e_dev_sync_phy_type(struct i40e_hw *hw)
 {
@@ -8724,13 +8792,16 @@ i40e_configure_registers(struct i40e_hw *hw)
                }
 
                if (reg_table[i].addr == I40E_GL_SWR_PM_UP_THR) {
-                       if (I40E_PHY_TYPE_SUPPORT_40G(hw->phy.phy_types) || /* For XL710 */
-                           I40E_PHY_TYPE_SUPPORT_25G(hw->phy.phy_types)) /* For XXV710 */
-                               reg_table[i].val =
-                                       I40E_GL_SWR_PM_UP_THR_SF_VALUE;
-                       else /* For X710 */
-                               reg_table[i].val =
-                                       I40E_GL_SWR_PM_UP_THR_EF_VALUE;
+                       uint32_t cfg_val;
+
+                       if (!i40e_get_swr_pm_cfg(hw, &cfg_val)) {
+                               PMD_DRV_LOG(DEBUG, "Device 0x%x skips "
+                                           "GL_SWR_PM_UP_THR value fixup",
+                                           hw->device_id);
+                               continue;
+                       }
+
+                       reg_table[i].val = cfg_val;
                }
 
                ret = i40e_aq_debug_read_register(hw, reg_table[i].addr,
index b19224d..0ffd9f3 100644 (file)
@@ -2313,7 +2313,6 @@ i40evf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
        struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
 
-       memset(dev_info, 0, sizeof(*dev_info));
        dev_info->max_rx_queues = vf->vsi_res->num_queue_pairs;
        dev_info->max_tx_queues = vf->vsi_res->num_queue_pairs;
        dev_info->min_rx_bufsize = I40E_BUF_SIZE_MIN;
index a4e2996..e1a97ea 100644 (file)
 #define IXGBE_5TUPLE_MAX_PRI            7
 #define IXGBE_5TUPLE_MIN_PRI            1
 
+/* bit of VXLAN tunnel type | 7 bits of zeros  | 8 bits of zeros*/
+#define IXGBE_FDIR_VXLAN_TUNNEL_TYPE    0x8000
+/* bit of NVGRE tunnel type | 7 bits of zeros  | 8 bits of zeros*/
+#define IXGBE_FDIR_NVGRE_TUNNEL_TYPE    0x0
+
 #define IXGBE_RSS_OFFLOAD_ALL ( \
        ETH_RSS_IPV4 | \
        ETH_RSS_NONFRAG_IPV4_TCP | \
index 4b81ee3..2a6f754 100644 (file)
@@ -433,10 +433,12 @@ fdir_set_input_mask_x550(struct rte_eth_dev *dev,
                                IXGBE_FDIRIP6M_TNI_VNI;
 
        if (mode == RTE_FDIR_MODE_PERFECT_TUNNEL) {
-               mac_mask = input_mask->mac_addr_byte_mask;
-               fdiripv6m |= (mac_mask << IXGBE_FDIRIP6M_INNER_MAC_SHIFT)
-                               & IXGBE_FDIRIP6M_INNER_MAC;
-               info->mask.mac_addr_byte_mask = input_mask->mac_addr_byte_mask;
+               fdiripv6m |= IXGBE_FDIRIP6M_INNER_MAC;
+               mac_mask = input_mask->mac_addr_byte_mask &
+                       (IXGBE_FDIRIP6M_INNER_MAC >>
+                       IXGBE_FDIRIP6M_INNER_MAC_SHIFT);
+               fdiripv6m &= ~((mac_mask << IXGBE_FDIRIP6M_INNER_MAC_SHIFT) &
+                               IXGBE_FDIRIP6M_INNER_MAC);
 
                switch (input_mask->tunnel_type_mask) {
                case 0:
@@ -720,10 +722,19 @@ ixgbe_fdir_filter_to_atr_input(const struct rte_eth_fdir_filter *fdir_filter,
                        input->formatted.inner_mac,
                        fdir_filter->input.flow.tunnel_flow.mac_addr.addr_bytes,
                        sizeof(input->formatted.inner_mac));
-               input->formatted.tunnel_type =
-                       fdir_filter->input.flow.tunnel_flow.tunnel_type;
+               if (fdir_filter->input.flow.tunnel_flow.tunnel_type ==
+                               RTE_FDIR_TUNNEL_TYPE_VXLAN)
+                       input->formatted.tunnel_type =
+                                       IXGBE_FDIR_VXLAN_TUNNEL_TYPE;
+               else if (fdir_filter->input.flow.tunnel_flow.tunnel_type ==
+                               RTE_FDIR_TUNNEL_TYPE_NVGRE)
+                       input->formatted.tunnel_type =
+                                       IXGBE_FDIR_NVGRE_TUNNEL_TYPE;
+               else
+                       PMD_DRV_LOG(ERR, " invalid tunnel type arguments.");
+
                input->formatted.tni_vni =
-                       fdir_filter->input.flow.tunnel_flow.tunnel_id;
+                       fdir_filter->input.flow.tunnel_flow.tunnel_id >> 8;
        }
 
        return 0;
@@ -950,8 +961,7 @@ fdir_write_perfect_filter_82599(struct ixgbe_hw *hw,
                        IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(2), 0);
                } else {
                        /* tunnel mode */
-                       if (input->formatted.tunnel_type !=
-                               RTE_FDIR_TUNNEL_TYPE_NVGRE)
+                       if (input->formatted.tunnel_type)
                                tunnel_type = 0x80000000;
                        tunnel_type |= addr_high;
                        IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(0), addr_low);
@@ -959,6 +969,9 @@ fdir_write_perfect_filter_82599(struct ixgbe_hw *hw,
                        IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(2),
                                        input->formatted.tni_vni);
                }
+               IXGBE_WRITE_REG(hw, IXGBE_FDIRIPSA, 0);
+               IXGBE_WRITE_REG(hw, IXGBE_FDIRIPDA, 0);
+               IXGBE_WRITE_REG(hw, IXGBE_FDIRPORT, 0);
        }
 
        /* record vlan (little-endian) and flex_bytes(big-endian) */
index 4581149..0f0589e 100644 (file)
@@ -2023,11 +2023,15 @@ nfp_net_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
                                txq->tail = 0;
 
                        pkt_size -= dma_size;
-                       if (!pkt_size) {
-                               /* End of packet */
-                               txds->offset_eop |= PCIE_DESC_TX_EOP;
-                       } else {
-                               txds->offset_eop &= PCIE_DESC_TX_OFFSET_MASK;
+
+                       /*
+                        * Making the EOP, packets with just one segment
+                        * the priority
+                        */
+                       if (likely(!pkt_size))
+                               txds->offset_eop = PCIE_DESC_TX_EOP;
+                       else {
+                               txds->offset_eop = 0;
                                pkt = pkt->next;
                        }
                        /* Referencing next free TX descriptor */
index 067ee29..620f09a 100644 (file)
@@ -462,6 +462,12 @@ eth_rss_hash_conf_get(struct rte_eth_dev *dev,
        return 0;
 }
 
+static void
+eth_mac_address_set(__rte_unused struct rte_eth_dev *dev,
+                   __rte_unused struct ether_addr *addr)
+{
+}
+
 static const struct eth_dev_ops ops = {
        .dev_start = eth_dev_start,
        .dev_stop = eth_dev_stop,
@@ -472,6 +478,7 @@ static const struct eth_dev_ops ops = {
        .rx_queue_release = eth_queue_release,
        .tx_queue_release = eth_queue_release,
        .link_update = eth_link_update,
+       .mac_addr_set = eth_mac_address_set,
        .stats_get = eth_stats_get,
        .stats_reset = eth_stats_reset,
        .reta_update = eth_rss_reta_update,
index 27590d3..deca553 100644 (file)
@@ -687,19 +687,19 @@ static const struct eth_dev_ops ops = {
 static int
 open_rx_pcap(const char *key, const char *value, void *extra_args)
 {
-       unsigned int i;
        const char *pcap_filename = value;
        struct pmd_devargs *rx = extra_args;
        pcap_t *pcap = NULL;
 
-       for (i = 0; i < rx->num_of_queue; i++) {
-               if (open_single_rx_pcap(pcap_filename, &pcap) < 0)
-                       return -1;
+       if (rx->num_of_queue >= RTE_PMD_PCAP_MAX_QUEUES)
+               return -1;
+       if (open_single_rx_pcap(pcap_filename, &pcap) < 0)
+               return -1;
 
-               rx->queue[i].pcap = pcap;
-               rx->queue[i].name = pcap_filename;
-               rx->queue[i].type = key;
-       }
+       rx->queue[rx->num_of_queue].pcap = pcap;
+       rx->queue[rx->num_of_queue].name = pcap_filename;
+       rx->queue[rx->num_of_queue].type = key;
+       rx->num_of_queue++;
 
        return 0;
 }
@@ -711,19 +711,19 @@ open_rx_pcap(const char *key, const char *value, void *extra_args)
 static int
 open_tx_pcap(const char *key, const char *value, void *extra_args)
 {
-       unsigned int i;
        const char *pcap_filename = value;
        struct pmd_devargs *dumpers = extra_args;
        pcap_dumper_t *dumper;
 
-       for (i = 0; i < dumpers->num_of_queue; i++) {
-               if (open_single_tx_pcap(pcap_filename, &dumper) < 0)
-                       return -1;
+       if (dumpers->num_of_queue >= RTE_PMD_PCAP_MAX_QUEUES)
+               return -1;
+       if (open_single_tx_pcap(pcap_filename, &dumper) < 0)
+               return -1;
 
-               dumpers->queue[i].dumper = dumper;
-               dumpers->queue[i].name = pcap_filename;
-               dumpers->queue[i].type = key;
-       }
+       dumpers->queue[dumpers->num_of_queue].dumper = dumper;
+       dumpers->queue[dumpers->num_of_queue].name = pcap_filename;
+       dumpers->queue[dumpers->num_of_queue].type = key;
+       dumpers->num_of_queue++;
 
        return 0;
 }
@@ -754,18 +754,18 @@ open_rx_tx_iface(const char *key, const char *value, void *extra_args)
 static inline int
 open_rx_iface(const char *key, const char *value, void *extra_args)
 {
-       unsigned int i;
        const char *iface = value;
        struct pmd_devargs *rx = extra_args;
        pcap_t *pcap = NULL;
 
-       for (i = 0; i < rx->num_of_queue; i++) {
-               if (open_single_iface(iface, &pcap) < 0)
-                       return -1;
-               rx->queue[i].pcap = pcap;
-               rx->queue[i].name = iface;
-               rx->queue[i].type = key;
-       }
+       if (rx->num_of_queue >= RTE_PMD_PCAP_MAX_QUEUES)
+               return -1;
+       if (open_single_iface(iface, &pcap) < 0)
+               return -1;
+       rx->queue[rx->num_of_queue].pcap = pcap;
+       rx->queue[rx->num_of_queue].name = iface;
+       rx->queue[rx->num_of_queue].type = key;
+       rx->num_of_queue++;
 
        return 0;
 }
@@ -776,18 +776,18 @@ open_rx_iface(const char *key, const char *value, void *extra_args)
 static int
 open_tx_iface(const char *key, const char *value, void *extra_args)
 {
-       unsigned int i;
        const char *iface = value;
        struct pmd_devargs *tx = extra_args;
        pcap_t *pcap;
 
-       for (i = 0; i < tx->num_of_queue; i++) {
-               if (open_single_iface(iface, &pcap) < 0)
-                       return -1;
-               tx->queue[i].pcap = pcap;
-               tx->queue[i].name = iface;
-               tx->queue[i].type = key;
-       }
+       if (tx->num_of_queue >= RTE_PMD_PCAP_MAX_QUEUES)
+               return -1;
+       if (open_single_iface(iface, &pcap) < 0)
+               return -1;
+       tx->queue[tx->num_of_queue].pcap = pcap;
+       tx->queue[tx->num_of_queue].name = iface;
+       tx->queue[tx->num_of_queue].type = key;
+       tx->num_of_queue++;
 
        return 0;
 }
@@ -983,15 +983,8 @@ pmd_pcap_probe(const char *name, const char *params)
         * We check whether we want to open a RX stream from a real NIC or a
         * pcap file
         */
-       pcaps.num_of_queue = rte_kvargs_count(kvlist, ETH_PCAP_RX_PCAP_ARG);
-       if (pcaps.num_of_queue)
-               is_rx_pcap = 1;
-       else
-               pcaps.num_of_queue = rte_kvargs_count(kvlist,
-                               ETH_PCAP_RX_IFACE_ARG);
-
-       if (pcaps.num_of_queue > RTE_PMD_PCAP_MAX_QUEUES)
-               pcaps.num_of_queue = RTE_PMD_PCAP_MAX_QUEUES;
+       is_rx_pcap = rte_kvargs_count(kvlist, ETH_PCAP_RX_PCAP_ARG) ? 1 : 0;
+       pcaps.num_of_queue = 0;
 
        if (is_rx_pcap)
                ret = rte_kvargs_process(kvlist, ETH_PCAP_RX_PCAP_ARG,
@@ -1007,15 +1000,8 @@ pmd_pcap_probe(const char *name, const char *params)
         * We check whether we want to open a TX stream to a real NIC or a
         * pcap file
         */
-       dumpers.num_of_queue = rte_kvargs_count(kvlist, ETH_PCAP_TX_PCAP_ARG);
-       if (dumpers.num_of_queue)
-               is_tx_pcap = 1;
-       else
-               dumpers.num_of_queue = rte_kvargs_count(kvlist,
-                               ETH_PCAP_TX_IFACE_ARG);
-
-       if (dumpers.num_of_queue > RTE_PMD_PCAP_MAX_QUEUES)
-               dumpers.num_of_queue = RTE_PMD_PCAP_MAX_QUEUES;
+       is_tx_pcap = rte_kvargs_count(kvlist, ETH_PCAP_TX_PCAP_ARG) ? 1 : 0;
+       dumpers.num_of_queue = 0;
 
        if (is_tx_pcap)
                ret = rte_kvargs_process(kvlist, ETH_PCAP_TX_PCAP_ARG,
index 207b01b..8ddfdee 100644 (file)
@@ -229,15 +229,19 @@ static const char *grc_timeout_attn_master_to_str(u8 master)
 
 static enum _ecore_status_t ecore_grc_attn_cb(struct ecore_hwfn *p_hwfn)
 {
+       enum _ecore_status_t rc = ECORE_SUCCESS;
        u32 tmp, tmp2;
 
        /* We've already cleared the timeout interrupt register, so we learn
-        * of interrupts via the validity register
+        * of interrupts via the validity register.
+        * Any attention which is not for a timeout event is treated as fatal.
         */
        tmp = ecore_rd(p_hwfn, p_hwfn->p_dpc_ptt,
                       GRC_REG_TIMEOUT_ATTN_ACCESS_VALID);
-       if (!(tmp & ECORE_GRC_ATTENTION_VALID_BIT))
+       if (!(tmp & ECORE_GRC_ATTENTION_VALID_BIT)) {
+               rc = ECORE_INVAL;
                goto out;
+       }
 
        /* Read the GRC timeout information */
        tmp = ecore_rd(p_hwfn, p_hwfn->p_dpc_ptt,
@@ -261,11 +265,11 @@ static enum _ecore_status_t ecore_grc_attn_cb(struct ecore_hwfn *p_hwfn)
                (tmp2 & ECORE_GRC_ATTENTION_VF_MASK) >>
                ECORE_GRC_ATTENTION_VF_SHIFT);
 
-out:
-       /* Regardles of anything else, clean the validity bit */
+       /* Clean the validity bit */
        ecore_wr(p_hwfn, p_hwfn->p_dpc_ptt,
                 GRC_REG_TIMEOUT_ATTN_ACCESS_VALID, 0);
-       return ECORE_SUCCESS;
+out:
+       return rc;
 }
 
 #define ECORE_PGLUE_ATTENTION_VALID (1 << 29)
index ce3a093..679599f 100644 (file)
@@ -441,7 +441,10 @@ qede_mac_int_ops(struct rte_eth_dev *eth_dev, struct ecore_filter_ucast *ucast,
                if (rc == 0)
                        rc = ecore_filter_ucast_cmd(edev, ucast,
                                                    ECORE_SPQ_MODE_CB, NULL);
-               if (rc != ECORE_SUCCESS) {
+               /* Indicate error only for add filter operation.
+                * Delete filter operations are not severe.
+                */
+               if ((rc != ECORE_SUCCESS) && add) {
                        DP_ERR(edev, "MAC filter failed, rc = %d, op = %d\n",
                               rc, add);
                }
@@ -797,8 +800,7 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
 
        /* Enable VLAN offloads by default */
        qede_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK  |
-                                      ETH_VLAN_FILTER_MASK |
-                                      ETH_VLAN_EXTEND_MASK);
+                                      ETH_VLAN_FILTER_MASK);
 
        qdev->state = QEDE_DEV_CONFIG;
 
index d0f0d52..82106a7 100644 (file)
@@ -879,7 +879,7 @@ nicvf_dev_tx_queue_release(void *sq)
 static void
 nicvf_set_tx_function(struct rte_eth_dev *dev)
 {
-       struct nicvf_txq *txq;
+       struct nicvf_txq *txq = NULL;
        size_t i;
        bool multiseg = false;
 
@@ -900,6 +900,9 @@ nicvf_set_tx_function(struct rte_eth_dev *dev)
                dev->tx_pkt_burst = nicvf_xmit_pkts;
        }
 
+       if (!txq)
+               return;
+
        if (txq->pool_free == nicvf_single_pool_free_xmited_buffers)
                PMD_DRV_LOG(DEBUG, "Using single-mempool tx free method");
        else
index 275adb3..4b9b293 100644 (file)
@@ -190,12 +190,14 @@ nicvf_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
                free_desc -= TX_DESC_PER_PKT;
        }
 
-       sq->tail = tail;
-       sq->xmit_bufs += i;
-       rte_wmb();
+       if (likely(i)) {
+               sq->tail = tail;
+               sq->xmit_bufs += i;
+               rte_wmb();
 
-       /* Inform HW to xmit the packets */
-       nicvf_addr_write(sq->sq_door, i * TX_DESC_PER_PKT);
+               /* Inform HW to xmit the packets */
+               nicvf_addr_write(sq->sq_door, i * TX_DESC_PER_PKT);
+       }
        return i;
 }
 
@@ -246,12 +248,14 @@ nicvf_xmit_pkts_multiseg(void *tx_queue, struct rte_mbuf **tx_pkts,
                }
        }
 
-       sq->tail = tail;
-       sq->xmit_bufs += used_bufs;
-       rte_wmb();
+       if (likely(used_desc)) {
+               sq->tail = tail;
+               sq->xmit_bufs += used_bufs;
+               rte_wmb();
 
-       /* Inform HW to xmit the packets */
-       nicvf_addr_write(sq->sq_door, used_desc);
+               /* Inform HW to xmit the packets */
+               nicvf_addr_write(sq->sq_door, used_desc);
+       }
        return i;
 }
 
index e70549b..9ab5054 100644 (file)
@@ -165,6 +165,9 @@ print_stats(void)
               " Lcore    Port            RX            TX    Dropped on TX\n"
               "-------  ------  ------------  ------------  ---------------\n");
        RTE_LCORE_FOREACH(i) {
+               /* limit ourselves to application supported cores only */
+               if (i >= APP_MAX_LCORE)
+                       break;
                printf("%6u %7u %13"PRIu64" %13"PRIu64" %16"PRIu64"\n",
                       i, (unsigned)port_ids[i],
                       lcore_stats[i].rx, lcore_stats[i].tx,
index 3c1ea16..05c7645 100644 (file)
@@ -304,6 +304,7 @@ prepare_tx_pkt(struct rte_mbuf *pkt, uint8_t port)
                pkt->l3_len = sizeof(struct ip);
                pkt->l2_len = ETHER_HDR_LEN;
 
+               ip->ip_sum = 0;
                ethhdr->ether_type = rte_cpu_to_be_16(ETHER_TYPE_IPv4);
        } else {
                pkt->ol_flags |= PKT_TX_IPV6;
@@ -477,11 +478,13 @@ outbound_sp(struct sp_ctx *sp, struct traffic_type *ip,
                sa_idx = ip->res[i] & PROTECT_MASK;
                if (ip->res[i] & DISCARD)
                        rte_pktmbuf_free(m);
+               else if (ip->res[i] & BYPASS)
+                       ip->pkts[j++] = m;
                else if (sa_idx < IPSEC_SA_MAX_ENTRIES) {
                        ipsec->res[ipsec->num] = sa_idx;
                        ipsec->pkts[ipsec->num++] = m;
-               } else /* BYPASS */
-                       ip->pkts[j++] = m;
+               } else /* invalid SA idx */
+                       rte_pktmbuf_free(m);
        }
        ip->num = j;
 }
index 46b327e..6410e3c 100644 (file)
@@ -47,7 +47,6 @@
 #include <rte_debug.h>
 #include <rte_ether.h>
 #include <rte_ethdev.h>
-#include <rte_mempool.h>
 #include <rte_cycles.h>
 #include <rte_mbuf.h>
 #include <rte_ip.h>
index f621269..ef65f9c 100644 (file)
@@ -46,7 +46,6 @@
 #include <rte_debug.h>
 #include <rte_ether.h>
 #include <rte_ethdev.h>
-#include <rte_mempool.h>
 #include <rte_cycles.h>
 #include <rte_mbuf.h>
 #include <rte_ip.h>
index 6b315cc..39306f3 100644 (file)
@@ -41,5 +41,6 @@ include $(RTE_SDK)/mk/rte.vars.mk
 DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += client_server_mp
 DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += simple_mp
 DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += symmetric_mp
+DIRS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += l2fwd_fork
 
 include $(RTE_SDK)/mk/rte.extsubdir.mk
index ea8ba3b..9148ef1 100644 (file)
@@ -66,7 +66,7 @@ extern "C" {
 /**
  * Patch level number i.e. the z in yy.mm.z
  */
-#define RTE_VER_MINOR 7
+#define RTE_VER_MINOR 8
 
 /**
  * Extra string to be appended to version number
index 368863f..7f73914 100644 (file)
@@ -451,7 +451,7 @@ rte_intr_callback_register(struct rte_intr_handle *intr_handle,
        TAILQ_FOREACH(src, &intr_sources, next) {
                if (src->intr_handle.fd == intr_handle->fd) {
                        /* we had no interrupts for this */
-                       if TAILQ_EMPTY(&src->callbacks)
+                       if (TAILQ_EMPTY(&src->callbacks))
                                wake_thread = 1;
 
                        TAILQ_INSERT_TAIL(&(src->callbacks), callback, next);
index 9f88530..da7dd69 100644 (file)
@@ -200,7 +200,7 @@ int rte_sys_gettid(void)
 
 int rte_thread_setname(pthread_t id, const char *name)
 {
-       int ret = -1;
+       int ret = ENOSYS;
 #if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
 #if __GLIBC_PREREQ(2, 12)
        ret = pthread_setname_np(id, name);
@@ -208,5 +208,5 @@ int rte_thread_setname(pthread_t id, const char *name)
 #endif
        RTE_SET_USED(id);
        RTE_SET_USED(name);
-       return ret;
+       return -ret;
 }
index d7a987d..1110bef 100644 (file)
@@ -826,9 +826,10 @@ static void igb_get_drvinfo(struct net_device *netdev,
        strncpy(drvinfo->driver,  igb_driver_name, sizeof(drvinfo->driver) - 1);
        strncpy(drvinfo->version, igb_driver_version, sizeof(drvinfo->version) - 1);
 
-       strncpy(drvinfo->fw_version, adapter->fw_version,
-               sizeof(drvinfo->fw_version) - 1);
-       strncpy(drvinfo->bus_info, pci_name(adapter->pdev), sizeof(drvinfo->bus_info) -1);
+       strlcpy(drvinfo->fw_version, adapter->fw_version,
+               sizeof(drvinfo->fw_version));
+       strlcpy(drvinfo->bus_info, pci_name(adapter->pdev),
+               sizeof(drvinfo->bus_info));
        drvinfo->n_stats = IGB_STATS_LEN;
        drvinfo->testinfo_len = IGB_TEST_LEN;
        drvinfo->regdump_len = igb_get_regs_len(netdev);
index 88bd18e..9e4798e 100644 (file)
@@ -3933,6 +3933,11 @@ skb_set_hash(struct sk_buff *skb, __u32 hash, __always_unused int type)
 #define HAVE_VF_VLAN_PROTO
 #endif /* >= 4.9.0 */
 
+#if (defined(RHEL_RELEASE_CODE) && \
+       (RHEL_RELEASE_VERSION(7, 5) <= RHEL_RELEASE_CODE))
+#define ndo_change_mtu ndo_change_mtu_rh74
+#endif
+
 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0)
 #define HAVE_PCI_ENABLE_MSIX
 #endif
index a698fc0..9b28e95 100644 (file)
@@ -1598,6 +1598,16 @@ set_queue_stats_mapping(uint8_t port_id, uint16_t queue_id, uint8_t stat_idx,
        dev = &rte_eth_devices[port_id];
 
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_stats_mapping_set, -ENOTSUP);
+
+       if (is_rx && (queue_id >= dev->data->nb_rx_queues))
+               return -EINVAL;
+
+       if (!is_rx && (queue_id >= dev->data->nb_tx_queues))
+               return -EINVAL;
+
+       if (stat_idx >= RTE_ETHDEV_QUEUE_STAT_CNTRS)
+               return -EINVAL;
+
        return (*dev->dev_ops->queue_stats_mapping_set)
                        (dev, queue_id, stat_idx, is_rx);
 }
index da33b9d..981e057 100644 (file)
@@ -1742,7 +1742,6 @@ struct rte_eth_dev *rte_eth_dev_allocated(const char *name);
  * to that slot for the driver to use.
  *
  * @param      name    Unique identifier name for each Ethernet device
- * @param      type    Device type of this Ethernet device
  * @return
  *   - Slot in the rte_dev_devices array for a new device;
  */
@@ -2325,7 +2324,7 @@ void rte_eth_xstats_reset(uint8_t port_id);
  * @param stat_idx
  *   The per-queue packet statistics functionality number that the transmit
  *   queue is to be assigned.
- *   The value must be in the range [0, RTE_MAX_ETHPORT_QUEUE_STATS_MAPS - 1].
+ *   The value must be in the range [0, RTE_ETHDEV_QUEUE_STAT_CNTRS - 1].
  * @return
  *   Zero if successful. Non-zero otherwise.
  */
@@ -2345,7 +2344,7 @@ int rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id,
  * @param stat_idx
  *   The per-queue packet statistics functionality number that the receive
  *   queue is to be assigned.
- *   The value must be in the range [0, RTE_MAX_ETHPORT_QUEUE_STATS_MAPS - 1].
+ *   The value must be in the range [0, RTE_ETHDEV_QUEUE_STAT_CNTRS - 1].
  * @return
  *   Zero if successful. Non-zero otherwise.
  */
index fb462d6..049ff98 100644 (file)
@@ -155,13 +155,13 @@ rte_hash_create(const struct rte_hash_parameters *params)
                 * except for the first cache
                 */
                num_key_slots = params->entries + (RTE_MAX_LCORE - 1) *
-                                       LCORE_CACHE_SIZE + 1;
+                                       (LCORE_CACHE_SIZE - 1) + 1;
        else
                num_key_slots = params->entries + 1;
 
        snprintf(ring_name, sizeof(ring_name), "HT_%s", params->name);
        /* Create ring (Dummy slot index is not enqueued) */
-       r = rte_ring_create(ring_name, rte_align32pow2(num_key_slots - 1),
+       r = rte_ring_create(ring_name, rte_align32pow2(num_key_slots),
                        params->socket_id, 0);
        if (r == NULL) {
                RTE_LOG(ERR, HASH, "memory allocation failed\n");
@@ -303,14 +303,17 @@ rte_hash_create(const struct rte_hash_parameters *params)
                        h->add_key = ADD_KEY_MULTIWRITER;
                        h->multiwriter_lock = rte_malloc(NULL,
                                                        sizeof(rte_spinlock_t),
-                                                       LCORE_CACHE_SIZE);
+                                                       RTE_CACHE_LINE_SIZE);
+                       if (h->multiwriter_lock == NULL)
+                               goto err_unlock;
+
                        rte_spinlock_init(h->multiwriter_lock);
                }
        } else
                h->add_key = ADD_KEY_SINGLEWRITER;
 
        /* Populate free slots ring. Entry zero is reserved for key misses. */
-       for (i = 1; i < params->entries + 1; i++)
+       for (i = 1; i < num_key_slots; i++)
                rte_ring_sp_enqueue(r, (void *)((uintptr_t) i));
 
        te->data = (void *) h;
@@ -392,7 +395,7 @@ void
 rte_hash_reset(struct rte_hash *h)
 {
        void *ptr;
-       unsigned i;
+       uint32_t tot_ring_cnt, i;
 
        if (h == NULL)
                return;
@@ -405,7 +408,13 @@ rte_hash_reset(struct rte_hash *h)
                rte_pause();
 
        /* Repopulate the free slots ring. Entry zero is reserved for key misses */
-       for (i = 1; i < h->entries + 1; i++)
+       if (h->hw_trans_mem_support)
+               tot_ring_cnt = h->entries + (RTE_MAX_LCORE - 1) *
+                                       (LCORE_CACHE_SIZE - 1);
+       else
+               tot_ring_cnt = h->entries;
+
+       for (i = 1; i < tot_ring_cnt + 1; i++)
                rte_ring_sp_enqueue(h->free_slots, (void *)((uintptr_t) i));
 
        if (h->hw_trans_mem_support) {
index 0c94244..a2f1663 100644 (file)
@@ -95,6 +95,9 @@ rte_hash_cuckoo_move_insert_mw_tm(const struct rte_hash *h,
        while (try < RTE_HASH_TSX_MAX_RETRY) {
                status = rte_xbegin();
                if (likely(status == RTE_XBEGIN_STARTED)) {
+                       /* In case empty slot was gone before entering TSX */
+                       if (curr_bkt->key_idx[curr_slot] != EMPTY_SLOT)
+                               rte_xabort(RTE_XABORT_CUCKOO_PATH_INVALIDED);
                        while (likely(curr_node->prev != NULL)) {
                                prev_node = curr_node->prev;
                                prev_bkt = prev_node->bkt;
index f29de81..8da2afa 100644 (file)
@@ -283,8 +283,8 @@ rte_hash_del_key_with_hash(const struct rte_hash *h, const void *key, hash_sig_t
  *   Output containing a pointer to the key
  * @return
  *   - 0 if retrieved successfully
- *   - EINVAL if the parameters are invalid.
- *   - ENOENT if no valid key is found in the given position.
+ *   - -EINVAL if the parameters are invalid.
+ *   - -ENOENT if no valid key is found in the given position.
  */
 int
 rte_hash_get_key_with_position(const struct rte_hash *h, const int32_t position,
@@ -301,9 +301,11 @@ rte_hash_get_key_with_position(const struct rte_hash *h, const int32_t position,
  * @param data
  *   Output with pointer to data returned from the hash table.
  * @return
- *   0 if successful lookup
- *   - EINVAL if the parameters are invalid.
- *   - ENOENT if the key is not found.
+ *   - A positive value that can be used by the caller as an offset into an
+ *     array of user data. This value is unique for this key, and is the same
+ *     value that was returned when the key was added.
+ *   - -EINVAL if the parameters are invalid.
+ *   - -ENOENT if the key is not found.
  */
 int
 rte_hash_lookup_data(const struct rte_hash *h, const void *key, void **data);
@@ -322,9 +324,11 @@ rte_hash_lookup_data(const struct rte_hash *h, const void *key, void **data);
  * @param data
  *   Output with pointer to data returned from the hash table.
  * @return
- *   0 if successful lookup
- *   - EINVAL if the parameters are invalid.
- *   - ENOENT if the key is not found.
+ *   - A positive value that can be used by the caller as an offset into an
+ *     array of user data. This value is unique for this key, and is the same
+ *     value that was returned when the key was added.
+ *   - -EINVAL if the parameters are invalid.
+ *   - -ENOENT if the key is not found.
  */
 int
 rte_hash_lookup_with_hash_data(const struct rte_hash *h, const void *key,
index c3f9208..0c6641b 100644 (file)
@@ -678,6 +678,9 @@ rte_kni_get(const char *name)
        struct rte_kni_memzone_slot *it;
        struct rte_kni *kni;
 
+       if (name == NULL || name[0] == '\0')
+               return NULL;
+
        /* Note: could be improved perf-wise if necessary */
        for (i = 0; i < kni_memzone_pool.max_ifaces; i++) {
                it = &kni_memzone_pool.slots[i];
index acd70bb..6064349 100644 (file)
@@ -566,9 +566,9 @@ extern "C" {
 #define  RTE_ETH_IS_IPV4_HDR(ptype) ((ptype) & RTE_PTYPE_L3_IPV4)
 
 /**
- * Check if the (outer) L3 header is IPv4. To avoid comparing IPv4 types one by
- * one, bit 6 is selected to be used for IPv4 only. Then checking bit 6 can
- * determine if it is an IPV4 packet.
+ * Check if the (outer) L3 header is IPv6. To avoid comparing IPv6 types one by
+ * one, bit 6 is selected to be used for IPv6 only. Then checking bit 6 can
+ * determine if it is an IPV6 packet.
  */
 #define  RTE_ETH_IS_IPV6_HDR(ptype) ((ptype) & RTE_PTYPE_L3_IPV6)
 
index 19d6c95..5234663 100644 (file)
@@ -170,25 +170,25 @@ __rte_raw_cksum(const void *buf, size_t len, uint32_t sum)
        /* workaround gcc strict-aliasing warning */
        uintptr_t ptr = (uintptr_t)buf;
        typedef uint16_t __attribute__((__may_alias__)) u16_p;
-       const u16_p *u16 = (const u16_p *)ptr;
-
-       while (len >= (sizeof(*u16) * 4)) {
-               sum += u16[0];
-               sum += u16[1];
-               sum += u16[2];
-               sum += u16[3];
-               len -= sizeof(*u16) * 4;
-               u16 += 4;
+       const u16_p *u16_buf = (const u16_p *)ptr;
+
+       while (len >= (sizeof(*u16_buf) * 4)) {
+               sum += u16_buf[0];
+               sum += u16_buf[1];
+               sum += u16_buf[2];
+               sum += u16_buf[3];
+               len -= sizeof(*u16_buf) * 4;
+               u16_buf += 4;
        }
-       while (len >= sizeof(*u16)) {
-               sum += *u16;
-               len -= sizeof(*u16);
-               u16 += 1;
+       while (len >= sizeof(*u16_buf)) {
+               sum += *u16_buf;
+               len -= sizeof(*u16_buf);
+               u16_buf += 1;
        }
 
        /* if length is in odd bytes */
        if (len == 1)
-               sum += *((const uint8_t *)u16);
+               sum += *((const uint8_t *)u16_buf);
 
        return sum;
 }
index 010d752..bbf4da9 100644 (file)
@@ -226,12 +226,12 @@ rte_bitmap_get_memory_footprint(uint32_t n_bits) {
 /**
  * Bitmap initialization
  *
- * @param mem_size
- *   Minimum expected size of bitmap.
+ * @param n_bits
+ *   Number of pre-allocated bits in array2.
  * @param mem
  *   Base address of array1 and array2.
- * @param n_bits
- *   Number of pre-allocated bits in array2. Must be non-zero and multiple of 512.
+ * @param mem_size
+ *   Minimum expected size of bitmap.
  * @return
  *   Handle to bitmap instance.
  */
index 2932bad..cfd69ce 100644 (file)
@@ -147,6 +147,7 @@ vhost_log_cache_page(struct virtio_net *dev, struct vhost_virtqueue *vq,
 
        vq->log_cache[i].offset = offset;
        vq->log_cache[i].val = (1UL << bit_nr);
+       vq->log_cache_nb_elem++;
 }
 
 static inline void __attribute__((always_inline))
index 7b0d8b5..713c69d 100644 (file)
@@ -113,18 +113,22 @@ else
        @echo Installation in $(DESTDIR)$(prefix)/ complete
 endif
 
+# when installing we want recursive copies preserving timestamps only, no
+# preservation of user/group ids or permissions
+CP_FLAGS=-dR --preserve=timestamps
+TAR_X_FLAGS=--strip-components=1 --keep-newer-files --no-same-owner --no-same-permissions
+
 install-runtime:
        $(Q)$(call rte_mkdir, $(DESTDIR)$(libdir))
-       $(Q)cp -a    $O/lib/* $(DESTDIR)$(libdir)
+       $(Q)cp $(CP_FLAGS)    $O/lib/* $(DESTDIR)$(libdir)
        $(Q)$(call rte_mkdir, $(DESTDIR)$(bindir))
        $(Q)tar -cf -      -C $O --exclude 'app/*.map' \
                --exclude app/dpdk-pmdinfogen \
                --exclude 'app/cmdline*' --exclude app/test \
                --exclude app/testacl --exclude app/testpipeline app | \
-           tar -xf -      -C $(DESTDIR)$(bindir) --strip-components=1 \
-               --keep-newer-files
+           tar -xf -      -C $(DESTDIR)$(bindir) $(TAR_X_FLAGS)
        $(Q)$(call rte_mkdir,      $(DESTDIR)$(datadir))
-       $(Q)cp -a $(RTE_SDK)/tools $(DESTDIR)$(datadir)
+       $(Q)cp $(CP_FLAGS) $(RTE_SDK)/tools $(DESTDIR)$(datadir)
        $(Q)$(call rte_symlink,    $(DESTDIR)$(datadir)/tools/dpdk-setup.sh, \
                                   $(DESTDIR)$(datadir)/tools/setup.sh)
        $(Q)$(call rte_symlink,    $(DESTDIR)$(datadir)/tools/dpdk-devbind.py, \
@@ -136,30 +140,29 @@ install-runtime:
                                   $(DESTDIR)$(bindir)/dpdk-pmdinfo)
 ifneq ($(wildcard $O/doc/man/*/*.1),)
        $(Q)$(call rte_mkdir,      $(DESTDIR)$(mandir)/man1)
-       $(Q)cp -a $O/doc/man/*/*.1 $(DESTDIR)$(mandir)/man1
+       $(Q)cp $(CP_FLAGS) $O/doc/man/*/*.1 $(DESTDIR)$(mandir)/man1
 endif
 ifneq ($(wildcard $O/doc/man/*/*.8),)
        $(Q)$(call rte_mkdir,      $(DESTDIR)$(mandir)/man8)
-       $(Q)cp -a $O/doc/man/*/*.8 $(DESTDIR)$(mandir)/man8
+       $(Q)cp $(CP_FLAGS) $O/doc/man/*/*.8 $(DESTDIR)$(mandir)/man8
 endif
 
 install-kmod:
 ifneq ($(wildcard $O/kmod/*),)
        $(Q)$(call rte_mkdir, $(DESTDIR)$(kerneldir))
-       $(Q)cp -a   $O/kmod/* $(DESTDIR)$(kerneldir)
+       $(Q)cp $(CP_FLAGS)   $O/kmod/* $(DESTDIR)$(kerneldir)
 endif
 
 install-sdk:
        $(Q)$(call rte_mkdir, $(DESTDIR)$(includedir))
        $(Q)tar -chf -     -C $O include | \
-           tar -xf -      -C $(DESTDIR)$(includedir) --strip-components=1 \
-               --keep-newer-files
+           tar -xf -      -C $(DESTDIR)$(includedir) $(TAR_X_FLAGS)
        $(Q)$(call rte_mkdir,                            $(DESTDIR)$(sdkdir))
-       $(Q)cp -a               $(RTE_SDK)/mk            $(DESTDIR)$(sdkdir)
-       $(Q)cp -a               $(RTE_SDK)/scripts       $(DESTDIR)$(sdkdir)
+       $(Q)cp $(CP_FLAGS)      $(RTE_SDK)/mk            $(DESTDIR)$(sdkdir)
+       $(Q)cp $(CP_FLAGS)      $(RTE_SDK)/scripts       $(DESTDIR)$(sdkdir)
        $(Q)$(call rte_mkdir,                            $(DESTDIR)$(targetdir)/app)
-       $(Q)cp -a               $O/.config               $(DESTDIR)$(targetdir)
-       $(Q)cp -a               $O/app/dpdk-pmdinfogen   $(DESTDIR)$(targetdir)/app
+       $(Q)cp $(CP_FLAGS)      $O/.config               $(DESTDIR)$(targetdir)
+       $(Q)cp $(CP_FLAGS)      $O/app/dpdk-pmdinfogen   $(DESTDIR)$(targetdir)/app
        $(Q)$(call rte_symlink, $(DESTDIR)$(includedir), $(DESTDIR)$(targetdir)/include)
        $(Q)$(call rte_symlink, $(DESTDIR)$(libdir),     $(DESTDIR)$(targetdir)/lib)
 
@@ -167,12 +170,11 @@ install-doc:
 ifneq ($(wildcard $O/doc/html),)
        $(Q)$(call rte_mkdir, $(DESTDIR)$(docdir))
        $(Q)tar -cf -      -C $O/doc html --exclude 'html/guides/.*' | \
-           tar -xf -      -C $(DESTDIR)$(docdir) --strip-components=1 \
-               --keep-newer-files
+           tar -xf -      -C $(DESTDIR)$(docdir) $(TAR_X_FLAGS)
 endif
 ifneq ($(wildcard $O/doc/*/*/*pdf),)
        $(Q)$(call rte_mkdir,     $(DESTDIR)$(docdir)/guides)
-       $(Q)cp -a $O/doc/*/*/*pdf $(DESTDIR)$(docdir)/guides
+       $(Q)cp $(CP_FLAGS) $O/doc/*/*/*pdf $(DESTDIR)$(docdir)/guides
 endif
        $(Q)$(call rte_mkdir,         $(DESTDIR)$(datadir))
-       $(Q)cp -a $(RTE_SDK)/examples $(DESTDIR)$(datadir)
+       $(Q)cp $(CP_FLAGS) $(RTE_SDK)/examples $(DESTDIR)$(datadir)
index 56c3a89..b33a182 100644 (file)
@@ -30,7 +30,7 @@
 # OF THE POSSIBILITY OF SUCH DAMAGE.
 
 Name: dpdk
-Version: 16.11.7
+Version: 16.11.8
 Release: 1
 Packager: packaging@6wind.com
 URL: http://dpdk.org