|
@@ -30,6 +30,7 @@
|
|
#include <net/mac80211.h>
|
|
#include <net/mac80211.h>
|
|
#include <linux/etherdevice.h>
|
|
#include <linux/etherdevice.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/sched.h>
|
|
|
|
+#include <linux/lockdep.h>
|
|
|
|
|
|
#include "iwl-dev.h"
|
|
#include "iwl-dev.h"
|
|
#include "iwl-core.h"
|
|
#include "iwl-core.h"
|
|
@@ -145,8 +146,10 @@ int iwl_send_add_sta(struct iwl_priv *priv,
|
|
|
|
|
|
if (flags & CMD_ASYNC)
|
|
if (flags & CMD_ASYNC)
|
|
cmd.callback = iwl_add_sta_callback;
|
|
cmd.callback = iwl_add_sta_callback;
|
|
- else
|
|
|
|
|
|
+ else {
|
|
cmd.flags |= CMD_WANT_SKB;
|
|
cmd.flags |= CMD_WANT_SKB;
|
|
|
|
+ might_sleep();
|
|
|
|
+ }
|
|
|
|
|
|
cmd.len = priv->cfg->ops->utils->build_addsta_hcmd(sta, data);
|
|
cmd.len = priv->cfg->ops->utils->build_addsta_hcmd(sta, data);
|
|
ret = iwl_send_cmd(priv, &cmd);
|
|
ret = iwl_send_cmd(priv, &cmd);
|
|
@@ -1268,17 +1271,22 @@ EXPORT_SYMBOL_GPL(iwl_dealloc_bcast_station);
|
|
/**
|
|
/**
|
|
* iwl_sta_tx_modify_enable_tid - Enable Tx for this TID in station table
|
|
* iwl_sta_tx_modify_enable_tid - Enable Tx for this TID in station table
|
|
*/
|
|
*/
|
|
-void iwl_sta_tx_modify_enable_tid(struct iwl_priv *priv, int sta_id, int tid)
|
|
|
|
|
|
+int iwl_sta_tx_modify_enable_tid(struct iwl_priv *priv, int sta_id, int tid)
|
|
{
|
|
{
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
+ struct iwl_addsta_cmd sta_cmd;
|
|
|
|
+
|
|
|
|
+ lockdep_assert_held(&priv->mutex);
|
|
|
|
|
|
/* Remove "disable" flag, to enable Tx for this TID */
|
|
/* Remove "disable" flag, to enable Tx for this TID */
|
|
spin_lock_irqsave(&priv->sta_lock, flags);
|
|
spin_lock_irqsave(&priv->sta_lock, flags);
|
|
priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_TID_DISABLE_TX;
|
|
priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_TID_DISABLE_TX;
|
|
priv->stations[sta_id].sta.tid_disable_tx &= cpu_to_le16(~(1 << tid));
|
|
priv->stations[sta_id].sta.tid_disable_tx &= cpu_to_le16(~(1 << tid));
|
|
priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
|
|
priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
|
|
- iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
|
|
|
|
|
|
+ memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
|
|
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
|
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
|
|
|
+
|
|
|
|
+ return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(iwl_sta_tx_modify_enable_tid);
|
|
EXPORT_SYMBOL(iwl_sta_tx_modify_enable_tid);
|
|
|
|
|
|
@@ -1287,6 +1295,9 @@ int iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta,
|
|
{
|
|
{
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
int sta_id;
|
|
int sta_id;
|
|
|
|
+ struct iwl_addsta_cmd sta_cmd;
|
|
|
|
+
|
|
|
|
+ lockdep_assert_held(&priv->mutex);
|
|
|
|
|
|
sta_id = iwl_sta_id(sta);
|
|
sta_id = iwl_sta_id(sta);
|
|
if (sta_id == IWL_INVALID_STATION)
|
|
if (sta_id == IWL_INVALID_STATION)
|
|
@@ -1298,10 +1309,10 @@ int iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta,
|
|
priv->stations[sta_id].sta.add_immediate_ba_tid = (u8)tid;
|
|
priv->stations[sta_id].sta.add_immediate_ba_tid = (u8)tid;
|
|
priv->stations[sta_id].sta.add_immediate_ba_ssn = cpu_to_le16(ssn);
|
|
priv->stations[sta_id].sta.add_immediate_ba_ssn = cpu_to_le16(ssn);
|
|
priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
|
|
priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
|
|
|
|
+ memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
|
|
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
|
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
|
|
|
|
|
- return iwl_send_add_sta(priv, &priv->stations[sta_id].sta,
|
|
|
|
- CMD_ASYNC);
|
|
|
|
|
|
+ return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(iwl_sta_rx_agg_start);
|
|
EXPORT_SYMBOL(iwl_sta_rx_agg_start);
|
|
|
|
|
|
@@ -1309,7 +1320,10 @@ int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta,
|
|
int tid)
|
|
int tid)
|
|
{
|
|
{
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
- int sta_id, ret;
|
|
|
|
|
|
+ int sta_id;
|
|
|
|
+ struct iwl_addsta_cmd sta_cmd;
|
|
|
|
+
|
|
|
|
+ lockdep_assert_held(&priv->mutex);
|
|
|
|
|
|
sta_id = iwl_sta_id(sta);
|
|
sta_id = iwl_sta_id(sta);
|
|
if (sta_id == IWL_INVALID_STATION) {
|
|
if (sta_id == IWL_INVALID_STATION) {
|
|
@@ -1322,11 +1336,10 @@ int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta,
|
|
priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_DELBA_TID_MSK;
|
|
priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_DELBA_TID_MSK;
|
|
priv->stations[sta_id].sta.remove_immediate_ba_tid = (u8)tid;
|
|
priv->stations[sta_id].sta.remove_immediate_ba_tid = (u8)tid;
|
|
priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
|
|
priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
|
|
- ret = iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
|
|
|
|
|
|
+ memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
|
|
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
|
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
|
|
|
|
|
- return ret;
|
|
|
|
-
|
|
|
|
|
|
+ return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(iwl_sta_rx_agg_stop);
|
|
EXPORT_SYMBOL(iwl_sta_rx_agg_stop);
|
|
|
|
|