mac80211: implement support for cfg80211_ops->{get,set}_ringparam
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
3677713b79
commit
38c091590f
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue