104 lines
3.2 KiB
Diff
104 lines
3.2 KiB
Diff
|
From 70277f47b58b174a6b0b891dcd06ae5125afb73b Mon Sep 17 00:00:00 2001
|
||
|
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||
|
Date: Thu, 20 Dec 2012 14:31:51 +0100
|
||
|
Subject: [PATCH] iwlegacy: add flush callback
|
||
|
|
||
|
Dump implementation of flush, which just wait until all TX queues
|
||
|
become empty.
|
||
|
|
||
|
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||
|
Signed-off-by: John W. Linville <linville@tuxdriver.com>
|
||
|
---
|
||
|
drivers/net/wireless/iwlegacy/3945-mac.c | 1 +
|
||
|
drivers/net/wireless/iwlegacy/4965-mac.c | 1 +
|
||
|
drivers/net/wireless/iwlegacy/common.c | 36 ++++++++++++++++++++++++++++++
|
||
|
drivers/net/wireless/iwlegacy/common.h | 1 +
|
||
|
4 files changed, 39 insertions(+), 0 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/net/wireless/iwlegacy/3945-mac.c b/drivers/net/wireless/iwlegacy/3945-mac.c
|
||
|
index d604b40..962400a 100644
|
||
|
--- a/drivers/net/wireless/iwlegacy/3945-mac.c
|
||
|
+++ b/drivers/net/wireless/iwlegacy/3945-mac.c
|
||
|
@@ -3474,6 +3474,7 @@ struct ieee80211_ops il3945_mac_ops = {
|
||
|
.sta_add = il3945_mac_sta_add,
|
||
|
.sta_remove = il_mac_sta_remove,
|
||
|
.tx_last_beacon = il_mac_tx_last_beacon,
|
||
|
+ .flush = il_mac_flush,
|
||
|
};
|
||
|
|
||
|
static int
|
||
|
diff --git a/drivers/net/wireless/iwlegacy/4965-mac.c b/drivers/net/wireless/iwlegacy/4965-mac.c
|
||
|
index 6a86ed4..c40020c 100644
|
||
|
--- a/drivers/net/wireless/iwlegacy/4965-mac.c
|
||
|
+++ b/drivers/net/wireless/iwlegacy/4965-mac.c
|
||
|
@@ -6308,6 +6308,7 @@ const struct ieee80211_ops il4965_mac_ops = {
|
||
|
.sta_remove = il_mac_sta_remove,
|
||
|
.channel_switch = il4965_mac_channel_switch,
|
||
|
.tx_last_beacon = il_mac_tx_last_beacon,
|
||
|
+ .flush = il_mac_flush,
|
||
|
};
|
||
|
|
||
|
static int
|
||
|
diff --git a/drivers/net/wireless/iwlegacy/common.c b/drivers/net/wireless/iwlegacy/common.c
|
||
|
index 7e16d10..56b8021 100644
|
||
|
--- a/drivers/net/wireless/iwlegacy/common.c
|
||
|
+++ b/drivers/net/wireless/iwlegacy/common.c
|
||
|
@@ -4707,6 +4707,42 @@ out:
|
||
|
}
|
||
|
EXPORT_SYMBOL(il_mac_change_interface);
|
||
|
|
||
|
+void
|
||
|
+il_mac_flush(struct ieee80211_hw *hw, bool drop)
|
||
|
+{
|
||
|
+ struct il_priv *il = hw->priv;
|
||
|
+ unsigned long timeout = jiffies + msecs_to_jiffies(500);
|
||
|
+ int i;
|
||
|
+
|
||
|
+ mutex_lock(&il->mutex);
|
||
|
+ D_MAC80211("enter\n");
|
||
|
+
|
||
|
+ if (il->txq == NULL)
|
||
|
+ goto out;
|
||
|
+
|
||
|
+ for (i = 0; i < il->hw_params.max_txq_num; i++) {
|
||
|
+ struct il_queue *q;
|
||
|
+
|
||
|
+ if (i == il->cmd_queue)
|
||
|
+ continue;
|
||
|
+
|
||
|
+ q = &il->txq[i].q;
|
||
|
+ if (q->read_ptr == q->write_ptr)
|
||
|
+ continue;
|
||
|
+
|
||
|
+ if (time_after(jiffies, timeout)) {
|
||
|
+ IL_ERR("Failed to flush queue %d\n", q->id);
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ msleep(20);
|
||
|
+ }
|
||
|
+out:
|
||
|
+ D_MAC80211("leave\n");
|
||
|
+ mutex_unlock(&il->mutex);
|
||
|
+}
|
||
|
+EXPORT_SYMBOL(il_mac_flush);
|
||
|
+
|
||
|
/*
|
||
|
* On every watchdog tick we check (latest) time stamp. If it does not
|
||
|
* change during timeout period and queue is not empty we reset firmware.
|
||
|
diff --git a/drivers/net/wireless/iwlegacy/common.h b/drivers/net/wireless/iwlegacy/common.h
|
||
|
index a9a569f..37fe553 100644
|
||
|
--- a/drivers/net/wireless/iwlegacy/common.h
|
||
|
+++ b/drivers/net/wireless/iwlegacy/common.h
|
||
|
@@ -1723,6 +1723,7 @@ void il_mac_remove_interface(struct ieee80211_hw *hw,
|
||
|
struct ieee80211_vif *vif);
|
||
|
int il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||
|
enum nl80211_iftype newtype, bool newp2p);
|
||
|
+void il_mac_flush(struct ieee80211_hw *hw, bool drop);
|
||
|
int il_alloc_txq_mem(struct il_priv *il);
|
||
|
void il_free_txq_mem(struct il_priv *il);
|
||
|
|
||
|
--
|
||
|
1.7.7.6
|
||
|
|