From: Johannes Berg <johannes@sipsolutions.net>
To: linux-wireless@vger.kernel.org
Subject: [RFT/C 4/7] mac80211: let drivers wake but not start queues
Date: Sun, 11 May 2008 00:18:49 +0200 [thread overview]
Message-ID: <20080510221907.428400000@sipsolutions.net> (raw)
In-Reply-To: 20080510221845.340428000@sipsolutions.net
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>
---
drivers/net/wireless/adm8211.c | 2 +-
drivers/net/wireless/at76_usb.c | 4 ++--
drivers/net/wireless/ath5k/base.c | 2 +-
drivers/net/wireless/b43/main.c | 1 -
drivers/net/wireless/b43legacy/main.c | 1 -
drivers/net/wireless/iwlwifi/iwl3945-base.c | 2 +-
drivers/net/wireless/iwlwifi/iwl4965-base.c | 2 +-
drivers/net/wireless/p54/p54common.c | 3 ---
drivers/net/wireless/p54/p54pci.c | 2 +-
drivers/net/wireless/rt2x00/rt2x00dev.c | 4 ++--
include/net/mac80211.h | 8 --------
net/mac80211/main.c | 8 +++++++-
net/mac80211/util.c | 12 ------------
13 files changed, 16 insertions(+), 35 deletions(-)
--- everything.orig/drivers/net/wireless/adm8211.c 2008-05-10 23:00:08.000000000 +0200
+++ everything/drivers/net/wireless/adm8211.c 2008-05-11 00:02:10.000000000 +0200
@@ -2014,7 +2014,7 @@ static int adm8211_resume(struct pci_dev
if (priv->mode != IEEE80211_IF_TYPE_INVALID) {
adm8211_start(dev);
- ieee80211_start_queues(dev);
+ ieee80211_wake_queues(dev);
}
return 0;
--- everything.orig/drivers/net/wireless/at76_usb.c 2008-05-10 23:00:07.000000000 +0200
+++ everything/drivers/net/wireless/at76_usb.c 2008-05-11 00:02:09.000000000 +0200
@@ -1720,7 +1720,7 @@ static void at76_mac80211_tx_callback(st
memset(&priv->tx_status, 0, sizeof(priv->tx_status));
priv->tx_skb = NULL;
- ieee80211_start_queues(priv->hw);
+ ieee80211_wake_queues(priv->hw);
}
static int at76_mac80211_tx(struct ieee80211_hw *hw, struct sk_buff *skb,
@@ -1918,7 +1918,7 @@ static void at76_dwork_hw_scan(struct wo
if (is_valid_ether_addr(priv->bssid))
at76_join(priv);
- ieee80211_start_queues(priv->hw);
+ ieee80211_wake_queues(priv->hw);
exit:
mutex_unlock(&priv->mtx);
--- everything.orig/drivers/net/wireless/ath5k/base.c 2008-05-10 23:00:08.000000000 +0200
+++ everything/drivers/net/wireless/ath5k/base.c 2008-05-11 00:02:10.000000000 +0200
@@ -1601,7 +1601,7 @@ ath5k_txq_cleanup(struct ath5k_softc *sc
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++)
if (sc->txqs[i].setup)
--- everything.orig/drivers/net/wireless/b43/main.c 2008-05-10 23:00:08.000000000 +0200
+++ everything/drivers/net/wireless/b43/main.c 2008-05-11 00:02:10.000000000 +0200
@@ -3497,7 +3497,6 @@ static int b43_wireless_core_start(struc
/* Start data flow (TX/RX). */
b43_mac_enable(dev);
b43_interrupt_enable(dev, dev->irq_savedstate);
- ieee80211_start_queues(dev->wl->hw);
/* Start maintainance work */
b43_periodic_tasks_setup(dev);
--- everything.orig/drivers/net/wireless/b43legacy/main.c 2008-05-10 23:00:08.000000000 +0200
+++ everything/drivers/net/wireless/b43legacy/main.c 2008-05-11 00:02:06.000000000 +0200
@@ -2794,7 +2794,6 @@ static int b43legacy_wireless_core_start
/* Start data flow (TX/RX) */
b43legacy_mac_enable(dev);
b43legacy_interrupt_enable(dev, dev->irq_savedstate);
- ieee80211_start_queues(dev->wl->hw);
/* Start maintenance work */
b43legacy_periodic_tasks_setup(dev);
--- everything.orig/drivers/net/wireless/iwlwifi/iwl3945-base.c 2008-05-10 23:00:07.000000000 +0200
+++ everything/drivers/net/wireless/iwlwifi/iwl3945-base.c 2008-05-11 00:02:09.000000000 +0200
@@ -5832,7 +5832,7 @@ static void iwl3945_alive_start(struct i
if (iwl3945_is_rfkill(priv))
return;
- ieee80211_start_queues(priv->hw);
+ ieee80211_wake_queues(priv->hw);
priv->active_rate = priv->rates_mask;
priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK;
--- everything.orig/drivers/net/wireless/iwlwifi/iwl4965-base.c 2008-05-10 23:00:07.000000000 +0200
+++ everything/drivers/net/wireless/iwlwifi/iwl4965-base.c 2008-05-11 00:02:09.000000000 +0200
@@ -4853,7 +4853,7 @@ static void iwl4965_alive_start(struct i
if (iwl_is_rfkill(priv))
return;
- ieee80211_start_queues(priv->hw);
+ ieee80211_wake_queues(priv->hw);
priv->active_rate = priv->rates_mask;
priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK;
--- everything.orig/drivers/net/wireless/p54/p54common.c 2008-05-10 23:00:08.000000000 +0200
+++ everything/drivers/net/wireless/p54/p54common.c 2008-05-11 00:02:10.000000000 +0200
@@ -375,9 +375,6 @@ static void inline p54_wake_free_queues(
struct p54_common *priv = dev->priv;
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++)
if (priv->tx_stats[i].len < priv->tx_stats[i].limit)
ieee80211_wake_queue(dev, i);
--- everything.orig/drivers/net/wireless/p54/p54pci.c 2008-05-10 23:00:08.000000000 +0200
+++ everything/drivers/net/wireless/p54/p54pci.c 2008-05-10 23:07:37.000000000 +0200
@@ -665,7 +665,7 @@ static int p54p_resume(struct pci_dev *p
if (priv->common.mode != IEEE80211_IF_TYPE_INVALID) {
p54p_open(dev);
- ieee80211_start_queues(dev);
+ ieee80211_wake_queues(dev);
}
return 0;
--- everything.orig/drivers/net/wireless/rt2x00/rt2x00dev.c 2008-05-10 23:00:08.000000000 +0200
+++ everything/drivers/net/wireless/rt2x00/rt2x00dev.c 2008-05-11 00:02:04.000000000 +0200
@@ -125,7 +125,7 @@ int rt2x00lib_enable_radio(struct rt2x00
/*
* Start the TX queues.
*/
- ieee80211_start_queues(rt2x00dev->hw);
+ ieee80211_wake_queues(rt2x00dev->hw);
return 0;
}
@@ -1186,7 +1186,7 @@ int rt2x00lib_resume(struct rt2x00_dev *
* In that case we have disabled the TX queue and should
* now enable it again
*/
- ieee80211_start_queues(rt2x00dev->hw);
+ ieee80211_wake_queues(rt2x00dev->hw);
/*
* During interface iteration we might have changed the
--- everything.orig/net/mac80211/util.c 2008-05-10 23:07:35.000000000 +0200
+++ everything/net/mac80211/util.c 2008-05-11 00:02:09.000000000 +0200
@@ -350,18 +350,6 @@ void ieee80211_stop_queue(struct ieee802
}
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)
{
int i;
--- everything.orig/include/net/mac80211.h 2008-05-10 23:00:07.000000000 +0200
+++ everything/include/net/mac80211.h 2008-05-11 00:02:09.000000000 +0200
@@ -1546,14 +1546,6 @@ void ieee80211_wake_queue(struct ieee802
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
* @hw: pointer as obtained from ieee80211_alloc_hw().
*
--- everything.orig/net/mac80211/main.c 2008-05-10 23:00:07.000000000 +0200
+++ everything/net/mac80211/main.c 2008-05-11 00:04:49.000000000 +0200
@@ -112,7 +112,13 @@ static int ieee80211_master_open(struct
break;
}
}
- return res;
+
+ if (res)
+ return res;
+
+ netif_start_queue(local->mdev);
+
+ return 0;
}
static int ieee80211_master_stop(struct net_device *dev)
--
next prev parent reply other threads:[~2008-05-10 22:22 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-10 22:18 [RFT/C 0/7] various mac80211 updates/bugfixes Johannes Berg
2008-05-10 22:18 ` [RFT/C 1/7] mac80211: use skb_header_cloned() Johannes Berg
2008-05-12 9:09 ` David Miller
2008-05-10 22:18 ` [RFT/C 2/7] mac80211: clean up skb reallocation code Johannes Berg
2008-05-12 9:09 ` David Miller
2008-05-13 8:39 ` Johannes Berg
2008-05-13 8:39 ` David Miller
2008-05-10 22:18 ` [RFT/C 3/7] mac80211: fix bugs in queue handling functions Johannes Berg
2008-05-10 22:18 ` Johannes Berg [this message]
2008-05-12 9:10 ` [RFT/C 4/7] mac80211: let drivers wake but not start queues David Miller
2008-05-10 22:18 ` [RFT/C 5/7] mac80211: use rate index in TX control Johannes Berg
2008-05-10 22:18 ` [RFT/C 6/7] mac80211: reorder some transmit handlers Johannes Berg
2008-05-10 22:18 ` [RFT/C 7/7] mac80211: move TX info into skb->cb Johannes Berg
2008-05-12 9:11 ` David Miller
2008-05-12 12:26 ` Ivo van Doorn
2008-05-13 8:40 ` Johannes Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080510221907.428400000@sipsolutions.net \
--to=johannes@sipsolutions.net \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.