aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2008-05-15 06:55:26 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-05-21 21:48:08 -0400
commit36d6825b91bc492b65b6333c369cd96a2fc8c903 (patch)
tree9113754ce110d593da8019a329c4afb229a036b3
parentc4680470a34a4f39af3d0a5c40f70befd8701908 (diff)
mac80211: let drivers wake but not start queues
Having drivers start queues is just confusing, their ->start() callback can block and do whatever is necessary, so let mac80211 start queues and have drivers wake queues when necessary (to get packets flowing again right away.) Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Acked-by: David S. Miller <davem@davemloft.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/adm8211.c2
-rw-r--r--drivers/net/wireless/ath5k/base.c2
-rw-r--r--drivers/net/wireless/b43/main.c1
-rw-r--r--drivers/net/wireless/b43legacy/main.c1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl4965-base.c2
-rw-r--r--drivers/net/wireless/p54/p54common.c3
-rw-r--r--drivers/net/wireless/p54/p54pci.c2
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c4
-rw-r--r--include/net/mac80211.h8
-rw-r--r--net/mac80211/main.c8
-rw-r--r--net/mac80211/util.c12
12 files changed, 14 insertions, 33 deletions
diff --git a/drivers/net/wireless/adm8211.c b/drivers/net/wireless/adm8211.c
index 7af5d8851f67..79dfca546c89 100644
--- a/drivers/net/wireless/adm8211.c
+++ b/drivers/net/wireless/adm8211.c
@@ -2015,7 +2015,7 @@ static int adm8211_resume(struct pci_dev *pdev)
2015 2015
2016 if (priv->mode != IEEE80211_IF_TYPE_INVALID) { 2016 if (priv->mode != IEEE80211_IF_TYPE_INVALID) {
2017 adm8211_start(dev); 2017 adm8211_start(dev);
2018 ieee80211_start_queues(dev); 2018 ieee80211_wake_queues(dev);
2019 } 2019 }
2020 2020
2021 return 0; 2021 return 0;
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
index c76ada178781..3f16ad66bdb5 100644
--- a/drivers/net/wireless/ath5k/base.c
+++ b/drivers/net/wireless/ath5k/base.c
@@ -1599,7 +1599,7 @@ ath5k_txq_cleanup(struct ath5k_softc *sc)
1599 sc->txqs[i].link); 1599 sc->txqs[i].link);
1600 } 1600 }
1601 } 1601 }
1602 ieee80211_start_queues(sc->hw); /* XXX move to callers */ 1602 ieee80211_wake_queues(sc->hw); /* XXX move to callers */
1603 1603
1604 for (i = 0; i < ARRAY_SIZE(sc->txqs); i++) 1604 for (i = 0; i < ARRAY_SIZE(sc->txqs); i++)
1605 if (sc->txqs[i].setup) 1605 if (sc->txqs[i].setup)
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index fc23ba5309bd..9445a604a966 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -3497,7 +3497,6 @@ static int b43_wireless_core_start(struct b43_wldev *dev)
3497 /* Start data flow (TX/RX). */ 3497 /* Start data flow (TX/RX). */
3498 b43_mac_enable(dev); 3498 b43_mac_enable(dev);
3499 b43_interrupt_enable(dev, dev->irq_savedstate); 3499 b43_interrupt_enable(dev, dev->irq_savedstate);
3500 ieee80211_start_queues(dev->wl->hw);
3501 3500
3502 /* Start maintainance work */ 3501 /* Start maintainance work */
3503 b43_periodic_tasks_setup(dev); 3502 b43_periodic_tasks_setup(dev);
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c
index 7755c59e0803..b05a507ed44d 100644
--- a/drivers/net/wireless/b43legacy/main.c
+++ b/drivers/net/wireless/b43legacy/main.c
@@ -2794,7 +2794,6 @@ static int b43legacy_wireless_core_start(struct b43legacy_wldev *dev)
2794 /* Start data flow (TX/RX) */ 2794 /* Start data flow (TX/RX) */
2795 b43legacy_mac_enable(dev); 2795 b43legacy_mac_enable(dev);
2796 b43legacy_interrupt_enable(dev, dev->irq_savedstate); 2796 b43legacy_interrupt_enable(dev, dev->irq_savedstate);
2797 ieee80211_start_queues(dev->wl->hw);
2798 2797
2799 /* Start maintenance work */ 2798 /* Start maintenance work */
2800 b43legacy_periodic_tasks_setup(dev); 2799 b43legacy_periodic_tasks_setup(dev);
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index b8fb8d8d95ff..54cde8a7b5fa 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -5823,7 +5823,7 @@ static void iwl3945_alive_start(struct iwl3945_priv *priv)
5823 if (iwl3945_is_rfkill(priv)) 5823 if (iwl3945_is_rfkill(priv))
5824 return; 5824 return;
5825 5825
5826 ieee80211_start_queues(priv->hw); 5826 ieee80211_wake_queues(priv->hw);
5827 5827
5828 priv->active_rate = priv->rates_mask; 5828 priv->active_rate = priv->rates_mask;
5829 priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK; 5829 priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK;
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c
index 48c59cbefb4a..db4f606bad50 100644
--- a/drivers/net/wireless/iwlwifi/iwl4965-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c
@@ -3367,7 +3367,7 @@ static void iwl4965_alive_start(struct iwl_priv *priv)
3367 if (iwl_is_rfkill(priv)) 3367 if (iwl_is_rfkill(priv))
3368 return; 3368 return;
3369 3369
3370 ieee80211_start_queues(priv->hw); 3370 ieee80211_wake_queues(priv->hw);
3371 3371
3372 priv->active_rate = priv->rates_mask; 3372 priv->active_rate = priv->rates_mask;
3373 priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK; 3373 priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK;
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c
index 9cbef5bce0f6..3d35fe6a8f5f 100644
--- a/drivers/net/wireless/p54/p54common.c
+++ b/drivers/net/wireless/p54/p54common.c
@@ -375,9 +375,6 @@ static void inline p54_wake_free_queues(struct ieee80211_hw *dev)
375 struct p54_common *priv = dev->priv; 375 struct p54_common *priv = dev->priv;
376 int i; 376 int i;
377 377
378 /* ieee80211_start_queues is great if all queues are really empty.
379 * But, what if some are full? */
380
381 for (i = 0; i < dev->queues; i++) 378 for (i = 0; i < dev->queues; i++)
382 if (priv->tx_stats[i].len < priv->tx_stats[i].limit) 379 if (priv->tx_stats[i].len < priv->tx_stats[i].limit)
383 ieee80211_wake_queue(dev, i); 380 ieee80211_wake_queue(dev, i);
diff --git a/drivers/net/wireless/p54/p54pci.c b/drivers/net/wireless/p54/p54pci.c
index fa527723fbe0..7dd4add4bf4e 100644
--- a/drivers/net/wireless/p54/p54pci.c
+++ b/drivers/net/wireless/p54/p54pci.c
@@ -665,7 +665,7 @@ static int p54p_resume(struct pci_dev *pdev)
665 665
666 if (priv->common.mode != IEEE80211_IF_TYPE_INVALID) { 666 if (priv->common.mode != IEEE80211_IF_TYPE_INVALID) {
667 p54p_open(dev); 667 p54p_open(dev);
668 ieee80211_start_queues(dev); 668 ieee80211_wake_queues(dev);
669 } 669 }
670 670
671 return 0; 671 return 0;
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index 171f445962db..d341764e1b24 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -125,7 +125,7 @@ int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev)
125 /* 125 /*
126 * Start the TX queues. 126 * Start the TX queues.
127 */ 127 */
128 ieee80211_start_queues(rt2x00dev->hw); 128 ieee80211_wake_queues(rt2x00dev->hw);
129 129
130 return 0; 130 return 0;
131} 131}
@@ -1186,7 +1186,7 @@ int rt2x00lib_resume(struct rt2x00_dev *rt2x00dev)
1186 * In that case we have disabled the TX queue and should 1186 * In that case we have disabled the TX queue and should
1187 * now enable it again 1187 * now enable it again
1188 */ 1188 */
1189 ieee80211_start_queues(rt2x00dev->hw); 1189 ieee80211_wake_queues(rt2x00dev->hw);
1190 1190
1191 /* 1191 /*
1192 * During interface iteration we might have changed the 1192 * During interface iteration we might have changed the
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 909956c97c44..f00fc76a7344 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -1567,14 +1567,6 @@ void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue);
1567void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue); 1567void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue);
1568 1568
1569/** 1569/**
1570 * ieee80211_start_queues - start all queues
1571 * @hw: pointer to as obtained from ieee80211_alloc_hw().
1572 *
1573 * Drivers should use this function instead of netif_start_queue.
1574 */
1575void ieee80211_start_queues(struct ieee80211_hw *hw);
1576
1577/**
1578 * ieee80211_stop_queues - stop all queues 1570 * ieee80211_stop_queues - stop all queues
1579 * @hw: pointer as obtained from ieee80211_alloc_hw(). 1571 * @hw: pointer as obtained from ieee80211_alloc_hw().
1580 * 1572 *
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index b0fddb7de549..9761d9bd5a79 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -110,7 +110,13 @@ static int ieee80211_master_open(struct net_device *dev)
110 break; 110 break;
111 } 111 }
112 } 112 }
113 return res; 113
114 if (res)
115 return res;
116
117 netif_start_queue(local->mdev);
118
119 return 0;
114} 120}
115 121
116static int ieee80211_master_stop(struct net_device *dev) 122static int ieee80211_master_stop(struct net_device *dev)
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 9cd07e1031af..800c15aff6e7 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -350,18 +350,6 @@ void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue)
350} 350}
351EXPORT_SYMBOL(ieee80211_stop_queue); 351EXPORT_SYMBOL(ieee80211_stop_queue);
352 352
353void ieee80211_start_queues(struct ieee80211_hw *hw)
354{
355 struct ieee80211_local *local = hw_to_local(hw);
356 int i;
357
358 for (i = 0; i < hw->queues + hw->ampdu_queues; i++)
359 clear_bit(IEEE80211_LINK_STATE_XOFF, &local->state[i]);
360 if (!ieee80211_qdisc_installed(local->mdev))
361 netif_start_queue(local->mdev);
362}
363EXPORT_SYMBOL(ieee80211_start_queues);
364
365void ieee80211_stop_queues(struct ieee80211_hw *hw) 353void ieee80211_stop_queues(struct ieee80211_hw *hw)
366{ 354{
367 int i; 355 int i;