Commit 4263ac7f authored by Gregory Greenman's avatar Gregory Greenman Committed by Johannes Berg
Browse files

wifi: iwlwifi: mvm: adjust to MLO assign/unassign/switch_vif_chanctx()

parent d6f6b0d8
Loading
Loading
Loading
Loading
+27 −19
Original line number Diff line number Diff line
@@ -4608,7 +4608,8 @@ void iwl_mvm_change_chanctx(struct ieee80211_hw *hw,
 * Returns true if we're done assigning the chanctx
 * (either on failure or success)
 */
bool __iwl_mvm_assign_vif_chanctx_common(struct iwl_mvm *mvm,
static bool
__iwl_mvm_assign_vif_chanctx_common(struct iwl_mvm *mvm,
				    struct ieee80211_vif *vif,
				    struct ieee80211_chanctx_conf *ctx,
				    bool switching_chanctx, int *ret)
@@ -4651,12 +4652,16 @@ bool __iwl_mvm_assign_vif_chanctx_common(struct iwl_mvm *mvm,

static int __iwl_mvm_assign_vif_chanctx(struct iwl_mvm *mvm,
					struct ieee80211_vif *vif,
					struct ieee80211_bss_conf *link_conf,
					struct ieee80211_chanctx_conf *ctx,
					bool switching_chanctx)
{
	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
	int ret;

	if (WARN_ON(!link_conf))
		return -EINVAL;

	if (__iwl_mvm_assign_vif_chanctx_common(mvm, vif, ctx,
						switching_chanctx, &ret))
		goto out;
@@ -4736,7 +4741,7 @@ static int iwl_mvm_assign_vif_chanctx(struct ieee80211_hw *hw,
	int ret;

	mutex_lock(&mvm->mutex);
	ret = __iwl_mvm_assign_vif_chanctx(mvm, vif, ctx, false);
	ret = __iwl_mvm_assign_vif_chanctx(mvm, vif, link_conf, ctx, false);
	mutex_unlock(&mvm->mutex);

	return ret;
@@ -4748,7 +4753,7 @@ static int iwl_mvm_assign_vif_chanctx(struct ieee80211_hw *hw,
 * Returns if chanctx unassign chanctx is done
 * (either on failure or success)
 */
bool __iwl_mvm_unassign_vif_chanctx_common(struct iwl_mvm *mvm,
static bool __iwl_mvm_unassign_vif_chanctx_common(struct iwl_mvm *mvm,
						  struct ieee80211_vif *vif,
						  bool switching_chanctx)
{
@@ -4788,6 +4793,7 @@ bool __iwl_mvm_unassign_vif_chanctx_common(struct iwl_mvm *mvm,

static void __iwl_mvm_unassign_vif_chanctx(struct iwl_mvm *mvm,
					   struct ieee80211_vif *vif,
					   struct ieee80211_bss_conf *link_conf,
					   struct ieee80211_chanctx_conf *ctx,
					   bool switching_chanctx)
{
@@ -4827,7 +4833,7 @@ static void iwl_mvm_unassign_vif_chanctx(struct ieee80211_hw *hw,
	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);

	mutex_lock(&mvm->mutex);
	__iwl_mvm_unassign_vif_chanctx(mvm, vif, ctx, false);
	__iwl_mvm_unassign_vif_chanctx(mvm, vif, link_conf, ctx, false);
	mutex_unlock(&mvm->mutex);
}

@@ -4839,7 +4845,8 @@ iwl_mvm_switch_vif_chanctx_swap(struct iwl_mvm *mvm,
	int ret;

	mutex_lock(&mvm->mutex);
	ops->__unassign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx, true);
	ops->__unassign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
				    vifs[0].old_ctx, true);
	__iwl_mvm_remove_chanctx(mvm, vifs[0].old_ctx);

	ret = __iwl_mvm_add_chanctx(mvm, vifs[0].new_ctx);
@@ -4848,8 +4855,8 @@ iwl_mvm_switch_vif_chanctx_swap(struct iwl_mvm *mvm,
		goto out_reassign;
	}

	ret = ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].new_ctx,
					   true);
	ret = ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
					vifs[0].new_ctx, true);
	if (ret) {
		IWL_ERR(mvm,
			"failed to assign new_ctx during channel switch\n");
@@ -4871,8 +4878,8 @@ iwl_mvm_switch_vif_chanctx_swap(struct iwl_mvm *mvm,
		goto out_restart;
	}

	if (ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx,
				      true)) {
	if (ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
				      vifs[0].old_ctx, true)) {
		IWL_ERR(mvm, "failed to reassign old_ctx after failure.\n");
		goto out_restart;
	}
@@ -4897,10 +4904,11 @@ iwl_mvm_switch_vif_chanctx_reassign(struct iwl_mvm *mvm,
	int ret;

	mutex_lock(&mvm->mutex);
	ops->__unassign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx, true);
	ops->__unassign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
				    vifs[0].old_ctx, true);

	ret = ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].new_ctx,
					   true);
	ret = ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
					vifs[0].new_ctx, true);
	if (ret) {
		IWL_ERR(mvm,
			"failed to assign new_ctx during channel switch\n");
@@ -4910,8 +4918,8 @@ iwl_mvm_switch_vif_chanctx_reassign(struct iwl_mvm *mvm,
	goto out;

out_reassign:
	if (ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx,
				      true)) {
	if (ops->__assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].link_conf,
				      vifs[0].old_ctx, true)) {
		IWL_ERR(mvm, "failed to reassign old_ctx after failure.\n");
		goto out_restart;
	}
+32 −20
Original line number Diff line number Diff line
@@ -220,17 +220,23 @@ static void iwl_mvm_mld_mac_remove_interface(struct ieee80211_hw *hw,
	mutex_unlock(&mvm->mutex);
}

static int __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
static int
__iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
				 struct ieee80211_vif *vif,
				 struct ieee80211_bss_conf *link_conf,
				 struct ieee80211_chanctx_conf *ctx,
				 bool switching_chanctx)
{
	u16 *phy_ctxt_id = (u16 *)ctx->drv_priv;
	struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id];
	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
	unsigned int link_id = link_conf->link_id;
	int ret;

	mvmvif->deflink.phy_ctxt = phy_ctxt;
	if (WARN_ON_ONCE(!mvmvif->link[link_id]))
		return -EINVAL;

	mvmvif->link[link_id]->phy_ctxt = phy_ctxt;

	if (switching_chanctx) {
		/* reactivate if we turned this off during channel switch */
@@ -239,12 +245,12 @@ static int __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
	}

	/* send it first with phy context ID */
	ret = iwl_mvm_link_changed(mvm, vif, &vif->bss_conf, 0, false);
	ret = iwl_mvm_link_changed(mvm, vif, link_conf, 0, false);
	if (ret)
		goto out;

	/* then activate */
	ret = iwl_mvm_link_changed(mvm, vif, &vif->bss_conf,
	ret = iwl_mvm_link_changed(mvm, vif, link_conf,
				   LINK_CONTEXT_MODIFY_ACTIVE |
				   LINK_CONTEXT_MODIFY_RATES_INFO,
				   true);
@@ -258,8 +264,7 @@ static int __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
	iwl_mvm_power_update_mac(mvm);

	if (vif->type == NL80211_IFTYPE_MONITOR) {
		ret = iwl_mvm_mld_add_snif_sta(mvm, vif,
					       &vif->bss_conf);
		ret = iwl_mvm_mld_add_snif_sta(mvm, vif, link_conf);
		if (ret)
			goto deactivate;
	}
@@ -267,10 +272,10 @@ static int __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
	return 0;

deactivate:
	iwl_mvm_link_changed(mvm, vif, &vif->bss_conf,
			     LINK_CONTEXT_MODIFY_ACTIVE, false);
	iwl_mvm_link_changed(mvm, vif, link_conf, LINK_CONTEXT_MODIFY_ACTIVE,
			     false);
out:
	mvmvif->deflink.phy_ctxt = NULL;
	mvmvif->link[link_id]->phy_ctxt = NULL;
	iwl_mvm_power_update_mac(mvm);
	return ret;
}
@@ -284,18 +289,25 @@ static int iwl_mvm_mld_assign_vif_chanctx(struct ieee80211_hw *hw,
	int ret;

	mutex_lock(&mvm->mutex);
	ret = __iwl_mvm_mld_assign_vif_chanctx(mvm, vif, ctx, false);
	ret = __iwl_mvm_mld_assign_vif_chanctx(mvm, vif, link_conf, ctx, false);
	mutex_unlock(&mvm->mutex);

	return ret;
}

static void __iwl_mvm_mld_unassign_vif_chanctx(struct iwl_mvm *mvm,
static void
__iwl_mvm_mld_unassign_vif_chanctx(struct iwl_mvm *mvm,
				   struct ieee80211_vif *vif,
				   struct ieee80211_bss_conf *link_conf,
				   struct ieee80211_chanctx_conf *ctx,
				   bool switching_chanctx)
{
	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
	unsigned int link_id = link_conf->link_id;

	/* shouldn't happen, but verify link_id is valid before accessing */
	if (WARN_ON_ONCE(!mvmvif->link[link_id]))
		return;

	if (vif->type == NL80211_IFTYPE_AP && switching_chanctx) {
		mvmvif->csa_countdown = false;
@@ -312,12 +324,12 @@ static void __iwl_mvm_mld_unassign_vif_chanctx(struct iwl_mvm *mvm,
	if (vif->type == NL80211_IFTYPE_MONITOR)
		iwl_mvm_mld_rm_snif_sta(mvm, vif);

	iwl_mvm_link_changed(mvm, vif, &vif->bss_conf,
	iwl_mvm_link_changed(mvm, vif, link_conf,
			     LINK_CONTEXT_MODIFY_ACTIVE, false);

	if (switching_chanctx)
		return;
	mvmvif->deflink.phy_ctxt = NULL;
	mvmvif->link[link_id]->phy_ctxt = NULL;
	iwl_mvm_power_update_mac(mvm);
}

@@ -329,7 +341,7 @@ static void iwl_mvm_mld_unassign_vif_chanctx(struct ieee80211_hw *hw,
	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);

	mutex_lock(&mvm->mutex);
	__iwl_mvm_mld_unassign_vif_chanctx(mvm, vif, ctx, false);
	__iwl_mvm_mld_unassign_vif_chanctx(mvm, vif, link_conf, ctx, false);
	mutex_unlock(&mvm->mutex);
}

+2 −8
Original line number Diff line number Diff line
@@ -2365,10 +2365,12 @@ int iwl_mvm_post_channel_switch(struct ieee80211_hw *hw,
struct iwl_mvm_switch_vif_chanctx_ops {
	int (*__assign_vif_chanctx)(struct iwl_mvm *mvm,
				    struct ieee80211_vif *vif,
				    struct ieee80211_bss_conf *link_conf,
				    struct ieee80211_chanctx_conf *ctx,
				    bool switching_chanctx);
	void (*__unassign_vif_chanctx)(struct iwl_mvm *mvm,
				       struct ieee80211_vif *vif,
				       struct ieee80211_bss_conf *link_conf,
				       struct ieee80211_chanctx_conf *ctx,
				       bool switching_chanctx);
};
@@ -2380,14 +2382,6 @@ iwl_mvm_switch_vif_chanctx_common(struct ieee80211_hw *hw,
				  enum ieee80211_chanctx_switch_mode mode,
				  struct iwl_mvm_switch_vif_chanctx_ops *ops);

bool __iwl_mvm_assign_vif_chanctx_common(struct iwl_mvm *mvm,
					 struct ieee80211_vif *vif,
					 struct ieee80211_chanctx_conf *ctx,
					 bool switching_chanctx, int *ret);
bool __iwl_mvm_unassign_vif_chanctx_common(struct iwl_mvm *mvm,
					   struct ieee80211_vif *vif,
					   bool switching_chanctx);

/* Channel info utils */
static inline bool iwl_mvm_has_ultra_hb_channel(struct iwl_mvm *mvm)
{