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));
 	}

Reply via email to