net/dpaa2: add support for VLAN filter and offload
authorHemant Agrawal <hemant.agrawal@nxp.com>
Fri, 26 May 2017 06:51:18 +0000 (12:21 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 12 Jun 2017 09:41:26 +0000 (10:41 +0100)
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
doc/guides/nics/features/dpaa2.ini
drivers/net/dpaa2/dpaa2_ethdev.c
drivers/net/dpaa2/mc/dpni.c
drivers/net/dpaa2/mc/fsl_dpni.h
drivers/net/dpaa2/mc/fsl_dpni_cmd.h

index dddf0e0..4b1e000 100644 (file)
@@ -11,6 +11,8 @@ Promiscuous mode     = Y
 Allmulticast mode    = Y
 Unicast MAC filter   = Y
 RSS hash             = Y
+VLAN filter          = Y
+VLAN offload         = Y
 L3 checksum offload  = Y
 L4 checksum offload  = Y
 Packet type parsing  = Y
index 22e0474..46532b2 100644 (file)
@@ -108,6 +108,56 @@ dpaa2_dev_atomic_write_link_status(struct rte_eth_dev *dev,
        return 0;
 }
 
+static int
+dpaa2_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
+{
+       int ret;
+       struct dpaa2_dev_priv *priv = dev->data->dev_private;
+       struct fsl_mc_io *dpni = priv->hw;
+
+       PMD_INIT_FUNC_TRACE();
+
+       if (dpni == NULL) {
+               RTE_LOG(ERR, PMD, "dpni is NULL");
+               return -1;
+       }
+
+       if (on)
+               ret = dpni_add_vlan_id(dpni, CMD_PRI_LOW,
+                                      priv->token, vlan_id);
+       else
+               ret = dpni_remove_vlan_id(dpni, CMD_PRI_LOW,
+                                         priv->token, vlan_id);
+
+       if (ret < 0)
+               PMD_DRV_LOG(ERR, "ret = %d Unable to add/rem vlan %d hwid =%d",
+                           ret, vlan_id, priv->hw_id);
+
+       return ret;
+}
+
+static void
+dpaa2_vlan_offload_set(struct rte_eth_dev *dev, int mask)
+{
+       struct dpaa2_dev_priv *priv = dev->data->dev_private;
+       struct fsl_mc_io *dpni = priv->hw;
+       int ret;
+
+       PMD_INIT_FUNC_TRACE();
+
+       if (mask & ETH_VLAN_FILTER_MASK) {
+               if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+                       ret = dpni_enable_vlan_filter(dpni, CMD_PRI_LOW,
+                                                     priv->token, true);
+               else
+                       ret = dpni_enable_vlan_filter(dpni, CMD_PRI_LOW,
+                                                     priv->token, false);
+               if (ret < 0)
+                       RTE_LOG(ERR, PMD, "Unable to set vlan filter ret = %d",
+                               ret);
+       }
+}
+
 static void
 dpaa2_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
@@ -542,6 +592,9 @@ dpaa2_dev_start(struct rte_eth_dev *dev)
                             "code = %d\n", ret);
                return ret;
        }
+       /* VLAN Offload Settings */
+       if (priv->max_vlan_filters)
+               dpaa2_vlan_offload_set(dev, ETH_VLAN_FILTER_MASK);
 
        return 0;
 }
@@ -951,6 +1004,8 @@ static struct eth_dev_ops dpaa2_ethdev_ops = {
        .dev_infos_get     = dpaa2_dev_info_get,
        .dev_supported_ptypes_get = dpaa2_supported_ptypes_get,
        .mtu_set           = dpaa2_dev_mtu_set,
+       .vlan_filter_set      = dpaa2_vlan_filter_set,
+       .vlan_offload_set     = dpaa2_vlan_offload_set,
        .rx_queue_setup    = dpaa2_dev_rx_queue_setup,
        .rx_queue_release  = dpaa2_dev_rx_queue_release,
        .tx_queue_setup    = dpaa2_dev_tx_queue_setup,
index 30bb7ad..0ad6d11 100644 (file)
@@ -708,6 +708,72 @@ int dpni_get_port_mac_addr(struct fsl_mc_io *mc_io,
        return 0;
 }
 
+int dpni_enable_vlan_filter(struct fsl_mc_io *mc_io,
+                           uint32_t cmd_flags,
+                         uint16_t token,
+                         int en)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE_VLAN_FILTER,
+                                         cmd_flags,
+                                         token);
+       DPNI_CMD_ENABLE_VLAN_FILTER(cmd, en);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_add_vlan_id(struct fsl_mc_io *mc_io,
+                    uint32_t cmd_flags,
+                    uint16_t token,
+                    uint16_t vlan_id)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_VLAN_ID,
+                                         cmd_flags,
+                                         token);
+       DPNI_CMD_ADD_VLAN_ID(cmd, vlan_id);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_remove_vlan_id(struct fsl_mc_io *mc_io,
+                       uint32_t cmd_flags,
+                       uint16_t token,
+                       uint16_t vlan_id)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_VLAN_ID,
+                                         cmd_flags,
+                                         token);
+       DPNI_CMD_REMOVE_VLAN_ID(cmd, vlan_id);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_clear_vlan_filters(struct fsl_mc_io *mc_io,
+                           uint32_t cmd_flags,
+                           uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLR_VLAN_FILTERS,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
 int dpni_set_rx_tc_dist(struct fsl_mc_io *mc_io,
                        uint32_t cmd_flags,
                        uint16_t token,
index dae57b5..2f69526 100644 (file)
@@ -944,6 +944,60 @@ int dpni_get_port_mac_addr(struct fsl_mc_io        *mc_io,
                           uint16_t             token,
                           uint8_t              mac_addr[6]);
 
+/**
+ * dpni_enable_vlan_filter() - Enable/disable VLAN filtering mode
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @en:                Set to '1' to enable; '0' to disable
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_enable_vlan_filter(struct fsl_mc_io   *mc_io,
+                           uint32_t            cmd_flags,
+                           uint16_t            token,
+                           int                 en);
+
+/**
+ * dpni_add_vlan_id() - Add VLAN ID filter
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @vlan_id:   VLAN ID to add
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_add_vlan_id(struct fsl_mc_io  *mc_io,
+                    uint32_t           cmd_flags,
+                    uint16_t           token,
+                    uint16_t           vlan_id);
+
+/**
+ * dpni_remove_vlan_id() - Remove VLAN ID filter
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @vlan_id:   VLAN ID to remove
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_remove_vlan_id(struct fsl_mc_io       *mc_io,
+                       uint32_t                cmd_flags,
+                       uint16_t                token,
+                       uint16_t                vlan_id);
+
+/**
+ * dpni_clear_vlan_filters() - Clear all VLAN filters
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_clear_vlan_filters(struct fsl_mc_io   *mc_io,
+                           uint32_t            cmd_flags,
+                           uint16_t            token);
+
 /**
  * enum dpni_dist_mode - DPNI distribution mode
  * @DPNI_DIST_MODE_NONE: No distribution
index bd2bb3f..6e96271 100644 (file)
 #define DPNI_CMDID_REMOVE_MAC_ADDR                     ((0x227 << 4) | (0x1))
 #define DPNI_CMDID_CLR_MAC_FILTERS                     ((0x228 << 4) | (0x1))
 
+#define DPNI_CMDID_ENABLE_VLAN_FILTER                  ((0x230 << 4) | (0x1))
+#define DPNI_CMDID_ADD_VLAN_ID                         ((0x231 << 4) | (0x1))
+#define DPNI_CMDID_REMOVE_VLAN_ID                      ((0x232 << 4) | (0x1))
+#define DPNI_CMDID_CLR_VLAN_FILTERS                    ((0x233 << 4) | (0x1))
+
 #define DPNI_CMDID_SET_RX_TC_DIST                      ((0x235 << 4) | (0x1))
 
 #define DPNI_CMDID_GET_STATISTICS                      ((0x25D << 4) | (0x1))
@@ -325,6 +330,18 @@ do { \
        MC_CMD_OP(cmd, 0, 1,  1,  int,      multicast); \
 } while (0)
 
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_ENABLE_VLAN_FILTER(cmd, en) \
+       MC_CMD_OP(cmd, 0, 0,  1,  int,      en)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_ADD_VLAN_ID(cmd, vlan_id) \
+       MC_CMD_OP(cmd, 0, 32, 16, uint16_t, vlan_id)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_REMOVE_VLAN_ID(cmd, vlan_id) \
+       MC_CMD_OP(cmd, 0, 32, 16, uint16_t, vlan_id)
+
 
 /*                cmd, param, offset, width, type, arg_name */
 #define DPNI_CMD_SET_RX_TC_DIST(cmd, tc_id, cfg) \