diff options
Diffstat (limited to 'net/mac80211/sta_info.c')
-rw-r--r-- | net/mac80211/sta_info.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 47d2c1bbfcaa..f2ba653b9d69 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c | |||
@@ -320,7 +320,9 @@ int sta_info_insert(struct sta_info *sta) | |||
320 | /* notify driver */ | 320 | /* notify driver */ |
321 | if (local->ops->sta_notify) { | 321 | if (local->ops->sta_notify) { |
322 | if (sdata->vif.type == IEEE80211_IF_TYPE_VLAN) | 322 | if (sdata->vif.type == IEEE80211_IF_TYPE_VLAN) |
323 | sdata = sdata->u.vlan.ap; | 323 | sdata = container_of(sdata->bss, |
324 | struct ieee80211_sub_if_data, | ||
325 | u.ap); | ||
324 | 326 | ||
325 | local->ops->sta_notify(local_to_hw(local), &sdata->vif, | 327 | local->ops->sta_notify(local_to_hw(local), &sdata->vif, |
326 | STA_NOTIFY_ADD, sta->addr); | 328 | STA_NOTIFY_ADD, sta->addr); |
@@ -375,8 +377,10 @@ static inline void __bss_tim_clear(struct ieee80211_if_ap *bss, u16 aid) | |||
375 | static void __sta_info_set_tim_bit(struct ieee80211_if_ap *bss, | 377 | static void __sta_info_set_tim_bit(struct ieee80211_if_ap *bss, |
376 | struct sta_info *sta) | 378 | struct sta_info *sta) |
377 | { | 379 | { |
378 | if (bss) | 380 | BUG_ON(!bss); |
379 | __bss_tim_set(bss, sta->aid); | 381 | |
382 | __bss_tim_set(bss, sta->aid); | ||
383 | |||
380 | if (sta->local->ops->set_tim) { | 384 | if (sta->local->ops->set_tim) { |
381 | sta->local->tim_in_locked_section = true; | 385 | sta->local->tim_in_locked_section = true; |
382 | sta->local->ops->set_tim(local_to_hw(sta->local), sta->aid, 1); | 386 | sta->local->ops->set_tim(local_to_hw(sta->local), sta->aid, 1); |
@@ -388,6 +392,8 @@ void sta_info_set_tim_bit(struct sta_info *sta) | |||
388 | { | 392 | { |
389 | unsigned long flags; | 393 | unsigned long flags; |
390 | 394 | ||
395 | BUG_ON(!sta->sdata->bss); | ||
396 | |||
391 | spin_lock_irqsave(&sta->local->sta_lock, flags); | 397 | spin_lock_irqsave(&sta->local->sta_lock, flags); |
392 | __sta_info_set_tim_bit(sta->sdata->bss, sta); | 398 | __sta_info_set_tim_bit(sta->sdata->bss, sta); |
393 | spin_unlock_irqrestore(&sta->local->sta_lock, flags); | 399 | spin_unlock_irqrestore(&sta->local->sta_lock, flags); |
@@ -396,8 +402,10 @@ void sta_info_set_tim_bit(struct sta_info *sta) | |||
396 | static void __sta_info_clear_tim_bit(struct ieee80211_if_ap *bss, | 402 | static void __sta_info_clear_tim_bit(struct ieee80211_if_ap *bss, |
397 | struct sta_info *sta) | 403 | struct sta_info *sta) |
398 | { | 404 | { |
399 | if (bss) | 405 | BUG_ON(!bss); |
400 | __bss_tim_clear(bss, sta->aid); | 406 | |
407 | __bss_tim_clear(bss, sta->aid); | ||
408 | |||
401 | if (sta->local->ops->set_tim) { | 409 | if (sta->local->ops->set_tim) { |
402 | sta->local->tim_in_locked_section = true; | 410 | sta->local->tim_in_locked_section = true; |
403 | sta->local->ops->set_tim(local_to_hw(sta->local), sta->aid, 0); | 411 | sta->local->ops->set_tim(local_to_hw(sta->local), sta->aid, 0); |
@@ -409,6 +417,8 @@ void sta_info_clear_tim_bit(struct sta_info *sta) | |||
409 | { | 417 | { |
410 | unsigned long flags; | 418 | unsigned long flags; |
411 | 419 | ||
420 | BUG_ON(!sta->sdata->bss); | ||
421 | |||
412 | spin_lock_irqsave(&sta->local->sta_lock, flags); | 422 | spin_lock_irqsave(&sta->local->sta_lock, flags); |
413 | __sta_info_clear_tim_bit(sta->sdata->bss, sta); | 423 | __sta_info_clear_tim_bit(sta->sdata->bss, sta); |
414 | spin_unlock_irqrestore(&sta->local->sta_lock, flags); | 424 | spin_unlock_irqrestore(&sta->local->sta_lock, flags); |
@@ -437,8 +447,9 @@ void __sta_info_unlink(struct sta_info **sta) | |||
437 | list_del(&(*sta)->list); | 447 | list_del(&(*sta)->list); |
438 | 448 | ||
439 | if (test_and_clear_sta_flags(*sta, WLAN_STA_PS)) { | 449 | if (test_and_clear_sta_flags(*sta, WLAN_STA_PS)) { |
440 | if (sdata->bss) | 450 | BUG_ON(!sdata->bss); |
441 | atomic_dec(&sdata->bss->num_sta_ps); | 451 | |
452 | atomic_dec(&sdata->bss->num_sta_ps); | ||
442 | __sta_info_clear_tim_bit(sdata->bss, *sta); | 453 | __sta_info_clear_tim_bit(sdata->bss, *sta); |
443 | } | 454 | } |
444 | 455 | ||
@@ -446,7 +457,9 @@ void __sta_info_unlink(struct sta_info **sta) | |||
446 | 457 | ||
447 | if (local->ops->sta_notify) { | 458 | if (local->ops->sta_notify) { |
448 | if (sdata->vif.type == IEEE80211_IF_TYPE_VLAN) | 459 | if (sdata->vif.type == IEEE80211_IF_TYPE_VLAN) |
449 | sdata = sdata->u.vlan.ap; | 460 | sdata = container_of(sdata->bss, |
461 | struct ieee80211_sub_if_data, | ||
462 | u.ap); | ||
450 | 463 | ||
451 | local->ops->sta_notify(local_to_hw(local), &sdata->vif, | 464 | local->ops->sta_notify(local_to_hw(local), &sdata->vif, |
452 | STA_NOTIFY_REMOVE, (*sta)->addr); | 465 | STA_NOTIFY_REMOVE, (*sta)->addr); |