};
 
 enum hnae3_reset_type {
+       HNAE3_VF_RESET,
        HNAE3_FUNC_RESET,
        HNAE3_CORE_RESET,
        HNAE3_GLOBAL_RESET,
        int (*set_vf_vlan_filter)(struct hnae3_handle *handle, int vfid,
                                  u16 vlan, u8 qos, __be16 proto);
        int (*enable_hw_strip_rxvtag)(struct hnae3_handle *handle, bool enable);
-       void (*reset_event)(struct hnae3_handle *handle,
-                           enum hnae3_reset_type reset);
+       void (*reset_event)(struct hnae3_handle *handle);
        void (*get_channels)(struct hnae3_handle *handle,
                             struct ethtool_channels *ch);
        void (*get_tqps_and_rss_info)(struct hnae3_handle *h,
        struct hnae3_ae_algo *ae_algo;  /* the class who provides this handle */
        u64 flags; /* Indicate the capabilities for this handle*/
 
+       unsigned long last_reset_time;
+       enum hnae3_reset_type reset_level;
+
        union {
                struct net_device *netdev; /* first member */
                struct hnae3_knic_private_info kinfo;
 
                return ret;
        }
 
-       priv->last_reset_time = jiffies;
+       priv->ae_handle->last_reset_time = jiffies;
        return 0;
 }
 
 static void hns3_nic_net_timeout(struct net_device *ndev)
 {
        struct hns3_nic_priv *priv = netdev_priv(ndev);
-       unsigned long last_reset_time = priv->last_reset_time;
        struct hnae3_handle *h = priv->ae_handle;
 
        if (!hns3_get_tx_timeo_queue_info(ndev))
 
        priv->tx_timeout_count++;
 
-       /* This timeout is far away enough from last timeout,
-        * if timeout again,set the reset type to PF reset
-        */
-       if (time_after(jiffies, (last_reset_time + 20 * HZ)))
-               priv->reset_level = HNAE3_FUNC_RESET;
-
-       /* Don't do any new action before the next timeout */
-       else if (time_before(jiffies, (last_reset_time + ndev->watchdog_timeo)))
+       if (time_before(jiffies, (h->last_reset_time + ndev->watchdog_timeo)))
                return;
 
-       priv->last_reset_time = jiffies;
-
+       /* request the reset */
        if (h->ae_algo->ops->reset_event)
-               h->ae_algo->ops->reset_event(h, priv->reset_level);
-
-       priv->reset_level++;
-       if (priv->reset_level > HNAE3_GLOBAL_RESET)
-               priv->reset_level = HNAE3_GLOBAL_RESET;
+               h->ae_algo->ops->reset_event(h);
 }
 
 static const struct net_device_ops hns3_nic_netdev_ops = {
        priv->dev = &pdev->dev;
        priv->netdev = netdev;
        priv->ae_handle = handle;
-       priv->last_reset_time = jiffies;
-       priv->reset_level = HNAE3_FUNC_RESET;
+       priv->ae_handle->reset_level = HNAE3_NONE_RESET;
+       priv->ae_handle->last_reset_time = jiffies;
        priv->tx_timeout_count = 0;
 
        handle->kinfo.netdev = netdev;
 static int hns3_reset_notify_up_enet(struct hnae3_handle *handle)
 {
        struct hnae3_knic_private_info *kinfo = &handle->kinfo;
-       struct hns3_nic_priv *priv = netdev_priv(kinfo->netdev);
        int ret = 0;
 
        if (netif_running(kinfo->netdev)) {
                                   "hns net up fail, ret=%d!\n", ret);
                        return ret;
                }
-
-               priv->last_reset_time = jiffies;
+               handle->last_reset_time = jiffies;
        }
 
        return ret;
        struct hns3_nic_priv *priv = netdev_priv(netdev);
        int ret;
 
-       priv->reset_level = 1;
        hns3_init_mac_addr(netdev);
        hns3_nic_set_rx_mode(netdev);
        hns3_recover_hw_addr(netdev);
 
        /* The most recently read link state */
        int link;
        u64 tx_timeout_count;
-       enum hnae3_reset_type reset_level;
-       unsigned long last_reset_time;
 
        unsigned long state;
 
 
        hclge_notify_client(hdev, HNAE3_UP_CLIENT);
 }
 
-static void hclge_reset_event(struct hnae3_handle *handle,
-                             enum hnae3_reset_type reset)
+static void hclge_reset_event(struct hnae3_handle *handle)
 {
        struct hclge_vport *vport = hclge_get_vport(handle);
        struct hclge_dev *hdev = vport->back;
 
-       dev_info(&hdev->pdev->dev,
-                "Receive reset event , reset_type is %d", reset);
+       /* check if this is a new reset request and we are not here just because
+        * last reset attempt did not succeed and watchdog hit us again. We will
+        * know this if last reset request did not occur very recently (watchdog
+        * timer = 5*HZ, let us check after sufficiently large time, say 4*5*Hz)
+        * In case of new request we reset the "reset level" to PF reset.
+        */
+       if (time_after(jiffies, (handle->last_reset_time + 4 * 5 * HZ)))
+               handle->reset_level = HNAE3_FUNC_RESET;
 
-       switch (reset) {
-       case HNAE3_FUNC_RESET:
-       case HNAE3_CORE_RESET:
-       case HNAE3_GLOBAL_RESET:
-               /* request reset & schedule reset task */
-               set_bit(reset, &hdev->reset_request);
-               hclge_reset_task_schedule(hdev);
-               break;
-       default:
-               dev_warn(&hdev->pdev->dev, "Unsupported reset event:%d", reset);
-               break;
-       }
+       dev_info(&hdev->pdev->dev, "received reset event , reset type is %d",
+                handle->reset_level);
+
+       /* request reset & schedule reset task */
+       set_bit(handle->reset_level, &hdev->reset_request);
+       hclge_reset_task_schedule(hdev);
+
+       if (handle->reset_level < HNAE3_GLOBAL_RESET)
+               handle->reset_level++;
+
+       handle->last_reset_time = jiffies;
 }
 
 static void hclge_reset_subtask(struct hclge_dev *hdev)
 
                             2, true, NULL, 0);
 }
 
+static void hclgevf_reset_event(struct hnae3_handle *handle)
+{
+       struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
+
+       dev_info(&hdev->pdev->dev, "received reset request from VF enet\n");
+
+       handle->reset_level = HNAE3_VF_RESET;
+
+       /* request VF reset here. Code added later */
+
+       handle->last_reset_time = jiffies;
+}
+
 static u32 hclgevf_get_fw_version(struct hnae3_handle *handle)
 {
        struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
        .get_tc_size = hclgevf_get_tc_size,
        .get_fw_version = hclgevf_get_fw_version,
        .set_vlan_filter = hclgevf_set_vlan_filter,
+       .reset_event = hclgevf_reset_event,
        .get_channels = hclgevf_get_channels,
        .get_tqps_and_rss_info = hclgevf_get_tqps_and_rss_info,
        .get_status = hclgevf_get_status,