diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c')
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c index 6f59933cdff7..3c6f01c41b78 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | |||
@@ -53,6 +53,11 @@ static int __ixgbe_enable_sriov(struct ixgbe_adapter *adapter, | |||
53 | struct ixgbe_hw *hw = &adapter->hw; | 53 | struct ixgbe_hw *hw = &adapter->hw; |
54 | int i; | 54 | int i; |
55 | 55 | ||
56 | if (adapter->xdp_prog) { | ||
57 | e_warn(probe, "SRIOV is not supported with XDP\n"); | ||
58 | return -EINVAL; | ||
59 | } | ||
60 | |||
56 | /* Enable VMDq flag so device will be set in VM mode */ | 61 | /* Enable VMDq flag so device will be set in VM mode */ |
57 | adapter->flags |= IXGBE_FLAG_SRIOV_ENABLED | | 62 | adapter->flags |= IXGBE_FLAG_SRIOV_ENABLED | |
58 | IXGBE_FLAG_VMDQ_ENABLED; | 63 | IXGBE_FLAG_VMDQ_ENABLED; |
@@ -688,8 +693,13 @@ static int ixgbe_set_vf_macvlan(struct ixgbe_adapter *adapter, | |||
688 | 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) |
689 | { | 694 | { |
690 | 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]; | ||
691 | 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); | ||
692 | u8 num_tcs = adapter->hw_tcs; | 699 | u8 num_tcs = adapter->hw_tcs; |
700 | u32 reg_val; | ||
701 | u32 queue; | ||
702 | u32 word; | ||
693 | 703 | ||
694 | /* remove VLAN filters beloning to this VF */ | 704 | /* remove VLAN filters beloning to this VF */ |
695 | ixgbe_clear_vf_vlans(adapter, vf); | 705 | ixgbe_clear_vf_vlans(adapter, vf); |
@@ -726,6 +736,27 @@ static inline void ixgbe_vf_reset_event(struct ixgbe_adapter *adapter, u32 vf) | |||
726 | 736 | ||
727 | /* reset VF api back to unknown */ | 737 | /* reset VF api back to unknown */ |
728 | 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); | ||
729 | } | 760 | } |
730 | 761 | ||
731 | static int ixgbe_set_vf_mac(struct ixgbe_adapter *adapter, | 762 | static int ixgbe_set_vf_mac(struct ixgbe_adapter *adapter, |