diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c')
-rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index 891162d1610c..e51d552410ae 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************************* | 1 | /******************************************************************************* |
2 | 2 | ||
3 | Intel 82599 Virtual Function driver | 3 | Intel 82599 Virtual Function driver |
4 | Copyright(c) 1999 - 2010 Intel Corporation. | 4 | Copyright(c) 1999 - 2012 Intel Corporation. |
5 | 5 | ||
6 | This program is free software; you can redistribute it and/or modify it | 6 | This program is free software; you can redistribute it and/or modify it |
7 | under the terms and conditions of the GNU General Public License, | 7 | under the terms and conditions of the GNU General Public License, |
@@ -53,14 +53,14 @@ | |||
53 | 53 | ||
54 | #include "ixgbevf.h" | 54 | #include "ixgbevf.h" |
55 | 55 | ||
56 | char ixgbevf_driver_name[] = "ixgbevf"; | 56 | const char ixgbevf_driver_name[] = "ixgbevf"; |
57 | static const char ixgbevf_driver_string[] = | 57 | static const char ixgbevf_driver_string[] = |
58 | "Intel(R) 10 Gigabit PCI Express Virtual Function Network Driver"; | 58 | "Intel(R) 10 Gigabit PCI Express Virtual Function Network Driver"; |
59 | 59 | ||
60 | #define DRV_VERSION "2.2.0-k" | 60 | #define DRV_VERSION "2.2.0-k" |
61 | const char ixgbevf_driver_version[] = DRV_VERSION; | 61 | const char ixgbevf_driver_version[] = DRV_VERSION; |
62 | static char ixgbevf_copyright[] = | 62 | static char ixgbevf_copyright[] = |
63 | "Copyright (c) 2009 - 2010 Intel Corporation."; | 63 | "Copyright (c) 2009 - 2012 Intel Corporation."; |
64 | 64 | ||
65 | static const struct ixgbevf_info *ixgbevf_info_tbl[] = { | 65 | static const struct ixgbevf_info *ixgbevf_info_tbl[] = { |
66 | [board_82599_vf] = &ixgbevf_82599_vf_info, | 66 | [board_82599_vf] = &ixgbevf_82599_vf_info, |
@@ -917,32 +917,39 @@ static irqreturn_t ixgbevf_msix_mbx(int irq, void *data) | |||
917 | struct ixgbe_hw *hw = &adapter->hw; | 917 | struct ixgbe_hw *hw = &adapter->hw; |
918 | u32 eicr; | 918 | u32 eicr; |
919 | u32 msg; | 919 | u32 msg; |
920 | bool got_ack = false; | ||
920 | 921 | ||
921 | eicr = IXGBE_READ_REG(hw, IXGBE_VTEICS); | 922 | eicr = IXGBE_READ_REG(hw, IXGBE_VTEICS); |
922 | IXGBE_WRITE_REG(hw, IXGBE_VTEICR, eicr); | 923 | IXGBE_WRITE_REG(hw, IXGBE_VTEICR, eicr); |
923 | 924 | ||
924 | if (!hw->mbx.ops.check_for_ack(hw)) { | 925 | if (!hw->mbx.ops.check_for_ack(hw)) |
926 | got_ack = true; | ||
927 | |||
928 | if (!hw->mbx.ops.check_for_msg(hw)) { | ||
929 | hw->mbx.ops.read(hw, &msg, 1); | ||
930 | |||
931 | if ((msg & IXGBE_MBVFICR_VFREQ_MASK) == IXGBE_PF_CONTROL_MSG) | ||
932 | mod_timer(&adapter->watchdog_timer, | ||
933 | round_jiffies(jiffies + 1)); | ||
934 | |||
935 | if (msg & IXGBE_VT_MSGTYPE_NACK) | ||
936 | pr_warn("Last Request of type %2.2x to PF Nacked\n", | ||
937 | msg & 0xFF); | ||
925 | /* | 938 | /* |
926 | * checking for the ack clears the PFACK bit. Place | 939 | * Restore the PFSTS bit in case someone is polling for a |
927 | * it back in the v2p_mailbox cache so that anyone | 940 | * return message from the PF |
928 | * polling for an ack will not miss it. Also | ||
929 | * avoid the read below because the code to read | ||
930 | * the mailbox will also clear the ack bit. This was | ||
931 | * causing lost acks. Just cache the bit and exit | ||
932 | * the IRQ handler. | ||
933 | */ | 941 | */ |
934 | hw->mbx.v2p_mailbox |= IXGBE_VFMAILBOX_PFACK; | 942 | hw->mbx.v2p_mailbox |= IXGBE_VFMAILBOX_PFSTS; |
935 | goto out; | ||
936 | } | 943 | } |
937 | 944 | ||
938 | /* Not an ack interrupt, go ahead and read the message */ | 945 | /* |
939 | hw->mbx.ops.read(hw, &msg, 1); | 946 | * checking for the ack clears the PFACK bit. Place |
940 | 947 | * it back in the v2p_mailbox cache so that anyone | |
941 | if ((msg & IXGBE_MBVFICR_VFREQ_MASK) == IXGBE_PF_CONTROL_MSG) | 948 | * polling for an ack will not miss it |
942 | mod_timer(&adapter->watchdog_timer, | 949 | */ |
943 | round_jiffies(jiffies + 1)); | 950 | if (got_ack) |
951 | hw->mbx.v2p_mailbox |= IXGBE_VFMAILBOX_PFACK; | ||
944 | 952 | ||
945 | out: | ||
946 | return IRQ_HANDLED; | 953 | return IRQ_HANDLED; |
947 | } | 954 | } |
948 | 955 | ||