diff options
author | Alexander Duyck <alexander.h.duyck@intel.com> | 2014-01-15 20:38:40 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-01-16 00:48:18 -0500 |
commit | 87397379d566d5d8692df1bfc22bef95fd64ae3b (patch) | |
tree | 32af909408927d86ea19f04a7960ee779f6c2f71 | |
parent | e5d640239fbb3a543b6151d49656b7573b940fdf (diff) |
ixgbe: Force QDE via PFQDE for VFs during reset
This change makes it so that the QDE bits are set for a VF before the Rx
queues are enabled. As such we avoid head of line blocking in the event
that the VF stops cleaning Rx descriptors for whatever reason.
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 14 ++++++++++++++
drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | 7 ++++---
2 files changed, 18 insertions(+), 3 deletions(-)
Signed-off-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 14 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | 7 |
2 files changed, 18 insertions, 3 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c index 359f6e60320d..43e10c67ac4e 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | |||
@@ -631,11 +631,14 @@ int ixgbe_vf_configuration(struct pci_dev *pdev, unsigned int event_mask) | |||
631 | 631 | ||
632 | static int ixgbe_vf_reset_msg(struct ixgbe_adapter *adapter, u32 vf) | 632 | static int ixgbe_vf_reset_msg(struct ixgbe_adapter *adapter, u32 vf) |
633 | { | 633 | { |
634 | struct ixgbe_ring_feature *vmdq = &adapter->ring_feature[RING_F_VMDQ]; | ||
634 | struct ixgbe_hw *hw = &adapter->hw; | 635 | struct ixgbe_hw *hw = &adapter->hw; |
635 | unsigned char *vf_mac = adapter->vfinfo[vf].vf_mac_addresses; | 636 | unsigned char *vf_mac = adapter->vfinfo[vf].vf_mac_addresses; |
636 | u32 reg, reg_offset, vf_shift; | 637 | u32 reg, reg_offset, vf_shift; |
637 | u32 msgbuf[4] = {0, 0, 0, 0}; | 638 | u32 msgbuf[4] = {0, 0, 0, 0}; |
638 | u8 *addr = (u8 *)(&msgbuf[1]); | 639 | u8 *addr = (u8 *)(&msgbuf[1]); |
640 | u32 q_per_pool = __ALIGN_MASK(1, ~vmdq->mask); | ||
641 | int i; | ||
639 | 642 | ||
640 | e_info(probe, "VF Reset msg received from vf %d\n", vf); | 643 | e_info(probe, "VF Reset msg received from vf %d\n", vf); |
641 | 644 | ||
@@ -654,6 +657,17 @@ static int ixgbe_vf_reset_msg(struct ixgbe_adapter *adapter, u32 vf) | |||
654 | reg |= 1 << vf_shift; | 657 | reg |= 1 << vf_shift; |
655 | IXGBE_WRITE_REG(hw, IXGBE_VFTE(reg_offset), reg); | 658 | IXGBE_WRITE_REG(hw, IXGBE_VFTE(reg_offset), reg); |
656 | 659 | ||
660 | /* force drop enable for all VF Rx queues */ | ||
661 | for (i = vf * q_per_pool; i < ((vf + 1) * q_per_pool); i++) { | ||
662 | /* flush previous write */ | ||
663 | IXGBE_WRITE_FLUSH(hw); | ||
664 | |||
665 | /* indicate to hardware that we want to set drop enable */ | ||
666 | reg = IXGBE_QDE_WRITE | IXGBE_QDE_ENABLE; | ||
667 | reg |= i << IXGBE_QDE_IDX_SHIFT; | ||
668 | IXGBE_WRITE_REG(hw, IXGBE_QDE, reg); | ||
669 | } | ||
670 | |||
657 | /* enable receive for vf */ | 671 | /* enable receive for vf */ |
658 | reg = IXGBE_READ_REG(hw, IXGBE_VFRE(reg_offset)); | 672 | reg = IXGBE_READ_REG(hw, IXGBE_VFRE(reg_offset)); |
659 | reg |= 1 << vf_shift; | 673 | reg |= 1 << vf_shift; |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h index 7c19e969576f..d8e59f42b85c 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | |||
@@ -1980,9 +1980,10 @@ enum { | |||
1980 | #define IXGBE_FWSM_TS_ENABLED 0x1 | 1980 | #define IXGBE_FWSM_TS_ENABLED 0x1 |
1981 | 1981 | ||
1982 | /* Queue Drop Enable */ | 1982 | /* Queue Drop Enable */ |
1983 | #define IXGBE_QDE_ENABLE 0x00000001 | 1983 | #define IXGBE_QDE_ENABLE 0x00000001 |
1984 | #define IXGBE_QDE_IDX_MASK 0x00007F00 | 1984 | #define IXGBE_QDE_IDX_MASK 0x00007F00 |
1985 | #define IXGBE_QDE_IDX_SHIFT 8 | 1985 | #define IXGBE_QDE_IDX_SHIFT 8 |
1986 | #define IXGBE_QDE_WRITE 0x00010000 | ||
1986 | 1987 | ||
1987 | #define IXGBE_TXD_POPTS_IXSM 0x01 /* Insert IP checksum */ | 1988 | #define IXGBE_TXD_POPTS_IXSM 0x01 /* Insert IP checksum */ |
1988 | #define IXGBE_TXD_POPTS_TXSM 0x02 /* Insert TCP/UDP checksum */ | 1989 | #define IXGBE_TXD_POPTS_TXSM 0x02 /* Insert TCP/UDP checksum */ |