net/pcap: fix file descriptor leak on close
[dpdk.git] / drivers / net / hns3 / hns3_ethdev_vf.c
index faf7e01..3f9f328 100644 (file)
@@ -778,6 +778,7 @@ hns3vf_dev_configure(struct rte_eth_dev *dev)
        uint16_t nb_rx_q = dev->data->nb_rx_queues;
        uint16_t nb_tx_q = dev->data->nb_tx_queues;
        struct rte_eth_rss_conf rss_conf;
+       uint32_t max_rx_pkt_len;
        uint16_t mtu;
        bool gro_en;
        int ret;
@@ -825,12 +826,18 @@ hns3vf_dev_configure(struct rte_eth_dev *dev)
         * according to the maximum RX packet length.
         */
        if (conf->rxmode.offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
-               /*
-                * Security of max_rx_pkt_len is guaranteed in dpdk frame.
-                * Maximum value of max_rx_pkt_len is HNS3_MAX_FRAME_LEN, so it
-                * can safely assign to "uint16_t" type variable.
-                */
-               mtu = (uint16_t)HNS3_PKTLEN_TO_MTU(conf->rxmode.max_rx_pkt_len);
+               max_rx_pkt_len = conf->rxmode.max_rx_pkt_len;
+               if (max_rx_pkt_len > HNS3_MAX_FRAME_LEN ||
+                   max_rx_pkt_len <= HNS3_DEFAULT_FRAME_LEN) {
+                       hns3_err(hw, "maximum Rx packet length must be greater "
+                                "than %u and less than %u when jumbo frame enabled.",
+                                (uint16_t)HNS3_DEFAULT_FRAME_LEN,
+                                (uint16_t)HNS3_MAX_FRAME_LEN);
+                       ret = -EINVAL;
+                       goto cfg_err;
+               }
+
+               mtu = (uint16_t)HNS3_PKTLEN_TO_MTU(max_rx_pkt_len);
                ret = hns3vf_dev_mtu_set(dev, mtu);
                if (ret)
                        goto cfg_err;
@@ -1016,7 +1023,7 @@ hns3vf_dev_infos_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *info)
 
        info->vmdq_queue_num = 0;
 
-       info->reta_size = HNS3_RSS_IND_TBL_SIZE;
+       info->reta_size = hw->rss_ind_tbl_size;
        info->hash_key_size = HNS3_RSS_KEY_SIZE;
        info->flow_type_rss_offloads = HNS3_ETH_RSS_SUPPORT;
        info->default_rxportconf.ring_size = HNS3_DEFAULT_RING_DESC;
@@ -1059,7 +1066,7 @@ hns3vf_check_event_cause(struct hns3_adapter *hns, uint32_t *clearval)
                rst_ing_reg = hns3_read_dev(hw, HNS3_FUN_RST_ING);
                hns3_warn(hw, "resetting reg: 0x%x", rst_ing_reg);
                hns3_atomic_set_bit(HNS3_VF_RESET, &hw->reset.pending);
-               rte_atomic16_set(&hw->reset.disable_cmd, 1);
+               __atomic_store_n(&hw->reset.disable_cmd, 1, __ATOMIC_RELAXED);
                val = hns3_read_dev(hw, HNS3_VF_RST_ING);
                hns3_write_dev(hw, HNS3_VF_RST_ING, val | HNS3_VF_RST_ING_BIT);
                val = cmdq_stat_reg & ~BIT(HNS3_VECTOR0_RST_INT_B);
@@ -1148,6 +1155,20 @@ hns3vf_parse_dev_specifications(struct hns3_hw *hw, struct hns3_cmd_desc *desc)
        hw->intr.int_ql_max = rte_le_to_cpu_16(req0->intr_ql_max);
 }
 
+static int
+hns3vf_check_dev_specifications(struct hns3_hw *hw)
+{
+       if (hw->rss_ind_tbl_size == 0 ||
+           hw->rss_ind_tbl_size > HNS3_RSS_IND_TBL_SIZE_MAX) {
+               hns3_warn(hw, "the size of hash lookup table configured (%u)"
+                             " exceeds the maximum(%u)", hw->rss_ind_tbl_size,
+                             HNS3_RSS_IND_TBL_SIZE_MAX);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 static int
 hns3vf_query_dev_specifications(struct hns3_hw *hw)
 {
@@ -1168,7 +1189,7 @@ hns3vf_query_dev_specifications(struct hns3_hw *hw)
 
        hns3vf_parse_dev_specifications(hw, desc);
 
-       return 0;
+       return hns3vf_check_dev_specifications(hw);
 }
 
 static int
@@ -1920,7 +1941,7 @@ hns3vf_do_stop(struct hns3_adapter *hns)
 
        hw->mac.link_status = ETH_LINK_DOWN;
 
-       if (rte_atomic16_read(&hw->reset.disable_cmd) == 0) {
+       if (__atomic_load_n(&hw->reset.disable_cmd, __ATOMIC_RELAXED) == 0) {
                hns3vf_configure_mac_addr(hns, true);
                ret = hns3_reset_all_tqps(hns);
                if (ret) {
@@ -2390,15 +2411,17 @@ static int
 hns3vf_prepare_reset(struct hns3_adapter *hns)
 {
        struct hns3_hw *hw = &hns->hw;
-       int ret = 0;
+       int ret;
 
        if (hw->reset.level == HNS3_VF_FUNC_RESET) {
                ret = hns3_send_mbx_msg(hw, HNS3_MBX_RESET, 0, NULL,
                                        0, true, NULL, 0);
+               if (ret)
+                       return ret;
        }
-       rte_atomic16_set(&hw->reset.disable_cmd, 1);
+       __atomic_store_n(&hw->reset.disable_cmd, 1, __ATOMIC_RELAXED);
 
-       return ret;
+       return 0;
 }
 
 static int
@@ -2435,7 +2458,7 @@ hns3vf_stop_service(struct hns3_adapter *hns)
         * from table space. Hence, for function reset software intervention is
         * required to delete the entries.
         */
-       if (rte_atomic16_read(&hw->reset.disable_cmd) == 0)
+       if (__atomic_load_n(&hw->reset.disable_cmd, __ATOMIC_RELAXED) == 0)
                hns3vf_configure_all_mc_mac_addr(hns, true);
        rte_spinlock_unlock(&hw->lock);
 
@@ -2607,8 +2630,10 @@ hns3vf_reset_service(void *param)
         * The interrupt may have been lost. It is necessary to handle
         * the interrupt to recover from the error.
         */
-       if (rte_atomic16_read(&hns->hw.reset.schedule) == SCHEDULE_DEFERRED) {
-               rte_atomic16_set(&hns->hw.reset.schedule, SCHEDULE_REQUESTED);
+       if (__atomic_load_n(&hw->reset.schedule, __ATOMIC_RELAXED) ==
+                           SCHEDULE_DEFERRED) {
+               __atomic_store_n(&hw->reset.schedule, SCHEDULE_REQUESTED,
+                                __ATOMIC_RELAXED);
                hns3_err(hw, "Handling interrupts in delayed tasks");
                hns3vf_interrupt_handler(&rte_eth_devices[hw->data->port_id]);
                reset_level = hns3vf_get_reset_level(hw, &hw->reset.pending);
@@ -2617,7 +2642,7 @@ hns3vf_reset_service(void *param)
                        hns3_atomic_set_bit(HNS3_VF_RESET, &hw->reset.pending);
                }
        }
-       rte_atomic16_set(&hns->hw.reset.schedule, SCHEDULE_NONE);
+       __atomic_store_n(&hw->reset.schedule, SCHEDULE_NONE, __ATOMIC_RELAXED);
 
        /*
         * Hardware reset has been notified, we now have to poll & check if
@@ -2840,7 +2865,8 @@ hns3vf_dev_init(struct rte_eth_dev *eth_dev)
 
        hw->adapter_state = HNS3_NIC_INITIALIZED;
 
-       if (rte_atomic16_read(&hns->hw.reset.schedule) == SCHEDULE_PENDING) {
+       if (__atomic_load_n(&hw->reset.schedule, __ATOMIC_RELAXED) ==
+                           SCHEDULE_PENDING) {
                hns3_err(hw, "Reschedule reset service after dev_init");
                hns3_schedule_reset(hns);
        } else {