rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME,
                           !(filter_flags & FIF_PROMISC_IN_BSS));
        rt2x00_set_field32(®, RXCSR0_DROP_TODS,
-                          !(filter_flags & FIF_PROMISC_IN_BSS));
+                          !(filter_flags & FIF_PROMISC_IN_BSS) &&
+                          !rt2x00dev->intf_ap_count);
        rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1);
        rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);
 }
 
        rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME,
                           !(filter_flags & FIF_PROMISC_IN_BSS));
        rt2x00_set_field32(®, RXCSR0_DROP_TODS,
-                          !(filter_flags & FIF_PROMISC_IN_BSS));
+                          !(filter_flags & FIF_PROMISC_IN_BSS) &&
+                          !rt2x00dev->intf_ap_count);
        rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1);
        rt2x00_set_field32(®, RXCSR0_DROP_MCAST,
                           !(filter_flags & FIF_ALLMULTI));
 
        rt2x00_set_field16(®, TXRX_CSR2_DROP_NOT_TO_ME,
                           !(filter_flags & FIF_PROMISC_IN_BSS));
        rt2x00_set_field16(®, TXRX_CSR2_DROP_TODS,
-                          !(filter_flags & FIF_PROMISC_IN_BSS));
+                          !(filter_flags & FIF_PROMISC_IN_BSS) &&
+                          !rt2x00dev->intf_ap_count);
        rt2x00_set_field16(®, TXRX_CSR2_DROP_VERSION_ERROR, 1);
        rt2x00_set_field16(®, TXRX_CSR2_DROP_MULTICAST,
                           !(filter_flags & FIF_ALLMULTI));
 
         */
        rt2x00lib_config_intf(rt2x00dev, intf, conf->type, intf->mac, NULL);
 
+       /*
+        * Some filters depend on the current working mode. We can force
+        * an update during the next configure_filter() run by mac80211 by
+        * resetting the current packet_filter state.
+        */
+       rt2x00dev->packet_filter = 0;
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(rt2x00mac_add_interface);
 
        rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME,
                           !(filter_flags & FIF_PROMISC_IN_BSS));
        rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS,
-                          !(filter_flags & FIF_PROMISC_IN_BSS));
+                          !(filter_flags & FIF_PROMISC_IN_BSS) &&
+                          !rt2x00dev->intf_ap_count);
        rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1);
        rt2x00_set_field32(®, TXRX_CSR0_DROP_MULTICAST,
                           !(filter_flags & FIF_ALLMULTI));
 
        rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME,
                           !(filter_flags & FIF_PROMISC_IN_BSS));
        rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS,
-                          !(filter_flags & FIF_PROMISC_IN_BSS));
+                          !(filter_flags & FIF_PROMISC_IN_BSS) &&
+                          !rt2x00dev->intf_ap_count);
        rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1);
        rt2x00_set_field32(®, TXRX_CSR0_DROP_MULTICAST,
                           !(filter_flags & FIF_ALLMULTI));