linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "John W. Linville" <linville@tuxdriver.com>
To: linux-wireless@vger.kernel.org
Subject: Re: [PATCH] wireless: report non-zero bitrate for MCS rates through wext
Date: Wed, 9 Dec 2009 17:01:45 -0500	[thread overview]
Message-ID: <20091209220144.GC32058@tuxdriver.com> (raw)
In-Reply-To: <1260395165-7116-1-git-send-email-linville@tuxdriver.com>

No testing, BTW -- I'm not near any 802.11n APs ATM.  Anyone care to
test and give me a warm fuzzy? :-)

John

On Wed, Dec 09, 2009 at 04:46:05PM -0500, John W. Linville wrote:
> Signed-off-by: John W. Linville <linville@tuxdriver.com>
> ---
>  net/wireless/core.h        |    2 ++
>  net/wireless/nl80211.c     |   37 ++-----------------------------------
>  net/wireless/util.c        |   33 +++++++++++++++++++++++++++++++++
>  net/wireless/wext-compat.c |    5 +----
>  4 files changed, 38 insertions(+), 39 deletions(-)
> 
> diff --git a/net/wireless/core.h b/net/wireless/core.h
> index 4ef3efc..35b7121 100644
> --- a/net/wireless/core.h
> +++ b/net/wireless/core.h
> @@ -378,6 +378,8 @@ int rdev_set_freq(struct cfg80211_registered_device *rdev,
>  		  struct wireless_dev *for_wdev,
>  		  int freq, enum nl80211_channel_type channel_type);
>  
> +u16 cfg80211_calculate_bitrate(struct rate_info *rate);
> +
>  #ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS
>  #define CFG80211_DEV_WARN_ON(cond)	WARN_ON(cond)
>  #else
> diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
> index a602843..7cb0d64 100644
> --- a/net/wireless/nl80211.c
> +++ b/net/wireless/nl80211.c
> @@ -1637,39 +1637,6 @@ static int parse_station_flags(struct genl_info *info,
>  	return 0;
>  }
>  
> -static u16 nl80211_calculate_bitrate(struct rate_info *rate)
> -{
> -	int modulation, streams, bitrate;
> -
> -	if (!(rate->flags & RATE_INFO_FLAGS_MCS))
> -		return rate->legacy;
> -
> -	/* the formula below does only work for MCS values smaller than 32 */
> -	if (rate->mcs >= 32)
> -		return 0;
> -
> -	modulation = rate->mcs & 7;
> -	streams = (rate->mcs >> 3) + 1;
> -
> -	bitrate = (rate->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) ?
> -			13500000 : 6500000;
> -
> -	if (modulation < 4)
> -		bitrate *= (modulation + 1);
> -	else if (modulation == 4)
> -		bitrate *= (modulation + 2);
> -	else
> -		bitrate *= (modulation + 3);
> -
> -	bitrate *= streams;
> -
> -	if (rate->flags & RATE_INFO_FLAGS_SHORT_GI)
> -		bitrate = (bitrate / 9) * 10;
> -
> -	/* do NOT round down here */
> -	return (bitrate + 50000) / 100000;
> -}
> -
>  static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
>  				int flags, struct net_device *dev,
>  				u8 *mac_addr, struct station_info *sinfo)
> @@ -1716,8 +1683,8 @@ static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
>  		if (!txrate)
>  			goto nla_put_failure;
>  
> -		/* nl80211_calculate_bitrate will return 0 for mcs >= 32 */
> -		bitrate = nl80211_calculate_bitrate(&sinfo->txrate);
> +		/* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */
> +		bitrate = cfg80211_calculate_bitrate(&sinfo->txrate);
>  		if (bitrate > 0)
>  			NLA_PUT_U16(msg, NL80211_RATE_INFO_BITRATE, bitrate);
>  
> diff --git a/net/wireless/util.c b/net/wireless/util.c
> index 59361fd..a3c841a 100644
> --- a/net/wireless/util.c
> +++ b/net/wireless/util.c
> @@ -720,3 +720,36 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
>  
>  	return err;
>  }
> +
> +u16 cfg80211_calculate_bitrate(struct rate_info *rate)
> +{
> +	int modulation, streams, bitrate;
> +
> +	if (!(rate->flags & RATE_INFO_FLAGS_MCS))
> +		return rate->legacy;
> +
> +	/* the formula below does only work for MCS values smaller than 32 */
> +	if (rate->mcs >= 32)
> +		return 0;
> +
> +	modulation = rate->mcs & 7;
> +	streams = (rate->mcs >> 3) + 1;
> +
> +	bitrate = (rate->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) ?
> +			13500000 : 6500000;
> +
> +	if (modulation < 4)
> +		bitrate *= (modulation + 1);
> +	else if (modulation == 4)
> +		bitrate *= (modulation + 2);
> +	else
> +		bitrate *= (modulation + 3);
> +
> +	bitrate *= streams;
> +
> +	if (rate->flags & RATE_INFO_FLAGS_SHORT_GI)
> +		bitrate = (bitrate / 9) * 10;
> +
> +	/* do NOT round down here */
> +	return (bitrate + 50000) / 100000;
> +}
> diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c
> index 54face3..4198243 100644
> --- a/net/wireless/wext-compat.c
> +++ b/net/wireless/wext-compat.c
> @@ -1257,10 +1257,7 @@ int cfg80211_wext_giwrate(struct net_device *dev,
>  	if (!(sinfo.filled & STATION_INFO_TX_BITRATE))
>  		return -EOPNOTSUPP;
>  
> -	rate->value = 0;
> -
> -	if (!(sinfo.txrate.flags & RATE_INFO_FLAGS_MCS))
> -		rate->value = 100000 * sinfo.txrate.legacy;
> +	rate->value = 100000 * cfg80211_calculate_bitrate(&sinfo.txrate);
>  
>  	return 0;
>  }
> -- 
> 1.6.2.5
> 
> 

-- 
John W. Linville		Someday the world will need a hero, and you
linville@tuxdriver.com			might be all we have.  Be ready.

  reply	other threads:[~2009-12-09 22:15 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-12-09 21:46 [PATCH] wireless: report non-zero bitrate for MCS rates through wext John W. Linville
2009-12-09 22:01 ` John W. Linville [this message]
2009-12-10  9:40 ` Kalle Valo
2009-12-10 13:00   ` John W. Linville
2009-12-10 13:32     ` Kalle Valo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20091209220144.GC32058@tuxdriver.com \
    --to=linville@tuxdriver.com \
    --cc=linux-wireless@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).