tags 591549 patch thanks On Tue, Aug 03, 2010 at 10:30:40PM +0200, Marc Haber wrote: > broadcom-sta 5.60.48.36 needs to be patched [...] > to allow building with kernel 2.6.35. I haven't tried yet whether the > patched driver actually works.
Tested and working with a BCM4321 device on 2.6.35. A quilt patch is attached. Geoff
Description: Multicast patch for kernel 2.6.34 and higher Origin: upstream, http://www.broadcom.com/docs/linux_sta/sta_5.60.48.36_2.6.34_multicast_kernel_patch.zip Bug-Debian: http://bugs.debian.org/591549 Author: Geoff Simmons <gsimm...@gsimmons.org> --- a/amd64/src/wl/sys/wl_linux.c +++ b/amd64/src/wl/sys/wl_linux.c @@ -1418,7 +1418,12 @@ _wl_set_multicast_list(struct net_device *dev) { wl_info_t *wl; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 33) struct dev_mc_list *mclist; +#else + struct netdev_hw_addr *ha; + int num; +#endif int i; if (!dev) @@ -1431,9 +1436,8 @@ if (wl->pub->up) { wl->pub->allmulti = (dev->flags & IFF_ALLMULTI)? TRUE: FALSE; - - for (i = 0, mclist = dev->mc_list; mclist && (i < dev->mc_count); - i++, mclist = mclist->next) { +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 33) + for (i = 0, mclist = dev->mc_list; mclist && (i < dev->mc_count); i++, mclist = mclist->next) { if (i >= MAXMULTILIST) { wl->pub->allmulti = TRUE; i = 0; @@ -1441,6 +1445,18 @@ } wl->pub->multicast[i] = *((struct ether_addr*) mclist->dmi_addr); } +#else + num = min_t(int, netdev_mc_count(dev), MAXMULTILIST); + i = 0; + netdev_for_each_mc_addr(ha, dev) { + if (i >= num) { + wl->pub->allmulti = TRUE; + i = 0; + break; + } + wl->pub->multicast[i] = *((struct ether_addr*) ha->addr); + } +#endif wl->pub->nmulticast = i; wlc_set(wl->wlc, WLC_SET_PROMISC, (dev->flags & IFF_PROMISC)); } --- a/i386/src/wl/sys/wl_linux.c +++ b/i386/src/wl/sys/wl_linux.c @@ -1418,7 +1418,12 @@ _wl_set_multicast_list(struct net_device *dev) { wl_info_t *wl; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 33) struct dev_mc_list *mclist; +#else + struct netdev_hw_addr *ha; + int num; +#endif int i; if (!dev) @@ -1431,9 +1436,8 @@ if (wl->pub->up) { wl->pub->allmulti = (dev->flags & IFF_ALLMULTI)? TRUE: FALSE; - - for (i = 0, mclist = dev->mc_list; mclist && (i < dev->mc_count); - i++, mclist = mclist->next) { +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 33) + for (i = 0, mclist = dev->mc_list; mclist && (i < dev->mc_count); i++, mclist = mclist->next) { if (i >= MAXMULTILIST) { wl->pub->allmulti = TRUE; i = 0; @@ -1441,6 +1445,18 @@ } wl->pub->multicast[i] = *((struct ether_addr*) mclist->dmi_addr); } +#else + num = min_t(int, netdev_mc_count(dev), MAXMULTILIST); + i = 0; + netdev_for_each_mc_addr(ha, dev) { + if (i >= num) { + wl->pub->allmulti = TRUE; + i = 0; + break; + } + wl->pub->multicast[i] = *((struct ether_addr*) ha->addr); + } +#endif wl->pub->nmulticast = i; wlc_set(wl->wlc, WLC_SET_PROMISC, (dev->flags & IFF_PROMISC)); }