diff options
author | Peter Wu <lekensteyn@gmail.com> | 2014-02-14 13:03:45 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-02-24 15:21:53 -0500 |
commit | 711f145ad0e93a914644d3e7998c28267bd3c136 (patch) | |
tree | 706f542a793f2e6423aabb319ba41ba8f40b273c /drivers/net/wireless/rtlwifi | |
parent | e51048cdf0bdf1358c39839eabb22a06674af9ed (diff) |
rtlwifi: properly apply filter flags
commit 0baa0fd76f3f5a134461d6cf30294f6bb1bb824c
("rtlwifi: Convert core routines for addition of rtl8192se and
rtl8192de") removed setting HW_VAR_RCR, HW_VAR_MGT_FILTER and
HW_VAR_CTRL_FILTER. The last two are probably done because some hardware
does not support them. The first is probably a mistake. This patch adds
the missing set_hw_reg call.
For PCI support, rx_conf is not touched directly. Instead, get_hw_reg is
used to abstract between receive_config (for PCI) and rx_conf (for USB).
This was tested on a 10ec:8176 Realtek RTL8188CE (according to the
label on the mini-PCIe card). Before this patch, `iw wlan0 set monitor
otherbss` did not capture frames from other BSS's. After this patch, it
does print packets.
Tested-by: Peter Wu <lekensteyn@gmail.com>
Signed-off-by: Peter Wu <lekensteyn@gmail.com>
Acked-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rtlwifi')
-rw-r--r-- | drivers/net/wireless/rtlwifi/core.c | 52 |
1 files changed, 30 insertions, 22 deletions
diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c index 2d337a0c3df0..6df4df090b73 100644 --- a/drivers/net/wireless/rtlwifi/core.c +++ b/drivers/net/wireless/rtlwifi/core.c | |||
@@ -475,20 +475,40 @@ static void rtl_op_configure_filter(struct ieee80211_hw *hw, | |||
475 | { | 475 | { |
476 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 476 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
477 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); | 477 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); |
478 | u32 rx_conf; | ||
478 | 479 | ||
479 | *new_flags &= RTL_SUPPORTED_FILTERS; | 480 | *new_flags &= RTL_SUPPORTED_FILTERS; |
480 | if (!changed_flags) | 481 | if (!changed_flags) |
481 | return; | 482 | return; |
482 | 483 | ||
484 | /* if ssid not set to hw don't check bssid | ||
485 | * here just used for linked scanning, & linked | ||
486 | * and nolink check bssid is set in set network_type */ | ||
487 | if ((changed_flags & FIF_BCN_PRBRESP_PROMISC) && | ||
488 | (mac->link_state >= MAC80211_LINKED)) { | ||
489 | if (mac->opmode != NL80211_IFTYPE_AP && | ||
490 | mac->opmode != NL80211_IFTYPE_MESH_POINT) { | ||
491 | if (*new_flags & FIF_BCN_PRBRESP_PROMISC) { | ||
492 | rtlpriv->cfg->ops->set_chk_bssid(hw, false); | ||
493 | } else { | ||
494 | rtlpriv->cfg->ops->set_chk_bssid(hw, true); | ||
495 | } | ||
496 | } | ||
497 | } | ||
498 | |||
499 | /* must be called after set_chk_bssid since that function modifies the | ||
500 | * RCR register too. */ | ||
501 | rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *)(&rx_conf)); | ||
502 | |||
483 | /*TODO: we disable broadcase now, so enable here */ | 503 | /*TODO: we disable broadcase now, so enable here */ |
484 | if (changed_flags & FIF_ALLMULTI) { | 504 | if (changed_flags & FIF_ALLMULTI) { |
485 | if (*new_flags & FIF_ALLMULTI) { | 505 | if (*new_flags & FIF_ALLMULTI) { |
486 | mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_AM] | | 506 | rx_conf |= rtlpriv->cfg->maps[MAC_RCR_AM] | |
487 | rtlpriv->cfg->maps[MAC_RCR_AB]; | 507 | rtlpriv->cfg->maps[MAC_RCR_AB]; |
488 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, | 508 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, |
489 | "Enable receive multicast frame\n"); | 509 | "Enable receive multicast frame\n"); |
490 | } else { | 510 | } else { |
491 | mac->rx_conf &= ~(rtlpriv->cfg->maps[MAC_RCR_AM] | | 511 | rx_conf &= ~(rtlpriv->cfg->maps[MAC_RCR_AM] | |
492 | rtlpriv->cfg->maps[MAC_RCR_AB]); | 512 | rtlpriv->cfg->maps[MAC_RCR_AB]); |
493 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, | 513 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, |
494 | "Disable receive multicast frame\n"); | 514 | "Disable receive multicast frame\n"); |
@@ -497,39 +517,25 @@ static void rtl_op_configure_filter(struct ieee80211_hw *hw, | |||
497 | 517 | ||
498 | if (changed_flags & FIF_FCSFAIL) { | 518 | if (changed_flags & FIF_FCSFAIL) { |
499 | if (*new_flags & FIF_FCSFAIL) { | 519 | if (*new_flags & FIF_FCSFAIL) { |
500 | mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_ACRC32]; | 520 | rx_conf |= rtlpriv->cfg->maps[MAC_RCR_ACRC32]; |
501 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, | 521 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, |
502 | "Enable receive FCS error frame\n"); | 522 | "Enable receive FCS error frame\n"); |
503 | } else { | 523 | } else { |
504 | mac->rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_ACRC32]; | 524 | rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_ACRC32]; |
505 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, | 525 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, |
506 | "Disable receive FCS error frame\n"); | 526 | "Disable receive FCS error frame\n"); |
507 | } | 527 | } |
508 | } | 528 | } |
509 | 529 | ||
510 | /* if ssid not set to hw don't check bssid | ||
511 | * here just used for linked scanning, & linked | ||
512 | * and nolink check bssid is set in set network_type */ | ||
513 | if ((changed_flags & FIF_BCN_PRBRESP_PROMISC) && | ||
514 | (mac->link_state >= MAC80211_LINKED)) { | ||
515 | if (mac->opmode != NL80211_IFTYPE_AP && | ||
516 | mac->opmode != NL80211_IFTYPE_MESH_POINT) { | ||
517 | if (*new_flags & FIF_BCN_PRBRESP_PROMISC) { | ||
518 | rtlpriv->cfg->ops->set_chk_bssid(hw, false); | ||
519 | } else { | ||
520 | rtlpriv->cfg->ops->set_chk_bssid(hw, true); | ||
521 | } | ||
522 | } | ||
523 | } | ||
524 | 530 | ||
525 | if (changed_flags & FIF_CONTROL) { | 531 | if (changed_flags & FIF_CONTROL) { |
526 | if (*new_flags & FIF_CONTROL) { | 532 | if (*new_flags & FIF_CONTROL) { |
527 | mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_ACF]; | 533 | rx_conf |= rtlpriv->cfg->maps[MAC_RCR_ACF]; |
528 | 534 | ||
529 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, | 535 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, |
530 | "Enable receive control frame\n"); | 536 | "Enable receive control frame\n"); |
531 | } else { | 537 | } else { |
532 | mac->rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_ACF]; | 538 | rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_ACF]; |
533 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, | 539 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, |
534 | "Disable receive control frame\n"); | 540 | "Disable receive control frame\n"); |
535 | } | 541 | } |
@@ -537,15 +543,17 @@ static void rtl_op_configure_filter(struct ieee80211_hw *hw, | |||
537 | 543 | ||
538 | if (changed_flags & FIF_OTHER_BSS) { | 544 | if (changed_flags & FIF_OTHER_BSS) { |
539 | if (*new_flags & FIF_OTHER_BSS) { | 545 | if (*new_flags & FIF_OTHER_BSS) { |
540 | mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_AAP]; | 546 | rx_conf |= rtlpriv->cfg->maps[MAC_RCR_AAP]; |
541 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, | 547 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, |
542 | "Enable receive other BSS's frame\n"); | 548 | "Enable receive other BSS's frame\n"); |
543 | } else { | 549 | } else { |
544 | mac->rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_AAP]; | 550 | rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_AAP]; |
545 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, | 551 | RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, |
546 | "Disable receive other BSS's frame\n"); | 552 | "Disable receive other BSS's frame\n"); |
547 | } | 553 | } |
548 | } | 554 | } |
555 | |||
556 | rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, (u8 *)(&rx_conf)); | ||
549 | } | 557 | } |
550 | static int rtl_op_sta_add(struct ieee80211_hw *hw, | 558 | static int rtl_op_sta_add(struct ieee80211_hw *hw, |
551 | struct ieee80211_vif *vif, | 559 | struct ieee80211_vif *vif, |