Skip to content

Commit d6ffdd1

Browse files
egrumbachIntel ChromeOS bot
authored andcommitted
CHROMIUM: iwl7000: mac80211: don't update the PM state of a peer upon a multicast frame
I changed the way mac80211 updates the PM state of the peer. I forgot that we could also have multicast frames from the peer and that those frame should of course not change the PM state of the peer: A peer goes to power save when it needs to scan, but it won't send the broadcast Probe Request with the PM bit set. This made us mark the peer as awake when it wasn't and then Intel's firmware would fail to transmit because the peer is asleep according to its database. The driver warned about this and it looked like this: WARNING: CPU: 0 PID: 184 at /usr/src/linux-4.16.14/drivers/net/wireless/intel/iwlwifi/mvm/tx.c:1369 iwl_mvm_rx_tx_cmd+0x53b/0x860 CPU: 0 PID: 184 Comm: irq/124-iwlwifi Not tainted 4.16.14 #1 RIP: 0010:iwl_mvm_rx_tx_cmd+0x53b/0x860 Call Trace: iwl_pcie_rx_handle+0x220/0x880 iwl_pcie_irq_handler+0x6c9/0xa20 ? irq_forced_thread_fn+0x60/0x60 ? irq_thread_dtor+0x90/0x90 The relevant code that spits the WARNING is: case TX_STATUS_FAIL_DEST_PS: /* the FW should have stopped the queue and not * return this status */ WARN_ON(1); info->flags |= IEEE80211_TX_STAT_TX_FILTERED; This fixes https://bugzilla.kernel.org/show_bug.cgi?id=199967. Change-Id: Ic2e631a6a0b358c1f783a75dc9f1adf56eeaff38 Fixes: 9fef654 ("mac80211: always update the PM state of a peer on MGMT / DATA frames") Cc: <stable@vger.kernel.org> thesofproject#4.16+ Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com> iwl7000-tree: 6994b58a2e09d06ea95547ba4ff34e44d104a587
1 parent 93c7539 commit d6ffdd1

File tree

1 file changed

+1
-0
lines changed
  • drivers/net/wireless/iwl7000/mac80211

1 file changed

+1
-0
lines changed

drivers/net/wireless/iwl7000/mac80211/rx.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1731,6 +1731,7 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
17311731
*/
17321732
if (!ieee80211_hw_check(&sta->local->hw, AP_LINK_PS) &&
17331733
!ieee80211_has_morefrags(hdr->frame_control) &&
1734+
!is_multicast_ether_addr(hdr->addr1) &&
17341735
(ieee80211_is_mgmt(hdr->frame_control) ||
17351736
ieee80211_is_data(hdr->frame_control)) &&
17361737
!(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) &&

0 commit comments

Comments
 (0)