unsigned long *bitmask)\r
{\r
#if 1\r
+ struct netdev_hw_addr *ha;\r
+ unsigned long crc;\r
+ char *addrs;\r
+ struct netdev_hw_addr_list *list = &dev->dev_addrs;\r
+ \r
printk("-----------------func %s-------------------\n", __func__);\r
+\r
+ WARN_ON(dev->mc_count == 0);\r
+ WARN_ON(dev->flags & IFF_ALLMULTI);\r
+\r
+ bitmask[0] = bitmask[1] = 0;\r
+\r
+ list_for_each_entry(ha, &list->list, list) {\r
+ addrs = ha->addr;\r
+\r
+ /* skip non-multicast addresses */\r
+ if (!(*addrs & 1))\r
+ continue;\r
+\r
+ crc = ether_crc_le(ETH_ALEN, addrs);\r
+ set_bit(crc >> 26, bitmask);\r
+ \r
+ }\r
#else\r
struct netdev_hw_addr *ha;\r
unsigned long crc;\r
static void vmac_set_multicast_list(struct net_device *dev)\r
{\r
#if 1\r
+ struct vmac_priv *ap = netdev_priv(dev);\r
+ unsigned long flags, bitmask[2];\r
+ int promisc, reg;\r
+\r
printk("-----------------func %s-------------------\n", __func__);\r
+\r
+ spin_lock_irqsave(&ap->lock, flags);\r
+\r
+ promisc = !!(dev->flags & IFF_PROMISC);\r
+ reg = vmac_readl(ap, ENABLE);\r
+ if (promisc != !!(reg & PROM_MASK)) {\r
+ reg ^= PROM_MASK;\r
+ vmac_writel(ap, reg, ENABLE);\r
+ }\r
+\r
+ if (dev->flags & IFF_ALLMULTI)\r
+ memset(bitmask, 1, sizeof(bitmask));\r
+ else if (dev->mc_count == 0)\r
+ memset(bitmask, 0, sizeof(bitmask));\r
+ else\r
+ create_multicast_filter(dev, bitmask);\r
+\r
+ vmac_writel(ap, bitmask[0], LAFL);\r
+ vmac_writel(ap, bitmask[1], LAFH);\r
+\r
+ spin_unlock_irqrestore(&ap->lock, flags);\r
#else\r
struct vmac_priv *ap = netdev_priv(dev);\r
unsigned long flags, bitmask[2];\r
.ndo_do_ioctl = vmac_ioctl,\r
.ndo_set_mac_address = eth_mac_addr,\r
.ndo_tx_timeout = vmac_tx_timeout,\r
- //.ndo_set_multicast_list = vmac_set_multicast_list,\r
+ .ndo_set_multicast_list = vmac_set_multicast_list,\r
.ndo_validate_addr = eth_validate_addr,\r
.ndo_change_mtu = eth_change_mtu,\r
};\r