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

Commit 9d6b9b8d authored by Kalle Valo's avatar Kalle Valo
Browse files

Merge tag 'iwlwifi-for-kalle-2018-08-09' of...

Merge tag 'iwlwifi-for-kalle-2018-08-09' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes

Some more fixes for 4.13

* Fix a memory leak in the SAR code;
* Fix a stuck queue case in AP mode;
* Convert a WARN to a simple debug in a legitimate race case (from
  which we can recover);
* Fix a severe throughput aggregation on 9000-family devices due to
  aggregation issues.
parents 368bd88e 20fc690f
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -1275,8 +1275,10 @@ static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm)

			entry = &wifi_pkg->package.elements[idx++];
			if ((entry->type != ACPI_TYPE_INTEGER) ||
			    (entry->integer.value > U8_MAX))
				return -EINVAL;
			    (entry->integer.value > U8_MAX)) {
				ret = -EINVAL;
				goto out_free;
			}

			mvm->geo_profiles[i].values[j] = entry->integer.value;
		}
+11 −1
Original line number Diff line number Diff line
@@ -2597,9 +2597,19 @@ static void iwl_mvm_purge_deferred_tx_frames(struct iwl_mvm *mvm,
	spin_lock_bh(&mvm_sta->lock);
	for (i = 0; i <= IWL_MAX_TID_COUNT; i++) {
		tid_data = &mvm_sta->tid_data[i];
		while ((skb = __skb_dequeue(&tid_data->deferred_tx_frames)))

		while ((skb = __skb_dequeue(&tid_data->deferred_tx_frames))) {
			struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);

			/*
			 * The first deferred frame should've stopped the MAC
			 * queues, so we should never get a second deferred
			 * frame for the RA/TID.
			 */
			iwl_mvm_start_mac_queues(mvm, info->hw_queue);
			ieee80211_free_txskb(mvm->hw, skb);
		}
	}
	spin_unlock_bh(&mvm_sta->lock);
}

+6 −4
Original line number Diff line number Diff line
@@ -636,9 +636,9 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,

	baid_data = rcu_dereference(mvm->baid_map[baid]);
	if (!baid_data) {
		WARN(!(reorder & IWL_RX_MPDU_REORDER_BA_OLD_SN),
		     "Received baid %d, but no data exists for this BAID\n",
		     baid);
		IWL_DEBUG_RX(mvm,
			     "Got valid BAID but no baid allocated, bypass the re-ordering buffer. Baid %d reorder 0x%x\n",
			      baid, reorder);
		return false;
	}

@@ -759,7 +759,9 @@ static void iwl_mvm_agg_rx_received(struct iwl_mvm *mvm,

	data = rcu_dereference(mvm->baid_map[baid]);
	if (!data) {
		WARN_ON(!(reorder_data & IWL_RX_MPDU_REORDER_BA_OLD_SN));
		IWL_DEBUG_RX(mvm,
			     "Got valid BAID but no baid allocated, bypass the re-ordering buffer. Baid %d reorder 0x%x\n",
			      baid, reorder_data);
		goto out;
	}

+2 −2
Original line number Diff line number Diff line
@@ -291,7 +291,7 @@ static void iwl_mvm_rx_agg_session_expired(unsigned long data)
		goto unlock;

	mvm_sta = iwl_mvm_sta_from_mac80211(sta);
	ieee80211_stop_rx_ba_session_offl(mvm_sta->vif,
	ieee80211_rx_ba_timer_expired(mvm_sta->vif,
				      sta->addr, ba_data->tid);
unlock:
	rcu_read_unlock();
+15 −0
Original line number Diff line number Diff line
@@ -5499,6 +5499,21 @@ static inline void ieee80211_stop_rx_ba_session_offl(struct ieee80211_vif *vif,
	ieee80211_manage_rx_ba_offl(vif, addr, tid + IEEE80211_NUM_TIDS);
}

/**
 * ieee80211_rx_ba_timer_expired - stop a Rx BA session due to timeout
 *
 * Some device drivers do not offload AddBa/DelBa negotiation, but handle rx
 * buffer reording internally, and therefore also handle the session timer.
 *
 * Trigger the timeout flow, which sends a DelBa.
 *
 * @vif: &struct ieee80211_vif pointer from the add_interface callback
 * @addr: station mac address
 * @tid: the rx tid
 */
void ieee80211_rx_ba_timer_expired(struct ieee80211_vif *vif,
				   const u8 *addr, unsigned int tid);

/* Rate control API */

/**
Loading