aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/lib8390.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/lib8390.c')
-rw-r--r--drivers/net/lib8390.c27
1 files changed, 10 insertions, 17 deletions
diff --git a/drivers/net/lib8390.c b/drivers/net/lib8390.c
index 256119882b1e..56f66f485400 100644
--- a/drivers/net/lib8390.c
+++ b/drivers/net/lib8390.c
@@ -464,8 +464,8 @@ static irqreturn_t __ei_interrupt(int irq, void *dev_id)
464 ei_inb_p(e8390_base + EN0_ISR)); 464 ei_inb_p(e8390_base + EN0_ISR));
465 465
466 /* !!Assumption!! -- we stay in page 0. Don't break this. */ 466 /* !!Assumption!! -- we stay in page 0. Don't break this. */
467 while ((interrupts = ei_inb_p(e8390_base + EN0_ISR)) != 0 467 while ((interrupts = ei_inb_p(e8390_base + EN0_ISR)) != 0 &&
468 && ++nr_serviced < MAX_SERVICE) 468 ++nr_serviced < MAX_SERVICE)
469 { 469 {
470 if (!netif_running(dev)) { 470 if (!netif_running(dev)) {
471 printk(KERN_WARNING "%s: interrupt from stopped card\n", dev->name); 471 printk(KERN_WARNING "%s: interrupt from stopped card\n", dev->name);
@@ -721,10 +721,10 @@ static void ei_receive(struct net_device *dev)
721 /* Check for bogosity warned by 3c503 book: the status byte is never 721 /* Check for bogosity warned by 3c503 book: the status byte is never
722 written. This happened a lot during testing! This code should be 722 written. This happened a lot during testing! This code should be
723 cleaned up someday. */ 723 cleaned up someday. */
724 if (rx_frame.next != next_frame 724 if (rx_frame.next != next_frame &&
725 && rx_frame.next != next_frame + 1 725 rx_frame.next != next_frame + 1 &&
726 && rx_frame.next != next_frame - num_rx_pages 726 rx_frame.next != next_frame - num_rx_pages &&
727 && rx_frame.next != next_frame + 1 - num_rx_pages) { 727 rx_frame.next != next_frame + 1 - num_rx_pages) {
728 ei_local->current_page = rxing_page; 728 ei_local->current_page = rxing_page;
729 ei_outb(ei_local->current_page-1, e8390_base+EN0_BOUNDARY); 729 ei_outb(ei_local->current_page-1, e8390_base+EN0_BOUNDARY);
730 dev->stats.rx_errors++; 730 dev->stats.rx_errors++;
@@ -907,15 +907,8 @@ static inline void make_mc_bits(u8 *bits, struct net_device *dev)
907{ 907{
908 struct dev_mc_list *dmi; 908 struct dev_mc_list *dmi;
909 909
910 for (dmi=dev->mc_list; dmi; dmi=dmi->next) 910 netdev_for_each_mc_addr(dmi, dev) {
911 { 911 u32 crc = ether_crc(ETH_ALEN, dmi->dmi_addr);
912 u32 crc;
913 if (dmi->dmi_addrlen != ETH_ALEN)
914 {
915 printk(KERN_INFO "%s: invalid multicast address length given.\n", dev->name);
916 continue;
917 }
918 crc = ether_crc(ETH_ALEN, dmi->dmi_addr);
919 /* 912 /*
920 * The 8390 uses the 6 most significant bits of the 913 * The 8390 uses the 6 most significant bits of the
921 * CRC to index the multicast table. 914 * CRC to index the multicast table.
@@ -941,7 +934,7 @@ static void do_set_multicast_list(struct net_device *dev)
941 if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI))) 934 if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI)))
942 { 935 {
943 memset(ei_local->mcfilter, 0, 8); 936 memset(ei_local->mcfilter, 0, 8);
944 if (dev->mc_list) 937 if (!netdev_mc_empty(dev))
945 make_mc_bits(ei_local->mcfilter, dev); 938 make_mc_bits(ei_local->mcfilter, dev);
946 } 939 }
947 else 940 else
@@ -975,7 +968,7 @@ static void do_set_multicast_list(struct net_device *dev)
975 968
976 if(dev->flags&IFF_PROMISC) 969 if(dev->flags&IFF_PROMISC)
977 ei_outb_p(E8390_RXCONFIG | 0x18, e8390_base + EN0_RXCR); 970 ei_outb_p(E8390_RXCONFIG | 0x18, e8390_base + EN0_RXCR);
978 else if(dev->flags&IFF_ALLMULTI || dev->mc_list) 971 else if (dev->flags & IFF_ALLMULTI || !netdev_mc_empty(dev))
979 ei_outb_p(E8390_RXCONFIG | 0x08, e8390_base + EN0_RXCR); 972 ei_outb_p(E8390_RXCONFIG | 0x08, e8390_base + EN0_RXCR);
980 else 973 else
981 ei_outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR); 974 ei_outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR);