diff options
Diffstat (limited to 'drivers/net/arm')
-rw-r--r-- | drivers/net/arm/am79c961a.c | 12 | ||||
-rw-r--r-- | drivers/net/arm/at91_ether.c | 9 | ||||
-rw-r--r-- | drivers/net/arm/ep93xx_eth.c | 140 | ||||
-rw-r--r-- | drivers/net/arm/ether3.c | 2 | ||||
-rw-r--r-- | drivers/net/arm/ixp4xx_eth.c | 13 | ||||
-rw-r--r-- | drivers/net/arm/ks8695net.c | 23 | ||||
-rw-r--r-- | drivers/net/arm/w90p910_ether.c | 8 |
7 files changed, 100 insertions, 107 deletions
diff --git a/drivers/net/arm/am79c961a.c b/drivers/net/arm/am79c961a.c index 164b37e85eea..f1f58c5e27bf 100644 --- a/drivers/net/arm/am79c961a.c +++ b/drivers/net/arm/am79c961a.c | |||
@@ -351,13 +351,13 @@ static struct net_device_stats *am79c961_getstats (struct net_device *dev) | |||
351 | return &priv->stats; | 351 | return &priv->stats; |
352 | } | 352 | } |
353 | 353 | ||
354 | static void am79c961_mc_hash(struct dev_mc_list *dmi, unsigned short *hash) | 354 | static void am79c961_mc_hash(char *addr, unsigned short *hash) |
355 | { | 355 | { |
356 | if (dmi->dmi_addrlen == ETH_ALEN && dmi->dmi_addr[0] & 0x01) { | 356 | if (addr[0] & 0x01) { |
357 | int idx, bit; | 357 | int idx, bit; |
358 | u32 crc; | 358 | u32 crc; |
359 | 359 | ||
360 | crc = ether_crc_le(ETH_ALEN, dmi->dmi_addr); | 360 | crc = ether_crc_le(ETH_ALEN, addr); |
361 | 361 | ||
362 | idx = crc >> 30; | 362 | idx = crc >> 30; |
363 | bit = (crc >> 26) & 15; | 363 | bit = (crc >> 26) & 15; |
@@ -387,8 +387,8 @@ static void am79c961_setmulticastlist (struct net_device *dev) | |||
387 | 387 | ||
388 | memset(multi_hash, 0x00, sizeof(multi_hash)); | 388 | memset(multi_hash, 0x00, sizeof(multi_hash)); |
389 | 389 | ||
390 | for (dmi = dev->mc_list; dmi; dmi = dmi->next) | 390 | netdev_for_each_mc_addr(dmi, dev) |
391 | am79c961_mc_hash(dmi, multi_hash); | 391 | am79c961_mc_hash(dmi->dmi_addr, multi_hash); |
392 | } | 392 | } |
393 | 393 | ||
394 | spin_lock_irqsave(&priv->chip_lock, flags); | 394 | spin_lock_irqsave(&priv->chip_lock, flags); |
@@ -680,7 +680,7 @@ static const struct net_device_ops am79c961_netdev_ops = { | |||
680 | #endif | 680 | #endif |
681 | }; | 681 | }; |
682 | 682 | ||
683 | static int __init am79c961_probe(struct platform_device *pdev) | 683 | static int __devinit am79c961_probe(struct platform_device *pdev) |
684 | { | 684 | { |
685 | struct resource *res; | 685 | struct resource *res; |
686 | struct net_device *dev; | 686 | struct net_device *dev; |
diff --git a/drivers/net/arm/at91_ether.c b/drivers/net/arm/at91_ether.c index c8bc60a7040c..8b23d5a175bf 100644 --- a/drivers/net/arm/at91_ether.c +++ b/drivers/net/arm/at91_ether.c | |||
@@ -558,14 +558,11 @@ static void at91ether_sethashtable(struct net_device *dev) | |||
558 | { | 558 | { |
559 | struct dev_mc_list *curr; | 559 | struct dev_mc_list *curr; |
560 | unsigned long mc_filter[2]; | 560 | unsigned long mc_filter[2]; |
561 | unsigned int i, bitnr; | 561 | unsigned int bitnr; |
562 | 562 | ||
563 | mc_filter[0] = mc_filter[1] = 0; | 563 | mc_filter[0] = mc_filter[1] = 0; |
564 | 564 | ||
565 | curr = dev->mc_list; | 565 | netdev_for_each_mc_addr(curr, dev) { |
566 | for (i = 0; i < dev->mc_count; i++, curr = curr->next) { | ||
567 | if (!curr) break; /* unexpected end of list */ | ||
568 | |||
569 | bitnr = hash_get_index(curr->dmi_addr); | 566 | bitnr = hash_get_index(curr->dmi_addr); |
570 | mc_filter[bitnr >> 5] |= 1 << (bitnr & 31); | 567 | mc_filter[bitnr >> 5] |= 1 << (bitnr & 31); |
571 | } | 568 | } |
@@ -592,7 +589,7 @@ static void at91ether_set_multicast_list(struct net_device *dev) | |||
592 | at91_emac_write(AT91_EMAC_HSH, -1); | 589 | at91_emac_write(AT91_EMAC_HSH, -1); |
593 | at91_emac_write(AT91_EMAC_HSL, -1); | 590 | at91_emac_write(AT91_EMAC_HSL, -1); |
594 | cfg |= AT91_EMAC_MTI; | 591 | cfg |= AT91_EMAC_MTI; |
595 | } else if (dev->mc_count > 0) { /* Enable specific multicasts */ | 592 | } else if (!netdev_mc_empty(dev)) { /* Enable specific multicasts */ |
596 | at91ether_sethashtable(dev); | 593 | at91ether_sethashtable(dev); |
597 | cfg |= AT91_EMAC_MTI; | 594 | cfg |= AT91_EMAC_MTI; |
598 | } else if (dev->flags & (~IFF_ALLMULTI)) { /* Disable all multicast mode */ | 595 | } else if (dev->flags & (~IFF_ALLMULTI)) { /* Disable all multicast mode */ |
diff --git a/drivers/net/arm/ep93xx_eth.c b/drivers/net/arm/ep93xx_eth.c index b25467ac895c..bf72d57a0afd 100644 --- a/drivers/net/arm/ep93xx_eth.c +++ b/drivers/net/arm/ep93xx_eth.c | |||
@@ -9,6 +9,8 @@ | |||
9 | * (at your option) any later version. | 9 | * (at your option) any later version. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ | ||
13 | |||
12 | #include <linux/dma-mapping.h> | 14 | #include <linux/dma-mapping.h> |
13 | #include <linux/module.h> | 15 | #include <linux/module.h> |
14 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
@@ -20,9 +22,9 @@ | |||
20 | #include <linux/moduleparam.h> | 22 | #include <linux/moduleparam.h> |
21 | #include <linux/platform_device.h> | 23 | #include <linux/platform_device.h> |
22 | #include <linux/delay.h> | 24 | #include <linux/delay.h> |
23 | #include <mach/ep93xx-regs.h> | 25 | #include <linux/io.h> |
24 | #include <mach/platform.h> | 26 | |
25 | #include <asm/io.h> | 27 | #include <mach/hardware.h> |
26 | 28 | ||
27 | #define DRV_MODULE_NAME "ep93xx-eth" | 29 | #define DRV_MODULE_NAME "ep93xx-eth" |
28 | #define DRV_MODULE_VERSION "0.1" | 30 | #define DRV_MODULE_VERSION "0.1" |
@@ -185,7 +187,47 @@ struct ep93xx_priv | |||
185 | #define wrw(ep, off, val) __raw_writew((val), (ep)->base_addr + (off)) | 187 | #define wrw(ep, off, val) __raw_writew((val), (ep)->base_addr + (off)) |
186 | #define wrl(ep, off, val) __raw_writel((val), (ep)->base_addr + (off)) | 188 | #define wrl(ep, off, val) __raw_writel((val), (ep)->base_addr + (off)) |
187 | 189 | ||
188 | static int ep93xx_mdio_read(struct net_device *dev, int phy_id, int reg); | 190 | static int ep93xx_mdio_read(struct net_device *dev, int phy_id, int reg) |
191 | { | ||
192 | struct ep93xx_priv *ep = netdev_priv(dev); | ||
193 | int data; | ||
194 | int i; | ||
195 | |||
196 | wrl(ep, REG_MIICMD, REG_MIICMD_READ | (phy_id << 5) | reg); | ||
197 | |||
198 | for (i = 0; i < 10; i++) { | ||
199 | if ((rdl(ep, REG_MIISTS) & REG_MIISTS_BUSY) == 0) | ||
200 | break; | ||
201 | msleep(1); | ||
202 | } | ||
203 | |||
204 | if (i == 10) { | ||
205 | pr_info("mdio read timed out\n"); | ||
206 | data = 0xffff; | ||
207 | } else { | ||
208 | data = rdl(ep, REG_MIIDATA); | ||
209 | } | ||
210 | |||
211 | return data; | ||
212 | } | ||
213 | |||
214 | static void ep93xx_mdio_write(struct net_device *dev, int phy_id, int reg, int data) | ||
215 | { | ||
216 | struct ep93xx_priv *ep = netdev_priv(dev); | ||
217 | int i; | ||
218 | |||
219 | wrl(ep, REG_MIIDATA, data); | ||
220 | wrl(ep, REG_MIICMD, REG_MIICMD_WRITE | (phy_id << 5) | reg); | ||
221 | |||
222 | for (i = 0; i < 10; i++) { | ||
223 | if ((rdl(ep, REG_MIISTS) & REG_MIISTS_BUSY) == 0) | ||
224 | break; | ||
225 | msleep(1); | ||
226 | } | ||
227 | |||
228 | if (i == 10) | ||
229 | pr_info("mdio write timed out\n"); | ||
230 | } | ||
189 | 231 | ||
190 | static struct net_device_stats *ep93xx_get_stats(struct net_device *dev) | 232 | static struct net_device_stats *ep93xx_get_stats(struct net_device *dev) |
191 | { | 233 | { |
@@ -217,14 +259,11 @@ static int ep93xx_rx(struct net_device *dev, int processed, int budget) | |||
217 | rstat->rstat1 = 0; | 259 | rstat->rstat1 = 0; |
218 | 260 | ||
219 | if (!(rstat0 & RSTAT0_EOF)) | 261 | if (!(rstat0 & RSTAT0_EOF)) |
220 | printk(KERN_CRIT "ep93xx_rx: not end-of-frame " | 262 | pr_crit("not end-of-frame %.8x %.8x\n", rstat0, rstat1); |
221 | " %.8x %.8x\n", rstat0, rstat1); | ||
222 | if (!(rstat0 & RSTAT0_EOB)) | 263 | if (!(rstat0 & RSTAT0_EOB)) |
223 | printk(KERN_CRIT "ep93xx_rx: not end-of-buffer " | 264 | pr_crit("not end-of-buffer %.8x %.8x\n", rstat0, rstat1); |
224 | " %.8x %.8x\n", rstat0, rstat1); | ||
225 | if ((rstat1 & RSTAT1_BUFFER_INDEX) >> 16 != entry) | 265 | if ((rstat1 & RSTAT1_BUFFER_INDEX) >> 16 != entry) |
226 | printk(KERN_CRIT "ep93xx_rx: entry mismatch " | 266 | pr_crit("entry mismatch %.8x %.8x\n", rstat0, rstat1); |
227 | " %.8x %.8x\n", rstat0, rstat1); | ||
228 | 267 | ||
229 | if (!(rstat0 & RSTAT0_RWE)) { | 268 | if (!(rstat0 & RSTAT0_RWE)) { |
230 | ep->stats.rx_errors++; | 269 | ep->stats.rx_errors++; |
@@ -241,8 +280,7 @@ static int ep93xx_rx(struct net_device *dev, int processed, int budget) | |||
241 | 280 | ||
242 | length = rstat1 & RSTAT1_FRAME_LENGTH; | 281 | length = rstat1 & RSTAT1_FRAME_LENGTH; |
243 | if (length > MAX_PKT_SIZE) { | 282 | if (length > MAX_PKT_SIZE) { |
244 | printk(KERN_NOTICE "ep93xx_rx: invalid length " | 283 | pr_notice("invalid length %.8x %.8x\n", rstat0, rstat1); |
245 | " %.8x %.8x\n", rstat0, rstat1); | ||
246 | goto err; | 284 | goto err; |
247 | } | 285 | } |
248 | 286 | ||
@@ -371,11 +409,9 @@ static void ep93xx_tx_complete(struct net_device *dev) | |||
371 | tstat->tstat0 = 0; | 409 | tstat->tstat0 = 0; |
372 | 410 | ||
373 | if (tstat0 & TSTAT0_FA) | 411 | if (tstat0 & TSTAT0_FA) |
374 | printk(KERN_CRIT "ep93xx_tx_complete: frame aborted " | 412 | pr_crit("frame aborted %.8x\n", tstat0); |
375 | " %.8x\n", tstat0); | ||
376 | if ((tstat0 & TSTAT0_BUFFER_INDEX) != entry) | 413 | if ((tstat0 & TSTAT0_BUFFER_INDEX) != entry) |
377 | printk(KERN_CRIT "ep93xx_tx_complete: entry mismatch " | 414 | pr_crit("entry mismatch %.8x\n", tstat0); |
378 | " %.8x\n", tstat0); | ||
379 | 415 | ||
380 | if (tstat0 & TSTAT0_TXWE) { | 416 | if (tstat0 & TSTAT0_TXWE) { |
381 | int length = ep->descs->tdesc[entry].tdesc1 & 0xfff; | 417 | int length = ep->descs->tdesc[entry].tdesc1 & 0xfff; |
@@ -536,7 +572,7 @@ static int ep93xx_start_hw(struct net_device *dev) | |||
536 | } | 572 | } |
537 | 573 | ||
538 | if (i == 10) { | 574 | if (i == 10) { |
539 | printk(KERN_CRIT DRV_MODULE_NAME ": hw failed to reset\n"); | 575 | pr_crit("hw failed to reset\n"); |
540 | return 1; | 576 | return 1; |
541 | } | 577 | } |
542 | 578 | ||
@@ -581,7 +617,7 @@ static int ep93xx_start_hw(struct net_device *dev) | |||
581 | } | 617 | } |
582 | 618 | ||
583 | if (i == 10) { | 619 | if (i == 10) { |
584 | printk(KERN_CRIT DRV_MODULE_NAME ": hw failed to start\n"); | 620 | pr_crit("hw failed to start\n"); |
585 | return 1; | 621 | return 1; |
586 | } | 622 | } |
587 | 623 | ||
@@ -617,7 +653,7 @@ static void ep93xx_stop_hw(struct net_device *dev) | |||
617 | } | 653 | } |
618 | 654 | ||
619 | if (i == 10) | 655 | if (i == 10) |
620 | printk(KERN_CRIT DRV_MODULE_NAME ": hw failed to reset\n"); | 656 | pr_crit("hw failed to reset\n"); |
621 | } | 657 | } |
622 | 658 | ||
623 | static int ep93xx_open(struct net_device *dev) | 659 | static int ep93xx_open(struct net_device *dev) |
@@ -681,48 +717,6 @@ static int ep93xx_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | |||
681 | return generic_mii_ioctl(&ep->mii, data, cmd, NULL); | 717 | return generic_mii_ioctl(&ep->mii, data, cmd, NULL); |
682 | } | 718 | } |
683 | 719 | ||
684 | static int ep93xx_mdio_read(struct net_device *dev, int phy_id, int reg) | ||
685 | { | ||
686 | struct ep93xx_priv *ep = netdev_priv(dev); | ||
687 | int data; | ||
688 | int i; | ||
689 | |||
690 | wrl(ep, REG_MIICMD, REG_MIICMD_READ | (phy_id << 5) | reg); | ||
691 | |||
692 | for (i = 0; i < 10; i++) { | ||
693 | if ((rdl(ep, REG_MIISTS) & REG_MIISTS_BUSY) == 0) | ||
694 | break; | ||
695 | msleep(1); | ||
696 | } | ||
697 | |||
698 | if (i == 10) { | ||
699 | printk(KERN_INFO DRV_MODULE_NAME ": mdio read timed out\n"); | ||
700 | data = 0xffff; | ||
701 | } else { | ||
702 | data = rdl(ep, REG_MIIDATA); | ||
703 | } | ||
704 | |||
705 | return data; | ||
706 | } | ||
707 | |||
708 | static void ep93xx_mdio_write(struct net_device *dev, int phy_id, int reg, int data) | ||
709 | { | ||
710 | struct ep93xx_priv *ep = netdev_priv(dev); | ||
711 | int i; | ||
712 | |||
713 | wrl(ep, REG_MIIDATA, data); | ||
714 | wrl(ep, REG_MIICMD, REG_MIICMD_WRITE | (phy_id << 5) | reg); | ||
715 | |||
716 | for (i = 0; i < 10; i++) { | ||
717 | if ((rdl(ep, REG_MIISTS) & REG_MIISTS_BUSY) == 0) | ||
718 | break; | ||
719 | msleep(1); | ||
720 | } | ||
721 | |||
722 | if (i == 10) | ||
723 | printk(KERN_INFO DRV_MODULE_NAME ": mdio write timed out\n"); | ||
724 | } | ||
725 | |||
726 | static void ep93xx_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) | 720 | static void ep93xx_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) |
727 | { | 721 | { |
728 | strcpy(info->driver, DRV_MODULE_NAME); | 722 | strcpy(info->driver, DRV_MODULE_NAME); |
@@ -825,12 +819,19 @@ static int ep93xx_eth_probe(struct platform_device *pdev) | |||
825 | struct ep93xx_eth_data *data; | 819 | struct ep93xx_eth_data *data; |
826 | struct net_device *dev; | 820 | struct net_device *dev; |
827 | struct ep93xx_priv *ep; | 821 | struct ep93xx_priv *ep; |
822 | struct resource *mem; | ||
823 | int irq; | ||
828 | int err; | 824 | int err; |
829 | 825 | ||
830 | if (pdev == NULL) | 826 | if (pdev == NULL) |
831 | return -ENODEV; | 827 | return -ENODEV; |
832 | data = pdev->dev.platform_data; | 828 | data = pdev->dev.platform_data; |
833 | 829 | ||
830 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
831 | irq = platform_get_irq(pdev, 0); | ||
832 | if (!mem || irq < 0) | ||
833 | return -ENXIO; | ||
834 | |||
834 | dev = ep93xx_dev_alloc(data); | 835 | dev = ep93xx_dev_alloc(data); |
835 | if (dev == NULL) { | 836 | if (dev == NULL) { |
836 | err = -ENOMEM; | 837 | err = -ENOMEM; |
@@ -842,23 +843,21 @@ static int ep93xx_eth_probe(struct platform_device *pdev) | |||
842 | 843 | ||
843 | platform_set_drvdata(pdev, dev); | 844 | platform_set_drvdata(pdev, dev); |
844 | 845 | ||
845 | ep->res = request_mem_region(pdev->resource[0].start, | 846 | ep->res = request_mem_region(mem->start, resource_size(mem), |
846 | pdev->resource[0].end - pdev->resource[0].start + 1, | 847 | dev_name(&pdev->dev)); |
847 | dev_name(&pdev->dev)); | ||
848 | if (ep->res == NULL) { | 848 | if (ep->res == NULL) { |
849 | dev_err(&pdev->dev, "Could not reserve memory region\n"); | 849 | dev_err(&pdev->dev, "Could not reserve memory region\n"); |
850 | err = -ENOMEM; | 850 | err = -ENOMEM; |
851 | goto err_out; | 851 | goto err_out; |
852 | } | 852 | } |
853 | 853 | ||
854 | ep->base_addr = ioremap(pdev->resource[0].start, | 854 | ep->base_addr = ioremap(mem->start, resource_size(mem)); |
855 | pdev->resource[0].end - pdev->resource[0].start); | ||
856 | if (ep->base_addr == NULL) { | 855 | if (ep->base_addr == NULL) { |
857 | dev_err(&pdev->dev, "Failed to ioremap ethernet registers\n"); | 856 | dev_err(&pdev->dev, "Failed to ioremap ethernet registers\n"); |
858 | err = -EIO; | 857 | err = -EIO; |
859 | goto err_out; | 858 | goto err_out; |
860 | } | 859 | } |
861 | ep->irq = pdev->resource[1].start; | 860 | ep->irq = irq; |
862 | 861 | ||
863 | ep->mii.phy_id = data->phy_id; | 862 | ep->mii.phy_id = data->phy_id; |
864 | ep->mii.phy_id_mask = 0x1f; | 863 | ep->mii.phy_id_mask = 0x1f; |
@@ -877,11 +876,8 @@ static int ep93xx_eth_probe(struct platform_device *pdev) | |||
877 | goto err_out; | 876 | goto err_out; |
878 | } | 877 | } |
879 | 878 | ||
880 | printk(KERN_INFO "%s: ep93xx on-chip ethernet, IRQ %d, " | 879 | printk(KERN_INFO "%s: ep93xx on-chip ethernet, IRQ %d, %pM\n", |
881 | "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x.\n", dev->name, | 880 | dev->name, ep->irq, dev->dev_addr); |
882 | ep->irq, data->dev_addr[0], data->dev_addr[1], | ||
883 | data->dev_addr[2], data->dev_addr[3], | ||
884 | data->dev_addr[4], data->dev_addr[5]); | ||
885 | 881 | ||
886 | return 0; | 882 | return 0; |
887 | 883 | ||
diff --git a/drivers/net/arm/ether3.c b/drivers/net/arm/ether3.c index 1f7a69c929a6..d9de9bce2395 100644 --- a/drivers/net/arm/ether3.c +++ b/drivers/net/arm/ether3.c | |||
@@ -463,7 +463,7 @@ static void ether3_setmulticastlist(struct net_device *dev) | |||
463 | if (dev->flags & IFF_PROMISC) { | 463 | if (dev->flags & IFF_PROMISC) { |
464 | /* promiscuous mode */ | 464 | /* promiscuous mode */ |
465 | priv(dev)->regs.config1 |= CFG1_RECVPROMISC; | 465 | priv(dev)->regs.config1 |= CFG1_RECVPROMISC; |
466 | } else if (dev->flags & IFF_ALLMULTI || dev->mc_count) { | 466 | } else if (dev->flags & IFF_ALLMULTI || !netdev_mc_empty(dev)) { |
467 | priv(dev)->regs.config1 |= CFG1_RECVSPECBRMULTI; | 467 | priv(dev)->regs.config1 |= CFG1_RECVSPECBRMULTI; |
468 | } else | 468 | } else |
469 | priv(dev)->regs.config1 |= CFG1_RECVSPECBROAD; | 469 | priv(dev)->regs.config1 |= CFG1_RECVSPECBROAD; |
diff --git a/drivers/net/arm/ixp4xx_eth.c b/drivers/net/arm/ixp4xx_eth.c index c3dfbdd2cdcf..6e2ae1d06df1 100644 --- a/drivers/net/arm/ixp4xx_eth.c +++ b/drivers/net/arm/ixp4xx_eth.c | |||
@@ -735,22 +735,25 @@ static int eth_xmit(struct sk_buff *skb, struct net_device *dev) | |||
735 | static void eth_set_mcast_list(struct net_device *dev) | 735 | static void eth_set_mcast_list(struct net_device *dev) |
736 | { | 736 | { |
737 | struct port *port = netdev_priv(dev); | 737 | struct port *port = netdev_priv(dev); |
738 | struct dev_mc_list *mclist = dev->mc_list; | 738 | struct dev_mc_list *mclist; |
739 | u8 diffs[ETH_ALEN], *addr; | 739 | u8 diffs[ETH_ALEN], *addr; |
740 | int cnt = dev->mc_count, i; | 740 | int i; |
741 | 741 | ||
742 | if ((dev->flags & IFF_PROMISC) || !mclist || !cnt) { | 742 | if ((dev->flags & IFF_PROMISC) || netdev_mc_empty(dev)) { |
743 | __raw_writel(DEFAULT_RX_CNTRL0 & ~RX_CNTRL0_ADDR_FLTR_EN, | 743 | __raw_writel(DEFAULT_RX_CNTRL0 & ~RX_CNTRL0_ADDR_FLTR_EN, |
744 | &port->regs->rx_control[0]); | 744 | &port->regs->rx_control[0]); |
745 | return; | 745 | return; |
746 | } | 746 | } |
747 | 747 | ||
748 | memset(diffs, 0, ETH_ALEN); | 748 | memset(diffs, 0, ETH_ALEN); |
749 | addr = mclist->dmi_addr; /* first MAC address */ | ||
750 | 749 | ||
751 | while (--cnt && (mclist = mclist->next)) | 750 | addr = NULL; |
751 | netdev_for_each_mc_addr(mclist, dev) { | ||
752 | if (!addr) | ||
753 | addr = mclist->dmi_addr; /* first MAC address */ | ||
752 | for (i = 0; i < ETH_ALEN; i++) | 754 | for (i = 0; i < ETH_ALEN; i++) |
753 | diffs[i] |= addr[i] ^ mclist->dmi_addr[i]; | 755 | diffs[i] |= addr[i] ^ mclist->dmi_addr[i]; |
756 | } | ||
754 | 757 | ||
755 | for (i = 0; i < ETH_ALEN; i++) { | 758 | for (i = 0; i < ETH_ALEN; i++) { |
756 | __raw_writel(addr[i], &port->regs->mcast_addr[i]); | 759 | __raw_writel(addr[i], &port->regs->mcast_addr[i]); |
diff --git a/drivers/net/arm/ks8695net.c b/drivers/net/arm/ks8695net.c index be256b34cea8..8ca639127dbc 100644 --- a/drivers/net/arm/ks8695net.c +++ b/drivers/net/arm/ks8695net.c | |||
@@ -327,25 +327,24 @@ ks8695_refill_rxbuffers(struct ks8695_priv *ksp) | |||
327 | */ | 327 | */ |
328 | static void | 328 | static void |
329 | ks8695_init_partial_multicast(struct ks8695_priv *ksp, | 329 | ks8695_init_partial_multicast(struct ks8695_priv *ksp, |
330 | struct dev_mc_list *addr, | 330 | struct net_device *ndev) |
331 | int nr_addr) | ||
332 | { | 331 | { |
333 | u32 low, high; | 332 | u32 low, high; |
334 | int i; | 333 | int i; |
334 | struct dev_mc_list *dmi; | ||
335 | 335 | ||
336 | for (i = 0; i < nr_addr; i++, addr = addr->next) { | 336 | i = 0; |
337 | /* Ran out of addresses? */ | 337 | netdev_for_each_mc_addr(dmi, ndev) { |
338 | if (!addr) | ||
339 | break; | ||
340 | /* Ran out of space in chip? */ | 338 | /* Ran out of space in chip? */ |
341 | BUG_ON(i == KS8695_NR_ADDRESSES); | 339 | BUG_ON(i == KS8695_NR_ADDRESSES); |
342 | 340 | ||
343 | low = (addr->dmi_addr[2] << 24) | (addr->dmi_addr[3] << 16) | | 341 | low = (dmi->dmi_addr[2] << 24) | (dmi->dmi_addr[3] << 16) | |
344 | (addr->dmi_addr[4] << 8) | (addr->dmi_addr[5]); | 342 | (dmi->dmi_addr[4] << 8) | (dmi->dmi_addr[5]); |
345 | high = (addr->dmi_addr[0] << 8) | (addr->dmi_addr[1]); | 343 | high = (dmi->dmi_addr[0] << 8) | (dmi->dmi_addr[1]); |
346 | 344 | ||
347 | ks8695_writereg(ksp, KS8695_AAL_(i), low); | 345 | ks8695_writereg(ksp, KS8695_AAL_(i), low); |
348 | ks8695_writereg(ksp, KS8695_AAH_(i), AAH_E | high); | 346 | ks8695_writereg(ksp, KS8695_AAH_(i), AAH_E | high); |
347 | i++; | ||
349 | } | 348 | } |
350 | 349 | ||
351 | /* Clear the remaining Additional Station Addresses */ | 350 | /* Clear the remaining Additional Station Addresses */ |
@@ -1207,7 +1206,7 @@ ks8695_set_multicast(struct net_device *ndev) | |||
1207 | if (ndev->flags & IFF_ALLMULTI) { | 1206 | if (ndev->flags & IFF_ALLMULTI) { |
1208 | /* enable all multicast mode */ | 1207 | /* enable all multicast mode */ |
1209 | ctrl |= DRXC_RM; | 1208 | ctrl |= DRXC_RM; |
1210 | } else if (ndev->mc_count > KS8695_NR_ADDRESSES) { | 1209 | } else if (netdev_mc_count(ndev) > KS8695_NR_ADDRESSES) { |
1211 | /* more specific multicast addresses than can be | 1210 | /* more specific multicast addresses than can be |
1212 | * handled in hardware | 1211 | * handled in hardware |
1213 | */ | 1212 | */ |
@@ -1215,8 +1214,7 @@ ks8695_set_multicast(struct net_device *ndev) | |||
1215 | } else { | 1214 | } else { |
1216 | /* enable specific multicasts */ | 1215 | /* enable specific multicasts */ |
1217 | ctrl &= ~DRXC_RM; | 1216 | ctrl &= ~DRXC_RM; |
1218 | ks8695_init_partial_multicast(ksp, ndev->mc_list, | 1217 | ks8695_init_partial_multicast(ksp, ndev); |
1219 | ndev->mc_count); | ||
1220 | } | 1218 | } |
1221 | 1219 | ||
1222 | ks8695_writereg(ksp, KS8695_DRXC, ctrl); | 1220 | ks8695_writereg(ksp, KS8695_DRXC, ctrl); |
@@ -1335,7 +1333,6 @@ ks8695_stop(struct net_device *ndev) | |||
1335 | 1333 | ||
1336 | netif_stop_queue(ndev); | 1334 | netif_stop_queue(ndev); |
1337 | napi_disable(&ksp->napi); | 1335 | napi_disable(&ksp->napi); |
1338 | netif_carrier_off(ndev); | ||
1339 | 1336 | ||
1340 | ks8695_shutdown(ksp); | 1337 | ks8695_shutdown(ksp); |
1341 | 1338 | ||
diff --git a/drivers/net/arm/w90p910_ether.c b/drivers/net/arm/w90p910_ether.c index b7f3866d546f..febd813c916d 100644 --- a/drivers/net/arm/w90p910_ether.c +++ b/drivers/net/arm/w90p910_ether.c | |||
@@ -858,10 +858,10 @@ static void w90p910_ether_set_multicast_list(struct net_device *dev) | |||
858 | 858 | ||
859 | if (dev->flags & IFF_PROMISC) | 859 | if (dev->flags & IFF_PROMISC) |
860 | rx_mode = CAMCMR_AUP | CAMCMR_AMP | CAMCMR_ABP | CAMCMR_ECMP; | 860 | rx_mode = CAMCMR_AUP | CAMCMR_AMP | CAMCMR_ABP | CAMCMR_ECMP; |
861 | else if ((dev->flags & IFF_ALLMULTI) || dev->mc_list) | 861 | else if ((dev->flags & IFF_ALLMULTI) || !netdev_mc_empty(dev)) |
862 | rx_mode = CAMCMR_AMP | CAMCMR_ABP | CAMCMR_ECMP; | 862 | rx_mode = CAMCMR_AMP | CAMCMR_ABP | CAMCMR_ECMP; |
863 | else | 863 | else |
864 | rx_mode = CAMCMR_ECMP | CAMCMR_ABP; | 864 | rx_mode = CAMCMR_ECMP | CAMCMR_ABP; |
865 | __raw_writel(rx_mode, ether->reg + REG_CAMCMR); | 865 | __raw_writel(rx_mode, ether->reg + REG_CAMCMR); |
866 | } | 866 | } |
867 | 867 | ||