network: wireless: bcm4329: Add 2.6.35 compatibility and fix memory leak in set_multi...
authorArve Hjønnevåg <arve@android.com>
Thu, 17 Jun 2010 22:23:59 +0000 (15:23 -0700)
committerColin Cross <ccross@android.com>
Thu, 30 Sep 2010 00:49:37 +0000 (17:49 -0700)
Signed-off-by: Dmitry Shmidt <dimitrysh@android.com>
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
drivers/net/wireless/bcm4329/dhd_linux.c
drivers/net/wireless/bcm4329/include/linuxver.h

index 9931870a6efd70f82241746062130a0c1c7664cd..da2cb640228d767967f8f32d3f2b76faeae05d60 100644 (file)
@@ -707,7 +707,11 @@ static void
 _dhd_set_multicast_list(dhd_info_t *dhd, int ifidx)
 {
        struct net_device *dev;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
+       struct netdev_hw_addr *ha;
+#else
        struct dev_mc_list *mclist;
+#endif
        uint32 allmulti, cnt;
 
        wl_ioctl_t ioc;
@@ -717,15 +721,19 @@ _dhd_set_multicast_list(dhd_info_t *dhd, int ifidx)
 
        ASSERT(dhd && dhd->iflist[ifidx]);
        dev = dhd->iflist[ifidx]->net;
-       mclist = dev->mc_list;
+
+       netif_addr_lock_bh(dev);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
+       cnt = netdev_mc_count(dev);
+#else
        cnt = dev->mc_count;
+#endif
+       netif_addr_unlock_bh(dev);
 
        /* Determine initial value of allmulti flag */
        allmulti = (dev->flags & IFF_ALLMULTI) ? TRUE : FALSE;
 
        /* Send down the multicast list first. */
-
-
        buflen = sizeof("mcast_list") + sizeof(cnt) + (cnt * ETHER_ADDR_LEN);
        if (!(bufp = buf = MALLOC(dhd->pub.osh, buflen))) {
                DHD_ERROR(("%s: out of memory for mcast_list, cnt %d\n",
@@ -740,10 +748,22 @@ _dhd_set_multicast_list(dhd_info_t *dhd, int ifidx)
        memcpy(bufp, &cnt, sizeof(cnt));
        bufp += sizeof(cnt);
 
-       for (cnt = 0; mclist && (cnt < dev->mc_count); cnt++, mclist = mclist->next) {
+       netif_addr_lock_bh(dev);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
+       netdev_for_each_mc_addr(ha, dev) {
+               if (!cnt)
+                       break;
+               memcpy(bufp, ha->addr, ETHER_ADDR_LEN);
+               bufp += ETHER_ADDR_LEN;
+               cnt--;
+       }
+#else
+       for (mclist = dev->mc_list;(mclist && (cnt > 0)); cnt--, mclist = mclist->next) {
                memcpy(bufp, (void *)mclist->dmi_addr, ETHER_ADDR_LEN);
                bufp += ETHER_ADDR_LEN;
        }
+#endif
+       netif_addr_unlock_bh(dev);
 
        memset(&ioc, 0, sizeof(ioc));
        ioc.cmd = WLC_SET_VAR;
index 92848d735ac6a600b19743970faeea5bc6e4548e..ab7566618da68448b511f451d9cadd518ae35814 100644 (file)
@@ -66,6 +66,7 @@
 #include <linux/pci.h>
 #include <linux/interrupt.h>
 #include <linux/netdevice.h>
+#include <linux/semaphore.h>
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28))
 #undef IP_TOS
 #endif