if (!(hdev->serv_processed_cnt % HCLGEVF_STATS_TIMER_INTERVAL))
                hclgevf_tqps_update_stats(handle);
 
-       /* request the link status from the PF. PF would be able to tell VF
-        * about such updates in future so we might remove this later
+       /* VF does not need to request link status when this bit is set, because
+        * PF will push its link status to VFs when link status changed.
         */
-       hclgevf_request_link_info(hdev);
+       if (!test_bit(HCLGEVF_STATE_PF_PUSH_LINK_STATUS, &hdev->state))
+               hclgevf_request_link_info(hdev);
 
        hclgevf_update_link_mode(hdev);
 
        struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
 
        clear_bit(HCLGEVF_STATE_DOWN, &hdev->state);
+       clear_bit(HCLGEVF_STATE_PF_PUSH_LINK_STATUS, &hdev->state);
 
        hclgevf_reset_tqp_stats(handle);
 
 
        u8 duplex;
        u32 speed;
        u32 tail;
+       u8 flag;
        u8 idx;
 
        /* we can safely clear it now as we are at start of the async message
                        link_status = msg_q[1];
                        memcpy(&speed, &msg_q[2], sizeof(speed));
                        duplex = (u8)msg_q[4];
+                       flag = (u8)msg_q[5];
 
                        /* update upper layer with new link link status */
                        hclgevf_update_link_status(hdev, link_status);
                        hclgevf_update_speed_duplex(hdev, speed, duplex);
 
+                       if (flag & HCLGE_MBX_PUSH_LINK_STATUS_EN)
+                               set_bit(HCLGEVF_STATE_PF_PUSH_LINK_STATUS,
+                                       &hdev->state);
+
                        break;
                case HCLGE_MBX_LINK_STAT_MODE:
                        idx = (u8)msg_q[1];