net/ice: invoke callback when link status change
[dpdk.git] / drivers / net / ice / ice_ethdev.c
index 237e973..dc4d1e6 100644 (file)
 #include "base/ice_dcb.h"
 #include "ice_ethdev.h"
 #include "ice_rxtx.h"
-#include "ice_switch_filter.h"
+#include "ice_generic_flow.h"
 
 /* devargs */
 #define ICE_SAFE_MODE_SUPPORT_ARG "safe-mode-support"
+#define ICE_PIPELINE_MODE_SUPPORT_ARG  "pipeline-mode-support"
 #define ICE_PROTO_XTR_ARG         "proto_xtr"
 
 static const char * const ice_valid_args[] = {
        ICE_SAFE_MODE_SUPPORT_ARG,
+       ICE_PIPELINE_MODE_SUPPORT_ARG,
        ICE_PROTO_XTR_ARG,
        NULL
 };
@@ -1303,6 +1305,7 @@ ice_interrupt_handler(void *param)
        uint8_t pf_num;
        uint8_t event;
        uint16_t queue;
+       int ret;
 #ifdef ICE_LSE_SPT
        uint32_t int_fw_ctl;
 #endif
@@ -1330,7 +1333,10 @@ ice_interrupt_handler(void *param)
 #else
        if (oicr & PFINT_OICR_LINK_STAT_CHANGE_M) {
                PMD_DRV_LOG(INFO, "OICR: link state change event");
-               ice_link_update(dev, 0);
+               ret = ice_link_update(dev, 0);
+               if (!ret)
+                       _rte_eth_dev_callback_process
+                               (dev, RTE_ETH_EVENT_INTR_LSC, NULL);
        }
 #endif
 
@@ -1833,6 +1839,11 @@ static int ice_parse_devargs(struct rte_eth_dev *dev)
 
        ret = rte_kvargs_process(kvlist, ICE_SAFE_MODE_SUPPORT_ARG,
                                 &parse_bool, &ad->devargs.safe_mode_support);
+       if (ret)
+               goto bail;
+
+       ret = rte_kvargs_process(kvlist, ICE_PIPELINE_MODE_SUPPORT_ARG,
+                                &parse_bool, &ad->devargs.pipe_mode_support);
 
 bail:
        rte_kvargs_free(kvlist);
@@ -2002,7 +2013,11 @@ ice_dev_init(struct rte_eth_dev *dev)
        /* get base queue pairs index  in the device */
        ice_base_queue_get(pf);
 
-       TAILQ_INIT(&pf->flow_list);
+       ret = ice_flow_init(ad);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "Failed to initialize flow");
+               return ret;
+       }
 
        return 0;
 
@@ -2124,7 +2139,8 @@ ice_dev_close(struct rte_eth_dev *dev)
        struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
-       struct rte_flow *p_flow;
+       struct ice_adapter *ad =
+               ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
 
        /* Since stop will make link down, then the link event will be
         * triggered, disable the irq firstly to avoid the port_infoe etc
@@ -2135,6 +2151,8 @@ ice_dev_close(struct rte_eth_dev *dev)
 
        ice_dev_stop(dev);
 
+       ice_flow_uninit(ad);
+
        /* release all queue resource */
        ice_free_queues(dev);
 
@@ -2160,13 +2178,6 @@ ice_dev_close(struct rte_eth_dev *dev)
        /* unregister callback func from eal lib */
        rte_intr_callback_unregister(intr_handle,
                                     ice_interrupt_handler, dev);
-
-       /* Remove all flows */
-       while ((p_flow = TAILQ_FIRST(&pf->flow_list))) {
-               TAILQ_REMOVE(&pf->flow_list, p_flow, node);
-               ice_free_switch_filter_rule(p_flow->rule);
-               rte_free(p_flow);
-       }
 }
 
 static int
@@ -3203,8 +3214,8 @@ ice_get_rss_lut(struct ice_vsi *vsi, uint8_t *lut, uint16_t lut_size)
                return -EINVAL;
 
        if (pf->flags & ICE_FLAG_RSS_AQ_CAPABLE) {
-               ret = ice_aq_get_rss_lut(hw, vsi->idx, TRUE,
-                                        lut, lut_size);
+               ret = ice_aq_get_rss_lut(hw, vsi->idx,
+                       ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_PF, lut, lut_size);
                if (ret) {
                        PMD_DRV_LOG(ERR, "Failed to get RSS lookup table");
                        return -EINVAL;
@@ -3234,8 +3245,8 @@ ice_set_rss_lut(struct ice_vsi *vsi, uint8_t *lut, uint16_t lut_size)
        hw = ICE_VSI_TO_HW(vsi);
 
        if (pf->flags & ICE_FLAG_RSS_AQ_CAPABLE) {
-               ret = ice_aq_set_rss_lut(hw, vsi->idx, TRUE,
-                                        lut, lut_size);
+               ret = ice_aq_set_rss_lut(hw, vsi->idx,
+                       ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_PF, lut, lut_size);
                if (ret) {
                        PMD_DRV_LOG(ERR, "Failed to set RSS lookup table");
                        return -EINVAL;
@@ -4298,7 +4309,8 @@ RTE_PMD_REGISTER_PCI_TABLE(net_ice, pci_id_ice_map);
 RTE_PMD_REGISTER_KMOD_DEP(net_ice, "* igb_uio | uio_pci_generic | vfio-pci");
 RTE_PMD_REGISTER_PARAM_STRING(net_ice,
                              ICE_PROTO_XTR_ARG "=[queue:]<vlan|ipv4|ipv6|ipv6_flow|tcp>"
-                             ICE_SAFE_MODE_SUPPORT_ARG "=<0|1>");
+                             ICE_SAFE_MODE_SUPPORT_ARG "=<0|1>"
+                             ICE_PIPELINE_MODE_SUPPORT_ARG "=<0|1>");
 
 RTE_INIT(ice_init_log)
 {