**/
 static void ixgbevf_configure_rx(struct ixgbevf_adapter *adapter)
 {
-       int i;
        struct ixgbe_hw *hw = &adapter->hw;
        struct net_device *netdev = adapter->netdev;
+       int i, ret;
 
        ixgbevf_setup_psrtype(adapter);
        if (hw->mac.type >= ixgbe_mac_X550_vf)
                ixgbevf_setup_vfmrqc(adapter);
 
        /* notify the PF of our intent to use this size of frame */
-       hw->mac.ops.set_rlpml(hw, netdev->mtu + ETH_HLEN + ETH_FCS_LEN);
+       ret = hw->mac.ops.set_rlpml(hw, netdev->mtu + ETH_HLEN + ETH_FCS_LEN);
+       if (ret)
+               dev_err(&adapter->pdev->dev,
+                       "Failed to set MTU at %d\n", netdev->mtu);
 
        /* Setup the HW Rx Head and Tail Descriptor Pointers and
         * the Base and Length of the Rx Descriptor Ring
        struct ixgbe_hw *hw = &adapter->hw;
        int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
        int max_possible_frame = MAXIMUM_ETHERNET_VLAN_SIZE;
+       int ret;
 
        switch (adapter->hw.api_version) {
        case ixgbe_mbox_api_11:
        if ((new_mtu < 68) || (max_frame > max_possible_frame))
                return -EINVAL;
 
+       /* notify the PF of our intent to use this size of frame */
+       ret = hw->mac.ops.set_rlpml(hw, max_frame);
+       if (ret)
+               return -EINVAL;
+
        hw_dbg(hw, "changing MTU from %d to %d\n",
               netdev->mtu, new_mtu);
+
        /* must set new MTU before calling down or up */
        netdev->mtu = new_mtu;
 
-       /* notify the PF of our intent to use this size of frame */
-       hw->mac.ops.set_rlpml(hw, max_frame);
-
        return 0;
 }
 
 
  */
 #define IXGBE_HV_RESET_OFFSET           0x201
 
+static inline s32 ixgbevf_write_msg_read_ack(struct ixgbe_hw *hw, u32 *msg,
+                                            u32 *retmsg, u16 size)
+{
+       struct ixgbe_mbx_info *mbx = &hw->mbx;
+       s32 retval = mbx->ops.write_posted(hw, msg, size);
+
+       if (retval)
+               return retval;
+
+       return mbx->ops.read_posted(hw, retmsg, size);
+}
+
 /**
  *  ixgbevf_start_hw_vf - Prepare hardware for Tx/Rx
  *  @hw: pointer to hardware structure
        return -EOPNOTSUPP;
 }
 
-static void ixgbevf_write_msg_read_ack(struct ixgbe_hw *hw,
-                                      u32 *msg, u16 size)
-{
-       struct ixgbe_mbx_info *mbx = &hw->mbx;
-       u32 retmsg[IXGBE_VFMAILBOX_SIZE];
-       s32 retval = mbx->ops.write_posted(hw, msg, size);
-
-       if (!retval)
-               mbx->ops.read_posted(hw, retmsg, size);
-}
-
 /**
  *  ixgbevf_update_mc_addr_list_vf - Update Multicast addresses
  *  @hw: pointer to the HW structure
                vector_list[i++] = ixgbevf_mta_vector(hw, ha->addr);
        }
 
-       ixgbevf_write_msg_read_ack(hw, msgbuf, IXGBE_VFMAILBOX_SIZE);
+       ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, IXGBE_VFMAILBOX_SIZE);
 
        return 0;
 }
  *  @hw: pointer to the HW structure
  *  @max_size: value to assign to max frame size
  **/
-static void ixgbevf_set_rlpml_vf(struct ixgbe_hw *hw, u16 max_size)
+static s32 ixgbevf_set_rlpml_vf(struct ixgbe_hw *hw, u16 max_size)
 {
        u32 msgbuf[2];
+       s32 ret_val;
 
        msgbuf[0] = IXGBE_VF_SET_LPE;
        msgbuf[1] = max_size;
-       ixgbevf_write_msg_read_ack(hw, msgbuf, 2);
+
+       ret_val = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 2);
+       if (ret_val)
+               return ret_val;
+       if ((msgbuf[0] & IXGBE_VF_SET_LPE) &&
+           (msgbuf[0] & IXGBE_VT_MSGTYPE_NACK))
+               return IXGBE_ERR_MBX;
+
+       return 0;
 }
 
 /**
  * @max_size: value to assign to max frame size
  * Hyper-V variant.
  **/
-static void ixgbevf_hv_set_rlpml_vf(struct ixgbe_hw *hw, u16 max_size)
+static s32 ixgbevf_hv_set_rlpml_vf(struct ixgbe_hw *hw, u16 max_size)
 {
        u32 reg;
 
        /* CRC == 4 */
        reg |= ((max_size + 4) | IXGBE_RXDCTL_RLPML_EN);
        IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(0), reg);
+
+       return 0;
 }
 
 /**