#define IXGBE_ERR_INVALID_MAC_ADDR     -1
 #define IXGBE_ERR_RESET_FAILED         -2
 #define IXGBE_ERR_INVALID_ARGUMENT     -3
+#define IXGBE_ERR_CONFIG               -4
+#define IXGBE_ERR_MBX                  -5
+#define IXGBE_ERR_TIMEOUT              -6
 
 /* Transmit Config masks */
 #define IXGBE_TXDCTL_ENABLE            0x02000000 /* Ena specific Tx Queue */
 
        struct ixgbe_mbx_info *mbx = &hw->mbx;
        int countdown = mbx->timeout;
 
+       if (!countdown || !mbx->ops.check_for_msg)
+               return IXGBE_ERR_CONFIG;
+
        while (countdown && mbx->ops.check_for_msg(hw)) {
                countdown--;
                udelay(mbx->udelay);
        if (!countdown)
                mbx->timeout = 0;
 
-       return countdown ? 0 : IXGBE_ERR_MBX;
+       return countdown ? 0 : IXGBE_ERR_TIMEOUT;
 }
 
 /**
        struct ixgbe_mbx_info *mbx = &hw->mbx;
        int countdown = mbx->timeout;
 
+       if (!countdown || !mbx->ops.check_for_ack)
+               return IXGBE_ERR_CONFIG;
+
        while (countdown && mbx->ops.check_for_ack(hw)) {
                countdown--;
                udelay(mbx->udelay);
        if (!countdown)
                mbx->timeout = 0;
 
-       return countdown ? 0 : IXGBE_ERR_MBX;
+       return countdown ? 0 : IXGBE_ERR_TIMEOUT;
 }
 
 /**
 static s32 ixgbevf_read_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size)
 {
        struct ixgbe_mbx_info *mbx = &hw->mbx;
-       s32 ret_val = IXGBE_ERR_MBX;
+       s32 ret_val = IXGBE_ERR_CONFIG;
 
        if (!mbx->ops.read)
                goto out;
 static s32 ixgbevf_write_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size)
 {
        struct ixgbe_mbx_info *mbx = &hw->mbx;
-       s32 ret_val = IXGBE_ERR_MBX;
+       s32 ret_val = IXGBE_ERR_CONFIG;
 
        /* exit if either we can't write or there isn't a defined timeout */
        if (!mbx->ops.write || !mbx->timeout)