From patchwork Mon Apr 15 10:09:09 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Karl Beldan X-Patchwork-Id: 2444491 Return-Path: X-Original-To: patchwork-linux-wireless@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id 9B5F23FD1A for ; Mon, 15 Apr 2013 10:13:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751251Ab3DOKNO (ORCPT ); Mon, 15 Apr 2013 06:13:14 -0400 Received: from mail-we0-f171.google.com ([74.125.82.171]:34417 "EHLO mail-we0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751124Ab3DOKNO (ORCPT ); Mon, 15 Apr 2013 06:13:14 -0400 Received: by mail-we0-f171.google.com with SMTP id i48so1848230wef.30 for ; Mon, 15 Apr 2013 03:13:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:date:from:to:cc:subject:message-id:mime-version :content-type:content-disposition:x-location:user-agent; bh=CYnabffXdKF+drKsNASYEoi2C914y7gZFZ7XVY/akF8=; b=qm7ixKYj4MLn7mnjUTXDXDtVUAS289WixB2Zire+XBeHh2Y/5oGqawv8m7PSB1/xHV TjlYfqiHfh2HxaTfG19f64fuXzCS/OIyDiJIO/Ugf5zbq5nB9f2YHLRH8IRrzWYyusgO 6sLe/PDBemtPK/GUd8OnjHVpIwjvPMeEflVSw1ay/SZ+S194FyyFOq0OR4PjgO3xpw3Z I2bVXxsybKnlH4+SImlqOq1wwak+SfR1ZzsqBGi0N0Jzr8pdZG4ZL9JfkSgjx87anQFk 94U69VwnVwW+Uv2XNo0MKrEwJsCb56QFNz5MyDvpKyraF86ZA/g2udM/W8/XfIyZNiOM 7yLw== X-Received: by 10.180.87.193 with SMTP id ba1mr10883405wib.10.1366020792781; Mon, 15 Apr 2013 03:13:12 -0700 (PDT) Received: from magnum.frso.rivierawaves.com (vpn.rivierawaves.com. [91.151.119.162]) by mx.google.com with ESMTPS id q18sm5757416wiw.8.2013.04.15.03.13.11 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 15 Apr 2013 03:13:12 -0700 (PDT) Date: Mon, 15 Apr 2013 12:09:09 +0200 From: Karl Beldan To: Johannes Berg Cc: linux-wireless Subject: vht off-by-one nss Message-ID: <20130415100909.GA29924@magnum.frso.rivierawaves.com> MIME-Version: 1.0 Content-Disposition: inline X-Location: France User-Agent: Mutt (Linux 3.8.0-rc7-00073-g323a72d x86_64 GNU/Linux) Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org It seems to me we have to perform one of the following, otherwise one driver may set negative rate indexes and iw et.al will report VHT NSSes starting at 0. { } Karl --- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 0dde213..2317ca9 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -601,8 +601,8 @@ static inline void ieee80211_rate_set_vht(struct ieee80211_tx_rate *rate, u8 mcs, u8 nss) { WARN_ON(mcs & ~0xF); - WARN_ON(nss & ~0x7); - rate->idx = (nss << 4) | mcs; + WARN_ON((nss - 1) & ~0x7); + rate->idx = ((nss - 1) << 4) | mcs; } static inline u8 @@ -614,7 +614,7 @@ ieee80211_rate_get_vht_mcs(const struct ieee80211_tx_rate *rate) static inline u8 ieee80211_rate_get_vht_nss(const struct ieee80211_tx_rate *rate) { - return rate->idx >> 4; + return (rate->idx >> 4) + 1; } /** } or: { diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c index 56df249..9631391 100644 --- a/drivers/net/wireless/iwlwifi/mvm/tx.c +++ b/drivers/net/wireless/iwlwifi/mvm/tx.c @@ -545,7 +545,7 @@ static void iwl_mvm_hwrate_to_tx_control(u32 rate_n_flags, ieee80211_rate_set_vht( r, rate_n_flags & RATE_VHT_MCS_RATE_CODE_MSK, ((rate_n_flags & RATE_VHT_MCS_NSS_MSK) >> - RATE_VHT_MCS_NSS_POS) + 1); + RATE_VHT_MCS_NSS_POS)); r->flags |= IEEE80211_TX_RC_VHT_MCS; } else { r->idx = iwl_mvm_legacy_rate_to_mac80211_idx(rate_n_flags, diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index fdd95bd..358d93c 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -389,7 +389,7 @@ void sta_set_rate_info_tx(struct sta_info *sta, } else if (rate->flags & IEEE80211_TX_RC_VHT_MCS) { rinfo->flags |= RATE_INFO_FLAGS_VHT_MCS; rinfo->mcs = ieee80211_rate_get_vht_mcs(rate); - rinfo->nss = ieee80211_rate_get_vht_nss(rate); + rinfo->nss = ieee80211_rate_get_vht_nss(rate) + 1; } else { struct ieee80211_supported_band *sband; sband = sta->local->hw.wiphy->bands[