diff options
author | Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> | 2011-08-04 14:53:06 +0200 |
---|---|---|
committer | Philippe LANGLAIS <philippe.langlais@stericsson.com> | 2011-10-13 09:57:00 +0200 |
commit | d1a2ea58a2231b046a92dbf4745bf0214f9ea058 (patch) | |
tree | c89d0655e9260a7e6014873bbb2ca5778f4a681e | |
parent | 6a64664ccd3d7f76845b24e434cb3b62c3f3a391 (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.c | 14 |
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) |