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: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
a622ab72b4
commit
5d22c89b9b
4 changed files with 10 additions and 32 deletions
|
@ -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 {
|
||||||
*
|
*
|
||||||
* 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,
|
||||||
*/
|
*/
|
||||||
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);
|
||||||
* @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,
|
||||||
*/
|
*/
|
||||||
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);
|
||||||
* @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)
|
||||||
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)
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
|
|
Loading…
Reference in a new issue