summaryrefslogtreecommitdiff
path: root/drivers/net/cxgb4vf/cxgb4vf_main.c
diff options
context:
space:
mode:
authorCasey Leedom <leedom@chelsio.com>2010-07-13 01:39:07 +0400
committerDavid S. Miller <davem@davemloft.net>2010-07-13 07:21:41 +0400
commit7f9dd2fa4ac74d35f7e5200b76bd09533afe4e4c (patch)
tree5ce55bc75706f9fa7136a7143bc404e0b55bc00f /drivers/net/cxgb4vf/cxgb4vf_main.c
parent84c3b972f37a735dafc25c4c0d5fb98f99e1157a (diff)
downloadlinux-7f9dd2fa4ac74d35f7e5200b76bd09533afe4e4c.tar.xz
cxgb4vf: fix TX Queue restart
Fix up TX Queue Host Flow Control to cause an Egress Queue Status Update to be generated when we run out of TX Queue Descriptors. This will, in turn, allow us to restart a stopped TX Queue. Signed-off-by: Casey Leedom <leedom@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/cxgb4vf/cxgb4vf_main.c')
-rw-r--r--drivers/net/cxgb4vf/cxgb4vf_main.c32
1 files changed, 7 insertions, 25 deletions
diff --git a/drivers/net/cxgb4vf/cxgb4vf_main.c b/drivers/net/cxgb4vf/cxgb4vf_main.c
index e988031f7e86..d065516c0ffd 100644
--- a/drivers/net/cxgb4vf/cxgb4vf_main.c
+++ b/drivers/net/cxgb4vf/cxgb4vf_main.c
@@ -423,12 +423,13 @@ static int fwevtq_handler(struct sge_rspq *rspq, const __be64 *rsp,
case CPL_SGE_EGR_UPDATE: {
/*
- * We've received an Egress Queue status update message.
- * We get these, as the SGE is currently configured, when
- * the firmware passes certain points in processing our
- * TX Ethernet Queue. We use these updates to determine
- * when we may need to restart a TX Ethernet Queue which
- * was stopped for lack of free slots ...
+ * We've received an Egress Queue Status Update message. We
+ * get these, if the SGE is configured to send these when the
+ * firmware passes certain points in processing our TX
+ * Ethernet Queue or if we make an explicit request for one.
+ * We use these updates to determine when we may need to
+ * restart a TX Ethernet Queue which was stopped for lack of
+ * free TX Queue Descriptors ...
*/
const struct cpl_sge_egr_update *p = (void *)cpl;
unsigned int qid = EGR_QID(be32_to_cpu(p->opcode_qid));
@@ -436,7 +437,6 @@ static int fwevtq_handler(struct sge_rspq *rspq, const __be64 *rsp,
struct sge_txq *tq;
struct sge_eth_txq *txq;
unsigned int eq_idx;
- int hw_cidx, reclaimable, in_use;
/*
* Perform sanity checking on the Queue ID to make sure it
@@ -466,24 +466,6 @@ static int fwevtq_handler(struct sge_rspq *rspq, const __be64 *rsp,
}
/*
- * Skip TX Queues which aren't stopped.
- */
- if (likely(!netif_tx_queue_stopped(txq->txq)))
- break;
-
- /*
- * Skip stopped TX Queues which have more than half of their
- * DMA rings occupied with unacknowledged writes.
- */
- hw_cidx = be16_to_cpu(txq->q.stat->cidx);
- reclaimable = hw_cidx - txq->q.cidx;
- if (reclaimable < 0)
- reclaimable += txq->q.size;
- in_use = txq->q.in_use - reclaimable;
- if (in_use >= txq->q.size/2)
- break;
-
- /*
* Restart a stopped TX Queue which has less than half of its
* TX ring in use ...
*/