aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Duyck <alexander.h.duyck@intel.com>2014-01-15 20:38:40 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-16 00:48:18 -0500
commit87397379d566d5d8692df1bfc22bef95fd64ae3b (patch)
tree32af909408927d86ea19f04a7960ee779f6c2f71
parente5d640239fbb3a543b6151d49656b7573b940fdf (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.c14
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_type.h7
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
632static int ixgbe_vf_reset_msg(struct ixgbe_adapter *adapter, u32 vf) 632static 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 */