return mc_send_command(mc_io, &cmd);
 }
 
+/**
+ * dpsw_if_get_tci() - Get default VLAN Tag Control Information (TCI)
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPSW object
+ * @if_id:     Interface Identifier
+ * @cfg:       Tag Control Information Configuration
+ *
+ * Return:     Completion status. '0' on Success; Error code otherwise.
+ */
+int dpsw_if_get_tci(struct fsl_mc_io *mc_io,
+                   u32 cmd_flags,
+                   u16 token,
+                   u16 if_id,
+                   struct dpsw_tci_cfg *cfg)
+{
+       struct fsl_mc_command cmd = { 0 };
+       struct dpsw_cmd_if_get_tci *cmd_params;
+       struct dpsw_rsp_if_get_tci *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPSW_CMDID_IF_GET_TCI,
+                                         cmd_flags,
+                                         token);
+       cmd_params = (struct dpsw_cmd_if_get_tci *)cmd.params;
+       cmd_params->if_id = cpu_to_le16(if_id);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpsw_rsp_if_get_tci *)cmd.params;
+       cfg->pcp = rsp_params->pcp;
+       cfg->dei = rsp_params->dei;
+       cfg->vlan_id = le16_to_cpu(rsp_params->vlan_id);
+
+       return 0;
+}
+
 /**
  * dpsw_if_set_stp() - Function sets Spanning Tree Protocol (STP) state.
  * @mc_io:     Pointer to MC portal's I/O object
 
        return 0;
 }
 
-static int ethsw_port_set_tci(struct ethsw_port_priv *port_priv,
-                             struct dpsw_tci_cfg *tci_cfg)
+static int ethsw_port_set_pvid(struct ethsw_port_priv *port_priv, u16 pvid)
 {
        struct ethsw_core *ethsw = port_priv->ethsw_data;
        struct net_device *netdev = port_priv->netdev;
+       struct dpsw_tci_cfg tci_cfg = { 0 };
        bool is_oper;
        int err, ret;
 
+       err = dpsw_if_get_tci(ethsw->mc_io, 0, ethsw->dpsw_handle,
+                             port_priv->idx, &tci_cfg);
+       if (err) {
+               netdev_err(netdev, "dpsw_if_get_tci err %d\n", err);
+               return err;
+       }
+
+       tci_cfg.vlan_id = pvid;
+
        /* Interface needs to be down to change PVID */
        is_oper = netif_oper_up(netdev);
        if (is_oper) {
        }
 
        err = dpsw_if_set_tci(ethsw->mc_io, 0, ethsw->dpsw_handle,
-                             port_priv->idx, tci_cfg);
+                             port_priv->idx, &tci_cfg);
        if (err) {
                netdev_err(netdev, "dpsw_if_set_tci err %d\n", err);
                goto set_tci_error;
        }
 
        /* Delete previous PVID info and mark the new one */
-       if (port_priv->pvid)
-               port_priv->vlans[port_priv->pvid] &= ~ETHSW_VLAN_PVID;
-       port_priv->vlans[tci_cfg->vlan_id] |= ETHSW_VLAN_PVID;
-       port_priv->pvid = tci_cfg->vlan_id;
+       port_priv->vlans[port_priv->pvid] &= ~ETHSW_VLAN_PVID;
+       port_priv->vlans[pvid] |= ETHSW_VLAN_PVID;
+       port_priv->pvid = pvid;
 
 set_tci_error:
        if (is_oper) {
        }
 
        if (flags & BRIDGE_VLAN_INFO_PVID) {
-               struct dpsw_tci_cfg tci_cfg = {
-                       .pcp = 0,
-                       .dei = 0,
-                       .vlan_id = vid,
-               };
-
-               err = ethsw_port_set_tci(port_priv, &tci_cfg);
+               err = ethsw_port_set_pvid(port_priv, vid);
                if (err)
                        return err;
        }
                return -ENOENT;
 
        if (port_priv->vlans[vid] & ETHSW_VLAN_PVID) {
-               struct dpsw_tci_cfg tci_cfg = { 0 };
-
-               err = ethsw_port_set_tci(port_priv, &tci_cfg);
+               err = ethsw_port_set_pvid(port_priv, 0);
                if (err)
                        return err;
        }
        const char def_mcast[ETH_ALEN] = {0x01, 0x00, 0x5e, 0x00, 0x00, 0x01};
        struct net_device *netdev = port_priv->netdev;
        struct ethsw_core *ethsw = port_priv->ethsw_data;
-       struct dpsw_tci_cfg tci_cfg = {0};
        struct dpsw_vlan_if_cfg vcfg;
        int err;
 
                return err;
        }
 
-       err = ethsw_port_set_tci(port_priv, &tci_cfg);
+       err = ethsw_port_set_pvid(port_priv, 0);
        if (err)
                return err;