|
@@ -1377,10 +1377,11 @@ list to the device.
|
|
|
*/
|
|
|
static void amd8111e_set_multicast_list(struct net_device *dev)
|
|
|
{
|
|
|
- struct dev_mc_list* mc_ptr;
|
|
|
+ struct dev_mc_list *mc_ptr;
|
|
|
struct amd8111e_priv *lp = netdev_priv(dev);
|
|
|
u32 mc_filter[2] ;
|
|
|
- int i,bit_num;
|
|
|
+ int bit_num;
|
|
|
+
|
|
|
if(dev->flags & IFF_PROMISC){
|
|
|
writel( VAL2 | PROM, lp->mmio + CMD2);
|
|
|
return;
|
|
@@ -1391,7 +1392,6 @@ static void amd8111e_set_multicast_list(struct net_device *dev)
|
|
|
netdev_mc_count(dev) > MAX_FILTER_SIZE) {
|
|
|
/* get all multicast packet */
|
|
|
mc_filter[1] = mc_filter[0] = 0xffffffff;
|
|
|
- lp->mc_list = dev->mc_list;
|
|
|
lp->options |= OPTION_MULTICAST_ENABLE;
|
|
|
amd8111e_writeq(*(u64*)mc_filter,lp->mmio + LADRF);
|
|
|
return;
|
|
@@ -1399,7 +1399,6 @@ static void amd8111e_set_multicast_list(struct net_device *dev)
|
|
|
if (netdev_mc_empty(dev)) {
|
|
|
/* get only own packets */
|
|
|
mc_filter[1] = mc_filter[0] = 0;
|
|
|
- lp->mc_list = NULL;
|
|
|
lp->options &= ~OPTION_MULTICAST_ENABLE;
|
|
|
amd8111e_writeq(*(u64*)mc_filter,lp->mmio + LADRF);
|
|
|
/* disable promiscous mode */
|
|
@@ -1408,10 +1407,8 @@ static void amd8111e_set_multicast_list(struct net_device *dev)
|
|
|
}
|
|
|
/* load all the multicast addresses in the logic filter */
|
|
|
lp->options |= OPTION_MULTICAST_ENABLE;
|
|
|
- lp->mc_list = dev->mc_list;
|
|
|
mc_filter[1] = mc_filter[0] = 0;
|
|
|
- for (i = 0, mc_ptr = dev->mc_list; mc_ptr && i < netdev_mc_count(dev);
|
|
|
- i++, mc_ptr = mc_ptr->next) {
|
|
|
+ netdev_for_each_mc_addr(mc_ptr, dev) {
|
|
|
bit_num = (ether_crc_le(ETH_ALEN, mc_ptr->dmi_addr) >> 26) & 0x3f;
|
|
|
mc_filter[bit_num >> 5] |= 1 << (bit_num & 31);
|
|
|
}
|