All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.