diff options
author | Sebastian Basierski <sebastianx.basierski@intel.com> | 2018-07-31 12:16:00 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2018-08-24 11:52:35 -0400 |
commit | 939b701ad63314f5aa90dcd3d866f73954945209 (patch) | |
tree | eb9ddad0d4a0d89348eeba18f73de7d40d3c401b | |
parent | fabf1bce103aa8e3db27ff2cc55f8e0fb0abcc30 (diff) |
ixgbe: fix driver behaviour after issuing VFLR
Since VFLR doesn't clear VFMBMEM (VF Mailbox Memory)
and is not re-enabling queues correctly we should fix
this behavior.
Signed-off-by: Sebastian Basierski <sebastianx.basierski@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 26 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | 1 |
2 files changed, 27 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c index 9264a5f8a5d0..3c6f01c41b78 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | |||
@@ -693,8 +693,13 @@ static int ixgbe_set_vf_macvlan(struct ixgbe_adapter *adapter, | |||
693 | static inline void ixgbe_vf_reset_event(struct ixgbe_adapter *adapter, u32 vf) | 693 | static inline void ixgbe_vf_reset_event(struct ixgbe_adapter *adapter, u32 vf) |
694 | { | 694 | { |
695 | struct ixgbe_hw *hw = &adapter->hw; | 695 | struct ixgbe_hw *hw = &adapter->hw; |
696 | struct ixgbe_ring_feature *vmdq = &adapter->ring_feature[RING_F_VMDQ]; | ||
696 | struct vf_data_storage *vfinfo = &adapter->vfinfo[vf]; | 697 | struct vf_data_storage *vfinfo = &adapter->vfinfo[vf]; |
698 | u32 q_per_pool = __ALIGN_MASK(1, ~vmdq->mask); | ||
697 | u8 num_tcs = adapter->hw_tcs; | 699 | u8 num_tcs = adapter->hw_tcs; |
700 | u32 reg_val; | ||
701 | u32 queue; | ||
702 | u32 word; | ||
698 | 703 | ||
699 | /* remove VLAN filters beloning to this VF */ | 704 | /* remove VLAN filters beloning to this VF */ |
700 | ixgbe_clear_vf_vlans(adapter, vf); | 705 | ixgbe_clear_vf_vlans(adapter, vf); |
@@ -731,6 +736,27 @@ static inline void ixgbe_vf_reset_event(struct ixgbe_adapter *adapter, u32 vf) | |||
731 | 736 | ||
732 | /* reset VF api back to unknown */ | 737 | /* reset VF api back to unknown */ |
733 | adapter->vfinfo[vf].vf_api = ixgbe_mbox_api_10; | 738 | adapter->vfinfo[vf].vf_api = ixgbe_mbox_api_10; |
739 | |||
740 | /* Restart each queue for given VF */ | ||
741 | for (queue = 0; queue < q_per_pool; queue++) { | ||
742 | unsigned int reg_idx = (vf * q_per_pool) + queue; | ||
743 | |||
744 | reg_val = IXGBE_READ_REG(hw, IXGBE_PVFTXDCTL(reg_idx)); | ||
745 | |||
746 | /* Re-enabling only configured queues */ | ||
747 | if (reg_val) { | ||
748 | reg_val |= IXGBE_TXDCTL_ENABLE; | ||
749 | IXGBE_WRITE_REG(hw, IXGBE_PVFTXDCTL(reg_idx), reg_val); | ||
750 | reg_val &= ~IXGBE_TXDCTL_ENABLE; | ||
751 | IXGBE_WRITE_REG(hw, IXGBE_PVFTXDCTL(reg_idx), reg_val); | ||
752 | } | ||
753 | } | ||
754 | |||
755 | /* Clear VF's mailbox memory */ | ||
756 | for (word = 0; word < IXGBE_VFMAILBOX_SIZE; word++) | ||
757 | IXGBE_WRITE_REG_ARRAY(hw, IXGBE_PFMBMEM(vf), word, 0); | ||
758 | |||
759 | IXGBE_WRITE_FLUSH(hw); | ||
734 | } | 760 | } |
735 | 761 | ||
736 | static int ixgbe_set_vf_mac(struct ixgbe_adapter *adapter, | 762 | static int ixgbe_set_vf_mac(struct ixgbe_adapter *adapter, |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h index 44cfb2021145..41bcbb337e83 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | |||
@@ -2518,6 +2518,7 @@ enum { | |||
2518 | /* Translated register #defines */ | 2518 | /* Translated register #defines */ |
2519 | #define IXGBE_PVFTDH(P) (0x06010 + (0x40 * (P))) | 2519 | #define IXGBE_PVFTDH(P) (0x06010 + (0x40 * (P))) |
2520 | #define IXGBE_PVFTDT(P) (0x06018 + (0x40 * (P))) | 2520 | #define IXGBE_PVFTDT(P) (0x06018 + (0x40 * (P))) |
2521 | #define IXGBE_PVFTXDCTL(P) (0x06028 + (0x40 * (P))) | ||
2521 | #define IXGBE_PVFTDWBAL(P) (0x06038 + (0x40 * (P))) | 2522 | #define IXGBE_PVFTDWBAL(P) (0x06038 + (0x40 * (P))) |
2522 | #define IXGBE_PVFTDWBAH(P) (0x0603C + (0x40 * (P))) | 2523 | #define IXGBE_PVFTDWBAH(P) (0x0603C + (0x40 * (P))) |
2523 | 2524 | ||