Skip to content

Commit

Permalink
mac80211: Add new API for rate selection
Browse files Browse the repository at this point in the history
This patch adds a new API for setting a TX rate mask in
drivers that have rate control in either the firmware or hardware.
This can be used for various purposes, for example, masking out the
11b rates in P2P operation.

Signed-off-by: Sujith Manoharan <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Sujith Manoharan authored and John W. Linville committed Apr 28, 2011
1 parent 8973a6e commit bdbfd6b
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 9 deletions.
6 changes: 6 additions & 0 deletions include/net/mac80211.h
Original file line number Diff line number Diff line change
Expand Up @@ -1822,6 +1822,10 @@ enum ieee80211_ampdu_mlme_action {
*
* @tx_frames_pending: Check if there is any pending frame in the hardware
* queues before entering power save.
*
* @set_bitrate_mask: Set a mask of rates to be used for rate control selection
* when transmitting a frame. Currently only legacy rates are handled.
* The callback can sleep.
*/
struct ieee80211_ops {
void (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb);
Expand Down Expand Up @@ -1910,6 +1914,8 @@ struct ieee80211_ops {
void (*get_ringparam)(struct ieee80211_hw *hw,
u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max);
bool (*tx_frames_pending)(struct ieee80211_hw *hw);
int (*set_bitrate_mask)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
const struct cfg80211_bitrate_mask *mask);
};

/**
Expand Down
15 changes: 6 additions & 9 deletions net/mac80211/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -1633,16 +1633,13 @@ static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
{
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
int i;

/*
* This _could_ be supported by providing a hook for
* drivers for this function, but at this point it
* doesn't seem worth bothering.
*/
if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)
return -EOPNOTSUPP;
int i, ret;

if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) {
ret = drv_set_bitrate_mask(local, sdata, mask);
if (ret)
return ret;
}

for (i = 0; i < IEEE80211_NUM_BANDS; i++)
sdata->rc_rateidx_mask[i] = mask->control[i].legacy;
Expand Down
18 changes: 18 additions & 0 deletions net/mac80211/driver-ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -565,4 +565,22 @@ static inline bool drv_tx_frames_pending(struct ieee80211_local *local)

return ret;
}

static inline int drv_set_bitrate_mask(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
const struct cfg80211_bitrate_mask *mask)
{
int ret = -EOPNOTSUPP;

might_sleep();

trace_drv_set_bitrate_mask(local, sdata, mask);
if (local->ops->set_bitrate_mask)
ret = local->ops->set_bitrate_mask(&local->hw,
&sdata->vif, mask);
trace_drv_return_int(local, ret);

return ret;
}

#endif /* __MAC80211_DRIVER_OPS */
27 changes: 27 additions & 0 deletions net/mac80211/driver-trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -989,6 +989,33 @@ DEFINE_EVENT(local_only_evt, drv_offchannel_tx_cancel_wait,
TP_ARGS(local)
);

TRACE_EVENT(drv_set_bitrate_mask,
TP_PROTO(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
const struct cfg80211_bitrate_mask *mask),

TP_ARGS(local, sdata, mask),

TP_STRUCT__entry(
LOCAL_ENTRY
VIF_ENTRY
__field(u32, legacy_2g)
__field(u32, legacy_5g)
),

TP_fast_assign(
LOCAL_ASSIGN;
VIF_ASSIGN;
__entry->legacy_2g = mask->control[IEEE80211_BAND_2GHZ].legacy;
__entry->legacy_5g = mask->control[IEEE80211_BAND_5GHZ].legacy;
),

TP_printk(
LOCAL_PR_FMT VIF_PR_FMT " 2G Mask:0x%x 5G Mask:0x%x",
LOCAL_PR_ARG, VIF_PR_ARG, __entry->legacy_2g, __entry->legacy_5g
)
);

/*
* Tracing for API calls that drivers call.
*/
Expand Down

0 comments on commit bdbfd6b

Please sign in to comment.