提交 5d22c89b 编写于 作者: J Johannes Berg 提交者: John W. Linville

mac80211: remove non-irqsafe aggregation callbacks

The non-irqsafe aggregation start/stop done
callbacks are currently only used by ath9k_htc,
and can cause callbacks into the driver again.
This might lead to locking issues, which will
only get worse as we modify locking. To avoid
trouble, remove the non-irqsafe versions and
change ath9k_htc to use those instead.
Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 a622ab72
...@@ -510,13 +510,13 @@ void ath9k_htc_aggr_work(struct work_struct *work) ...@@ -510,13 +510,13 @@ void ath9k_htc_aggr_work(struct work_struct *work)
ret = ath9k_htc_aggr_oper(priv, wk->vif, wk->sta_addr, ret = ath9k_htc_aggr_oper(priv, wk->vif, wk->sta_addr,
wk->tid, true); wk->tid, true);
if (!ret) if (!ret)
ieee80211_start_tx_ba_cb(wk->vif, wk->sta_addr, ieee80211_start_tx_ba_cb_irqsafe(wk->vif, wk->sta_addr,
wk->tid); wk->tid);
break; break;
case IEEE80211_AMPDU_TX_STOP: case IEEE80211_AMPDU_TX_STOP:
ath9k_htc_aggr_oper(priv, wk->vif, wk->sta_addr, ath9k_htc_aggr_oper(priv, wk->vif, wk->sta_addr,
wk->tid, false); wk->tid, false);
ieee80211_stop_tx_ba_cb(wk->vif, wk->sta_addr, wk->tid); ieee80211_stop_tx_ba_cb_irqsafe(wk->vif, wk->sta_addr, wk->tid);
break; break;
default: default:
ath_print(ath9k_hw_common(priv->ah), ATH_DBG_FATAL, ath_print(ath9k_hw_common(priv->ah), ATH_DBG_FATAL,
......
...@@ -1445,7 +1445,7 @@ enum ieee80211_filter_flags { ...@@ -1445,7 +1445,7 @@ enum ieee80211_filter_flags {
* *
* Note that drivers MUST be able to deal with a TX aggregation * Note that drivers MUST be able to deal with a TX aggregation
* session being stopped even before they OK'ed starting it by * session being stopped even before they OK'ed starting it by
* calling ieee80211_start_tx_ba_cb(_irqsafe), because the peer * calling ieee80211_start_tx_ba_cb_irqsafe, because the peer
* might receive the addBA frame and send a delBA right away! * might receive the addBA frame and send a delBA right away!
* *
* @IEEE80211_AMPDU_RX_START: start Rx aggregation * @IEEE80211_AMPDU_RX_START: start Rx aggregation
...@@ -2313,17 +2313,6 @@ void ieee80211_queue_delayed_work(struct ieee80211_hw *hw, ...@@ -2313,17 +2313,6 @@ void ieee80211_queue_delayed_work(struct ieee80211_hw *hw,
*/ */
int ieee80211_start_tx_ba_session(struct ieee80211_sta *sta, u16 tid); int ieee80211_start_tx_ba_session(struct ieee80211_sta *sta, u16 tid);
/**
* ieee80211_start_tx_ba_cb - low level driver ready to aggregate.
* @vif: &struct ieee80211_vif pointer from the add_interface callback
* @ra: receiver address of the BA session recipient.
* @tid: the TID to BA on.
*
* This function must be called by low level driver once it has
* finished with preparations for the BA session.
*/
void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid);
/** /**
* ieee80211_start_tx_ba_cb_irqsafe - low level driver ready to aggregate. * ieee80211_start_tx_ba_cb_irqsafe - low level driver ready to aggregate.
* @vif: &struct ieee80211_vif pointer from the add_interface callback * @vif: &struct ieee80211_vif pointer from the add_interface callback
...@@ -2331,8 +2320,8 @@ void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid); ...@@ -2331,8 +2320,8 @@ void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid);
* @tid: the TID to BA on. * @tid: the TID to BA on.
* *
* This function must be called by low level driver once it has * This function must be called by low level driver once it has
* finished with preparations for the BA session. * finished with preparations for the BA session. It can be called
* This version of the function is IRQ-safe. * from any context.
*/ */
void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, const u8 *ra, void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, const u8 *ra,
u16 tid); u16 tid);
...@@ -2350,17 +2339,6 @@ void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, const u8 *ra, ...@@ -2350,17 +2339,6 @@ void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, const u8 *ra,
*/ */
int ieee80211_stop_tx_ba_session(struct ieee80211_sta *sta, u16 tid); int ieee80211_stop_tx_ba_session(struct ieee80211_sta *sta, u16 tid);
/**
* ieee80211_stop_tx_ba_cb - low level driver ready to stop aggregate.
* @vif: &struct ieee80211_vif pointer from the add_interface callback
* @ra: receiver address of the BA session recipient.
* @tid: the desired TID to BA on.
*
* This function must be called by low level driver once it has
* finished with preparations for the BA session tear down.
*/
void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid);
/** /**
* ieee80211_stop_tx_ba_cb_irqsafe - low level driver ready to stop aggregate. * ieee80211_stop_tx_ba_cb_irqsafe - low level driver ready to stop aggregate.
* @vif: &struct ieee80211_vif pointer from the add_interface callback * @vif: &struct ieee80211_vif pointer from the add_interface callback
...@@ -2368,8 +2346,8 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid); ...@@ -2368,8 +2346,8 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid);
* @tid: the desired TID to BA on. * @tid: the desired TID to BA on.
* *
* This function must be called by low level driver once it has * This function must be called by low level driver once it has
* finished with preparations for the BA session tear down. * finished with preparations for the BA session tear down. It
* This version of the function is IRQ-safe. * can be called from any context.
*/ */
void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, const u8 *ra, void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, const u8 *ra,
u16 tid); u16 tid);
......
...@@ -479,7 +479,6 @@ void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid) ...@@ -479,7 +479,6 @@ void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid)
spin_unlock_bh(&sta->lock); spin_unlock_bh(&sta->lock);
rcu_read_unlock(); rcu_read_unlock();
} }
EXPORT_SYMBOL(ieee80211_start_tx_ba_cb);
void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif,
const u8 *ra, u16 tid) const u8 *ra, u16 tid)
...@@ -619,7 +618,6 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid) ...@@ -619,7 +618,6 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid)
spin_unlock_bh(&sta->lock); spin_unlock_bh(&sta->lock);
rcu_read_unlock(); rcu_read_unlock();
} }
EXPORT_SYMBOL(ieee80211_stop_tx_ba_cb);
void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif,
const u8 *ra, u16 tid) const u8 *ra, u16 tid)
......
...@@ -1119,6 +1119,8 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, ...@@ -1119,6 +1119,8 @@ void ieee80211_process_addba_request(struct ieee80211_local *local,
int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
enum ieee80211_back_parties initiator); enum ieee80211_back_parties initiator);
void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid);
void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid);
/* Spectrum management */ /* Spectrum management */
void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata, void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册