mac80211: implement support for cfg80211_ops->{get,set}_ringparam

Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
John W. Linville 2011-03-07 16:19:18 -05:00
parent 3677713b79
commit 38c091590f
4 changed files with 102 additions and 0 deletions

View File

@ -1804,6 +1804,10 @@ enum ieee80211_ampdu_mlme_action {
* return value is 1, then the @remain_on_channel will be used with a * return value is 1, then the @remain_on_channel will be used with a
* regular transmission (if supported.) * regular transmission (if supported.)
* @offchannel_tx_cancel_wait: cancel wait associated with offchannel TX * @offchannel_tx_cancel_wait: cancel wait associated with offchannel TX
*
* @set_ringparam: Set tx and rx ring sizes.
*
* @get_ringparam: Get tx and rx ring current and maximum sizes.
*/ */
struct ieee80211_ops { struct ieee80211_ops {
void (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb); void (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb);
@ -1888,6 +1892,9 @@ struct ieee80211_ops {
enum nl80211_channel_type channel_type, enum nl80211_channel_type channel_type,
unsigned int wait); unsigned int wait);
int (*offchannel_tx_cancel_wait)(struct ieee80211_hw *hw); int (*offchannel_tx_cancel_wait)(struct ieee80211_hw *hw);
int (*set_ringparam)(struct ieee80211_hw *hw, u32 tx, u32 rx);
void (*get_ringparam)(struct ieee80211_hw *hw,
u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max);
}; };
/** /**

View File

@ -2012,6 +2012,21 @@ static int ieee80211_get_antenna(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant)
return drv_get_antenna(local, tx_ant, rx_ant); return drv_get_antenna(local, tx_ant, rx_ant);
} }
static int ieee80211_set_ringparam(struct wiphy *wiphy, u32 tx, u32 rx)
{
struct ieee80211_local *local = wiphy_priv(wiphy);
return drv_set_ringparam(local, tx, rx);
}
static void ieee80211_get_ringparam(struct wiphy *wiphy,
u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max)
{
struct ieee80211_local *local = wiphy_priv(wiphy);
drv_get_ringparam(local, tx, tx_max, rx, rx_max);
}
struct cfg80211_ops mac80211_config_ops = { struct cfg80211_ops mac80211_config_ops = {
.add_virtual_intf = ieee80211_add_iface, .add_virtual_intf = ieee80211_add_iface,
.del_virtual_intf = ieee80211_del_iface, .del_virtual_intf = ieee80211_del_iface,
@ -2069,4 +2084,6 @@ struct cfg80211_ops mac80211_config_ops = {
.mgmt_frame_register = ieee80211_mgmt_frame_register, .mgmt_frame_register = ieee80211_mgmt_frame_register,
.set_antenna = ieee80211_set_antenna, .set_antenna = ieee80211_set_antenna,
.get_antenna = ieee80211_get_antenna, .get_antenna = ieee80211_get_antenna,
.set_ringparam = ieee80211_set_ringparam,
.get_ringparam = ieee80211_get_ringparam,
}; };

View File

@ -526,4 +526,30 @@ static inline int drv_offchannel_tx_cancel_wait(struct ieee80211_local *local)
return ret; return ret;
} }
static inline int drv_set_ringparam(struct ieee80211_local *local,
u32 tx, u32 rx)
{
int ret = -ENOTSUPP;
might_sleep();
trace_drv_set_ringparam(local, tx, rx);
if (local->ops->set_ringparam)
ret = local->ops->set_ringparam(&local->hw, tx, rx);
trace_drv_return_int(local, ret);
return ret;
}
static inline void drv_get_ringparam(struct ieee80211_local *local,
u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max)
{
might_sleep();
trace_drv_get_ringparam(local, tx, tx_max, rx, rx_max);
if (local->ops->get_ringparam)
local->ops->get_ringparam(&local->hw, tx, tx_max, rx, rx_max);
trace_drv_return_void(local);
}
#endif /* __MAC80211_DRIVER_OPS */ #endif /* __MAC80211_DRIVER_OPS */

View File

@ -912,6 +912,58 @@ TRACE_EVENT(drv_offchannel_tx,
) )
); );
TRACE_EVENT(drv_set_ringparam,
TP_PROTO(struct ieee80211_local *local, u32 tx, u32 rx),
TP_ARGS(local, tx, rx),
TP_STRUCT__entry(
LOCAL_ENTRY
__field(u32, tx)
__field(u32, rx)
),
TP_fast_assign(
LOCAL_ASSIGN;
__entry->tx = tx;
__entry->rx = rx;
),
TP_printk(
LOCAL_PR_FMT " tx:%d rx %d",
LOCAL_PR_ARG, __entry->tx, __entry->rx
)
);
TRACE_EVENT(drv_get_ringparam,
TP_PROTO(struct ieee80211_local *local, u32 *tx, u32 *tx_max,
u32 *rx, u32 *rx_max),
TP_ARGS(local, tx, tx_max, rx, rx_max),
TP_STRUCT__entry(
LOCAL_ENTRY
__field(u32, tx)
__field(u32, tx_max)
__field(u32, rx)
__field(u32, rx_max)
),
TP_fast_assign(
LOCAL_ASSIGN;
__entry->tx = *tx;
__entry->tx_max = *tx_max;
__entry->rx = *rx;
__entry->rx_max = *rx_max;
),
TP_printk(
LOCAL_PR_FMT " tx:%d tx_max %d rx %d rx_max %d",
LOCAL_PR_ARG,
__entry->tx, __entry->tx_max, __entry->rx, __entry->rx_max
)
);
DEFINE_EVENT(local_only_evt, drv_offchannel_tx_cancel_wait, DEFINE_EVENT(local_only_evt, drv_offchannel_tx_cancel_wait,
TP_PROTO(struct ieee80211_local *local), TP_PROTO(struct ieee80211_local *local),
TP_ARGS(local) TP_ARGS(local)