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>
This commit is contained in:
parent
c4680470a3
commit
36d6825b91
12 changed files with 14 additions and 33 deletions
|
@ -2015,7 +2015,7 @@ static int adm8211_resume(struct pci_dev *pdev)
|
||||||
|
|
||||||
if (priv->mode != IEEE80211_IF_TYPE_INVALID) {
|
if (priv->mode != IEEE80211_IF_TYPE_INVALID) {
|
||||||
adm8211_start(dev);
|
adm8211_start(dev);
|
||||||
ieee80211_start_queues(dev);
|
ieee80211_wake_queues(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1599,7 +1599,7 @@ ath5k_txq_cleanup(struct ath5k_softc *sc)
|
||||||
sc->txqs[i].link);
|
sc->txqs[i].link);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ieee80211_start_queues(sc->hw); /* XXX move to callers */
|
ieee80211_wake_queues(sc->hw); /* XXX move to callers */
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(sc->txqs); i++)
|
for (i = 0; i < ARRAY_SIZE(sc->txqs); i++)
|
||||||
if (sc->txqs[i].setup)
|
if (sc->txqs[i].setup)
|
||||||
|
|
|
@ -3497,7 +3497,6 @@ static int b43_wireless_core_start(struct b43_wldev *dev)
|
||||||
/* Start data flow (TX/RX). */
|
/* Start data flow (TX/RX). */
|
||||||
b43_mac_enable(dev);
|
b43_mac_enable(dev);
|
||||||
b43_interrupt_enable(dev, dev->irq_savedstate);
|
b43_interrupt_enable(dev, dev->irq_savedstate);
|
||||||
ieee80211_start_queues(dev->wl->hw);
|
|
||||||
|
|
||||||
/* Start maintainance work */
|
/* Start maintainance work */
|
||||||
b43_periodic_tasks_setup(dev);
|
b43_periodic_tasks_setup(dev);
|
||||||
|
|
|
@ -2794,7 +2794,6 @@ static int b43legacy_wireless_core_start(struct b43legacy_wldev *dev)
|
||||||
/* Start data flow (TX/RX) */
|
/* Start data flow (TX/RX) */
|
||||||
b43legacy_mac_enable(dev);
|
b43legacy_mac_enable(dev);
|
||||||
b43legacy_interrupt_enable(dev, dev->irq_savedstate);
|
b43legacy_interrupt_enable(dev, dev->irq_savedstate);
|
||||||
ieee80211_start_queues(dev->wl->hw);
|
|
||||||
|
|
||||||
/* Start maintenance work */
|
/* Start maintenance work */
|
||||||
b43legacy_periodic_tasks_setup(dev);
|
b43legacy_periodic_tasks_setup(dev);
|
||||||
|
|
|
@ -5823,7 +5823,7 @@ static void iwl3945_alive_start(struct iwl3945_priv *priv)
|
||||||
if (iwl3945_is_rfkill(priv))
|
if (iwl3945_is_rfkill(priv))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ieee80211_start_queues(priv->hw);
|
ieee80211_wake_queues(priv->hw);
|
||||||
|
|
||||||
priv->active_rate = priv->rates_mask;
|
priv->active_rate = priv->rates_mask;
|
||||||
priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK;
|
priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK;
|
||||||
|
|
|
@ -3367,7 +3367,7 @@ static void iwl4965_alive_start(struct iwl_priv *priv)
|
||||||
if (iwl_is_rfkill(priv))
|
if (iwl_is_rfkill(priv))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ieee80211_start_queues(priv->hw);
|
ieee80211_wake_queues(priv->hw);
|
||||||
|
|
||||||
priv->active_rate = priv->rates_mask;
|
priv->active_rate = priv->rates_mask;
|
||||||
priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK;
|
priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK;
|
||||||
|
|
|
@ -375,9 +375,6 @@ static void inline p54_wake_free_queues(struct ieee80211_hw *dev)
|
||||||
struct p54_common *priv = dev->priv;
|
struct p54_common *priv = dev->priv;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* ieee80211_start_queues is great if all queues are really empty.
|
|
||||||
* But, what if some are full? */
|
|
||||||
|
|
||||||
for (i = 0; i < dev->queues; i++)
|
for (i = 0; i < dev->queues; i++)
|
||||||
if (priv->tx_stats[i].len < priv->tx_stats[i].limit)
|
if (priv->tx_stats[i].len < priv->tx_stats[i].limit)
|
||||||
ieee80211_wake_queue(dev, i);
|
ieee80211_wake_queue(dev, i);
|
||||||
|
|
|
@ -665,7 +665,7 @@ static int p54p_resume(struct pci_dev *pdev)
|
||||||
|
|
||||||
if (priv->common.mode != IEEE80211_IF_TYPE_INVALID) {
|
if (priv->common.mode != IEEE80211_IF_TYPE_INVALID) {
|
||||||
p54p_open(dev);
|
p54p_open(dev);
|
||||||
ieee80211_start_queues(dev);
|
ieee80211_wake_queues(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -125,7 +125,7 @@ int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev)
|
||||||
/*
|
/*
|
||||||
* Start the TX queues.
|
* Start the TX queues.
|
||||||
*/
|
*/
|
||||||
ieee80211_start_queues(rt2x00dev->hw);
|
ieee80211_wake_queues(rt2x00dev->hw);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1186,7 +1186,7 @@ int rt2x00lib_resume(struct rt2x00_dev *rt2x00dev)
|
||||||
* In that case we have disabled the TX queue and should
|
* In that case we have disabled the TX queue and should
|
||||||
* now enable it again
|
* now enable it again
|
||||||
*/
|
*/
|
||||||
ieee80211_start_queues(rt2x00dev->hw);
|
ieee80211_wake_queues(rt2x00dev->hw);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* During interface iteration we might have changed the
|
* During interface iteration we might have changed the
|
||||||
|
|
|
@ -1566,14 +1566,6 @@ void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue);
|
||||||
*/
|
*/
|
||||||
void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue);
|
void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue);
|
||||||
|
|
||||||
/**
|
|
||||||
* ieee80211_start_queues - start all queues
|
|
||||||
* @hw: pointer to as obtained from ieee80211_alloc_hw().
|
|
||||||
*
|
|
||||||
* Drivers should use this function instead of netif_start_queue.
|
|
||||||
*/
|
|
||||||
void ieee80211_start_queues(struct ieee80211_hw *hw);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ieee80211_stop_queues - stop all queues
|
* ieee80211_stop_queues - stop all queues
|
||||||
* @hw: pointer as obtained from ieee80211_alloc_hw().
|
* @hw: pointer as obtained from ieee80211_alloc_hw().
|
||||||
|
|
|
@ -110,7 +110,13 @@ static int ieee80211_master_open(struct net_device *dev)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res;
|
|
||||||
|
if (res)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
netif_start_queue(local->mdev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ieee80211_master_stop(struct net_device *dev)
|
static int ieee80211_master_stop(struct net_device *dev)
|
||||||
|
|
|
@ -350,18 +350,6 @@ void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ieee80211_stop_queue);
|
EXPORT_SYMBOL(ieee80211_stop_queue);
|
||||||
|
|
||||||
void ieee80211_start_queues(struct ieee80211_hw *hw)
|
|
||||||
{
|
|
||||||
struct ieee80211_local *local = hw_to_local(hw);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < hw->queues + hw->ampdu_queues; i++)
|
|
||||||
clear_bit(IEEE80211_LINK_STATE_XOFF, &local->state[i]);
|
|
||||||
if (!ieee80211_qdisc_installed(local->mdev))
|
|
||||||
netif_start_queue(local->mdev);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(ieee80211_start_queues);
|
|
||||||
|
|
||||||
void ieee80211_stop_queues(struct ieee80211_hw *hw)
|
void ieee80211_stop_queues(struct ieee80211_hw *hw)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
Loading…
Add table
Reference in a new issue