Skip to content

Commit

Permalink
ixgbevf: Cache PF ack bit in interrupt
Browse files Browse the repository at this point in the history
When the PF acks a message from the VF the VF gets an interrupt.  It
must cache the ack bit so that polling SW will not miss the ack.  Also
avoid reading the message buffer on acks because that also will clear
the ack bit.

Signed-off-by: Greg Rose <gregory.v.rose@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Greg Rose authored and David S. Miller committed May 6, 2010
1 parent 8a07a22 commit 0825959
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions drivers/net/ixgbevf/ixgbevf_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -961,12 +961,28 @@ static irqreturn_t ixgbevf_msix_mbx(int irq, void *data)
eicr = IXGBE_READ_REG(hw, IXGBE_VTEICS);
IXGBE_WRITE_REG(hw, IXGBE_VTEICR, eicr);

if (!hw->mbx.ops.check_for_ack(hw)) {
/*
* checking for the ack clears the PFACK bit. Place
* it back in the v2p_mailbox cache so that anyone
* polling for an ack will not miss it. Also
* avoid the read below because the code to read
* the mailbox will also clear the ack bit. This was
* causing lost acks. Just cache the bit and exit
* the IRQ handler.
*/
hw->mbx.v2p_mailbox |= IXGBE_VFMAILBOX_PFACK;
goto out;
}

/* Not an ack interrupt, go ahead and read the message */
hw->mbx.ops.read(hw, &msg, 1);

if ((msg & IXGBE_MBVFICR_VFREQ_MASK) == IXGBE_PF_CONTROL_MSG)
mod_timer(&adapter->watchdog_timer,
round_jiffies(jiffies + 1));

out:
return IRQ_HANDLED;
}

Expand Down

0 comments on commit 0825959

Please sign in to comment.