return rc;
 }
 
-static int bnxt_hwrm_func_resc_qcaps(struct bnxt *bp)
+int bnxt_hwrm_func_resc_qcaps(struct bnxt *bp, bool all)
 {
        struct hwrm_func_resource_qcaps_output *resp = bp->hwrm_cmd_resp_addr;
        struct hwrm_func_resource_qcaps_input req = {0};
                goto hwrm_func_resc_qcaps_exit;
        }
 
+       hw_resc->max_tx_sch_inputs = le16_to_cpu(resp->max_tx_scheduler_inputs);
+       if (!all)
+               goto hwrm_func_resc_qcaps_exit;
+
        hw_resc->min_rsscos_ctxs = le16_to_cpu(resp->min_rsscos_ctx);
        hw_resc->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx);
        hw_resc->min_cp_rings = le16_to_cpu(resp->min_cmpl_rings);
        if (rc)
                return rc;
        if (bp->hwrm_spec_code >= 0x10803) {
-               rc = bnxt_hwrm_func_resc_qcaps(bp);
+               rc = bnxt_hwrm_func_resc_qcaps(bp, true);
                if (!rc)
                        bp->flags |= BNXT_FLAG_NEW_RM;
        }
 
        u16     min_tx_rings;
        u16     max_tx_rings;
        u16     resv_tx_rings;
+       u16     max_tx_sch_inputs;
        u16     min_rx_rings;
        u16     max_rx_rings;
        u16     resv_rx_rings;
 int bnxt_hwrm_set_link_setting(struct bnxt *, bool, bool);
 int bnxt_hwrm_alloc_wol_fltr(struct bnxt *bp);
 int bnxt_hwrm_free_wol_fltr(struct bnxt *bp);
+int bnxt_hwrm_func_resc_qcaps(struct bnxt *bp, bool all);
 int bnxt_hwrm_fw_set_time(struct bnxt *);
 int bnxt_open_nic(struct bnxt *, bool, bool);
 int bnxt_half_open_nic(struct bnxt *bp);
 
                              struct ethtool_channels *channel)
 {
        struct bnxt *bp = netdev_priv(dev);
+       struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
        int max_rx_rings, max_tx_rings, tcs;
+       int max_tx_sch_inputs;
+
+       /* Get the most up-to-date max_tx_sch_inputs. */
+       if (bp->flags & BNXT_FLAG_NEW_RM)
+               bnxt_hwrm_func_resc_qcaps(bp, false);
+       max_tx_sch_inputs = hw_resc->max_tx_sch_inputs;
 
        bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, true);
+       if (max_tx_sch_inputs)
+               max_tx_rings = min_t(int, max_tx_rings, max_tx_sch_inputs);
        channel->max_combined = min_t(int, max_rx_rings, max_tx_rings);
 
        if (bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, false)) {
                max_rx_rings = 0;
                max_tx_rings = 0;
        }
+       if (max_tx_sch_inputs)
+               max_tx_rings = min_t(int, max_tx_rings, max_tx_sch_inputs);
 
        tcs = netdev_get_num_tc(dev);
        if (tcs > 1)