net/bnxt: add code to determine the Tx COS queue
[dpdk.git] / drivers / net / bnxt / bnxt_hwrm.c
index c9b04e2..3a326d4 100644 (file)
@@ -1,34 +1,6 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) Broadcom Limited.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Broadcom Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2014-2018 Broadcom
+ * All rights reserved.
  */
 
 #include <unistd.h>
@@ -55,6 +27,7 @@
 #include <rte_io.h>
 
 #define HWRM_CMD_TIMEOUT               10000
+#define HWRM_VERSION_1_9_1             0x10901
 
 struct bnxt_plcmodes_cfg {
        uint32_t        flags;
@@ -79,7 +52,7 @@ static int page_getenum(size_t size)
                return 22;
        if (size <= 1 << 30)
                return 30;
-       RTE_LOG(ERR, PMD, "Page size %zu out of range\n", size);
+       PMD_DRV_LOG(ERR, "Page size %zu out of range\n", size);
        return sizeof(void *) * 8 - 1;
 }
 
@@ -161,7 +134,7 @@ static int bnxt_hwrm_send_message(struct bnxt *bp, void *msg,
        }
 
        if (i >= HWRM_CMD_TIMEOUT) {
-               RTE_LOG(ERR, PMD, "Error sending msg 0x%04x\n",
+               PMD_DRV_LOG(ERR, "Error sending msg 0x%04x\n",
                        req->req_type);
                goto err_ret;
        }
@@ -194,8 +167,7 @@ err_ret:
 
 #define HWRM_CHECK_RESULT() do {\
        if (rc) { \
-               RTE_LOG(ERR, PMD, "%s failed rc:%d\n", \
-                       __func__, rc); \
+               PMD_DRV_LOG(ERR, "failed rc:%d\n", rc); \
                rte_spinlock_unlock(&bp->hwrm_lock); \
                return rc; \
        } \
@@ -204,18 +176,15 @@ err_ret:
                if (resp->resp_len >= 16) { \
                        struct hwrm_err_output *tmp_hwrm_err_op = \
                                                (void *)resp; \
-                       RTE_LOG(ERR, PMD, \
-                               "%s error %d:%d:%08x:%04x\n", \
-                               __func__, \
+                       PMD_DRV_LOG(ERR, \
+                               "error %d:%d:%08x:%04x\n", \
                                rc, tmp_hwrm_err_op->cmd_err, \
                                rte_le_to_cpu_32(\
                                        tmp_hwrm_err_op->opaque_0), \
                                rte_le_to_cpu_16(\
                                        tmp_hwrm_err_op->opaque_1)); \
-               } \
-               else { \
-                       RTE_LOG(ERR, PMD, \
-                               "%s error %d\n", __func__, rc); \
+               } else { \
+                       PMD_DRV_LOG(ERR, "error %d\n", rc); \
                } \
                rte_spinlock_unlock(&bp->hwrm_lock); \
                return rc; \
@@ -277,7 +246,7 @@ int bnxt_hwrm_cfa_l2_set_rx_mask(struct bnxt *bp,
                if (!(mask & HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_VLAN_NONVLAN))
                        mask |= HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_VLANONLY;
                req.vlan_tag_tbl_addr = rte_cpu_to_le_64(
-                        rte_mem_virt2phy(vlan_table));
+                        rte_mem_virt2iova(vlan_table));
                req.num_vlan_tags = rte_cpu_to_le_32((uint32_t)vlan_count);
        }
        req.mask = rte_cpu_to_le_32(mask);
@@ -318,7 +287,7 @@ int bnxt_hwrm_cfa_vlan_antispoof_cfg(struct bnxt *bp, uint16_t fid,
        req.fid = rte_cpu_to_le_16(fid);
 
        req.vlan_tag_mask_tbl_addr =
-               rte_cpu_to_le_64(rte_mem_virt2phy(vlan_table));
+               rte_cpu_to_le_64(rte_mem_virt2iova(vlan_table));
        req.num_vlan_entries = rte_cpu_to_le_32((uint32_t)vlan_count);
 
        rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
@@ -367,8 +336,9 @@ int bnxt_hwrm_set_l2_filter(struct bnxt *bp,
        uint16_t j = dst_id - 1;
 
        //TODO: Is there a better way to add VLANs to each VNIC in case of VMDQ
-       if (conf->pool_map[j].pools & (1UL << j)) {
-               RTE_LOG(DEBUG, PMD,
+       if ((dev_conf->rxmode.mq_mode & ETH_MQ_RX_VMDQ_FLAG) &&
+           conf->pool_map[j].pools & (1UL << j)) {
+               PMD_DRV_LOG(DEBUG,
                        "Add vlan %u to vmdq pool %u\n",
                        conf->pool_map[j].vlan_id, j);
 
@@ -426,12 +396,95 @@ int bnxt_hwrm_set_l2_filter(struct bnxt *bp,
        return rc;
 }
 
+int bnxt_hwrm_ptp_cfg(struct bnxt *bp)
+{
+       struct hwrm_port_mac_cfg_input req = {.req_type = 0};
+       struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
+       uint32_t flags = 0;
+       int rc;
+
+       if (!ptp)
+               return 0;
+
+       HWRM_PREP(req, PORT_MAC_CFG);
+
+       if (ptp->rx_filter)
+               flags |= PORT_MAC_CFG_REQ_FLAGS_PTP_RX_TS_CAPTURE_ENABLE;
+       else
+               flags |= PORT_MAC_CFG_REQ_FLAGS_PTP_RX_TS_CAPTURE_DISABLE;
+       if (ptp->tx_tstamp_en)
+               flags |= PORT_MAC_CFG_REQ_FLAGS_PTP_TX_TS_CAPTURE_ENABLE;
+       else
+               flags |= PORT_MAC_CFG_REQ_FLAGS_PTP_TX_TS_CAPTURE_DISABLE;
+       req.flags = rte_cpu_to_le_32(flags);
+       req.enables =
+       rte_cpu_to_le_32(PORT_MAC_CFG_REQ_ENABLES_RX_TS_CAPTURE_PTP_MSG_TYPE);
+       req.rx_ts_capture_ptp_msg_type = rte_cpu_to_le_16(ptp->rxctl);
+
+       rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
+       HWRM_UNLOCK();
+
+       return rc;
+}
+
+static int bnxt_hwrm_ptp_qcfg(struct bnxt *bp)
+{
+       int rc = 0;
+       struct hwrm_port_mac_ptp_qcfg_input req = {.req_type = 0};
+       struct hwrm_port_mac_ptp_qcfg_output *resp = bp->hwrm_cmd_resp_addr;
+       struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
+
+/*     if (bp->hwrm_spec_code < 0x10801 || ptp)  TBD  */
+       if (ptp)
+               return 0;
+
+       HWRM_PREP(req, PORT_MAC_PTP_QCFG);
+
+       req.port_id = rte_cpu_to_le_16(bp->pf.port_id);
+
+       rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
+
+       HWRM_CHECK_RESULT();
+
+       if (!(resp->flags & PORT_MAC_PTP_QCFG_RESP_FLAGS_DIRECT_ACCESS))
+               return 0;
+
+       ptp = rte_zmalloc("ptp_cfg", sizeof(*ptp), 0);
+       if (!ptp)
+               return -ENOMEM;
+
+       ptp->rx_regs[BNXT_PTP_RX_TS_L] =
+               rte_le_to_cpu_32(resp->rx_ts_reg_off_lower);
+       ptp->rx_regs[BNXT_PTP_RX_TS_H] =
+               rte_le_to_cpu_32(resp->rx_ts_reg_off_upper);
+       ptp->rx_regs[BNXT_PTP_RX_SEQ] =
+               rte_le_to_cpu_32(resp->rx_ts_reg_off_seq_id);
+       ptp->rx_regs[BNXT_PTP_RX_FIFO] =
+               rte_le_to_cpu_32(resp->rx_ts_reg_off_fifo);
+       ptp->rx_regs[BNXT_PTP_RX_FIFO_ADV] =
+               rte_le_to_cpu_32(resp->rx_ts_reg_off_fifo_adv);
+       ptp->tx_regs[BNXT_PTP_TX_TS_L] =
+               rte_le_to_cpu_32(resp->tx_ts_reg_off_lower);
+       ptp->tx_regs[BNXT_PTP_TX_TS_H] =
+               rte_le_to_cpu_32(resp->tx_ts_reg_off_upper);
+       ptp->tx_regs[BNXT_PTP_TX_SEQ] =
+               rte_le_to_cpu_32(resp->tx_ts_reg_off_seq_id);
+       ptp->tx_regs[BNXT_PTP_TX_FIFO] =
+               rte_le_to_cpu_32(resp->tx_ts_reg_off_fifo);
+
+       ptp->bp = bp;
+       bp->ptp_cfg = ptp;
+
+       return 0;
+}
+
 int bnxt_hwrm_func_qcaps(struct bnxt *bp)
 {
        int rc = 0;
        struct hwrm_func_qcaps_input req = {.req_type = 0 };
        struct hwrm_func_qcaps_output *resp = bp->hwrm_cmd_resp_addr;
        uint16_t new_max_vfs;
+       uint32_t flags;
        int i;
 
        HWRM_PREP(req, FUNC_QCAPS);
@@ -443,6 +496,7 @@ int bnxt_hwrm_func_qcaps(struct bnxt *bp)
        HWRM_CHECK_RESULT();
 
        bp->max_ring_grps = rte_le_to_cpu_32(resp->max_hw_ring_grps);
+       flags = rte_le_to_cpu_32(resp->flags);
        if (BNXT_PF(bp)) {
                bp->pf.port_id = resp->port_id;
                bp->pf.first_vf_id = rte_le_to_cpu_16(resp->first_vf_id);
@@ -460,7 +514,7 @@ int bnxt_hwrm_func_qcaps(struct bnxt *bp)
                                                    getpagesize(),
                                                    getpagesize());
                                if (bp->pf.vf_info[i].vlan_table == NULL)
-                                       RTE_LOG(ERR, PMD,
+                                       PMD_DRV_LOG(ERR,
                                        "Fail to alloc VLAN table for VF %d\n",
                                        i);
                                else
@@ -471,7 +525,7 @@ int bnxt_hwrm_func_qcaps(struct bnxt *bp)
                                                    getpagesize(),
                                                    getpagesize());
                                if (bp->pf.vf_info[i].vlan_as_table == NULL)
-                                       RTE_LOG(ERR, PMD,
+                                       PMD_DRV_LOG(ERR,
                                        "Alloc VLAN AS table for VF %d fail\n",
                                        i);
                                else
@@ -499,8 +553,16 @@ int bnxt_hwrm_func_qcaps(struct bnxt *bp)
                bp->max_vnics = 1;
        }
        bp->max_stat_ctx = rte_le_to_cpu_16(resp->max_stat_ctx);
-       if (BNXT_PF(bp))
+       if (BNXT_PF(bp)) {
                bp->pf.total_vnics = rte_le_to_cpu_16(resp->max_vnics);
+               if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_PTP_SUPPORTED) {
+                       bp->flags |= BNXT_FLAG_PTP_SUPPORTED;
+                       PMD_DRV_LOG(INFO, "PTP SUPPORTED\n");
+                       HWRM_UNLOCK();
+                       bnxt_hwrm_ptp_qcfg(bp);
+               }
+       }
+
        HWRM_UNLOCK();
 
        return rc;
@@ -548,8 +610,13 @@ int bnxt_hwrm_func_driver_register(struct bnxt *bp)
                               sizeof(bp->pf.vf_req_fwd)));
        }
 
-       req.async_event_fwd[0] |= rte_cpu_to_le_32(0x1);   /* TODO: Use MACRO */
-       memset(req.async_event_fwd, 0xff, sizeof(req.async_event_fwd));
+       req.async_event_fwd[0] |=
+               rte_cpu_to_le_32(ASYNC_CMPL_EVENT_ID_LINK_STATUS_CHANGE |
+                                ASYNC_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED |
+                                ASYNC_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE);
+       req.async_event_fwd[1] |=
+               rte_cpu_to_le_32(ASYNC_CMPL_EVENT_ID_PF_DRVR_UNLOAD |
+                                ASYNC_CMPL_EVENT_ID_VF_CFG_CHANGE);
 
        rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
 
@@ -583,13 +650,13 @@ int bnxt_hwrm_ver_get(struct bnxt *bp)
 
        HWRM_CHECK_RESULT();
 
-       RTE_LOG(INFO, PMD, "%d.%d.%d:%d.%d.%d\n",
+       PMD_DRV_LOG(INFO, "%d.%d.%d:%d.%d.%d\n",
                resp->hwrm_intf_maj, resp->hwrm_intf_min,
                resp->hwrm_intf_upd,
                resp->hwrm_fw_maj, resp->hwrm_fw_min, resp->hwrm_fw_bld);
        bp->fw_ver = (resp->hwrm_fw_maj << 24) | (resp->hwrm_fw_min << 16) |
                        (resp->hwrm_fw_bld << 8) | resp->hwrm_fw_rsvd;
-       RTE_LOG(INFO, PMD, "Driver HWRM version: %d.%d.%d\n",
+       PMD_DRV_LOG(INFO, "Driver HWRM version: %d.%d.%d\n",
                HWRM_VERSION_MAJOR, HWRM_VERSION_MINOR, HWRM_VERSION_UPDATE);
 
        my_version = HWRM_VERSION_MAJOR << 16;
@@ -599,30 +666,31 @@ int bnxt_hwrm_ver_get(struct bnxt *bp)
        fw_version = resp->hwrm_intf_maj << 16;
        fw_version |= resp->hwrm_intf_min << 8;
        fw_version |= resp->hwrm_intf_upd;
+       bp->hwrm_spec_code = fw_version;
 
        if (resp->hwrm_intf_maj != HWRM_VERSION_MAJOR) {
-               RTE_LOG(ERR, PMD, "Unsupported firmware API version\n");
+               PMD_DRV_LOG(ERR, "Unsupported firmware API version\n");
                rc = -EINVAL;
                goto error;
        }
 
        if (my_version != fw_version) {
-               RTE_LOG(INFO, PMD, "BNXT Driver/HWRM API mismatch.\n");
+               PMD_DRV_LOG(INFO, "BNXT Driver/HWRM API mismatch.\n");
                if (my_version < fw_version) {
-                       RTE_LOG(INFO, PMD,
+                       PMD_DRV_LOG(INFO,
                                "Firmware API version is newer than driver.\n");
-                       RTE_LOG(INFO, PMD,
+                       PMD_DRV_LOG(INFO,
                                "The driver may be missing features.\n");
                } else {
-                       RTE_LOG(INFO, PMD,
+                       PMD_DRV_LOG(INFO,
                                "Firmware API version is older than driver.\n");
-                       RTE_LOG(INFO, PMD,
+                       PMD_DRV_LOG(INFO,
                                "Not all driver features may be functional.\n");
                }
        }
 
        if (bp->max_req_len > resp->max_req_win_len) {
-               RTE_LOG(ERR, PMD, "Unsupported request length\n");
+               PMD_DRV_LOG(ERR, "Unsupported request length\n");
                rc = -EINVAL;
        }
        bp->max_req_len = rte_le_to_cpu_16(resp->max_req_win_len);
@@ -643,9 +711,9 @@ int bnxt_hwrm_ver_get(struct bnxt *bp)
                }
                rte_mem_lock_page(bp->hwrm_cmd_resp_addr);
                bp->hwrm_cmd_resp_dma_addr =
-                       rte_mem_virt2phy(bp->hwrm_cmd_resp_addr);
+                       rte_mem_virt2iova(bp->hwrm_cmd_resp_addr);
                if (bp->hwrm_cmd_resp_dma_addr == 0) {
-                       RTE_LOG(ERR, PMD,
+                       PMD_DRV_LOG(ERR,
                        "Unable to map response buffer to physical memory.\n");
                        rc = -ENOMEM;
                        goto error;
@@ -657,7 +725,7 @@ int bnxt_hwrm_ver_get(struct bnxt *bp)
                HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_SHORT_CMD_SUPPORTED) &&
            (dev_caps_cfg &
             HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_SHORT_CMD_INPUTUIRED)) {
-               RTE_LOG(DEBUG, PMD, "Short command supported\n");
+               PMD_DRV_LOG(DEBUG, "Short command supported\n");
 
                rte_free(bp->hwrm_short_cmd_req_addr);
 
@@ -669,10 +737,10 @@ int bnxt_hwrm_ver_get(struct bnxt *bp)
                }
                rte_mem_lock_page(bp->hwrm_short_cmd_req_addr);
                bp->hwrm_short_cmd_req_dma_addr =
-                       rte_mem_virt2phy(bp->hwrm_short_cmd_req_addr);
+                       rte_mem_virt2iova(bp->hwrm_short_cmd_req_addr);
                if (bp->hwrm_short_cmd_req_dma_addr == 0) {
                        rte_free(bp->hwrm_short_cmd_req_addr);
-                       RTE_LOG(ERR, PMD,
+                       PMD_DRV_LOG(ERR,
                                "Unable to map buffer to physical memory.\n");
                        rc = -ENOMEM;
                        goto error;
@@ -714,34 +782,39 @@ static int bnxt_hwrm_port_phy_cfg(struct bnxt *bp, struct bnxt_link_info *conf)
        struct hwrm_port_phy_cfg_input req = {0};
        struct hwrm_port_phy_cfg_output *resp = bp->hwrm_cmd_resp_addr;
        uint32_t enables = 0;
-       uint32_t link_speed_mask =
-               HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_LINK_SPEED_MASK;
 
        HWRM_PREP(req, PORT_PHY_CFG);
 
        if (conf->link_up) {
+               /* Setting Fixed Speed. But AutoNeg is ON, So disable it */
+               if (bp->link_info.auto_mode && conf->link_speed) {
+                       req.auto_mode = HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_NONE;
+                       PMD_DRV_LOG(DEBUG, "Disabling AutoNeg\n");
+               }
+
                req.flags = rte_cpu_to_le_32(conf->phy_flags);
                req.force_link_speed = rte_cpu_to_le_16(conf->link_speed);
+               enables |= HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_MODE;
                /*
                 * Note, ChiMP FW 20.2.1 and 20.2.2 return an error when we set
                 * any auto mode, even "none".
                 */
                if (!conf->link_speed) {
-                       req.auto_mode = conf->auto_mode;
-                       enables |= HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_MODE;
-                       if (conf->auto_mode ==
-                           HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_SPEED_MASK) {
-                               req.auto_link_speed_mask =
-                                       conf->auto_link_speed_mask;
-                               enables |= link_speed_mask;
-                       }
-                       if (bp->link_info.auto_link_speed) {
-                               req.auto_link_speed =
-                                       bp->link_info.auto_link_speed;
-                               enables |=
-                               HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_LINK_SPEED;
-                       }
+                       /* No speeds specified. Enable AutoNeg - all speeds */
+                       req.auto_mode =
+                               HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_ALL_SPEEDS;
+               }
+               /* AutoNeg - Advertise speeds specified. */
+               if (conf->auto_link_speed_mask &&
+                   !(conf->phy_flags & HWRM_PORT_PHY_CFG_INPUT_FLAGS_FORCE)) {
+                       req.auto_mode =
+                               HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_SPEED_MASK;
+                       req.auto_link_speed_mask =
+                               conf->auto_link_speed_mask;
+                       enables |=
+                       HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_LINK_SPEED_MASK;
                }
+
                req.auto_duplex = conf->duplex;
                enables |= HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_DUPLEX;
                req.auto_pause = conf->auto_pause;
@@ -756,7 +829,7 @@ static int bnxt_hwrm_port_phy_cfg(struct bnxt *bp, struct bnxt_link_info *conf)
        } else {
                req.flags =
                rte_cpu_to_le_32(HWRM_PORT_PHY_CFG_INPUT_FLAGS_FORCE_LINK_DWN);
-               RTE_LOG(INFO, PMD, "Force Link Down\n");
+               PMD_DRV_LOG(INFO, "Force Link Down\n");
        }
 
        rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
@@ -785,21 +858,33 @@ static int bnxt_hwrm_port_phy_qcfg(struct bnxt *bp,
                (link_info->phy_link_status ==
                 HWRM_PORT_PHY_QCFG_OUTPUT_LINK_LINK) ? 1 : 0;
        link_info->link_speed = rte_le_to_cpu_16(resp->link_speed);
-       link_info->duplex = resp->duplex;
+       link_info->duplex = resp->duplex_cfg;
        link_info->pause = resp->pause;
        link_info->auto_pause = resp->auto_pause;
        link_info->force_pause = resp->force_pause;
        link_info->auto_mode = resp->auto_mode;
+       link_info->phy_type = resp->phy_type;
+       link_info->media_type = resp->media_type;
 
        link_info->support_speeds = rte_le_to_cpu_16(resp->support_speeds);
        link_info->auto_link_speed = rte_le_to_cpu_16(resp->auto_link_speed);
        link_info->preemphasis = rte_le_to_cpu_32(resp->preemphasis);
+       link_info->force_link_speed = rte_le_to_cpu_16(resp->force_link_speed);
        link_info->phy_ver[0] = resp->phy_maj;
        link_info->phy_ver[1] = resp->phy_min;
        link_info->phy_ver[2] = resp->phy_bld;
 
        HWRM_UNLOCK();
 
+       PMD_DRV_LOG(DEBUG, "Link Speed %d\n", link_info->link_speed);
+       PMD_DRV_LOG(DEBUG, "Auto Mode %d\n", link_info->auto_mode);
+       PMD_DRV_LOG(DEBUG, "Support Speeds %x\n", link_info->support_speeds);
+       PMD_DRV_LOG(DEBUG, "Auto Link Speed %x\n", link_info->auto_link_speed);
+       PMD_DRV_LOG(DEBUG, "Auto Link Speed Mask %x\n",
+                   link_info->auto_link_speed_mask);
+       PMD_DRV_LOG(DEBUG, "Forced Link Speed %x\n",
+                   link_info->force_link_speed);
+
        return rc;
 }
 
@@ -808,9 +893,15 @@ int bnxt_hwrm_queue_qportcfg(struct bnxt *bp)
        int rc = 0;
        struct hwrm_queue_qportcfg_input req = {.req_type = 0 };
        struct hwrm_queue_qportcfg_output *resp = bp->hwrm_cmd_resp_addr;
+       int i;
 
        HWRM_PREP(req, QUEUE_QPORTCFG);
 
+       req.flags = HWRM_QUEUE_QPORTCFG_INPUT_FLAGS_PATH_TX;
+       /* HWRM Version >= 1.9.1 */
+       if (bp->hwrm_spec_code >= HWRM_VERSION_1_9_1)
+               req.drv_qmap_cap =
+                       HWRM_QUEUE_QPORTCFG_INPUT_DRV_QMAP_CAP_ENABLED;
        rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
 
        HWRM_CHECK_RESULT();
@@ -830,6 +921,20 @@ int bnxt_hwrm_queue_qportcfg(struct bnxt *bp)
 
        HWRM_UNLOCK();
 
+       if (bp->hwrm_spec_code < HWRM_VERSION_1_9_1) {
+               bp->tx_cosq_id = bp->cos_queue[0].id;
+       } else {
+               /* iterate and find the COSq profile to use for Tx */
+               for (i = 0; i < BNXT_COS_QUEUE_COUNT; i++) {
+                       if (bp->cos_queue[i].profile ==
+                               HWRM_QUEUE_SERVICE_PROFILE_LOSSY) {
+                               bp->tx_cosq_id = bp->cos_queue[i].id;
+                               break;
+                       }
+               }
+       }
+       PMD_DRV_LOG(DEBUG, "Tx Cos Queue to use: %d\n", bp->tx_cosq_id);
+
        return rc;
 }
 
@@ -853,7 +958,7 @@ int bnxt_hwrm_ring_alloc(struct bnxt *bp,
 
        switch (ring_type) {
        case HWRM_RING_ALLOC_INPUT_RING_TYPE_TX:
-               req.queue_id = bp->cos_queue[0].id;
+               req.queue_id = rte_cpu_to_le_16(bp->tx_cosq_id);
                /* FALLTHROUGH */
        case HWRM_RING_ALLOC_INPUT_RING_TYPE_RX:
                req.ring_type = ring_type;
@@ -872,7 +977,7 @@ int bnxt_hwrm_ring_alloc(struct bnxt *bp,
                req.int_mode = HWRM_RING_ALLOC_INPUT_INT_MODE_MSIX;
                break;
        default:
-               RTE_LOG(ERR, PMD, "hwrm alloc invalid ring type %d\n",
+               PMD_DRV_LOG(ERR, "hwrm alloc invalid ring type %d\n",
                        ring_type);
                HWRM_UNLOCK();
                return -1;
@@ -886,22 +991,22 @@ int bnxt_hwrm_ring_alloc(struct bnxt *bp,
                        rc = rte_le_to_cpu_16(resp->error_code);
                switch (ring_type) {
                case HWRM_RING_FREE_INPUT_RING_TYPE_L2_CMPL:
-                       RTE_LOG(ERR, PMD,
+                       PMD_DRV_LOG(ERR,
                                "hwrm_ring_alloc cp failed. rc:%d\n", rc);
                        HWRM_UNLOCK();
                        return rc;
                case HWRM_RING_FREE_INPUT_RING_TYPE_RX:
-                       RTE_LOG(ERR, PMD,
+                       PMD_DRV_LOG(ERR,
                                "hwrm_ring_alloc rx failed. rc:%d\n", rc);
                        HWRM_UNLOCK();
                        return rc;
                case HWRM_RING_FREE_INPUT_RING_TYPE_TX:
-                       RTE_LOG(ERR, PMD,
+                       PMD_DRV_LOG(ERR,
                                "hwrm_ring_alloc tx failed. rc:%d\n", rc);
                        HWRM_UNLOCK();
                        return rc;
                default:
-                       RTE_LOG(ERR, PMD, "Invalid ring. rc:%d\n", rc);
+                       PMD_DRV_LOG(ERR, "Invalid ring. rc:%d\n", rc);
                        HWRM_UNLOCK();
                        return rc;
                }
@@ -933,19 +1038,19 @@ int bnxt_hwrm_ring_free(struct bnxt *bp,
 
                switch (ring_type) {
                case HWRM_RING_FREE_INPUT_RING_TYPE_L2_CMPL:
-                       RTE_LOG(ERR, PMD, "hwrm_ring_free cp failed. rc:%d\n",
+                       PMD_DRV_LOG(ERR, "hwrm_ring_free cp failed. rc:%d\n",
                                rc);
                        return rc;
                case HWRM_RING_FREE_INPUT_RING_TYPE_RX:
-                       RTE_LOG(ERR, PMD, "hwrm_ring_free rx failed. rc:%d\n",
+                       PMD_DRV_LOG(ERR, "hwrm_ring_free rx failed. rc:%d\n",
                                rc);
                        return rc;
                case HWRM_RING_FREE_INPUT_RING_TYPE_TX:
-                       RTE_LOG(ERR, PMD, "hwrm_ring_free tx failed. rc:%d\n",
+                       PMD_DRV_LOG(ERR, "hwrm_ring_free tx failed. rc:%d\n",
                                rc);
                        return rc;
                default:
-                       RTE_LOG(ERR, PMD, "Invalid ring, rc:%d\n", rc);
+                       PMD_DRV_LOG(ERR, "Invalid ring, rc:%d\n", rc);
                        return rc;
                }
        }
@@ -1039,7 +1144,6 @@ int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
        cpr->hw_stats_ctx_id = rte_le_to_cpu_16(resp->stat_ctx_id);
 
        HWRM_UNLOCK();
-       bp->grp_info[idx].fw_stats_ctx = cpr->hw_stats_ctx_id;
 
        return rc;
 }
@@ -1070,7 +1174,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 */
-       RTE_LOG(DEBUG, PMD, "Alloc VNIC. Start %x, End %x\n",
+       PMD_DRV_LOG(DEBUG, "Alloc VNIC. Start %x, End %x\n",
                vnic->start_grp_id, vnic->end_grp_id);
        for (i = vnic->start_grp_id, j = 0; i <= vnic->end_grp_id; i++, j++)
                vnic->fw_grp_ids[j] = bp->grp_info[i].fw_grp_id;
@@ -1083,14 +1187,15 @@ int bnxt_hwrm_vnic_alloc(struct bnxt *bp, struct bnxt_vnic_info *vnic)
        HWRM_PREP(req, VNIC_ALLOC);
 
        if (vnic->func_default)
-               req.flags = HWRM_VNIC_ALLOC_INPUT_FLAGS_DEFAULT;
+               req.flags =
+                       rte_cpu_to_le_32(HWRM_VNIC_ALLOC_INPUT_FLAGS_DEFAULT);
        rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
 
        HWRM_CHECK_RESULT();
 
        vnic->fw_vnic_id = rte_le_to_cpu_16(resp->vnic_id);
        HWRM_UNLOCK();
-       RTE_LOG(DEBUG, PMD, "VNIC ID %x\n", vnic->fw_vnic_id);
+       PMD_DRV_LOG(DEBUG, "VNIC ID %x\n", vnic->fw_vnic_id);
        return rc;
 }
 
@@ -1160,7 +1265,7 @@ int bnxt_hwrm_vnic_cfg(struct bnxt *bp, struct bnxt_vnic_info *vnic)
        struct bnxt_plcmodes_cfg pmodes;
 
        if (vnic->fw_vnic_id == INVALID_HW_RING_ID) {
-               RTE_LOG(DEBUG, PMD, "VNIC ID %x\n", vnic->fw_vnic_id);
+               PMD_DRV_LOG(DEBUG, "VNIC ID %x\n", vnic->fw_vnic_id);
                return rc;
        }
 
@@ -1225,7 +1330,7 @@ int bnxt_hwrm_vnic_qcfg(struct bnxt *bp, struct bnxt_vnic_info *vnic,
        struct hwrm_vnic_qcfg_output *resp = bp->hwrm_cmd_resp_addr;
 
        if (vnic->fw_vnic_id == INVALID_HW_RING_ID) {
-               RTE_LOG(DEBUG, PMD, "VNIC QCFG ID %d\n", vnic->fw_vnic_id);
+               PMD_DRV_LOG(DEBUG, "VNIC QCFG ID %d\n", vnic->fw_vnic_id);
                return rc;
        }
        HWRM_PREP(req, VNIC_QCFG);
@@ -1277,7 +1382,7 @@ int bnxt_hwrm_vnic_ctx_alloc(struct bnxt *bp, struct bnxt_vnic_info *vnic)
 
        vnic->rss_rule = rte_le_to_cpu_16(resp->rss_cos_lb_ctx_id);
        HWRM_UNLOCK();
-       RTE_LOG(DEBUG, PMD, "VNIC RSS Rule %x\n", vnic->rss_rule);
+       PMD_DRV_LOG(DEBUG, "VNIC RSS Rule %x\n", vnic->rss_rule);
 
        return rc;
 }
@@ -1290,7 +1395,7 @@ int bnxt_hwrm_vnic_ctx_free(struct bnxt *bp, struct bnxt_vnic_info *vnic)
                                                bp->hwrm_cmd_resp_addr;
 
        if (vnic->rss_rule == 0xffff) {
-               RTE_LOG(DEBUG, PMD, "VNIC RSS Rule %x\n", vnic->rss_rule);
+               PMD_DRV_LOG(DEBUG, "VNIC RSS Rule %x\n", vnic->rss_rule);
                return rc;
        }
        HWRM_PREP(req, VNIC_RSS_COS_LB_CTX_FREE);
@@ -1314,7 +1419,7 @@ int bnxt_hwrm_vnic_free(struct bnxt *bp, struct bnxt_vnic_info *vnic)
        struct hwrm_vnic_free_output *resp = bp->hwrm_cmd_resp_addr;
 
        if (vnic->fw_vnic_id == INVALID_HW_RING_ID) {
-               RTE_LOG(DEBUG, PMD, "VNIC FREE ID %x\n", vnic->fw_vnic_id);
+               PMD_DRV_LOG(DEBUG, "VNIC FREE ID %x\n", vnic->fw_vnic_id);
                return rc;
        }
 
@@ -1407,12 +1512,12 @@ int bnxt_hwrm_vnic_tpa_cfg(struct bnxt *bp,
                                HWRM_VNIC_TPA_CFG_INPUT_FLAGS_GRO |
                                HWRM_VNIC_TPA_CFG_INPUT_FLAGS_AGG_WITH_ECN |
                        HWRM_VNIC_TPA_CFG_INPUT_FLAGS_AGG_WITH_SAME_GRE_SEQ);
-               req.vnic_id = rte_cpu_to_le_32(vnic->fw_vnic_id);
                req.max_agg_segs = rte_cpu_to_le_16(5);
                req.max_aggs =
                        rte_cpu_to_le_16(HWRM_VNIC_TPA_CFG_INPUT_MAX_AGGS_MAX);
                req.min_agg_len = rte_cpu_to_le_32(512);
        }
+       req.vnic_id = rte_cpu_to_le_32(vnic->fw_vnic_id);
 
        rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
 
@@ -1562,19 +1667,15 @@ int bnxt_free_all_hwrm_stat_ctxs(struct bnxt *bp)
 
        for (i = 0; i < bp->rx_cp_nr_rings + bp->tx_cp_nr_rings; i++) {
 
-               if (i >= bp->rx_cp_nr_rings)
+               if (i >= bp->rx_cp_nr_rings) {
                        cpr = bp->tx_queues[i - bp->rx_cp_nr_rings]->cp_ring;
-               else
+               } else {
                        cpr = bp->rx_queues[i]->cp_ring;
+                       bp->grp_info[i].fw_stats_ctx = -1;
+               }
                if (cpr->hw_stats_ctx_id != HWRM_NA_SIGNATURE) {
                        rc = bnxt_hwrm_stat_ctx_free(bp, cpr, i);
                        cpr->hw_stats_ctx_id = HWRM_NA_SIGNATURE;
-                       /*
-                        * TODO. Need a better way to reset grp_info.stats_ctx
-                        * for Rx rings only. stats_ctx is not saved for Tx
-                        * in grp_info.
-                        */
-                       bp->grp_info[i].fw_stats_ctx = cpr->hw_stats_ctx_id;
                        if (rc)
                                return rc;
                }
@@ -1634,7 +1735,6 @@ static void bnxt_free_cp_ring(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
        bnxt_hwrm_ring_free(bp, cp_ring,
                        HWRM_RING_FREE_INPUT_RING_TYPE_L2_CMPL);
        cp_ring->fw_ring_id = INVALID_HW_RING_ID;
-       bp->grp_info[idx].cp_fw_ring_id = INVALID_HW_RING_ID;
        memset(cpr->cp_desc_ring, 0, cpr->cp_ring_struct->ring_size *
                        sizeof(*cpr->cp_desc_ring));
        cpr->cp_raw_cons = 0;
@@ -1690,10 +1790,17 @@ int bnxt_free_all_hwrm_rings(struct bnxt *bp)
                                        rxr->rx_ring_struct->ring_size *
                                        sizeof(*rxr->rx_buf_ring));
                        rxr->rx_prod = 0;
+               }
+               ring = rxr->ag_ring_struct;
+               if (ring->fw_ring_id != INVALID_HW_RING_ID) {
+                       bnxt_hwrm_ring_free(bp, ring,
+                                           HWRM_RING_FREE_INPUT_RING_TYPE_RX);
+                       ring->fw_ring_id = INVALID_HW_RING_ID;
                        memset(rxr->ag_buf_ring, 0,
-                                       rxr->ag_ring_struct->ring_size *
-                                       sizeof(*rxr->ag_buf_ring));
+                              rxr->ag_ring_struct->ring_size *
+                              sizeof(*rxr->ag_buf_ring));
                        rxr->ag_prod = 0;
+                       bp->grp_info[i].ag_fw_ring_id = INVALID_HW_RING_ID;
                }
                if (cpr->cp_ring_struct->fw_ring_id != INVALID_HW_RING_ID) {
                        bnxt_free_cp_ring(bp, cpr, idx);
@@ -1752,9 +1859,9 @@ int bnxt_alloc_hwrm_resources(struct bnxt *bp)
        if (bp->hwrm_cmd_resp_addr == NULL)
                return -ENOMEM;
        bp->hwrm_cmd_resp_dma_addr =
-               rte_mem_virt2phy(bp->hwrm_cmd_resp_addr);
+               rte_mem_virt2iova(bp->hwrm_cmd_resp_addr);
        if (bp->hwrm_cmd_resp_dma_addr == 0) {
-               RTE_LOG(ERR, PMD,
+               PMD_DRV_LOG(ERR,
                        "unable to map response address to physical memory\n");
                return -ENOMEM;
        }
@@ -1790,7 +1897,7 @@ bnxt_clear_hwrm_vnic_flows(struct bnxt *bp, struct bnxt_vnic_info *vnic)
 
        STAILQ_FOREACH(flow, &vnic->flow_list, next) {
                filter = flow->filter;
-               RTE_LOG(ERR, PMD, "filter type %d\n", filter->filter_type);
+               PMD_DRV_LOG(ERR, "filter type %d\n", filter->filter_type);
                if (filter->filter_type == HWRM_CFA_EM_FILTER)
                        rc = bnxt_hwrm_clear_em_filter(bp, filter);
                else if (filter->filter_type == HWRM_CFA_NTUPLE_FILTER)
@@ -1885,6 +1992,11 @@ static uint16_t bnxt_parse_eth_link_duplex(uint32_t conf_link_speed)
        return hw_link_duplex;
 }
 
+static uint16_t bnxt_check_eth_link_autoneg(uint32_t conf_link)
+{
+       return (conf_link & ETH_LINK_SPEED_FIXED) ? 0 : 1;
+}
+
 static uint16_t bnxt_parse_eth_link_speed(uint32_t conf_link_speed)
 {
        uint16_t eth_link_speed = 0;
@@ -1926,8 +2038,12 @@ static uint16_t bnxt_parse_eth_link_speed(uint32_t conf_link_speed)
                eth_link_speed =
                        HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_50GB;
                break;
+       case ETH_LINK_SPEED_100G:
+               eth_link_speed =
+                       HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_100GB;
+               break;
        default:
-               RTE_LOG(ERR, PMD,
+               PMD_DRV_LOG(ERR,
                        "Unsupported link speed %d; default to AUTO\n",
                        conf_link_speed);
                break;
@@ -1938,9 +2054,9 @@ static uint16_t bnxt_parse_eth_link_speed(uint32_t conf_link_speed)
 #define BNXT_SUPPORTED_SPEEDS (ETH_LINK_SPEED_100M | ETH_LINK_SPEED_100M_HD | \
                ETH_LINK_SPEED_1G | ETH_LINK_SPEED_2_5G | \
                ETH_LINK_SPEED_10G | ETH_LINK_SPEED_20G | ETH_LINK_SPEED_25G | \
-               ETH_LINK_SPEED_40G | ETH_LINK_SPEED_50G)
+               ETH_LINK_SPEED_40G | ETH_LINK_SPEED_50G | ETH_LINK_SPEED_100G)
 
-static int bnxt_valid_link_speed(uint32_t link_speed, uint8_t port_id)
+static int bnxt_valid_link_speed(uint32_t link_speed, uint16_t port_id)
 {
        uint32_t one_speed;
 
@@ -1951,20 +2067,20 @@ static int bnxt_valid_link_speed(uint32_t link_speed, uint8_t port_id)
                one_speed = link_speed & ~ETH_LINK_SPEED_FIXED;
 
                if (one_speed & (one_speed - 1)) {
-                       RTE_LOG(ERR, PMD,
+                       PMD_DRV_LOG(ERR,
                                "Invalid advertised speeds (%u) for port %u\n",
                                link_speed, port_id);
                        return -EINVAL;
                }
                if ((one_speed & BNXT_SUPPORTED_SPEEDS) != one_speed) {
-                       RTE_LOG(ERR, PMD,
+                       PMD_DRV_LOG(ERR,
                                "Unsupported advertised speed (%u) for port %u\n",
                                link_speed, port_id);
                        return -EINVAL;
                }
        } else {
                if (!(link_speed & BNXT_SUPPORTED_SPEEDS)) {
-                       RTE_LOG(ERR, PMD,
+                       PMD_DRV_LOG(ERR,
                                "Unsupported advertised speeds (%u) for port %u\n",
                                link_speed, port_id);
                        return -EINVAL;
@@ -2002,6 +2118,8 @@ bnxt_parse_eth_link_speed_mask(struct bnxt *bp, uint32_t link_speed)
                ret |= HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_40GB;
        if (link_speed & ETH_LINK_SPEED_50G)
                ret |= HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_50GB;
+       if (link_speed & ETH_LINK_SPEED_100G)
+               ret |= HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_100GB;
        return ret;
 }
 
@@ -2034,9 +2152,12 @@ static uint32_t bnxt_parse_hw_link_speed(uint16_t hw_link_speed)
        case HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_50GB:
                eth_link_speed = ETH_SPEED_NUM_50G;
                break;
+       case HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_100GB:
+               eth_link_speed = ETH_SPEED_NUM_100G;
+               break;
        case HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_2GB:
        default:
-               RTE_LOG(ERR, PMD, "HWRM link speed %d not defined\n",
+               PMD_DRV_LOG(ERR, "HWRM link speed %d not defined\n",
                        hw_link_speed);
                break;
        }
@@ -2056,7 +2177,7 @@ static uint16_t bnxt_parse_hw_link_duplex(uint16_t hw_link_duplex)
                eth_link_duplex = ETH_LINK_HALF_DUPLEX;
                break;
        default:
-               RTE_LOG(ERR, PMD, "HWRM link duplex %d not defined\n",
+               PMD_DRV_LOG(ERR, "HWRM link duplex %d not defined\n",
                        hw_link_duplex);
                break;
        }
@@ -2070,7 +2191,7 @@ int bnxt_get_hwrm_link_config(struct bnxt *bp, struct rte_eth_link *link)
 
        rc = bnxt_hwrm_port_phy_qcfg(bp, link_info);
        if (rc) {
-               RTE_LOG(ERR, PMD,
+               PMD_DRV_LOG(ERR,
                        "Get link config failed with rc %d\n", rc);
                goto exit;
        }
@@ -2093,9 +2214,9 @@ int bnxt_set_hwrm_link_config(struct bnxt *bp, bool link_up)
        int rc = 0;
        struct rte_eth_conf *dev_conf = &bp->eth_dev->data->dev_conf;
        struct bnxt_link_info link_req;
-       uint16_t speed;
+       uint16_t speed, autoneg;
 
-       if (BNXT_NPAR_PF(bp) || BNXT_VF(bp))
+       if (!BNXT_SINGLE_PF(bp) || BNXT_VF(bp))
                return 0;
 
        rc = bnxt_valid_link_speed(dev_conf->link_speeds,
@@ -2108,20 +2229,36 @@ int bnxt_set_hwrm_link_config(struct bnxt *bp, bool link_up)
        if (!link_up)
                goto port_phy_cfg;
 
+       autoneg = bnxt_check_eth_link_autoneg(dev_conf->link_speeds);
        speed = bnxt_parse_eth_link_speed(dev_conf->link_speeds);
        link_req.phy_flags = HWRM_PORT_PHY_CFG_INPUT_FLAGS_RESET_PHY;
-       if (speed == 0) {
+       /* Autoneg can be done only when the FW allows */
+       if (autoneg == 1 && !(bp->link_info.auto_link_speed ||
+                               bp->link_info.force_link_speed)) {
                link_req.phy_flags |=
                                HWRM_PORT_PHY_CFG_INPUT_FLAGS_RESTART_AUTONEG;
-               link_req.auto_mode =
-                               HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_SPEED_MASK;
                link_req.auto_link_speed_mask =
                        bnxt_parse_eth_link_speed_mask(bp,
                                                       dev_conf->link_speeds);
        } else {
+               if (bp->link_info.phy_type ==
+                   HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASET ||
+                   bp->link_info.phy_type ==
+                   HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASETE ||
+                   bp->link_info.media_type ==
+                   HWRM_PORT_PHY_QCFG_OUTPUT_MEDIA_TYPE_TP) {
+                       PMD_DRV_LOG(ERR, "10GBase-T devices must autoneg\n");
+                       return -EINVAL;
+               }
+
                link_req.phy_flags |= HWRM_PORT_PHY_CFG_INPUT_FLAGS_FORCE;
-               link_req.link_speed = speed;
-               RTE_LOG(INFO, PMD, "Set Link Speed %x\n", speed);
+               /* If user wants a particular speed try that first. */
+               if (speed)
+                       link_req.link_speed = speed;
+               else if (bp->link_info.force_link_speed)
+                       link_req.link_speed = bp->link_info.force_link_speed;
+               else
+                       link_req.link_speed = bp->link_info.auto_link_speed;
        }
        link_req.duplex = bnxt_parse_eth_link_duplex(dev_conf->link_speeds);
        link_req.auto_pause = bp->link_info.auto_pause;
@@ -2130,7 +2267,7 @@ int bnxt_set_hwrm_link_config(struct bnxt *bp, bool link_up)
 port_phy_cfg:
        rc = bnxt_hwrm_port_phy_cfg(bp, &link_req);
        if (rc) {
-               RTE_LOG(ERR, PMD,
+               PMD_DRV_LOG(ERR,
                        "Set link config failed with rc %d\n", rc);
        }
 
@@ -2143,6 +2280,7 @@ int bnxt_hwrm_func_qcfg(struct bnxt *bp)
 {
        struct hwrm_func_qcfg_input req = {0};
        struct hwrm_func_qcfg_output *resp = bp->hwrm_cmd_resp_addr;
+       uint16_t flags;
        int rc = 0;
 
        HWRM_PREP(req, FUNC_QCFG);
@@ -2154,6 +2292,9 @@ int bnxt_hwrm_func_qcfg(struct bnxt *bp)
 
        /* Hard Coded.. 0xfff VLAN ID mask */
        bp->vlan = rte_le_to_cpu_16(resp->vlan) & 0xfff;
+       flags = rte_le_to_cpu_16(resp->flags);
+       if (BNXT_PF(bp) && (flags & HWRM_FUNC_QCFG_OUTPUT_FLAGS_MULTI_HOST))
+               bp->flags |= BNXT_FLAG_MULTI_HOST;
 
        switch (resp->port_partition_type) {
        case HWRM_FUNC_QCFG_OUTPUT_PORT_PARTITION_TYPE_NPAR1_0:
@@ -2303,11 +2444,11 @@ static void reserve_resources_from_vf(struct bnxt *bp,
        rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
 
        if (rc) {
-               RTE_LOG(ERR, PMD, "hwrm_func_qcaps failed rc:%d\n", rc);
+               PMD_DRV_LOG(ERR, "hwrm_func_qcaps failed rc:%d\n", rc);
                copy_func_cfg_to_qcaps(cfg_req, resp);
        } else if (resp->error_code) {
                rc = rte_le_to_cpu_16(resp->error_code);
-               RTE_LOG(ERR, PMD, "hwrm_func_qcaps error %d\n", rc);
+               PMD_DRV_LOG(ERR, "hwrm_func_qcaps error %d\n", rc);
                copy_func_cfg_to_qcaps(cfg_req, resp);
        }
 
@@ -2338,11 +2479,11 @@ int bnxt_hwrm_func_qcfg_current_vf_vlan(struct bnxt *bp, int vf)
        req.fid = rte_cpu_to_le_16(bp->pf.vf_info[vf].fid);
        rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
        if (rc) {
-               RTE_LOG(ERR, PMD, "hwrm_func_qcfg failed rc:%d\n", rc);
+               PMD_DRV_LOG(ERR, "hwrm_func_qcfg failed rc:%d\n", rc);
                return -1;
        } else if (resp->error_code) {
                rc = rte_le_to_cpu_16(resp->error_code);
-               RTE_LOG(ERR, PMD, "hwrm_func_qcfg error %d\n", rc);
+               PMD_DRV_LOG(ERR, "hwrm_func_qcfg error %d\n", rc);
                return -1;
        }
        rc = rte_le_to_cpu_16(resp->vlan);
@@ -2378,7 +2519,7 @@ int bnxt_hwrm_allocate_pf_only(struct bnxt *bp)
        int rc;
 
        if (!BNXT_PF(bp)) {
-               RTE_LOG(ERR, PMD, "Attempt to allcoate VFs on a VF!\n");
+               PMD_DRV_LOG(ERR, "Attempt to allcoate VFs on a VF!\n");
                return -1;
        }
 
@@ -2405,7 +2546,7 @@ int bnxt_hwrm_allocate_vfs(struct bnxt *bp, int num_vfs)
        size_t req_buf_sz;
 
        if (!BNXT_PF(bp)) {
-               RTE_LOG(ERR, PMD, "Attempt to allcoate VFs on a VF!\n");
+               PMD_DRV_LOG(ERR, "Attempt to allcoate VFs on a VF!\n");
                return -1;
        }
 
@@ -2471,9 +2612,9 @@ int bnxt_hwrm_allocate_vfs(struct bnxt *bp, int num_vfs)
                                HWRM_FUNC_CFG_INPUT_ENABLES_DFLT_MAC_ADDR);
 
                if (rc || resp->error_code) {
-                       RTE_LOG(ERR, PMD,
+                       PMD_DRV_LOG(ERR,
                                "Failed to initizlie VF %d\n", i);
-                       RTE_LOG(ERR, PMD,
+                       PMD_DRV_LOG(ERR,
                                "Not all VFs available. (%d, %d)\n",
                                rc, resp->error_code);
                        HWRM_UNLOCK();
@@ -2621,9 +2762,9 @@ int bnxt_hwrm_func_buf_rgtr(struct bnxt *bp)
                         page_getenum(bp->pf.active_vfs * HWRM_MAX_REQ_LEN));
        req.req_buf_len = rte_cpu_to_le_16(HWRM_MAX_REQ_LEN);
        req.req_buf_page_addr[0] =
-               rte_cpu_to_le_64(rte_mem_virt2phy(bp->pf.vf_req_buf));
+               rte_cpu_to_le_64(rte_mem_virt2iova(bp->pf.vf_req_buf));
        if (req.req_buf_page_addr[0] == 0) {
-               RTE_LOG(ERR, PMD,
+               PMD_DRV_LOG(ERR,
                        "unable to map buffer address to physical memory\n");
                return -ENOMEM;
        }
@@ -3025,7 +3166,7 @@ int bnxt_get_nvram_directory(struct bnxt *bp, uint32_t len, uint8_t *data)
        uint32_t entry_length;
        uint8_t *buf;
        size_t buflen;
-       phys_addr_t dma_handle;
+       rte_iova_t dma_handle;
        struct hwrm_nvm_get_dir_entries_input req = {0};
        struct hwrm_nvm_get_dir_entries_output *resp = bp->hwrm_cmd_resp_addr;
 
@@ -3043,9 +3184,9 @@ int bnxt_get_nvram_directory(struct bnxt *bp, uint32_t len, uint8_t *data)
        rte_mem_lock_page(buf);
        if (buf == NULL)
                return -ENOMEM;
-       dma_handle = rte_mem_virt2phy(buf);
+       dma_handle = rte_mem_virt2iova(buf);
        if (dma_handle == 0) {
-               RTE_LOG(ERR, PMD,
+               PMD_DRV_LOG(ERR,
                        "unable to map response address to physical memory\n");
                return -ENOMEM;
        }
@@ -3070,7 +3211,7 @@ int bnxt_hwrm_get_nvram_item(struct bnxt *bp, uint32_t index,
 {
        int rc;
        uint8_t *buf;
-       phys_addr_t dma_handle;
+       rte_iova_t dma_handle;
        struct hwrm_nvm_read_input req = {0};
        struct hwrm_nvm_read_output *resp = bp->hwrm_cmd_resp_addr;
 
@@ -3079,9 +3220,9 @@ int bnxt_hwrm_get_nvram_item(struct bnxt *bp, uint32_t index,
        if (!buf)
                return -ENOMEM;
 
-       dma_handle = rte_mem_virt2phy(buf);
+       dma_handle = rte_mem_virt2iova(buf);
        if (dma_handle == 0) {
-               RTE_LOG(ERR, PMD,
+               PMD_DRV_LOG(ERR,
                        "unable to map response address to physical memory\n");
                return -ENOMEM;
        }
@@ -3124,7 +3265,7 @@ int bnxt_hwrm_flash_nvram(struct bnxt *bp, uint16_t dir_type,
        int rc;
        struct hwrm_nvm_write_input req = {0};
        struct hwrm_nvm_write_output *resp = bp->hwrm_cmd_resp_addr;
-       phys_addr_t dma_handle;
+       rte_iova_t dma_handle;
        uint8_t *buf;
 
        HWRM_PREP(req, NVM_WRITE);
@@ -3140,9 +3281,9 @@ int bnxt_hwrm_flash_nvram(struct bnxt *bp, uint16_t dir_type,
        if (!buf)
                return -ENOMEM;
 
-       dma_handle = rte_mem_virt2phy(buf);
+       dma_handle = rte_mem_virt2iova(buf);
        if (dma_handle == 0) {
-               RTE_LOG(ERR, PMD,
+               PMD_DRV_LOG(ERR,
                        "unable to map response address to physical memory\n");
                return -ENOMEM;
        }
@@ -3195,23 +3336,23 @@ static int bnxt_hwrm_func_vf_vnic_query(struct bnxt *bp, uint16_t vf,
 
        req.vf_id = rte_cpu_to_le_16(bp->pf.first_vf_id + vf);
        req.max_vnic_id_cnt = rte_cpu_to_le_32(bp->pf.total_vnics);
-       req.vnic_id_tbl_addr = rte_cpu_to_le_64(rte_mem_virt2phy(vnic_ids));
+       req.vnic_id_tbl_addr = rte_cpu_to_le_64(rte_mem_virt2iova(vnic_ids));
 
        if (req.vnic_id_tbl_addr == 0) {
                HWRM_UNLOCK();
-               RTE_LOG(ERR, PMD,
+               PMD_DRV_LOG(ERR,
                "unable to map VNIC ID table address to physical memory\n");
                return -ENOMEM;
        }
        rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
        if (rc) {
                HWRM_UNLOCK();
-               RTE_LOG(ERR, PMD, "hwrm_func_vf_vnic_query failed rc:%d\n", rc);
+               PMD_DRV_LOG(ERR, "hwrm_func_vf_vnic_query failed rc:%d\n", rc);
                return -1;
        } else if (resp->error_code) {
                rc = rte_le_to_cpu_16(resp->error_code);
                HWRM_UNLOCK();
-               RTE_LOG(ERR, PMD, "hwrm_func_vf_vnic_query error %d\n", rc);
+               PMD_DRV_LOG(ERR, "hwrm_func_vf_vnic_query error %d\n", rc);
                return -1;
        }
        rc = rte_le_to_cpu_32(resp->vnic_id_cnt);
@@ -3342,7 +3483,7 @@ int bnxt_hwrm_func_qcfg_vf_dflt_vnic_id(struct bnxt *bp, int vf)
                }
        }
        /* Could not find a default VNIC. */
-       RTE_LOG(ERR, PMD, "No default VNIC\n");
+       PMD_DRV_LOG(ERR, "No default VNIC\n");
 exit:
        rte_free(vnic_ids);
        return -1;
@@ -3432,7 +3573,7 @@ int bnxt_hwrm_clear_em_filter(struct bnxt *bp, struct bnxt_filter_info *filter)
        if (filter->fw_em_filter_id == UINT64_MAX)
                return 0;
 
-       RTE_LOG(ERR, PMD, "Clear EM filter\n");
+       PMD_DRV_LOG(ERR, "Clear EM filter\n");
        HWRM_PREP(req, CFA_EM_FLOW_FREE);
 
        req.em_filter_id = rte_cpu_to_le_64(filter->fw_em_filter_id);
@@ -3555,7 +3696,34 @@ int bnxt_hwrm_clear_ntuple_filter(struct bnxt *bp,
        HWRM_UNLOCK();
 
        filter->fw_ntuple_filter_id = -1;
-       filter->fw_l2_filter_id = -1;
 
        return 0;
 }
+
+int bnxt_vnic_rss_configure(struct bnxt *bp, struct bnxt_vnic_info *vnic)
+{
+       unsigned int rss_idx, fw_idx, i;
+
+       if (vnic->rss_table && vnic->hash_type) {
+               /*
+                * Fill the RSS hash & redirection table with
+                * ring group ids for all VNICs
+                */
+               for (rss_idx = 0, fw_idx = 0; rss_idx < HW_HASH_INDEX_SIZE;
+                       rss_idx++, fw_idx++) {
+                       for (i = 0; i < bp->rx_cp_nr_rings; i++) {
+                               fw_idx %= bp->rx_cp_nr_rings;
+                               if (vnic->fw_grp_ids[fw_idx] !=
+                                   INVALID_HW_RING_ID)
+                                       break;
+                               fw_idx++;
+                       }
+                       if (i == bp->rx_cp_nr_rings)
+                               return 0;
+                       vnic->rss_table[rss_idx] =
+                               vnic->fw_grp_ids[fw_idx];
+               }
+               return bnxt_hwrm_vnic_rss_cfg(bp, vnic);
+       }
+       return 0;
+}