lkml.org 
[lkml]   [2016]   [Sep]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.7 36/69] iwlwifi: mvm: update TX queue before making a copy of the skb
    Date
    4.7-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Beni Lev <beni.lev@intel.com>

    commit 54c5ef2e93ea002dc5dd63349298b2778fe59edb upstream.

    Off-channel action frames (such as ANQP frames) must be sent either on
    the AUX queue or on the offchannel queue, otherwise the firmware will
    cause a SYSASSERT.

    In the current implementation, the queue to be used is correctly set in
    the original skb, but this is done after it is copied. Thus the copy
    remains with the original, incorrect queue.

    Fix this by setting the queue in the original skb before copying it.

    Fixes: commit 5c08b0f5026f ("iwlwifi: mvm: don't override the rate with the AMSDU len")
    Signed-off-by: Beni Lev <beni.lev@intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 19 +++++++++----------
    1 file changed, 9 insertions(+), 10 deletions(-)

    --- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
    +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
    @@ -501,6 +501,15 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mv
    int hdrlen = ieee80211_hdrlen(hdr->frame_control);
    int queue;

    + /* IWL_MVM_OFFCHANNEL_QUEUE is used for ROC packets that can be used
    + * in 2 different types of vifs, P2P & STATION. P2P uses the offchannel
    + * queue. STATION (HS2.0) uses the auxiliary context of the FW,
    + * and hence needs to be sent on the aux queue
    + */
    + if (IEEE80211_SKB_CB(skb)->hw_queue == IWL_MVM_OFFCHANNEL_QUEUE &&
    + skb_info->control.vif->type == NL80211_IFTYPE_STATION)
    + IEEE80211_SKB_CB(skb)->hw_queue = mvm->aux_queue;
    +
    memcpy(&info, skb->cb, sizeof(info));

    if (WARN_ON_ONCE(info.flags & IEEE80211_TX_CTL_AMPDU))
    @@ -514,16 +523,6 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mv
    /* This holds the amsdu headers length */
    skb_info->driver_data[0] = (void *)(uintptr_t)0;

    - /*
    - * IWL_MVM_OFFCHANNEL_QUEUE is used for ROC packets that can be used
    - * in 2 different types of vifs, P2P & STATION. P2P uses the offchannel
    - * queue. STATION (HS2.0) uses the auxiliary context of the FW,
    - * and hence needs to be sent on the aux queue
    - */
    - if (IEEE80211_SKB_CB(skb)->hw_queue == IWL_MVM_OFFCHANNEL_QUEUE &&
    - info.control.vif->type == NL80211_IFTYPE_STATION)
    - IEEE80211_SKB_CB(skb)->hw_queue = mvm->aux_queue;
    -
    queue = info.hw_queue;

    /*

    \
     
     \ /
      Last update: 2016-09-28 11:21    [W:3.144 / U:0.724 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site