Comment 96 for bug 732677

Revision history for this message
Denis (denis-dellsale) wrote : Re: bcmwl 5.100.82.38+bdcom-0ubuntu2 not work on BCM4311/4312

Download previous source of driver version bcmwl-5.60.48.36
In file src/include/wl_linux.h replace #include <linux/autoconf.h> to <generated/autoconf.h>
in file src/wl/sys/wl_linux.c find function wl_set_multicast_list (sting 1416) and replace it all on

static void
_wl_set_multicast_list(struct net_device *dev)
{
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 34)
 struct dev_mc_list *mclist;
#else
 struct netdev_hw_addr *ha;
 int num;
#endif
 wl_info_t *wl;
 int i, buflen;
 struct maclist *maclist;
 bool allmulti;

 if (!dev)
  return;
 wl = WL_INFO(dev);

 WL_TRACE(("wl%d: wl_set_multicast_list\n", wl->pub->unit));

 if (wl->pub->up) {
  allmulti = (dev->flags & IFF_ALLMULTI)? TRUE: FALSE;

  buflen = sizeof(struct maclist) + (MAXMULTILIST * ETHER_ADDR_LEN);

  if ((maclist = MALLOC(wl->pub->osh, buflen)) == NULL) {
   return;
  }

  i = 0;
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 34)
  for (mclist = dev->mc_list; mclist && (i < dev->mc_count); mclist = mclist->next) {
   if (i >= MAXMULTILIST) {
    allmulti = TRUE;
    i = 0;
    break;
   }
   bcopy(mclist->dmi_addr, &maclist->ea[i++], ETHER_ADDR_LEN);
  }
#else
  num = min_t(int, netdev_mc_count(dev), MAXMULTILIST);
  netdev_for_each_mc_addr(ha, dev) {
   if (i >= num) {
    allmulti = TRUE;
    i = 0;
    break;
   }
   bcopy(ha->addr, &maclist->ea[i++], ETHER_ADDR_LEN);
  }
#endif
  maclist->count = i;

  WL_LOCK(wl);

  wlc_iovar_setint(wl->wlc, "allmulti", allmulti);
  wlc_set(wl->wlc, WLC_SET_PROMISC, (dev->flags & IFF_PROMISC));

  wlc_iovar_op(wl->wlc, "mcast_list", NULL, 0, maclist, buflen, IOV_SET, NULL);

  WL_UNLOCK(wl);
  MFREE(wl->pub->osh, maclist, buflen);
 }

}

Compile and install new driver.
I have linux kernel 3.0.17. The driver is working for me.