summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>2011-08-04 14:53:06 +0200
committerPhilippe LANGLAIS <philippe.langlais@stericsson.com>2011-10-13 09:57:00 +0200
commitd1a2ea58a2231b046a92dbf4745bf0214f9ea058 (patch)
treec89d0655e9260a7e6014873bbb2ca5778f4a681e
parent6a64664ccd3d7f76845b24e434cb3b62c3f3a391 (diff)
cw1200: Fix for a crash in cw1200_join_work.
[ 129.340148] Unable to handle kernel NULL pointer dereference at virtual address 00000018 [ 129.348266] pgd = c0004000 [ 129.350982] [00000018] *pgd=00000000 [ 129.354553] Internal error: Oops: 17 [#1] PREEMPT SMP [ 129.359619] last sysfs file: /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state [ 129.367431] Modules linked in: cw1200_wlan cw1200_core [ 129.372589] CPU: 1 Not tainted (2.6.35.7+ #111) [ 129.377502] PC is at cw1200_join_work+0x148/0x3c8 [cw1200_core] [ 129.383422] LR is at mutex_lock+0x18/0x4c Change-Id: I62b013780fa66592d49938c6d7d86229450105a1 Signed-off-by: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/28283 Reviewed-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com> Tested-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33497 Reviewed-by: Philippe LANGLAIS <philippe.langlais@stericsson.com>
-rw-r--r--drivers/staging/cw1200/sta.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/staging/cw1200/sta.c b/drivers/staging/cw1200/sta.c
index e69bd729f07..86a05dcaca2 100644
--- a/drivers/staging/cw1200/sta.c
+++ b/drivers/staging/cw1200/sta.c
@@ -968,17 +968,22 @@ void cw1200_join_work(struct work_struct *work)
mutex_lock(&priv->conf_mutex);
{
struct wsm_join join = {
- .mode = (bss->capability & WLAN_CAPABILITY_IBSS) ?
- WSM_JOIN_MODE_IBSS : WSM_JOIN_MODE_BSS,
+ .mode = WSM_JOIN_MODE_BSS,
.preambleType = WSM_JOIN_PREAMBLE_SHORT,
.probeForJoin = 1,
/* dtimPeriod will be updated after association */
.dtimPeriod = 1,
- .beaconInterval = bss->beacon_interval,
+ .beaconInterval = 100,
/* basicRateSet will be updated after association */
.basicRateSet = 7,
};
+ if (bss) {
+ join.mode = (bss->capability & WLAN_CAPABILITY_IBSS) ?
+ WSM_JOIN_MODE_IBSS : WSM_JOIN_MODE_BSS;
+ join.beaconInterval = bss->beacon_interval;
+ }
+
if (tim && tim->dtim_period > 1) {
join.dtimPeriod = tim->dtim_period;
priv->join_dtim_period = tim->dtim_period;
@@ -1036,7 +1041,8 @@ void cw1200_join_work(struct work_struct *work)
cw1200_update_filtering(priv);
}
mutex_unlock(&priv->conf_mutex);
- cfg80211_put_bss(bss);
+ if (bss)
+ cfg80211_put_bss(bss);
}
void cw1200_join_timeout(struct work_struct *work)