net/ice: complete device info get in DCF
[dpdk.git] / drivers / net / bnxt / bnxt_ethdev.c
index 4d64a98..7022f6d 100644 (file)
@@ -129,9 +129,11 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
 
 #define BNXT_DEVARG_TRUFLOW    "host-based-truflow"
 #define BNXT_DEVARG_FLOW_XSTAT "flow-xstat"
+#define BNXT_DEVARG_MAX_NUM_KFLOWS  "max-num-kflows"
 static const char *const bnxt_dev_args[] = {
        BNXT_DEVARG_TRUFLOW,
        BNXT_DEVARG_FLOW_XSTAT,
+       BNXT_DEVARG_MAX_NUM_KFLOWS,
        NULL
 };
 
@@ -147,6 +149,19 @@ static const char *const bnxt_dev_args[] = {
  */
 #define        BNXT_DEVARG_FLOW_XSTAT_INVALID(flow_xstat)      ((flow_xstat) > 1)
 
+/*
+ * max_num_kflows must be >= 32
+ * and must be a power-of-2 supported value
+ * return: 1 -> invalid
+ *         0 -> valid
+ */
+static int bnxt_devarg_max_num_kflow_invalid(uint16_t max_num_kflows)
+{
+       if (max_num_kflows < 32 || !rte_is_power_of_2(max_num_kflows))
+               return 1;
+       return 0;
+}
+
 static int bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask);
 static void bnxt_print_link_info(struct rte_eth_dev *eth_dev);
 static int bnxt_dev_uninit(struct rte_eth_dev *eth_dev);
@@ -221,8 +236,6 @@ static void bnxt_free_cos_queues(struct bnxt *bp)
 
 static void bnxt_free_mem(struct bnxt *bp, bool reconfig)
 {
-       bnxt_free_flow_stats_info(bp);
-
        bnxt_free_filter_mem(bp);
        bnxt_free_vnic_attributes(bp);
        bnxt_free_vnic_mem(bp);
@@ -778,7 +791,7 @@ static int bnxt_shutdown_nic(struct bnxt *bp)
  * Device configuration and status function
  */
 
-static uint32_t bnxt_get_speed_capabilities(struct bnxt *bp)
+uint32_t bnxt_get_speed_capabilities(struct bnxt *bp)
 {
        uint32_t link_speed = bp->link_info->support_speeds;
        uint32_t speed_capa = 0;
@@ -1095,7 +1108,7 @@ bnxt_receive_function(struct rte_eth_dev *eth_dev)
                DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
                DEV_RX_OFFLOAD_RSS_HASH |
                DEV_RX_OFFLOAD_VLAN_FILTER)) &&
-           !bp->truflow) {
+           !BNXT_TRUFLOW_EN(bp)) {
                PMD_DRV_LOG(INFO, "Using vector mode receive for port %d\n",
                            eth_dev->data->port_id);
                bp->flags |= BNXT_FLAG_RX_VECTOR_PKT_MODE;
@@ -1221,7 +1234,7 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
        bnxt_schedule_fw_health_check(bp);
        pthread_mutex_unlock(&bp->def_cp_lock);
 
-       if (bp->truflow)
+       if (BNXT_TRUFLOW_EN(bp))
                bnxt_ulp_init(bp);
 
        return 0;
@@ -1267,7 +1280,7 @@ static void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev)
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
 
-       if (bp->truflow)
+       if (BNXT_TRUFLOW_EN(bp))
                bnxt_ulp_deinit(bp);
 
        eth_dev->data->dev_started = 0;
@@ -3647,7 +3660,7 @@ bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
        case RTE_ETH_FILTER_GENERIC:
                if (filter_op != RTE_ETH_FILTER_GET)
                        return -EINVAL;
-               if (bp->truflow)
+               if (BNXT_TRUFLOW_EN(bp))
                        *(const void **)arg = &bnxt_ulp_rte_flow_ops;
                else
                        *(const void **)arg = &bnxt_flow_ops;
@@ -4980,7 +4993,7 @@ static int bnxt_setup_mac_addr(struct rte_eth_dev *eth_dev)
                return -ENOMEM;
        }
 
-       if (bnxt_check_zero_bytes(bp->dflt_mac_addr, RTE_ETHER_ADDR_LEN)) {
+       if (!BNXT_HAS_DFLT_MAC_SET(bp)) {
                if (BNXT_PF(bp))
                        return -EINVAL;
 
@@ -4993,14 +5006,11 @@ static int bnxt_setup_mac_addr(struct rte_eth_dev *eth_dev)
                            bp->mac_addr[3], bp->mac_addr[4], bp->mac_addr[5]);
 
                rc = bnxt_hwrm_set_mac(bp);
-               if (!rc)
-                       memcpy(&bp->eth_dev->data->mac_addrs[0], bp->mac_addr,
-                              RTE_ETHER_ADDR_LEN);
-               return rc;
+               if (rc)
+                       return rc;
        }
 
        /* Copy the permanent MAC from the FUNC_QCAPS response */
-       memcpy(bp->mac_addr, bp->dflt_mac_addr, RTE_ETHER_ADDR_LEN);
        memcpy(&eth_dev->data->mac_addrs[0], bp->mac_addr, RTE_ETHER_ADDR_LEN);
 
        return rc;
@@ -5011,7 +5021,7 @@ static int bnxt_restore_dflt_mac(struct bnxt *bp)
        int rc = 0;
 
        /* MAC is already configured in FW */
-       if (!bnxt_check_zero_bytes(bp->dflt_mac_addr, RTE_ETHER_ADDR_LEN))
+       if (BNXT_HAS_DFLT_MAC_SET(bp))
                return 0;
 
        /* Restore the old MAC configured */
@@ -5353,8 +5363,8 @@ bnxt_parse_devarg_truflow(__rte_unused const char *key,
                return -EINVAL;
        }
 
-       bp->truflow = truflow;
-       if (bp->truflow)
+       bp->flags |= BNXT_FLAG_TRUFLOW_EN;
+       if (BNXT_TRUFLOW_EN(bp))
                PMD_DRV_LOG(INFO, "Host-based truflow feature enabled.\n");
 
        return 0;
@@ -5395,6 +5405,42 @@ bnxt_parse_devarg_flow_xstat(__rte_unused const char *key,
        return 0;
 }
 
+static int
+bnxt_parse_devarg_max_num_kflows(__rte_unused const char *key,
+                                       const char *value, void *opaque_arg)
+{
+       struct bnxt *bp = opaque_arg;
+       unsigned long max_num_kflows;
+       char *end = NULL;
+
+       if (!value || !opaque_arg) {
+               PMD_DRV_LOG(ERR,
+                       "Invalid parameter passed to max_num_kflows devarg.\n");
+               return -EINVAL;
+       }
+
+       max_num_kflows = strtoul(value, &end, 10);
+       if (end == NULL || *end != '\0' ||
+               (max_num_kflows == ULONG_MAX && errno == ERANGE)) {
+               PMD_DRV_LOG(ERR,
+                       "Invalid parameter passed to max_num_kflows devarg.\n");
+               return -EINVAL;
+       }
+
+       if (bnxt_devarg_max_num_kflow_invalid(max_num_kflows)) {
+               PMD_DRV_LOG(ERR,
+                       "Invalid value passed to max_num_kflows devarg.\n");
+               return -EINVAL;
+       }
+
+       bp->max_num_kflows = max_num_kflows;
+       if (bp->max_num_kflows)
+               PMD_DRV_LOG(INFO, "max_num_kflows set as %ldK.\n",
+                               max_num_kflows);
+
+       return 0;
+}
+
 static void
 bnxt_parse_dev_args(struct bnxt *bp, struct rte_devargs *devargs)
 {
@@ -5409,18 +5455,25 @@ bnxt_parse_dev_args(struct bnxt *bp, struct rte_devargs *devargs)
 
        /*
         * Handler for "truflow" devarg.
-        * Invoked as for ex: "-w 0000:00:0d.0,host-based-truflow=1
+        * Invoked as for ex: "-w 0000:00:0d.0,host-based-truflow=1"
         */
        rte_kvargs_process(kvlist, BNXT_DEVARG_TRUFLOW,
                           bnxt_parse_devarg_truflow, bp);
 
        /*
         * Handler for "flow_xstat" devarg.
-        * Invoked as for ex: "-w 0000:00:0d.0,flow_xstat=1
+        * Invoked as for ex: "-w 0000:00:0d.0,flow_xstat=1"
         */
        rte_kvargs_process(kvlist, BNXT_DEVARG_FLOW_XSTAT,
                           bnxt_parse_devarg_flow_xstat, bp);
 
+       /*
+        * Handler for "max_num_kflows" devarg.
+        * Invoked as for ex: "-w 000:00:0d.0,max_num_kflows=32"
+        */
+       rte_kvargs_process(kvlist, BNXT_DEVARG_MAX_NUM_KFLOWS,
+                          bnxt_parse_devarg_max_num_kflows, bp);
+
        rte_kvargs_free(kvlist);
 }
 
@@ -5616,6 +5669,7 @@ bnxt_uninit_resources(struct bnxt *bp, bool reconfig_dev)
        bnxt_uninit_ctx_mem(bp);
 
        bnxt_uninit_locks(bp);
+       bnxt_free_flow_stats_info(bp);
        rte_free(bp->ptp_cfg);
        bp->ptp_cfg = NULL;
        return rc;