mac80211: make ieee80211_vif_use_reserved_switch static
Reorder some code to make ieee80211_vif_use_reserved_switch() static, no other changes. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Родитель
f8134fed83
Коммит
649b2a4da5
|
@ -637,41 +637,6 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __ieee80211_vif_release_channel(struct ieee80211_sub_if_data *sdata)
|
|
||||||
{
|
|
||||||
struct ieee80211_local *local = sdata->local;
|
|
||||||
struct ieee80211_chanctx_conf *conf;
|
|
||||||
struct ieee80211_chanctx *ctx;
|
|
||||||
bool use_reserved_switch = false;
|
|
||||||
|
|
||||||
lockdep_assert_held(&local->chanctx_mtx);
|
|
||||||
|
|
||||||
conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
|
|
||||||
lockdep_is_held(&local->chanctx_mtx));
|
|
||||||
if (!conf)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ctx = container_of(conf, struct ieee80211_chanctx, conf);
|
|
||||||
|
|
||||||
if (sdata->reserved_chanctx) {
|
|
||||||
if (sdata->reserved_chanctx->replace_state ==
|
|
||||||
IEEE80211_CHANCTX_REPLACES_OTHER &&
|
|
||||||
ieee80211_chanctx_num_reserved(local,
|
|
||||||
sdata->reserved_chanctx) > 1)
|
|
||||||
use_reserved_switch = true;
|
|
||||||
|
|
||||||
ieee80211_vif_unreserve_chanctx(sdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
ieee80211_assign_vif_chanctx(sdata, NULL);
|
|
||||||
if (ieee80211_chanctx_refcount(local, ctx) == 0)
|
|
||||||
ieee80211_free_chanctx(local, ctx);
|
|
||||||
|
|
||||||
/* Unreserving may ready an in-place reservation. */
|
|
||||||
if (use_reserved_switch)
|
|
||||||
ieee80211_vif_use_reserved_switch(local);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ieee80211_recalc_smps_chanctx(struct ieee80211_local *local,
|
void ieee80211_recalc_smps_chanctx(struct ieee80211_local *local,
|
||||||
struct ieee80211_chanctx *chanctx)
|
struct ieee80211_chanctx *chanctx)
|
||||||
{
|
{
|
||||||
|
@ -762,63 +727,6 @@ void ieee80211_recalc_smps_chanctx(struct ieee80211_local *local,
|
||||||
drv_change_chanctx(local, chanctx, IEEE80211_CHANCTX_CHANGE_RX_CHAINS);
|
drv_change_chanctx(local, chanctx, IEEE80211_CHANCTX_CHANGE_RX_CHAINS);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ieee80211_vif_use_channel(struct ieee80211_sub_if_data *sdata,
|
|
||||||
const struct cfg80211_chan_def *chandef,
|
|
||||||
enum ieee80211_chanctx_mode mode)
|
|
||||||
{
|
|
||||||
struct ieee80211_local *local = sdata->local;
|
|
||||||
struct ieee80211_chanctx *ctx;
|
|
||||||
u8 radar_detect_width = 0;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
lockdep_assert_held(&local->mtx);
|
|
||||||
|
|
||||||
WARN_ON(sdata->dev && netif_carrier_ok(sdata->dev));
|
|
||||||
|
|
||||||
mutex_lock(&local->chanctx_mtx);
|
|
||||||
|
|
||||||
ret = cfg80211_chandef_dfs_required(local->hw.wiphy,
|
|
||||||
chandef,
|
|
||||||
sdata->wdev.iftype);
|
|
||||||
if (ret < 0)
|
|
||||||
goto out;
|
|
||||||
if (ret > 0)
|
|
||||||
radar_detect_width = BIT(chandef->width);
|
|
||||||
|
|
||||||
sdata->radar_required = ret;
|
|
||||||
|
|
||||||
ret = ieee80211_check_combinations(sdata, chandef, mode,
|
|
||||||
radar_detect_width);
|
|
||||||
if (ret < 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
__ieee80211_vif_release_channel(sdata);
|
|
||||||
|
|
||||||
ctx = ieee80211_find_chanctx(local, chandef, mode);
|
|
||||||
if (!ctx)
|
|
||||||
ctx = ieee80211_new_chanctx(local, chandef, mode);
|
|
||||||
if (IS_ERR(ctx)) {
|
|
||||||
ret = PTR_ERR(ctx);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
sdata->vif.bss_conf.chandef = *chandef;
|
|
||||||
|
|
||||||
ret = ieee80211_assign_vif_chanctx(sdata, ctx);
|
|
||||||
if (ret) {
|
|
||||||
/* if assign fails refcount stays the same */
|
|
||||||
if (ieee80211_chanctx_refcount(local, ctx) == 0)
|
|
||||||
ieee80211_free_chanctx(local, ctx);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
ieee80211_recalc_smps_chanctx(local, ctx);
|
|
||||||
ieee80211_recalc_radar_chanctx(local, ctx);
|
|
||||||
out:
|
|
||||||
mutex_unlock(&local->chanctx_mtx);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
__ieee80211_vif_copy_chanctx_to_vlans(struct ieee80211_sub_if_data *sdata,
|
__ieee80211_vif_copy_chanctx_to_vlans(struct ieee80211_sub_if_data *sdata,
|
||||||
bool clear)
|
bool clear)
|
||||||
|
@ -1267,8 +1175,7 @@ err:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
static int ieee80211_vif_use_reserved_switch(struct ieee80211_local *local)
|
||||||
ieee80211_vif_use_reserved_switch(struct ieee80211_local *local)
|
|
||||||
{
|
{
|
||||||
struct ieee80211_sub_if_data *sdata, *sdata_tmp;
|
struct ieee80211_sub_if_data *sdata, *sdata_tmp;
|
||||||
struct ieee80211_chanctx *ctx, *ctx_tmp, *old_ctx;
|
struct ieee80211_chanctx *ctx, *ctx_tmp, *old_ctx;
|
||||||
|
@ -1520,6 +1427,98 @@ err:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __ieee80211_vif_release_channel(struct ieee80211_sub_if_data *sdata)
|
||||||
|
{
|
||||||
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
struct ieee80211_chanctx_conf *conf;
|
||||||
|
struct ieee80211_chanctx *ctx;
|
||||||
|
bool use_reserved_switch = false;
|
||||||
|
|
||||||
|
lockdep_assert_held(&local->chanctx_mtx);
|
||||||
|
|
||||||
|
conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
|
||||||
|
lockdep_is_held(&local->chanctx_mtx));
|
||||||
|
if (!conf)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ctx = container_of(conf, struct ieee80211_chanctx, conf);
|
||||||
|
|
||||||
|
if (sdata->reserved_chanctx) {
|
||||||
|
if (sdata->reserved_chanctx->replace_state ==
|
||||||
|
IEEE80211_CHANCTX_REPLACES_OTHER &&
|
||||||
|
ieee80211_chanctx_num_reserved(local,
|
||||||
|
sdata->reserved_chanctx) > 1)
|
||||||
|
use_reserved_switch = true;
|
||||||
|
|
||||||
|
ieee80211_vif_unreserve_chanctx(sdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
ieee80211_assign_vif_chanctx(sdata, NULL);
|
||||||
|
if (ieee80211_chanctx_refcount(local, ctx) == 0)
|
||||||
|
ieee80211_free_chanctx(local, ctx);
|
||||||
|
|
||||||
|
/* Unreserving may ready an in-place reservation. */
|
||||||
|
if (use_reserved_switch)
|
||||||
|
ieee80211_vif_use_reserved_switch(local);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ieee80211_vif_use_channel(struct ieee80211_sub_if_data *sdata,
|
||||||
|
const struct cfg80211_chan_def *chandef,
|
||||||
|
enum ieee80211_chanctx_mode mode)
|
||||||
|
{
|
||||||
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
struct ieee80211_chanctx *ctx;
|
||||||
|
u8 radar_detect_width = 0;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
lockdep_assert_held(&local->mtx);
|
||||||
|
|
||||||
|
WARN_ON(sdata->dev && netif_carrier_ok(sdata->dev));
|
||||||
|
|
||||||
|
mutex_lock(&local->chanctx_mtx);
|
||||||
|
|
||||||
|
ret = cfg80211_chandef_dfs_required(local->hw.wiphy,
|
||||||
|
chandef,
|
||||||
|
sdata->wdev.iftype);
|
||||||
|
if (ret < 0)
|
||||||
|
goto out;
|
||||||
|
if (ret > 0)
|
||||||
|
radar_detect_width = BIT(chandef->width);
|
||||||
|
|
||||||
|
sdata->radar_required = ret;
|
||||||
|
|
||||||
|
ret = ieee80211_check_combinations(sdata, chandef, mode,
|
||||||
|
radar_detect_width);
|
||||||
|
if (ret < 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
__ieee80211_vif_release_channel(sdata);
|
||||||
|
|
||||||
|
ctx = ieee80211_find_chanctx(local, chandef, mode);
|
||||||
|
if (!ctx)
|
||||||
|
ctx = ieee80211_new_chanctx(local, chandef, mode);
|
||||||
|
if (IS_ERR(ctx)) {
|
||||||
|
ret = PTR_ERR(ctx);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
sdata->vif.bss_conf.chandef = *chandef;
|
||||||
|
|
||||||
|
ret = ieee80211_assign_vif_chanctx(sdata, ctx);
|
||||||
|
if (ret) {
|
||||||
|
/* if assign fails refcount stays the same */
|
||||||
|
if (ieee80211_chanctx_refcount(local, ctx) == 0)
|
||||||
|
ieee80211_free_chanctx(local, ctx);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ieee80211_recalc_smps_chanctx(local, ctx);
|
||||||
|
ieee80211_recalc_radar_chanctx(local, ctx);
|
||||||
|
out:
|
||||||
|
mutex_unlock(&local->chanctx_mtx);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int ieee80211_vif_use_reserved_context(struct ieee80211_sub_if_data *sdata)
|
int ieee80211_vif_use_reserved_context(struct ieee80211_sub_if_data *sdata)
|
||||||
{
|
{
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
|
|
@ -1869,7 +1869,6 @@ ieee80211_vif_reserve_chanctx(struct ieee80211_sub_if_data *sdata,
|
||||||
int __must_check
|
int __must_check
|
||||||
ieee80211_vif_use_reserved_context(struct ieee80211_sub_if_data *sdata);
|
ieee80211_vif_use_reserved_context(struct ieee80211_sub_if_data *sdata);
|
||||||
int ieee80211_vif_unreserve_chanctx(struct ieee80211_sub_if_data *sdata);
|
int ieee80211_vif_unreserve_chanctx(struct ieee80211_sub_if_data *sdata);
|
||||||
int ieee80211_vif_use_reserved_switch(struct ieee80211_local *local);
|
|
||||||
|
|
||||||
int __must_check
|
int __must_check
|
||||||
ieee80211_vif_change_bandwidth(struct ieee80211_sub_if_data *sdata,
|
ieee80211_vif_change_bandwidth(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче