net/bnxt: support VLAN pvid
authorAjit Khaparde <ajit.khaparde@broadcom.com>
Thu, 1 Jun 2017 17:07:12 +0000 (12:07 -0500)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 12 Jun 2017 09:41:28 +0000 (10:41 +0100)
This patch adds code to support vlan_pvid_set dev_op

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_hwrm.h

index 8e6689f..adf0ab1 100644 (file)
@@ -67,6 +67,7 @@ struct bnxt_child_vf_info {
        uint32_t                func_cfg_flags;
        uint32_t                l2_rx_mask;
        uint16_t                fid;
+       uint16_t                dflt_vlan;
        bool                    random_mac;
 };
 
index 73795fc..198f38d 100644 (file)
@@ -1477,6 +1477,26 @@ static int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu)
        return rc;
 }
 
+static int
+bnxt_vlan_pvid_set_op(struct rte_eth_dev *dev, uint16_t pvid, int on)
+{
+       struct bnxt *bp = (struct bnxt *)dev->data->dev_private;
+       uint16_t vlan = bp->vlan;
+       int rc;
+
+       if (BNXT_NPAR_PF(bp) || BNXT_VF(bp)) {
+               RTE_LOG(ERR, PMD,
+                       "PVID cannot be modified for this function\n");
+               return -ENOTSUP;
+       }
+       bp->vlan = on ? pvid : 0;
+
+       rc = bnxt_hwrm_set_default_vlan(bp, 0, 0);
+       if (rc)
+               bp->vlan = vlan;
+       return rc;
+}
+
 /*
  * Initialization
  */
@@ -1512,6 +1532,7 @@ static const struct eth_dev_ops bnxt_dev_ops = {
        .udp_tunnel_port_del  = bnxt_udp_tunnel_port_del_op,
        .vlan_filter_set = bnxt_vlan_filter_set_op,
        .vlan_offload_set = bnxt_vlan_offload_set_op,
+       .vlan_pvid_set = bnxt_vlan_pvid_set_op,
        .mtu_set = bnxt_mtu_set_op,
        .mac_addr_set = bnxt_set_default_mac_addr_op,
        .xstats_get = bnxt_dev_xstats_get_op,
index dc4bb1b..3e595c3 100644 (file)
@@ -2256,6 +2256,37 @@ int bnxt_hwrm_vf_func_cfg_def_cp(struct bnxt *bp)
        return rc;
 }
 
+int bnxt_hwrm_set_default_vlan(struct bnxt *bp, int vf, uint8_t is_vf)
+{
+       struct hwrm_func_cfg_input req = {0};
+       struct hwrm_func_cfg_output *resp = bp->hwrm_cmd_resp_addr;
+       uint16_t dflt_vlan, fid;
+       uint32_t func_cfg_flags;
+       int rc = 0;
+
+       HWRM_PREP(req, FUNC_CFG, -1, resp);
+
+       if (is_vf) {
+               dflt_vlan = bp->pf.vf_info[vf].dflt_vlan;
+               fid = bp->pf.vf_info[vf].fid;
+               func_cfg_flags = bp->pf.vf_info[vf].func_cfg_flags;
+       } else {
+               fid = rte_cpu_to_le_16(0xffff);
+               func_cfg_flags = bp->pf.func_cfg_flags;
+               dflt_vlan = bp->vlan;
+       }
+
+       req.flags = rte_cpu_to_le_32(func_cfg_flags);
+       req.fid = rte_cpu_to_le_16(fid);
+       req.enables |= rte_cpu_to_le_32(HWRM_FUNC_CFG_INPUT_ENABLES_DFLT_VLAN);
+       req.dflt_vlan = rte_cpu_to_le_16(dflt_vlan);
+
+       rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
+       HWRM_CHECK_RESULT;
+
+       return rc;
+}
+
 int bnxt_hwrm_reject_fwd_resp(struct bnxt *bp, uint16_t target_id,
                              void *encaped, size_t ec_size)
 {
index 6ce0bc3..1759187 100644 (file)
@@ -123,6 +123,7 @@ int bnxt_hwrm_tunnel_dst_port_alloc(struct bnxt *bp, uint16_t port,
 int bnxt_hwrm_tunnel_dst_port_free(struct bnxt *bp, uint16_t port,
                                uint8_t tunnel_type);
 void bnxt_free_tunnel_ports(struct bnxt *bp);
+int bnxt_hwrm_set_default_vlan(struct bnxt *bp, int vf, uint8_t is_vf);
 int bnxt_hwrm_port_qstats(struct bnxt *bp);
 int bnxt_hwrm_port_clr_stats(struct bnxt *bp);
 #endif