net/ixgbe: fix mask bits register set error for FDIR
[dpdk.git] / drivers / net / failsafe / failsafe_ops.c
index 089f114..24e91c9 100644 (file)
@@ -13,6 +13,7 @@
 #include <rte_malloc.h>
 #include <rte_flow.h>
 #include <rte_cycles.h>
+#include <rte_ethdev.h>
 
 #include "failsafe_private.h"
 
@@ -137,7 +138,7 @@ fs_dev_configure(struct rte_eth_dev *dev)
                        fs_unlock(dev, 0);
                        return ret;
                }
-               if (rmv_interrupt) {
+               if (rmv_interrupt && sdev->rmv_callback == 0) {
                        ret = rte_eth_dev_callback_register(PORT_ID(sdev),
                                        RTE_ETH_EVENT_INTR_RMV,
                                        failsafe_eth_rmv_event_callback,
@@ -145,9 +146,11 @@ fs_dev_configure(struct rte_eth_dev *dev)
                        if (ret)
                                WARN("Failed to register RMV callback for sub_device %d",
                                     SUB_ID(sdev));
+                       else
+                               sdev->rmv_callback = 1;
                }
                dev->data->dev_conf.intr_conf.rmv = 0;
-               if (lsc_interrupt) {
+               if (lsc_interrupt && sdev->lsc_callback == 0) {
                        ret = rte_eth_dev_callback_register(PORT_ID(sdev),
                                                RTE_ETH_EVENT_INTR_LSC,
                                                failsafe_eth_lsc_event_callback,
@@ -155,6 +158,8 @@ fs_dev_configure(struct rte_eth_dev *dev)
                        if (ret)
                                WARN("Failed to register LSC callback for sub_device %d",
                                     SUB_ID(sdev));
+                       else
+                               sdev->lsc_callback = 1;
                }
                dev->data->dev_conf.intr_conf.lsc = lsc_enabled;
                sdev->state = DEV_ACTIVE;
@@ -281,6 +286,7 @@ fs_dev_close(struct rte_eth_dev *dev)
        PRIV(dev)->state = DEV_ACTIVE - 1;
        FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {
                DEBUG("Closing sub_device %d", i);
+               failsafe_eth_dev_unregister_callbacks(sdev);
                rte_eth_dev_close(PORT_ID(sdev));
                sdev->state = DEV_ACTIVE - 1;
        }
@@ -946,6 +952,31 @@ fs_mac_addr_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr)
        return 0;
 }
 
+static int
+fs_rss_hash_update(struct rte_eth_dev *dev,
+                       struct rte_eth_rss_conf *rss_conf)
+{
+       struct sub_device *sdev;
+       uint8_t i;
+       int ret;
+
+       fs_lock(dev, 0);
+       FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {
+               ret = rte_eth_dev_rss_hash_update(PORT_ID(sdev), rss_conf);
+               ret = fs_err(sdev, ret);
+               if (ret) {
+                       ERROR("Operation rte_eth_dev_rss_hash_update"
+                               " failed for sub_device %d with error %d",
+                               i, ret);
+                       fs_unlock(dev, 0);
+                       return ret;
+               }
+       }
+       fs_unlock(dev, 0);
+
+       return 0;
+}
+
 static int
 fs_filter_ctrl(struct rte_eth_dev *dev,
                enum rte_filter_type type,
@@ -1005,5 +1036,6 @@ const struct eth_dev_ops failsafe_ops = {
        .mac_addr_remove = fs_mac_addr_remove,
        .mac_addr_add = fs_mac_addr_add,
        .mac_addr_set = fs_mac_addr_set,
+       .rss_hash_update = fs_rss_hash_update,
        .filter_ctrl = fs_filter_ctrl,
 };