* - Some filters are set based on interface type.
         */
        *total_flags |= FIF_ALLMULTI;
-       if (changed_flags & FIF_OTHER_BSS ||
-           changed_flags & FIF_PROMISC_IN_BSS)
+       if (*total_flags & FIF_OTHER_BSS ||
+           *total_flags & FIF_PROMISC_IN_BSS)
                *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
        if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
                *total_flags |= FIF_PROMISC_IN_BSS;
 
         */
        if (mc_count)
                *total_flags |= FIF_ALLMULTI;
-       if (changed_flags & FIF_OTHER_BSS ||
-           changed_flags & FIF_PROMISC_IN_BSS)
+       if (*total_flags & FIF_OTHER_BSS ||
+           *total_flags & FIF_PROMISC_IN_BSS)
                *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
        if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
                *total_flags |= FIF_PROMISC_IN_BSS;
 
         */
        if (mc_count)
                *total_flags |= FIF_ALLMULTI;
-       if (changed_flags & FIF_OTHER_BSS ||
-           changed_flags & FIF_PROMISC_IN_BSS)
+       if (*total_flags & FIF_OTHER_BSS ||
+           *total_flags & FIF_PROMISC_IN_BSS)
                *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
        if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
                *total_flags |= FIF_PROMISC_IN_BSS;
 
         */
        void (*config_mac_addr) (struct rt2x00_dev *rt2x00dev, __le32 *mac);
        void (*config_bssid) (struct rt2x00_dev *rt2x00dev, __le32 *bssid);
-       void (*config_packet_filter) (struct rt2x00_dev *rt2x00dev,
-                                     const unsigned int filter);
        void (*config_type) (struct rt2x00_dev *rt2x00dev, const int type);
        void (*config) (struct rt2x00_dev *rt2x00dev, const unsigned int flags,
                        struct ieee80211_conf *conf);
 
 {
        struct rt2x00_dev *rt2x00dev =
            container_of(work, struct rt2x00_dev, filter_work);
+       unsigned int filter = rt2x00dev->interface.filter;
+
+       /*
+        * Since we had stored the filter inside interface.filter,
+        * we should now clear that field. Otherwise the driver will
+        * assume nothing has changed (*total_flags will be compared
+        * to interface.filter to determine if any action is required).
+        */
+       rt2x00dev->interface.filter = 0;
 
        rt2x00dev->ops->hw->configure_filter(rt2x00dev->hw,
-                                            rt2x00dev->interface.filter,
-                                            &rt2x00dev->interface.filter,
-                                            0, NULL);
+                                            filter, &filter, 0, NULL);
 }
 
 /*
 
         */
        if (mc_count)
                *total_flags |= FIF_ALLMULTI;
-       if (changed_flags & FIF_OTHER_BSS ||
-           changed_flags & FIF_PROMISC_IN_BSS)
+       if (*total_flags & FIF_OTHER_BSS ||
+           *total_flags & FIF_PROMISC_IN_BSS)
                *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
        if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
                *total_flags |= FIF_PROMISC_IN_BSS;
 
         */
        if (mc_count)
                *total_flags |= FIF_ALLMULTI;
-       if (changed_flags & FIF_OTHER_BSS ||
-           changed_flags & FIF_PROMISC_IN_BSS)
+       if (*total_flags & FIF_OTHER_BSS ||
+           *total_flags & FIF_PROMISC_IN_BSS)
                *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
        if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
                *total_flags |= FIF_PROMISC_IN_BSS;