diff options
-rw-r--r-- | drivers/net/ixgbevf/ixgbevf_main.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/net/ixgbevf/ixgbevf_main.c b/drivers/net/ixgbevf/ixgbevf_main.c index 08707402eb18..460c37fee965 100644 --- a/drivers/net/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ixgbevf/ixgbevf_main.c | |||
@@ -961,12 +961,28 @@ static irqreturn_t ixgbevf_msix_mbx(int irq, void *data) | |||
961 | eicr = IXGBE_READ_REG(hw, IXGBE_VTEICS); | 961 | eicr = IXGBE_READ_REG(hw, IXGBE_VTEICS); |
962 | IXGBE_WRITE_REG(hw, IXGBE_VTEICR, eicr); | 962 | IXGBE_WRITE_REG(hw, IXGBE_VTEICR, eicr); |
963 | 963 | ||
964 | if (!hw->mbx.ops.check_for_ack(hw)) { | ||
965 | /* | ||
966 | * checking for the ack clears the PFACK bit. Place | ||
967 | * it back in the v2p_mailbox cache so that anyone | ||
968 | * polling for an ack will not miss it. Also | ||
969 | * avoid the read below because the code to read | ||
970 | * the mailbox will also clear the ack bit. This was | ||
971 | * causing lost acks. Just cache the bit and exit | ||
972 | * the IRQ handler. | ||
973 | */ | ||
974 | hw->mbx.v2p_mailbox |= IXGBE_VFMAILBOX_PFACK; | ||
975 | goto out; | ||
976 | } | ||
977 | |||
978 | /* Not an ack interrupt, go ahead and read the message */ | ||
964 | hw->mbx.ops.read(hw, &msg, 1); | 979 | hw->mbx.ops.read(hw, &msg, 1); |
965 | 980 | ||
966 | if ((msg & IXGBE_MBVFICR_VFREQ_MASK) == IXGBE_PF_CONTROL_MSG) | 981 | if ((msg & IXGBE_MBVFICR_VFREQ_MASK) == IXGBE_PF_CONTROL_MSG) |
967 | mod_timer(&adapter->watchdog_timer, | 982 | mod_timer(&adapter->watchdog_timer, |
968 | round_jiffies(jiffies + 1)); | 983 | round_jiffies(jiffies + 1)); |
969 | 984 | ||
985 | out: | ||
970 | return IRQ_HANDLED; | 986 | return IRQ_HANDLED; |
971 | } | 987 | } |
972 | 988 | ||