lkml.org 
[lkml]   [2005]   [Oct]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Date
SubjectRe: Wifi oddness [Was: Re: 2.6.14-rc4-mm1]
>Alexandre Buisse wrote:
>>Jiri Slaby wrote:
>>>>I've been having problems with ipw2200 oopsing at modprobe since
>>>>2.6.14-rc2-mm1 (sorry for not reporting before). I use the ipw2200
>>>>included in the kernel.
>>>
>>>
>>> Can you apply this and tell me what are the numbers?
>>
>>Hi,
>>
>>I tested with -rc4 and the problem did not appear.
>>As for your patch, it just says ---THIS: 0,0 before oopsing.
>>
>>Hope it helps.
>Yes, it really does.
>
>The problem is in git-netdev-all.patch. Somebody rewrote the function:
>
>diff --git a/net/ieee80211/ieee80211_wx.c b/net/ieee80211/ieee80211_wx.c
>--- a/net/ieee80211/ieee80211_wx.c
>+++ b/net/ieee80211/ieee80211_wx.c
>@@ -1,6 +1,6 @@
> /******************************************************************************
>
>- Copyright(c) 2004 Intel Corporation. All rights reserved.
>+ Copyright(c) 2004-2005 Intel Corporation. All rights reserved.
>
> Portions of this file are based on the WEP enablement code provided by the
> Host AP project hostap-drivers v0.1.3
>@@ -32,6 +32,7 @@
>
> #include <linux/kmod.h>
> #include <linux/module.h>
>+#include <linux/jiffies.h>
>
> #include <net/ieee80211.h>
> #include <linux/wireless.h>
>@@ -140,18 +141,38 @@ static inline char *ipw2100_translate_sc
> start = iwe_stream_add_point(start, stop, &iwe, custom);
>
> /* Add quality statistics */
>- /* TODO: Fix these values... */
> iwe.cmd = IWEVQUAL;
>- iwe.u.qual.qual = network->stats.signal;
>- iwe.u.qual.level = network->stats.rssi;
>- iwe.u.qual.noise = network->stats.noise;
>- iwe.u.qual.updated = network->stats.mask & IEEE80211_STATMASK_WEMASK;
>- if (!(network->stats.mask & IEEE80211_STATMASK_RSSI))
>- iwe.u.qual.updated |= IW_QUAL_LEVEL_INVALID;
>- if (!(network->stats.mask & IEEE80211_STATMASK_NOISE))
>+ iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED |
>+ IW_QUAL_NOISE_UPDATED;
>+
>+ if (!(network->stats.mask & IEEE80211_STATMASK_RSSI)) {
>+ iwe.u.qual.updated |= IW_QUAL_QUAL_INVALID |
>+ IW_QUAL_LEVEL_INVALID;
>+ iwe.u.qual.qual = 0;
>+ iwe.u.qual.level = 0;
>+ } else {
>+ iwe.u.qual.level = network->stats.rssi;
>+ iwe.u.qual.qual =
>+ (100 *
>+ (ieee->perfect_rssi - ieee->worst_rssi) *
>+ (ieee->perfect_rssi - ieee->worst_rssi) -
>+ (ieee->perfect_rssi - network->stats.rssi) *
>+ (15 * (ieee->perfect_rssi - ieee->worst_rssi) +
>+ 62 * (ieee->perfect_rssi - network->stats.rssi))) /
>+ ((ieee->perfect_rssi - ieee->worst_rssi) *
>+ (ieee->perfect_rssi - ieee->worst_rssi));
>But here is a problem ieee->perfect_rssi and ieee->worst_rssi is 0 and 0, as
>you mentioned -- division by zero...
>
>It seems, that it is pulled from your tree, Jeff. Any ideas?
Yup. There is a BIG problem between ipw and 80211. 80211 is a new code and ipw
is an old one. We don't set perfect_rssi and worst_rssi in ipw and 80211 wait
some other values than 0!

What was the problem to not to add a new version of ipw into kernel?

And what about this fix (at least for the time, until ipw will be updated)?

diff --git a/net/ieee80211/ieee80211_wx.c b/net/ieee80211/ieee80211_wx.c
--- a/net/ieee80211/ieee80211_wx.c
+++ b/net/ieee80211/ieee80211_wx.c
@@ -152,15 +152,20 @@ static inline char *ipw2100_translate_sc
iwe.u.qual.level = 0;
} else {
iwe.u.qual.level = network->stats.rssi;
- iwe.u.qual.qual =
- (100 *
- (ieee->perfect_rssi - ieee->worst_rssi) *
- (ieee->perfect_rssi - ieee->worst_rssi) -
- (ieee->perfect_rssi - network->stats.rssi) *
- (15 * (ieee->perfect_rssi - ieee->worst_rssi) +
- 62 * (ieee->perfect_rssi - network->stats.rssi))) /
- ((ieee->perfect_rssi - ieee->worst_rssi) *
- (ieee->perfect_rssi - ieee->worst_rssi));
+ if (ieee->perfect_rssi)
+ iwe.u.qual.qual = (100 *
+ (ieee->perfect_rssi - ieee->worst_rssi) *
+ (ieee->perfect_rssi - ieee->worst_rssi) -
+ (ieee->perfect_rssi - network->stats.rssi) *
+ (
+ 15 * (ieee->perfect_rssi - ieee->worst_rssi) +
+ 62 * (ieee->perfect_rssi - network->stats.rssi)
+ )) /
+ ((ieee->perfect_rssi - ieee->worst_rssi) *
+ (ieee->perfect_rssi - ieee->worst_rssi));
+ else
+ iwe.u.qual.qual = network->stats.signal;
+
if (iwe.u.qual.qual > 100)
iwe.u.qual.qual = 100;
else if (iwe.u.qual.qual < 1)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-10-21 01:11    [W:0.124 / U:0.636 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site