Skip to content

Commit

Permalink
mac80211: notify driver of rate control updates
Browse files Browse the repository at this point in the history
Devices that have internal rate control need to be
notified when the bandwidth or SMPS state changes
just like external rate control algorithms get a
notification now.

Add this notification and clarify the change bits
while at it, the HT_CHANGED bit really meant only
bandwidth changed.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Johannes Berg authored and John W. Linville committed Apr 10, 2012
1 parent 7213cf2 commit 8f727ef
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 16 deletions.
2 changes: 1 addition & 1 deletion Documentation/DocBook/80211.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -516,7 +516,7 @@
!Finclude/net/mac80211.h ieee80211_start_tx_ba_cb_irqsafe
!Finclude/net/mac80211.h ieee80211_stop_tx_ba_session
!Finclude/net/mac80211.h ieee80211_stop_tx_ba_cb_irqsafe
!Finclude/net/mac80211.h rate_control_changed
!Finclude/net/mac80211.h ieee80211_rate_control_changed
!Finclude/net/mac80211.h ieee80211_tx_rate_control
!Finclude/net/mac80211.h rate_control_send_low
</chapter>
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/ath/ath9k/rc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1447,7 +1447,7 @@ static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband,

/* FIXME: Handle AP mode later when we support CWM */

if (changed & IEEE80211_RC_HT_CHANGED) {
if (changed & IEEE80211_RC_BW_CHANGED) {
if (sc->sc_ah->opmode != NL80211_IFTYPE_STATION)
return;

Expand Down
37 changes: 24 additions & 13 deletions include/net/mac80211.h
Original file line number Diff line number Diff line change
Expand Up @@ -1779,6 +1779,18 @@ enum ieee80211_frame_release_type {
IEEE80211_FRAME_RELEASE_UAPSD,
};

/**
* enum ieee80211_rate_control_changed - flags to indicate what changed
*
* @IEEE80211_RC_BW_CHANGED: The bandwidth that can be used to transmit
* to this station changed.
* @IEEE80211_RC_SMPS_CHANGED: The SMPS state of the station changed.
*/
enum ieee80211_rate_control_changed {
IEEE80211_RC_BW_CHANGED = BIT(0),
IEEE80211_RC_SMPS_CHANGED = BIT(1),
};

/**
* struct ieee80211_ops - callbacks from mac80211 to the driver
*
Expand Down Expand Up @@ -1980,6 +1992,14 @@ enum ieee80211_frame_release_type {
* up the list of states.
* The callback can sleep.
*
* @sta_rc_update: Notifies the driver of changes to the bitrates that can be
* used to transmit to the station. The changes are advertised with bits
* from &enum ieee80211_rate_control_changed and the values are reflected
* in the station data. This callback should only be used when the driver
* uses hardware rate control (%IEEE80211_HW_HAS_RATE_CONTROL) since
* otherwise the rate control algorithm is notified directly.
* Must be atomic.
*
* @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max),
* bursting) for a hardware TX queue.
* Returns a negative error code on failure.
Expand Down Expand Up @@ -2196,6 +2216,10 @@ struct ieee80211_ops {
struct ieee80211_sta *sta,
enum ieee80211_sta_state old_state,
enum ieee80211_sta_state new_state);
void (*sta_rc_update)(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
struct ieee80211_sta *sta,
u32 changed);
int (*conf_tx)(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, u16 queue,
const struct ieee80211_tx_queue_params *params);
Expand Down Expand Up @@ -3511,19 +3535,6 @@ void ieee80211_send_bar(struct ieee80211_vif *vif, u8 *ra, u16 tid, u16 ssn);

/* Rate control API */

/**
* enum rate_control_changed - flags to indicate which parameter changed
*
* @IEEE80211_RC_HT_CHANGED: The HT parameters of the operating channel have
* changed, rate control algorithm can update its internal state if needed.
* @IEEE80211_RC_SMPS_CHANGED: The SMPS state of the station changed, the rate
* control algorithm needs to adjust accordingly.
*/
enum rate_control_changed {
IEEE80211_RC_HT_CHANGED = BIT(0),
IEEE80211_RC_SMPS_CHANGED = BIT(1),
};

/**
* struct ieee80211_tx_rate_control - rate control information for/from RC algo
*
Expand Down
15 changes: 15 additions & 0 deletions net/mac80211/driver-ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,21 @@ int drv_sta_state(struct ieee80211_local *local,
return ret;
}

static inline void drv_sta_rc_update(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
struct ieee80211_sta *sta, u32 changed)
{
sdata = get_bss_sdata(sdata);
check_sdata_in_driver(sdata);

trace_drv_sta_rc_update(local, sdata, sta, changed);
if (local->ops->sta_rc_update)
local->ops->sta_rc_update(&local->hw, &sdata->vif,
sta, changed);

trace_drv_return_void(local);
}

static inline int drv_conf_tx(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata, u16 queue,
const struct ieee80211_tx_queue_params *params)
Expand Down
28 changes: 28 additions & 0 deletions net/mac80211/driver-trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -624,6 +624,34 @@ TRACE_EVENT(drv_sta_state,
)
);

TRACE_EVENT(drv_sta_rc_update,
TP_PROTO(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
struct ieee80211_sta *sta,
u32 changed),

TP_ARGS(local, sdata, sta, changed),

TP_STRUCT__entry(
LOCAL_ENTRY
VIF_ENTRY
STA_ENTRY
__field(u32, changed)
),

TP_fast_assign(
LOCAL_ASSIGN;
VIF_ASSIGN;
STA_ASSIGN;
__entry->changed = changed;
),

TP_printk(
LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT " changed: 0x%x",
LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->changed
)
);

TRACE_EVENT(drv_sta_add,
TP_PROTO(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
Expand Down
2 changes: 1 addition & 1 deletion net/mac80211/mlme.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ static u32 ieee80211_config_ht_tx(struct ieee80211_sub_if_data *sdata,
sta->sta.ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;

rate_control_rate_update(local, sband, sta,
IEEE80211_RC_HT_CHANGED);
IEEE80211_RC_BW_CHANGED);
}
mutex_unlock(&local->sta_mtx);

Expand Down
2 changes: 2 additions & 0 deletions net/mac80211/rate.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <net/mac80211.h>
#include "ieee80211_i.h"
#include "sta_info.h"
#include "driver-ops.h"

struct rate_control_ref {
struct ieee80211_local *local;
Expand Down Expand Up @@ -72,6 +73,7 @@ static inline void rate_control_rate_update(struct ieee80211_local *local,
if (ref && ref->ops->rate_update)
ref->ops->rate_update(ref->priv, sband, ista,
priv_sta, changed);
drv_sta_rc_update(local, sta->sdata, &sta->sta, changed);
}

static inline void *rate_control_alloc_sta(struct rate_control_ref *ref,
Expand Down

0 comments on commit 8f727ef

Please sign in to comment.