]> git.droids-corp.org - dpdk.git/commitdiff
net/bnxt: add check for multi host PF per port
authorAjit Khaparde <ajit.khaparde@broadcom.com>
Mon, 8 Jan 2018 20:24:30 +0000 (12:24 -0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 16 Jan 2018 17:47:49 +0000 (18:47 +0100)
Certain SKUs of NIC can support features like NPAR, Multi Host PFs per
port.  We need to check for such features in order to restrict certain
HWRM commands from being sent to the FW.

For the single PF per port model, allow commands like hwrm_port_phy_cfg
from the PF driver. In NPAR and MH environments with multiple PFs per
port, we should not allow HWRM commands like hwrm_port_phy_cfg to be
sent to the FW.

This patch takes care of that.

Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
drivers/net/bnxt/bnxt.h
drivers/net/bnxt/bnxt_ethdev.c
drivers/net/bnxt/bnxt_hwrm.c
drivers/net/bnxt/bnxt_stats.c

index e46759f25e66978b0df6fab2015e27a71d1b8eff..345750be7b820cbf99264e74d322509bba7e018d 100644 (file)
@@ -244,10 +244,12 @@ struct bnxt {
 #define BNXT_FLAG_SHORT_CMD    (1 << 4)
 #define BNXT_FLAG_UPDATE_HASH  (1 << 5)
 #define BNXT_FLAG_PTP_SUPPORTED        (1 << 6)
+#define BNXT_FLAG_MULTI_HOST    (1 << 7)
 #define BNXT_PF(bp)            (!((bp)->flags & BNXT_FLAG_VF))
 #define BNXT_VF(bp)            ((bp)->flags & BNXT_FLAG_VF)
-#define BNXT_NPAR_ENABLED(bp)  ((bp)->port_partition_type)
-#define BNXT_NPAR_PF(bp)       (BNXT_PF(bp) && BNXT_NPAR_ENABLED(bp))
+#define BNXT_NPAR(bp)          ((bp)->port_partition_type)
+#define BNXT_MH(bp)             ((bp)->flags & BNXT_FLAG_MULTI_HOST)
+#define BNXT_SINGLE_PF(bp)      (BNXT_PF(bp) && !BNXT_NPAR(bp) && !BNXT_MH(bp))
 
        unsigned int            rx_nr_rings;
        unsigned int            rx_cp_nr_rings;
index ce7030d1a6d3b90069efbb3c223e1a16ce6755ea..475faac2a20d0d4cac9a6329aa5fcc1700759505 100644 (file)
@@ -1039,7 +1039,7 @@ static int bnxt_flow_ctrl_set_op(struct rte_eth_dev *dev,
 {
        struct bnxt *bp = (struct bnxt *)dev->data->dev_private;
 
-       if (BNXT_NPAR_PF(bp) || BNXT_VF(bp)) {
+       if (!BNXT_SINGLE_PF(bp) || BNXT_VF(bp)) {
                RTE_LOG(ERR, PMD, "Flow Control Settings cannot be modified\n");
                return -ENOTSUP;
        }
@@ -1570,7 +1570,7 @@ bnxt_vlan_pvid_set_op(struct rte_eth_dev *dev, uint16_t pvid, int on)
        uint16_t vlan = bp->vlan;
        int rc;
 
-       if (BNXT_NPAR_PF(bp) || BNXT_VF(bp)) {
+       if (!BNXT_SINGLE_PF(bp) || BNXT_VF(bp)) {
                RTE_LOG(ERR, PMD,
                        "PVID cannot be modified for this function\n");
                return -ENOTSUP;
index 68e21139527a17aa1019fbb37f58cff9222b48d4..0c8f6443cd963877623150558cb1b30bf7b1e416 100644 (file)
@@ -2193,7 +2193,7 @@ int bnxt_set_hwrm_link_config(struct bnxt *bp, bool link_up)
        struct bnxt_link_info link_req;
        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,
@@ -2249,6 +2249,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);
@@ -2260,6 +2261,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:
index fe83d370a7ab217e26319932f6ed107b4dd90c5d..2606e93c1a5fc4578a45d5a47b2136ebed5dd3ac 100644 (file)
@@ -358,12 +358,12 @@ void bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
 {
        struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
 
-       if (bp->flags & BNXT_FLAG_PORT_STATS && !BNXT_NPAR_PF(bp))
+       if (bp->flags & BNXT_FLAG_PORT_STATS && BNXT_SINGLE_PF(bp))
                bnxt_hwrm_port_clr_stats(bp);
 
        if (BNXT_VF(bp))
                RTE_LOG(ERR, PMD, "Operation not supported on a VF device\n");
-       if (BNXT_NPAR_PF(bp))
+       if (!BNXT_SINGLE_PF(bp))
                RTE_LOG(ERR, PMD, "Operation not supported on a MF device\n");
        if (!(bp->flags & BNXT_FLAG_PORT_STATS))
                RTE_LOG(ERR, PMD, "Operation not supported\n");