• Emmanuel Grumbach's avatar
    mac80211: don't update the PM state of a peer upon a multicast frame · 20932750
    Emmanuel Grumbach authored
    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.
    
    Fixes: 9fef6544 ("mac80211: always update the PM state of a peer on MGMT / DATA frames")
    Cc: <stable@vger.kernel.org>   #4.16+
    Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
    Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
    20932750
rx.c 123 KB