static void ixgbevf_up_complete(struct ixgbevf_adapter *adapter)
 {
        struct net_device *netdev = adapter->netdev;
+       struct pci_dev *pdev = adapter->pdev;
        struct ixgbe_hw *hw = &adapter->hw;
+       bool state;
 
        ixgbevf_configure_msix(adapter);
 
 
        spin_unlock_bh(&adapter->mbx_lock);
 
+       state = adapter->link_state;
+       hw->mac.ops.get_link_state(hw, &adapter->link_state);
+       if (state && state != adapter->link_state)
+               dev_info(&pdev->dev, "VF is administratively disabled\n");
+
        smp_mb__before_atomic();
        clear_bit(__IXGBEVF_DOWN, &adapter->state);
        ixgbevf_napi_enable_all(adapter);
        adapter->tx_ring_count = IXGBEVF_DEFAULT_TXD;
        adapter->rx_ring_count = IXGBEVF_DEFAULT_RXD;
 
+       adapter->link_state = true;
+
        set_bit(__IXGBEVF_DOWN, &adapter->state);
        return 0;
 
 
        ixgbevf_watchdog_update_link(adapter);
 
-       if (adapter->link_up)
+       if (adapter->link_up && adapter->link_state)
                ixgbevf_watchdog_link_is_up(adapter);
        else
                ixgbevf_watchdog_link_is_down(adapter);
 
        return -EOPNOTSUPP;
 }
 
+/**
+ * ixgbevf_get_link_state_vf - Get VF link state from PF
+ * @hw: pointer to the HW structure
+ * @link_state: link state storage
+ *
+ * Returns state of the operation error or success.
+ */
+static s32 ixgbevf_get_link_state_vf(struct ixgbe_hw *hw, bool *link_state)
+{
+       u32 msgbuf[2];
+       s32 ret_val;
+       s32 err;
+
+       msgbuf[0] = IXGBE_VF_GET_LINK_STATE;
+       msgbuf[1] = 0x0;
+
+       err = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 2);
+
+       if (err || (msgbuf[0] & IXGBE_VT_MSGTYPE_FAILURE)) {
+               ret_val = IXGBE_ERR_MBX;
+       } else {
+               ret_val = 0;
+               *link_state = msgbuf[1];
+       }
+
+       return ret_val;
+}
+
+/**
+ * ixgbevf_hv_get_link_state_vf - * Hyper-V variant - just a stub.
+ * @hw: unused
+ * @link_state: unused
+ *
+ * Hyper-V variant; there is no mailbox communication.
+ */
+static s32 ixgbevf_hv_get_link_state_vf(struct ixgbe_hw *hw, bool *link_state)
+{
+       return -EOPNOTSUPP;
+}
+
 /**
  *  ixgbevf_set_vfta_vf - Set/Unset VLAN filter table address
  *  @hw: pointer to the HW structure
        .set_rar                = ixgbevf_set_rar_vf,
        .update_mc_addr_list    = ixgbevf_update_mc_addr_list_vf,
        .update_xcast_mode      = ixgbevf_update_xcast_mode,
+       .get_link_state         = ixgbevf_get_link_state_vf,
        .set_uc_addr            = ixgbevf_set_uc_addr_vf,
        .set_vfta               = ixgbevf_set_vfta_vf,
        .set_rlpml              = ixgbevf_set_rlpml_vf,
        .set_rar                = ixgbevf_hv_set_rar_vf,
        .update_mc_addr_list    = ixgbevf_hv_update_mc_addr_list_vf,
        .update_xcast_mode      = ixgbevf_hv_update_xcast_mode,
+       .get_link_state         = ixgbevf_hv_get_link_state_vf,
        .set_uc_addr            = ixgbevf_hv_set_uc_addr_vf,
        .set_vfta               = ixgbevf_hv_set_vfta_vf,
        .set_rlpml              = ixgbevf_hv_set_rlpml_vf,
 
        s32 (*init_rx_addrs)(struct ixgbe_hw *);
        s32 (*update_mc_addr_list)(struct ixgbe_hw *, struct net_device *);
        s32 (*update_xcast_mode)(struct ixgbe_hw *, int);
+       s32 (*get_link_state)(struct ixgbe_hw *hw, bool *link_state);
        s32 (*enable_mc)(struct ixgbe_hw *);
        s32 (*disable_mc)(struct ixgbe_hw *);
        s32 (*clear_vfta)(struct ixgbe_hw *);