net/mlx5: fix using flow tunnel before null check
[dpdk.git] / drivers / net / hns3 / hns3_ethdev_vf.c
index 1b8c029..6c3ddcc 100644 (file)
@@ -988,6 +988,9 @@ hns3vf_dev_infos_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *info)
                                 DEV_TX_OFFLOAD_MBUF_FAST_FREE |
                                 hns3_txvlan_cap_get(hw));
 
+       if (hns3_dev_outer_udp_cksum_supported(hw))
+               info->tx_offload_capa |= DEV_TX_OFFLOAD_OUTER_UDP_CKSUM;
+
        if (hns3_dev_indep_txrx_supported(hw))
                info->dev_capa = RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
                                 RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
@@ -1218,6 +1221,7 @@ hns3vf_get_capability(struct hns3_hw *hw)
                hw->intr.mapping_mode = HNS3_INTR_MAPPING_VEC_RSV_ONE;
                hw->intr.gl_unit = HNS3_INTR_COALESCE_GL_UINT_2US;
                hw->tso_mode = HNS3_TSO_SW_CAL_PSEUDO_H_CSUM;
+               hw->drop_stats_mode = HNS3_PKTS_DROP_STATS_MODE1;
                hw->min_tx_pkt_len = HNS3_HIP08_MIN_TX_PKT_LEN;
                hw->rss_info.ipv6_sctp_offload_supported = false;
                hw->promisc_mode = HNS3_UNLIMIT_PROMISC_MODE;
@@ -1235,6 +1239,7 @@ hns3vf_get_capability(struct hns3_hw *hw)
        hw->intr.mapping_mode = HNS3_INTR_MAPPING_VEC_ALL;
        hw->intr.gl_unit = HNS3_INTR_COALESCE_GL_UINT_1US;
        hw->tso_mode = HNS3_TSO_HW_CAL_PSEUDO_H_CSUM;
+       hw->drop_stats_mode = HNS3_PKTS_DROP_STATS_MODE2;
        hw->min_tx_pkt_len = HNS3_HIP09_MIN_TX_PKT_LEN;
        hw->rss_info.ipv6_sctp_offload_supported = true;
        hw->promisc_mode = HNS3_LIMIT_PROMISC_MODE;
@@ -1872,6 +1877,13 @@ hns3vf_init_vf(struct rte_eth_dev *eth_dev)
        if (ret)
                goto err_get_config;
 
+       /* Hardware statistics of imissed registers cleared. */
+       ret = hns3_update_imissed_stats(hw, true);
+       if (ret) {
+               hns3_err(hw, "clear imissed stats failed, ret = %d", ret);
+               goto err_set_tc_queue;
+       }
+
        ret = hns3vf_set_tc_queue_mapping(hns, hw->tqps_num, hw->tqps_num);
        if (ret) {
                PMD_INIT_LOG(ERR, "failed to set tc info, ret = %d.", ret);
@@ -1941,6 +1953,17 @@ hns3vf_do_stop(struct hns3_adapter *hns)
 
        hw->mac.link_status = ETH_LINK_DOWN;
 
+       /*
+        * The "hns3vf_do_stop" function will also be called by .stop_service to
+        * prepare reset. At the time of global or IMP reset, the command cannot
+        * be sent to stop the tx/rx queues. The mbuf in Tx/Rx queues may be
+        * accessed during the reset process. So the mbuf can not be released
+        * during reset and is required to be released after the reset is
+        * completed.
+        */
+       if (__atomic_load_n(&hw->reset.resetting,  __ATOMIC_RELAXED) == 0)
+               hns3_dev_release_mbufs(hns);
+
        if (__atomic_load_n(&hw->reset.disable_cmd, __ATOMIC_RELAXED) == 0) {
                hns3vf_configure_mac_addr(hns, true);
                ret = hns3_reset_all_tqps(hns);
@@ -2010,7 +2033,6 @@ hns3vf_dev_stop(struct rte_eth_dev *dev)
                hns3_stop_tqps(hw);
                hns3vf_do_stop(hns);
                hns3vf_unmap_rx_interrupt(dev);
-               hns3_dev_release_mbufs(hns);
                hw->adapter_state = HNS3_NIC_CONFIGURED;
        }
        hns3_rx_scattered_reset(dev);
@@ -2101,7 +2123,10 @@ hns3vf_dev_link_update(struct rte_eth_dev *eth_dev,
                new_link.link_speed = mac->link_speed;
                break;
        default:
-               new_link.link_speed = ETH_SPEED_NUM_100M;
+               if (mac->link_status)
+                       new_link.link_speed = ETH_SPEED_NUM_UNKNOWN;
+               else
+                       new_link.link_speed = ETH_SPEED_NUM_NONE;
                break;
        }
 
@@ -2125,6 +2150,8 @@ hns3vf_do_start(struct hns3_adapter *hns, bool reset_queue)
        if (ret)
                return ret;
 
+       hns3_enable_rxd_adv_layout(hw);
+
        ret = hns3_init_queues(hns, reset_queue);
        if (ret)
                hns3_err(hw, "failed to init queues, ret = %d.", ret);
@@ -2251,11 +2278,8 @@ hns3vf_dev_start(struct rte_eth_dev *dev)
                return ret;
        }
        ret = hns3vf_map_rx_interrupt(dev);
-       if (ret) {
-               hw->adapter_state = HNS3_NIC_CONFIGURED;
-               rte_spinlock_unlock(&hw->lock);
-               return ret;
-       }
+       if (ret)
+               goto map_rx_inter_err;
 
        /*
         * There are three register used to control the status of a TQP
@@ -2269,19 +2293,12 @@ hns3vf_dev_start(struct rte_eth_dev *dev)
         * status of queue in the dpdk framework.
         */
        ret = hns3_start_all_txqs(dev);
-       if (ret) {
-               hw->adapter_state = HNS3_NIC_CONFIGURED;
-               rte_spinlock_unlock(&hw->lock);
-               return ret;
-       }
+       if (ret)
+               goto map_rx_inter_err;
 
        ret = hns3_start_all_rxqs(dev);
-       if (ret) {
-               hns3_stop_all_txqs(dev);
-               hw->adapter_state = HNS3_NIC_CONFIGURED;
-               rte_spinlock_unlock(&hw->lock);
-               return ret;
-       }
+       if (ret)
+               goto start_all_rxqs_fail;
 
        hw->adapter_state = HNS3_NIC_STARTED;
        rte_spinlock_unlock(&hw->lock);
@@ -2302,6 +2319,15 @@ hns3vf_dev_start(struct rte_eth_dev *dev)
         */
        hns3_start_tqps(hw);
 
+       return ret;
+
+start_all_rxqs_fail:
+       hns3_stop_all_txqs(dev);
+map_rx_inter_err:
+       (void)hns3vf_do_stop(hns);
+       hw->adapter_state = HNS3_NIC_CONFIGURED;
+       rte_spinlock_unlock(&hw->lock);
+
        return ret;
 }
 
@@ -2758,7 +2784,7 @@ static const struct eth_dev_ops hns3vf_eth_dev_ops = {
        .rss_hash_conf_get  = hns3_dev_rss_hash_conf_get,
        .reta_update        = hns3_dev_rss_reta_update,
        .reta_query         = hns3_dev_rss_reta_query,
-       .filter_ctrl        = hns3_dev_filter_ctrl,
+       .flow_ops_get       = hns3_dev_flow_ops_get,
        .vlan_filter_set    = hns3vf_vlan_filter_set,
        .vlan_offload_set   = hns3vf_vlan_offload_set,
        .get_reg            = hns3_get_regs,
@@ -2823,6 +2849,7 @@ hns3vf_dev_init(struct rte_eth_dev *eth_dev)
        hw->adapter_state = HNS3_NIC_UNINITIALIZED;
        hns->is_vf = true;
        hw->data = eth_dev->data;
+       hns3_parse_devargs(eth_dev);
 
        ret = hns3_reset_init(hw);
        if (ret)
@@ -2891,8 +2918,10 @@ err_mp_init_primary:
 err_mp_init_secondary:
        eth_dev->dev_ops = NULL;
        eth_dev->rx_pkt_burst = NULL;
+       eth_dev->rx_descriptor_status = NULL;
        eth_dev->tx_pkt_burst = NULL;
        eth_dev->tx_pkt_prepare = NULL;
+       eth_dev->tx_descriptor_status = NULL;
        rte_free(eth_dev->process_private);
        eth_dev->process_private = NULL;
 
@@ -2951,3 +2980,6 @@ static struct rte_pci_driver rte_hns3vf_pmd = {
 RTE_PMD_REGISTER_PCI(net_hns3_vf, rte_hns3vf_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_hns3_vf, pci_id_hns3vf_map);
 RTE_PMD_REGISTER_KMOD_DEP(net_hns3_vf, "* igb_uio | vfio-pci");
+RTE_PMD_REGISTER_PARAM_STRING(net_hns3_vf,
+               HNS3_DEVARG_RX_FUNC_HINT "=vec|sve|simple|common "
+               HNS3_DEVARG_TX_FUNC_HINT "=vec|sve|simple|common ");