iwlagn: update write pointers for all tx queues after wakeup
authorBen Cahill <ben.m.cahill@intel.com>
Fri, 30 Oct 2009 21:36:09 +0000 (14:36 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 2 Nov 2009 20:39:45 +0000 (15:39 -0500)
Wakeup interrupt has been updating write pointers (indexes, actually) only
for tx queues 0-5.  This is adequate just for 3945, but inadequate for other
devices, all of which have more tx queues.  Now updating all tx/command queues,
so device can be aware of all new tx and host commands enqueued while
device was asleep.

This can potentially improve data traffic bandwidth and/or latency.

Signed-off-by: Ben Cahill <ben.m.cahill@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwlwifi/iwl-agn.c

index 7751a75..0cb95bf 100644 (file)
@@ -890,6 +890,7 @@ static void iwl_irq_tasklet_legacy(struct iwl_priv *priv)
        u32 inta, handled = 0;
        u32 inta_fh;
        unsigned long flags;
+       u32 i;
 #ifdef CONFIG_IWLWIFI_DEBUG
        u32 inta_mask;
 #endif
@@ -1007,19 +1008,17 @@ static void iwl_irq_tasklet_legacy(struct iwl_priv *priv)
                handled |= CSR_INT_BIT_SW_ERR;
        }
 
-       /* uCode wakes up after power-down sleep */
+       /*
+        * uCode wakes up after power-down sleep.
+        * Tell device about any new tx or host commands enqueued,
+        * and about any Rx buffers made available while asleep.
+        */
        if (inta & CSR_INT_BIT_WAKEUP) {
                IWL_DEBUG_ISR(priv, "Wakeup interrupt\n");
                iwl_rx_queue_update_write_ptr(priv, &priv->rxq);
-               iwl_txq_update_write_ptr(priv, &priv->txq[0]);
-               iwl_txq_update_write_ptr(priv, &priv->txq[1]);
-               iwl_txq_update_write_ptr(priv, &priv->txq[2]);
-               iwl_txq_update_write_ptr(priv, &priv->txq[3]);
-               iwl_txq_update_write_ptr(priv, &priv->txq[4]);
-               iwl_txq_update_write_ptr(priv, &priv->txq[5]);
-
+               for (i = 0; i < priv->hw_params.max_txq_num; i++)
+                       iwl_txq_update_write_ptr(priv, &priv->txq[i]);
                priv->isr_stats.wakeup++;
-
                handled |= CSR_INT_BIT_WAKEUP;
        }