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