net/mrvl: support classifier
[dpdk.git] / drivers / net / mrvl / mrvl_ethdev.c
index 7e00dbd..34b9ef7 100644 (file)
@@ -659,6 +659,10 @@ mrvl_dev_stop(struct rte_eth_dev *dev)
        mrvl_dev_set_link_down(dev);
        mrvl_flush_rx_queues(dev);
        mrvl_flush_tx_shadow_queues(dev);
+       if (priv->cls_tbl) {
+               pp2_cls_tbl_deinit(priv->cls_tbl);
+               priv->cls_tbl = NULL;
+       }
        if (priv->qos_tbl) {
                pp2_cls_qos_tbl_deinit(priv->qos_tbl);
                priv->qos_tbl = NULL;
@@ -784,6 +788,9 @@ mrvl_promiscuous_enable(struct rte_eth_dev *dev)
        if (!priv->ppio)
                return;
 
+       if (priv->isolated)
+               return;
+
        ret = pp2_ppio_set_promisc(priv->ppio, 1);
        if (ret)
                RTE_LOG(ERR, PMD, "Failed to enable promiscuous mode\n");
@@ -804,6 +811,9 @@ mrvl_allmulticast_enable(struct rte_eth_dev *dev)
        if (!priv->ppio)
                return;
 
+       if (priv->isolated)
+               return;
+
        ret = pp2_ppio_set_mc_promisc(priv->ppio, 1);
        if (ret)
                RTE_LOG(ERR, PMD, "Failed enable all-multicast mode\n");
@@ -867,6 +877,9 @@ mrvl_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index)
        if (!priv->ppio)
                return;
 
+       if (priv->isolated)
+               return;
+
        ret = pp2_ppio_remove_mac_addr(priv->ppio,
                                       dev->data->mac_addrs[index].addr_bytes);
        if (ret) {
@@ -899,6 +912,9 @@ mrvl_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
        char buf[ETHER_ADDR_FMT_SIZE];
        int ret;
 
+       if (priv->isolated)
+               return -ENOTSUP;
+
        if (index == 0)
                /* For setting index 0, mrvl_mac_addr_set() should be used.*/
                return -1;
@@ -946,6 +962,9 @@ mrvl_mac_addr_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr)
        if (!priv->ppio)
                return;
 
+       if (priv->isolated)
+               return;
+
        ret = pp2_ppio_set_mac_addr(priv->ppio, mac_addr->addr_bytes);
        if (ret) {
                char buf[ETHER_ADDR_FMT_SIZE];
@@ -1227,6 +1246,9 @@ mrvl_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
        if (!priv->ppio)
                return -EPERM;
 
+       if (priv->isolated)
+               return -ENOTSUP;
+
        return on ? pp2_ppio_add_vlan(priv->ppio, vlan_id) :
                    pp2_ppio_remove_vlan(priv->ppio, vlan_id);
 }
@@ -1580,6 +1602,9 @@ mrvl_rss_hash_update(struct rte_eth_dev *dev,
 {
        struct mrvl_priv *priv = dev->data->dev_private;
 
+       if (priv->isolated)
+               return -ENOTSUP;
+
        return mrvl_configure_rss(priv, rss_conf);
 }
 
@@ -1616,6 +1641,39 @@ mrvl_rss_hash_conf_get(struct rte_eth_dev *dev,
        return 0;
 }
 
+/**
+ * DPDK callback to get rte_flow callbacks.
+ *
+ * @param dev
+ *   Pointer to the device structure.
+ * @param filer_type
+ *   Flow filter type.
+ * @param filter_op
+ *   Flow filter operation.
+ * @param arg
+ *   Pointer to pass the flow ops.
+ *
+ * @return
+ *   0 on success, negative error value otherwise.
+ */
+static int
+mrvl_eth_filter_ctrl(struct rte_eth_dev *dev __rte_unused,
+                    enum rte_filter_type filter_type,
+                    enum rte_filter_op filter_op, void *arg)
+{
+       switch (filter_type) {
+       case RTE_ETH_FILTER_GENERIC:
+               if (filter_op != RTE_ETH_FILTER_GET)
+                       return -EINVAL;
+               *(const void **)arg = &mrvl_flow_ops;
+               return 0;
+       default:
+               RTE_LOG(WARNING, PMD, "Filter type (%d) not supported",
+                               filter_type);
+               return -EINVAL;
+       }
+}
+
 static const struct eth_dev_ops mrvl_ops = {
        .dev_configure = mrvl_dev_configure,
        .dev_start = mrvl_dev_start,
@@ -1645,6 +1703,7 @@ static const struct eth_dev_ops mrvl_ops = {
        .tx_queue_release = mrvl_tx_queue_release,
        .rss_hash_update = mrvl_rss_hash_update,
        .rss_hash_conf_get = mrvl_rss_hash_conf_get,
+       .filter_ctrl = mrvl_eth_filter_ctrl
 };
 
 /**