diff -ruN --exclude='*~' --exclude='*.pci_suspend' hostap.old/driver/modules/hostap.c hostap/driver/modules/hostap.c
--- hostap.old/driver/modules/hostap.c	Fri Sep  6 11:25:23 2002
+++ hostap/driver/modules/hostap.c	Sat Sep  7 23:06:15 2002
@@ -57,6 +57,7 @@
 			  int rtnl_locked);
 static int prism2_wds_del(local_info_t *local, u8 *remote_addr,
 			  int rtnl_locked, int do_not_remove);
+static void prism2_do_set_mc_list(void *data);
 
 /* hostap_ap.c */
 #ifdef WIRELESS_EXT
@@ -520,6 +521,8 @@
 		netif_device_detach(dev);
 	}
 
+	flush_scheduled_tasks();
+
 	__MOD_DEC_USE_COUNT(local->hw_module);
 
 	return 0;
@@ -550,6 +553,11 @@
 	netif_device_attach(dev);
 	netif_start_queue(dev);
 
+	HOSTAP_TQ_INIT(&local->set_mc_list);
+	local->set_mc_list.sync = 0;
+	local->set_mc_list.routine = prism2_do_set_mc_list;
+	local->set_mc_list.data = dev;
+
 	return 0;
 }
 
@@ -584,6 +592,51 @@
 #endif /* HAVE_SET_MAC_ADDR */
 
 
+/* TODO: to be further implemented as soon as Prism2 fully supports
+ *       GroupAddresses and correct documentation is available */
+static void prism2_do_set_mc_list(void *data)
+{
+	struct net_device *dev = (struct net_device *)data;
+	local_info_t *local = (local_info_t *) dev->priv;
+
+	local->is_promisc = 0;
+
+	if (dev->flags & IFF_ALLMULTI) {
+		local->is_promisc = 1;
+	}
+
+	if (dev->flags & IFF_PROMISC) {
+		local->is_promisc = 1;
+	}
+
+	if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE,
+	                    local->is_promisc)) {
+		printk("%s: %sabling promiscuous mode failed\n",
+		       dev->name, local->is_promisc ? "en" : "dis");
+	}
+
+	MOD_DEC_USE_COUNT;
+}
+
+static void prism2_set_multicast_list(struct net_device *dev)
+{
+	local_info_t *local = (local_info_t *) dev->priv;
+	int promisc = 0;
+
+	if (dev->flags & IFF_ALLMULTI) {
+		promisc = 1;
+	}
+
+	if (dev->flags & IFF_PROMISC) {
+		promisc = 1;
+	}
+
+	if (promisc != local->is_promisc) {
+		PRISM2_SCHEDULE_TASK(&local->set_mc_list);
+	}
+}
+
+
 static int prism2_change_mtu(struct net_device *dev, int new_mtu)
 {
 	if (new_mtu < PRISM2_MIN_MTU || new_mtu > PRISM2_MAX_MTU)
@@ -637,12 +690,7 @@
 #ifdef HAVE_SET_MAC_ADDR
 	dev->set_mac_address = prism2_set_mac_address;
 #endif /* HAVE_SET_MAC_ADDR */
-#ifdef HAVE_MULTICAST
-	/* FIX: to be implemented as soon as Prism2 supports GroupAddresses
-	 * and correct documentation is available */
-
-	/* dev->set_multicast_list = prism2_set_multicast_list; */
-#endif
+	dev->set_multicast_list = prism2_set_multicast_list;
 #ifdef HAVE_PRIVATE_IOCTL
 	dev->do_ioctl = main_dev ? hostap_ioctl : NULL;
 #endif
diff -ruN --exclude='*~' --exclude='*.pci_suspend' hostap.old/driver/modules/hostap_hw.c hostap/driver/modules/hostap_hw.c
--- hostap.old/driver/modules/hostap_hw.c	Fri Sep  6 11:25:23 2002
+++ hostap/driver/modules/hostap_hw.c	Sat Sep  7 22:15:55 2002
@@ -997,6 +997,22 @@
 			goto fail;
 	}
 
+	local->is_promisc = 0;
+
+	if (dev->flags & IFF_ALLMULTI) {
+		local->is_promisc = 1;
+	}
+
+	if (dev->flags & IFF_PROMISC) {
+		local->is_promisc = 1;
+	}
+
+	ret = hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE,
+	                      local->is_promisc);
+	if (ret)
+		printk("%s: %sabling promiscuous mode failed\n",
+		       dev->name, local->is_promisc ? "en" : "dis");
+
 	if (!local->fw_ap) {
 		ret = hostap_set_string(dev, HFA384X_RID_CNFDESIREDSSID,
 					local->essid);
@@ -2495,7 +2511,9 @@
 #else
 		{
 #endif
-			printk(KERN_DEBUG "RX: Unknown MACPort %d\n", macport);
+			if (!local->is_promisc)
+				printk(KERN_DEBUG "RX: Unknown MACPort %d\n",
+				       macport);
 		}
 		goto rx_dropped;
 	}
@@ -2503,8 +2521,9 @@
 	/* FCS errors should not come this far, but let's make sure that frames
 	 * with errors will be dropped even in Host AP mode */
 	if (status & HFA384X_RX_STATUS_FCSERR) {
-		printk(KERN_DEBUG "%s: prism2_rx: dropped FCSErr frame "
-		       "(status=%02X)\n", dev->name, status);
+		if (!local->is_promisc)
+			printk(KERN_DEBUG "%s: prism2_rx: dropped FCSErr frame"
+			       " (status=%02X)\n", dev->name, status);
 		goto rx_dropped;
 	}
 
diff -ruN --exclude='*~' --exclude='*.pci_suspend' hostap.old/driver/modules/hostap_wlan.h hostap/driver/modules/hostap_wlan.h
--- hostap.old/driver/modules/hostap_wlan.h	Sun Sep  1 13:28:28 2002
+++ hostap/driver/modules/hostap_wlan.h	Sat Sep  7 21:50:39 2002
@@ -1145,6 +1145,9 @@
 	struct timer_list ev_tick_timer;
 #endif /* PRISM2_CHECK_INTERRUPT_DELIVERY */
 
+	/* For scheduling a change of the promiscuous mode RID */
+	struct tq_struct set_mc_list;
+	int is_promisc;
 
 	/* struct local_info is used also in hostap.o that does not define
 	 * any PRISM2_{PCCARD,PLX,PCI}. Make sure that the hardware version

