lkml.org 
[lkml]   [2015]   [Jan]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.18 060/183] cfg80211: Fix 160 MHz channels with 80+80 and 160 MHz drivers
    Date
    3.18-stable review patch.  If anyone has any objections, please let me know.

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

    From: Jouni Malinen <jouni@qca.qualcomm.com>

    commit 08f6f147773b23b765b94633a8eaa82e7defcf4c upstream.

    The VHT supported channel width field is a two bit integer, not a
    bitfield. cfg80211_chandef_usable() was interpreting it incorrectly and
    ended up rejecting 160 MHz channel width if the driver indicated support
    for both 160 and 80+80 MHz channels.

    Fixes: 3d9d1d6656a73 ("nl80211/cfg80211: support VHT channel configuration")
    (however, no real drivers had 160 MHz support it until 3.16)
    Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    net/wireless/chan.c | 9 ++++++---
    1 file changed, 6 insertions(+), 3 deletions(-)

    --- a/net/wireless/chan.c
    +++ b/net/wireless/chan.c
    @@ -602,7 +602,7 @@ bool cfg80211_chandef_usable(struct wiph
    {
    struct ieee80211_sta_ht_cap *ht_cap;
    struct ieee80211_sta_vht_cap *vht_cap;
    - u32 width, control_freq;
    + u32 width, control_freq, cap;

    if (WARN_ON(!cfg80211_chandef_valid(chandef)))
    return false;
    @@ -642,7 +642,8 @@ bool cfg80211_chandef_usable(struct wiph
    return false;
    break;
    case NL80211_CHAN_WIDTH_80P80:
    - if (!(vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ))
    + cap = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
    + if (cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ)
    return false;
    case NL80211_CHAN_WIDTH_80:
    if (!vht_cap->vht_supported)
    @@ -653,7 +654,9 @@ bool cfg80211_chandef_usable(struct wiph
    case NL80211_CHAN_WIDTH_160:
    if (!vht_cap->vht_supported)
    return false;
    - if (!(vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ))
    + cap = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
    + if (cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ &&
    + cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ)
    return false;
    prohibited_flags |= IEEE80211_CHAN_NO_160MHZ;
    width = 160;



    \
     
     \ /
      Last update: 2015-01-25 20:01    [W:4.051 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site