Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c0f3a317 authored by Johannes Berg's avatar Johannes Berg
Browse files

Merge remote-tracking branch 'mac80211/master' into HEAD



There are a few things that would otherwise conflict.

Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parents 6dbe51c2 801d929c
Loading
Loading
Loading
Loading
+11 −0
Original line number Original line Diff line number Diff line
@@ -3285,6 +3285,7 @@ static int ieee80211_cfg_get_channel(struct wiphy *wiphy,
				     struct cfg80211_chan_def *chandef)
				     struct cfg80211_chan_def *chandef)
{
{
	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
	struct ieee80211_local *local = wiphy_priv(wiphy);
	struct ieee80211_chanctx_conf *chanctx_conf;
	struct ieee80211_chanctx_conf *chanctx_conf;
	int ret = -ENODATA;
	int ret = -ENODATA;


@@ -3293,6 +3294,16 @@ static int ieee80211_cfg_get_channel(struct wiphy *wiphy,
	if (chanctx_conf) {
	if (chanctx_conf) {
		*chandef = chanctx_conf->def;
		*chandef = chanctx_conf->def;
		ret = 0;
		ret = 0;
	} else if (local->open_count > 0 &&
		   local->open_count == local->monitors &&
		   sdata->vif.type == NL80211_IFTYPE_MONITOR) {
		if (local->use_chanctx)
			*chandef = local->monitor_chandef;
		else
			cfg80211_chandef_create(chandef,
						local->_oper_channel,
						local->_oper_channel_type);
		ret = 0;
	}
	}
	rcu_read_unlock();
	rcu_read_unlock();


+7 −1
Original line number Original line Diff line number Diff line
@@ -107,7 +107,7 @@ void ieee80211_recalc_idle(struct ieee80211_local *local)


	lockdep_assert_held(&local->mtx);
	lockdep_assert_held(&local->mtx);


	active = !list_empty(&local->chanctx_list);
	active = !list_empty(&local->chanctx_list) || local->monitors;


	if (!local->ops->remain_on_channel) {
	if (!local->ops->remain_on_channel) {
		list_for_each_entry(roc, &local->roc_list, list) {
		list_for_each_entry(roc, &local->roc_list, list) {
@@ -541,6 +541,9 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)


		ieee80211_adjust_monitor_flags(sdata, 1);
		ieee80211_adjust_monitor_flags(sdata, 1);
		ieee80211_configure_filter(local);
		ieee80211_configure_filter(local);
		mutex_lock(&local->mtx);
		ieee80211_recalc_idle(local);
		mutex_unlock(&local->mtx);


		netif_carrier_on(dev);
		netif_carrier_on(dev);
		break;
		break;
@@ -812,6 +815,9 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,


		ieee80211_adjust_monitor_flags(sdata, -1);
		ieee80211_adjust_monitor_flags(sdata, -1);
		ieee80211_configure_filter(local);
		ieee80211_configure_filter(local);
		mutex_lock(&local->mtx);
		ieee80211_recalc_idle(local);
		mutex_unlock(&local->mtx);
		break;
		break;
	case NL80211_IFTYPE_P2P_DEVICE:
	case NL80211_IFTYPE_P2P_DEVICE:
		/* relies on synchronize_rcu() below */
		/* relies on synchronize_rcu() below */
+23 −5
Original line number Original line Diff line number Diff line
@@ -647,6 +647,9 @@ static void ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata,
		our_mcs = (le16_to_cpu(vht_cap.vht_mcs.rx_mcs_map) &
		our_mcs = (le16_to_cpu(vht_cap.vht_mcs.rx_mcs_map) &
								mask) >> shift;
								mask) >> shift;


		if (our_mcs == IEEE80211_VHT_MCS_NOT_SUPPORTED)
			continue;

		switch (ap_mcs) {
		switch (ap_mcs) {
		default:
		default:
			if (our_mcs <= ap_mcs)
			if (our_mcs <= ap_mcs)
@@ -3502,6 +3505,14 @@ void ieee80211_sta_quiesce(struct ieee80211_sub_if_data *sdata)
{
{
	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;


	/*
	 * Stop timers before deleting work items, as timers
	 * could race and re-add the work-items. They will be
	 * re-established on connection.
	 */
	del_timer_sync(&ifmgd->conn_mon_timer);
	del_timer_sync(&ifmgd->bcn_mon_timer);

	/*
	/*
	 * we need to use atomic bitops for the running bits
	 * we need to use atomic bitops for the running bits
	 * only because both timers might fire at the same
	 * only because both timers might fire at the same
@@ -3516,13 +3527,9 @@ void ieee80211_sta_quiesce(struct ieee80211_sub_if_data *sdata)
	if (del_timer_sync(&ifmgd->timer))
	if (del_timer_sync(&ifmgd->timer))
		set_bit(TMR_RUNNING_TIMER, &ifmgd->timers_running);
		set_bit(TMR_RUNNING_TIMER, &ifmgd->timers_running);


	cancel_work_sync(&ifmgd->chswitch_work);
	if (del_timer_sync(&ifmgd->chswitch_timer))
	if (del_timer_sync(&ifmgd->chswitch_timer))
		set_bit(TMR_RUNNING_CHANSW, &ifmgd->timers_running);
		set_bit(TMR_RUNNING_CHANSW, &ifmgd->timers_running);

	cancel_work_sync(&ifmgd->chswitch_work);
	/* these will just be re-established on connection */
	del_timer_sync(&ifmgd->conn_mon_timer);
	del_timer_sync(&ifmgd->bcn_mon_timer);
}
}


void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata)
void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata)
@@ -4315,6 +4322,17 @@ void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata)
{
{
	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;


	/*
	 * Make sure some work items will not run after this,
	 * they will not do anything but might not have been
	 * cancelled when disconnecting.
	 */
	cancel_work_sync(&ifmgd->monitor_work);
	cancel_work_sync(&ifmgd->beacon_connection_loss_work);
	cancel_work_sync(&ifmgd->request_smps_work);
	cancel_work_sync(&ifmgd->csa_connection_drop_work);
	cancel_work_sync(&ifmgd->chswitch_work);

	mutex_lock(&ifmgd->mtx);
	mutex_lock(&ifmgd->mtx);
	if (ifmgd->assoc_data)
	if (ifmgd->assoc_data)
		ieee80211_destroy_assoc_data(sdata, false);
		ieee80211_destroy_assoc_data(sdata, false);
+51 −29
Original line number Original line Diff line number Diff line
@@ -1231,27 +1231,32 @@ static bool ieee80211_tx_frags(struct ieee80211_local *local,
		if (local->queue_stop_reasons[q] ||
		if (local->queue_stop_reasons[q] ||
		    (!txpending && !skb_queue_empty(&local->pending[q]))) {
		    (!txpending && !skb_queue_empty(&local->pending[q]))) {
			if (unlikely(info->flags &
			if (unlikely(info->flags &
					IEEE80211_TX_INTFL_OFFCHAN_TX_OK &&
				     IEEE80211_TX_INTFL_OFFCHAN_TX_OK)) {
				     local->queue_stop_reasons[q] &
				if (local->queue_stop_reasons[q] &
					~BIT(IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL))) {
				    ~BIT(IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL)) {
					/*
					/*
				 * Drop off-channel frames if queues are stopped
					 * Drop off-channel frames if queues
				 * for any reason other than off-channel
					 * are stopped for any reason other
				 * operation. Never queue them.
					 * than off-channel operation. Never
					 * queue them.
					 */
					 */
					spin_unlock_irqrestore(
					spin_unlock_irqrestore(
					&local->queue_stop_reason_lock, flags);
						&local->queue_stop_reason_lock,
				ieee80211_purge_tx_queue(&local->hw, skbs);
						flags);
					ieee80211_purge_tx_queue(&local->hw,
								 skbs);
					return true;
					return true;
				}
				}
			} else {


				/*
				/*
			 * Since queue is stopped, queue up frames for later
				 * Since queue is stopped, queue up frames for
			 * transmission from the tx-pending tasklet when the
				 * later transmission from the tx-pending
			 * queue is woken again.
				 * tasklet when the queue is woken again.
				 */
				 */
				if (txpending)
				if (txpending)
				skb_queue_splice_init(skbs, &local->pending[q]);
					skb_queue_splice_init(skbs,
							      &local->pending[q]);
				else
				else
					skb_queue_splice_tail_init(skbs,
					skb_queue_splice_tail_init(skbs,
								   &local->pending[q]);
								   &local->pending[q]);
@@ -1260,6 +1265,7 @@ static bool ieee80211_tx_frags(struct ieee80211_local *local,
						       flags);
						       flags);
				return false;
				return false;
			}
			}
		}
		spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
		spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);


		info->control.vif = vif;
		info->control.vif = vif;
@@ -1844,9 +1850,24 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
		}
		}


		if (!is_multicast_ether_addr(skb->data)) {
		if (!is_multicast_ether_addr(skb->data)) {
			struct sta_info *next_hop;
			bool mpp_lookup = true;

			mpath = mesh_path_lookup(sdata, skb->data);
			mpath = mesh_path_lookup(sdata, skb->data);
			if (!mpath)
			if (mpath) {
				mpp_lookup = false;
				next_hop = rcu_dereference(mpath->next_hop);
				if (!next_hop ||
				    !(mpath->flags & (MESH_PATH_ACTIVE |
						      MESH_PATH_RESOLVING)))
					mpp_lookup = true;
			}

			if (mpp_lookup)
				mppath = mpp_path_lookup(sdata, skb->data);
				mppath = mpp_path_lookup(sdata, skb->data);

			if (mppath && mpath)
				mesh_path_del(mpath->sdata, mpath->dst);
		}
		}


		/*
		/*
@@ -2350,9 +2371,9 @@ static int ieee80211_beacon_add_tim(struct ieee80211_sub_if_data *sdata,
	if (local->tim_in_locked_section) {
	if (local->tim_in_locked_section) {
		__ieee80211_beacon_add_tim(sdata, ps, skb);
		__ieee80211_beacon_add_tim(sdata, ps, skb);
	} else {
	} else {
		spin_lock(&local->tim_lock);
		spin_lock_bh(&local->tim_lock);
		__ieee80211_beacon_add_tim(sdata, ps, skb);
		__ieee80211_beacon_add_tim(sdata, ps, skb);
		spin_unlock(&local->tim_lock);
		spin_unlock_bh(&local->tim_lock);
	}
	}


	return 0;
	return 0;
@@ -2724,6 +2745,7 @@ ieee80211_get_buffered_bc(struct ieee80211_hw *hw,
				cpu_to_le16(IEEE80211_FCTL_MOREDATA);
				cpu_to_le16(IEEE80211_FCTL_MOREDATA);
		}
		}


		if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
			sdata = IEEE80211_DEV_TO_SUB_IF(skb->dev);
			sdata = IEEE80211_DEV_TO_SUB_IF(skb->dev);
		if (!ieee80211_tx_prepare(sdata, &tx, skb))
		if (!ieee80211_tx_prepare(sdata, &tx, skb))
			break;
			break;
+1 −2
Original line number Original line Diff line number Diff line
@@ -367,8 +367,7 @@ struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv)
	rdev->wiphy.rts_threshold = (u32) -1;
	rdev->wiphy.rts_threshold = (u32) -1;
	rdev->wiphy.coverage_class = 0;
	rdev->wiphy.coverage_class = 0;


	rdev->wiphy.features = NL80211_FEATURE_SCAN_FLUSH |
	rdev->wiphy.features = NL80211_FEATURE_SCAN_FLUSH;
			       NL80211_FEATURE_ADVERTISE_CHAN_LIMITS;


	return &rdev->wiphy;
	return &rdev->wiphy;
}
}
Loading