diff options
author | Alexander Duyck <alexander.h.duyck@intel.com> | 2012-02-08 07:49:23 (GMT) |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2012-03-13 03:26:27 (GMT) |
commit | 7f83a9e6292b49d1540f82f295ac8710ba562c5f (patch) | |
tree | 3d5292d14d37792b8bc14b2bd40ffb7af07ce7a2 /drivers/net/ethernet | |
parent | b37c0fbe3f6dfba1f8ad2aed47fb40578a254635 (diff) | |
download | linux-fsl-qoriq-7f83a9e6292b49d1540f82f295ac8710ba562c5f.tar.xz |
ixgbe: Do no clear Tx status bits since eop_desc provides enough info
There isn't any need to clear the status bits in the descriptors due to the
fact that the eop_desc provides enough information for us to know
that we have cleaned to the last packet that the software has put on the
ring. The status bits are cleared as a part of putting the frame on the
ring so as long as we do not read the descriptor bit prior to reading the
value eop_desc we should be able to guarantee that we will not clean beyond
the end of the current data stream.
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Tested-by: Stephen Ko <stephen.s.ko@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 0609643..a2c14bf 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -763,6 +763,9 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector, if (!eop_desc) break; + /* prevent any other reads prior to eop_desc */ + rmb(); + /* if DD is not set pending work has not been completed */ if (!(eop_desc->wb.status & cpu_to_le32(IXGBE_TXD_STAT_DD))) break; @@ -773,12 +776,8 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector, /* clear next_to_watch to prevent false hangs */ tx_buffer->next_to_watch = NULL; - /* prevent any other reads prior to eop_desc being verified */ - rmb(); - do { ixgbe_unmap_tx_resource(tx_ring, tx_buffer); - tx_desc->wb.status = 0; if (likely(tx_desc == eop_desc)) { eop_desc = NULL; dev_kfree_skb_any(tx_buffer->skb); |