mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 22:02:28 +00:00
mac80211: save tx params per sdata
save and configure tx param per sdata, rather than per hardware. Signed-off-by: Eliad Peller <eliad@wizery.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
f70f01c2eb
commit
f6f3def323
@ -1275,6 +1275,7 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy,
|
|||||||
struct ieee80211_txq_params *params)
|
struct ieee80211_txq_params *params)
|
||||||
{
|
{
|
||||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||||
|
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||||
struct ieee80211_tx_queue_params p;
|
struct ieee80211_tx_queue_params p;
|
||||||
|
|
||||||
if (!local->ops->conf_tx)
|
if (!local->ops->conf_tx)
|
||||||
@ -1295,8 +1296,8 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy,
|
|||||||
if (params->queue >= local->hw.queues)
|
if (params->queue >= local->hw.queues)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
local->tx_conf[params->queue] = p;
|
sdata->tx_conf[params->queue] = p;
|
||||||
if (drv_conf_tx(local, params->queue, &p)) {
|
if (drv_conf_tx(local, sdata, params->queue, &p)) {
|
||||||
wiphy_debug(local->hw.wiphy,
|
wiphy_debug(local->hw.wiphy,
|
||||||
"failed to set TX queue parameters for queue %d\n",
|
"failed to set TX queue parameters for queue %d\n",
|
||||||
params->queue);
|
params->queue);
|
||||||
|
@ -413,14 +413,15 @@ static inline void drv_sta_remove(struct ieee80211_local *local,
|
|||||||
trace_drv_return_void(local);
|
trace_drv_return_void(local);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int drv_conf_tx(struct ieee80211_local *local, u16 queue,
|
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)
|
const struct ieee80211_tx_queue_params *params)
|
||||||
{
|
{
|
||||||
int ret = -EOPNOTSUPP;
|
int ret = -EOPNOTSUPP;
|
||||||
|
|
||||||
might_sleep();
|
might_sleep();
|
||||||
|
|
||||||
trace_drv_conf_tx(local, queue, params);
|
trace_drv_conf_tx(local, sdata, queue, params);
|
||||||
if (local->ops->conf_tx)
|
if (local->ops->conf_tx)
|
||||||
ret = local->ops->conf_tx(&local->hw, queue, params);
|
ret = local->ops->conf_tx(&local->hw, queue, params);
|
||||||
trace_drv_return_int(local, ret);
|
trace_drv_return_int(local, ret);
|
||||||
|
@ -697,32 +697,38 @@ TRACE_EVENT(drv_sta_remove,
|
|||||||
);
|
);
|
||||||
|
|
||||||
TRACE_EVENT(drv_conf_tx,
|
TRACE_EVENT(drv_conf_tx,
|
||||||
TP_PROTO(struct ieee80211_local *local, u16 queue,
|
TP_PROTO(struct ieee80211_local *local,
|
||||||
|
struct ieee80211_sub_if_data *sdata,
|
||||||
|
u16 queue,
|
||||||
const struct ieee80211_tx_queue_params *params),
|
const struct ieee80211_tx_queue_params *params),
|
||||||
|
|
||||||
TP_ARGS(local, queue, params),
|
TP_ARGS(local, sdata, queue, params),
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
TP_STRUCT__entry(
|
||||||
LOCAL_ENTRY
|
LOCAL_ENTRY
|
||||||
|
VIF_ENTRY
|
||||||
__field(u16, queue)
|
__field(u16, queue)
|
||||||
__field(u16, txop)
|
__field(u16, txop)
|
||||||
__field(u16, cw_min)
|
__field(u16, cw_min)
|
||||||
__field(u16, cw_max)
|
__field(u16, cw_max)
|
||||||
__field(u8, aifs)
|
__field(u8, aifs)
|
||||||
|
__field(bool, uapsd)
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
LOCAL_ASSIGN;
|
LOCAL_ASSIGN;
|
||||||
|
VIF_ASSIGN;
|
||||||
__entry->queue = queue;
|
__entry->queue = queue;
|
||||||
__entry->txop = params->txop;
|
__entry->txop = params->txop;
|
||||||
__entry->cw_max = params->cw_max;
|
__entry->cw_max = params->cw_max;
|
||||||
__entry->cw_min = params->cw_min;
|
__entry->cw_min = params->cw_min;
|
||||||
__entry->aifs = params->aifs;
|
__entry->aifs = params->aifs;
|
||||||
|
__entry->uapsd = params->uapsd;
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_printk(
|
TP_printk(
|
||||||
LOCAL_PR_FMT " queue:%d",
|
LOCAL_PR_FMT VIF_PR_FMT " queue:%d",
|
||||||
LOCAL_PR_ARG, __entry->queue
|
LOCAL_PR_ARG, VIF_PR_ARG, __entry->queue
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -609,6 +609,8 @@ struct ieee80211_sub_if_data {
|
|||||||
__be16 control_port_protocol;
|
__be16 control_port_protocol;
|
||||||
bool control_port_no_encrypt;
|
bool control_port_no_encrypt;
|
||||||
|
|
||||||
|
struct ieee80211_tx_queue_params tx_conf[IEEE80211_MAX_QUEUES];
|
||||||
|
|
||||||
struct work_struct work;
|
struct work_struct work;
|
||||||
struct sk_buff_head skb_queue;
|
struct sk_buff_head skb_queue;
|
||||||
|
|
||||||
@ -751,7 +753,6 @@ struct ieee80211_local {
|
|||||||
struct workqueue_struct *workqueue;
|
struct workqueue_struct *workqueue;
|
||||||
|
|
||||||
unsigned long queue_stop_reasons[IEEE80211_MAX_QUEUES];
|
unsigned long queue_stop_reasons[IEEE80211_MAX_QUEUES];
|
||||||
struct ieee80211_tx_queue_params tx_conf[IEEE80211_MAX_QUEUES];
|
|
||||||
/* also used to protect ampdu_ac_queue and amdpu_ac_stop_refcnt */
|
/* also used to protect ampdu_ac_queue and amdpu_ac_stop_refcnt */
|
||||||
spinlock_t queue_stop_reason_lock;
|
spinlock_t queue_stop_reason_lock;
|
||||||
|
|
||||||
|
@ -936,8 +936,8 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
|
|||||||
params.aifs, params.cw_min, params.cw_max,
|
params.aifs, params.cw_min, params.cw_max,
|
||||||
params.txop, params.uapsd);
|
params.txop, params.uapsd);
|
||||||
#endif
|
#endif
|
||||||
local->tx_conf[queue] = params;
|
sdata->tx_conf[queue] = params;
|
||||||
if (drv_conf_tx(local, queue, ¶ms))
|
if (drv_conf_tx(local, sdata, queue, ¶ms))
|
||||||
wiphy_debug(local->hw.wiphy,
|
wiphy_debug(local->hw.wiphy,
|
||||||
"failed to set TX queue parameters for queue %d\n",
|
"failed to set TX queue parameters for queue %d\n",
|
||||||
queue);
|
queue);
|
||||||
|
@ -632,8 +632,8 @@ void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata)
|
|||||||
|
|
||||||
qparam.uapsd = false;
|
qparam.uapsd = false;
|
||||||
|
|
||||||
local->tx_conf[queue] = qparam;
|
sdata->tx_conf[queue] = qparam;
|
||||||
drv_conf_tx(local, queue, &qparam);
|
drv_conf_tx(local, sdata, queue, &qparam);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* after reinitialize QoS TX queues setting to default,
|
/* after reinitialize QoS TX queues setting to default,
|
||||||
@ -1044,8 +1044,15 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|||||||
mutex_unlock(&local->sta_mtx);
|
mutex_unlock(&local->sta_mtx);
|
||||||
|
|
||||||
/* reconfigure tx conf */
|
/* reconfigure tx conf */
|
||||||
for (i = 0; i < hw->queues; i++)
|
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||||
drv_conf_tx(local, i, &local->tx_conf[i]);
|
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
|
||||||
|
sdata->vif.type == NL80211_IFTYPE_MONITOR ||
|
||||||
|
!ieee80211_sdata_running(sdata))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (i = 0; i < hw->queues; i++)
|
||||||
|
drv_conf_tx(local, sdata, i, &sdata->tx_conf[i]);
|
||||||
|
}
|
||||||
|
|
||||||
/* reconfigure hardware */
|
/* reconfigure hardware */
|
||||||
ieee80211_hw_config(local, ~0);
|
ieee80211_hw_config(local, ~0);
|
||||||
|
Loading…
Reference in New Issue
Block a user