aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/r6040.c
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /drivers/net/r6040.c
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff)
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/net/r6040.c')
-rw-r--r--drivers/net/r6040.c46
1 files changed, 21 insertions, 25 deletions
diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c
index 8b14c6eda7c3..0298d8c1dcb6 100644
--- a/drivers/net/r6040.c
+++ b/drivers/net/r6040.c
@@ -29,7 +29,6 @@
29#include <linux/timer.h> 29#include <linux/timer.h>
30#include <linux/errno.h> 30#include <linux/errno.h>
31#include <linux/ioport.h> 31#include <linux/ioport.h>
32#include <linux/slab.h>
33#include <linux/interrupt.h> 32#include <linux/interrupt.h>
34#include <linux/pci.h> 33#include <linux/pci.h>
35#include <linux/netdevice.h> 34#include <linux/netdevice.h>
@@ -135,7 +134,7 @@
135#define RX_DESC_SIZE (RX_DCNT * sizeof(struct r6040_descriptor)) 134#define RX_DESC_SIZE (RX_DCNT * sizeof(struct r6040_descriptor))
136#define TX_DESC_SIZE (TX_DCNT * sizeof(struct r6040_descriptor)) 135#define TX_DESC_SIZE (TX_DCNT * sizeof(struct r6040_descriptor))
137#define MBCR_DEFAULT 0x012A /* MAC Bus Control Register */ 136#define MBCR_DEFAULT 0x012A /* MAC Bus Control Register */
138#define MCAST_MAX 4 /* Max number multicast addresses to filter */ 137#define MCAST_MAX 3 /* Max number multicast addresses to filter */
139 138
140/* Descriptor status */ 139/* Descriptor status */
141#define DSC_OWNER_MAC 0x8000 /* MAC is the owner of this descriptor */ 140#define DSC_OWNER_MAC 0x8000 /* MAC is the owner of this descriptor */
@@ -842,7 +841,7 @@ static int r6040_open(struct net_device *dev)
842 int ret; 841 int ret;
843 842
844 /* Request IRQ and Register interrupt handler */ 843 /* Request IRQ and Register interrupt handler */
845 ret = request_irq(dev->irq, &r6040_interrupt, 844 ret = request_irq(dev->irq, r6040_interrupt,
846 IRQF_SHARED, dev->name, dev); 845 IRQF_SHARED, dev->name, dev);
847 if (ret) 846 if (ret)
848 return ret; 847 return ret;
@@ -938,7 +937,7 @@ static void r6040_multicast_list(struct net_device *dev)
938 u16 *adrp; 937 u16 *adrp;
939 u16 reg; 938 u16 reg;
940 unsigned long flags; 939 unsigned long flags;
941 struct dev_mc_list *dmi = dev->mc_list; 940 struct dev_mc_list *dmi;
942 int i; 941 int i;
943 942
944 /* MAC Address */ 943 /* MAC Address */
@@ -958,26 +957,24 @@ static void r6040_multicast_list(struct net_device *dev)
958 } 957 }
959 /* Too many multicast addresses 958 /* Too many multicast addresses
960 * accept all traffic */ 959 * accept all traffic */
961 else if ((dev->mc_count > MCAST_MAX) 960 else if ((netdev_mc_count(dev) > MCAST_MAX) ||
962 || (dev->flags & IFF_ALLMULTI)) 961 (dev->flags & IFF_ALLMULTI))
963 reg |= 0x0020; 962 reg |= 0x0020;
964 963
965 iowrite16(reg, ioaddr); 964 iowrite16(reg, ioaddr);
966 spin_unlock_irqrestore(&lp->lock, flags); 965 spin_unlock_irqrestore(&lp->lock, flags);
967 966
968 /* Build the hash table */ 967 /* Build the hash table */
969 if (dev->mc_count > MCAST_MAX) { 968 if (netdev_mc_count(dev) > MCAST_MAX) {
970 u16 hash_table[4]; 969 u16 hash_table[4];
971 u32 crc; 970 u32 crc;
972 971
973 for (i = 0; i < 4; i++) 972 for (i = 0; i < 4; i++)
974 hash_table[i] = 0; 973 hash_table[i] = 0;
975 974
976 for (i = 0; i < dev->mc_count; i++) { 975 netdev_for_each_mc_addr(dmi, dev) {
977 char *addrs = dmi->dmi_addr; 976 char *addrs = dmi->dmi_addr;
978 977
979 dmi = dmi->next;
980
981 if (!(*addrs & 1)) 978 if (!(*addrs & 1))
982 continue; 979 continue;
983 980
@@ -985,9 +982,6 @@ static void r6040_multicast_list(struct net_device *dev)
985 crc >>= 26; 982 crc >>= 26;
986 hash_table[crc >> 4] |= 1 << (15 - (crc & 0xf)); 983 hash_table[crc >> 4] |= 1 << (15 - (crc & 0xf));
987 } 984 }
988 /* Write the index of the hash table */
989 for (i = 0; i < 4; i++)
990 iowrite16(hash_table[i] << 14, ioaddr + MCR1);
991 /* Fill the MAC hash tables with their values */ 985 /* Fill the MAC hash tables with their values */
992 iowrite16(hash_table[0], ioaddr + MAR0); 986 iowrite16(hash_table[0], ioaddr + MAR0);
993 iowrite16(hash_table[1], ioaddr + MAR1); 987 iowrite16(hash_table[1], ioaddr + MAR1);
@@ -995,17 +989,19 @@ static void r6040_multicast_list(struct net_device *dev)
995 iowrite16(hash_table[3], ioaddr + MAR3); 989 iowrite16(hash_table[3], ioaddr + MAR3);
996 } 990 }
997 /* Multicast Address 1~4 case */ 991 /* Multicast Address 1~4 case */
998 for (i = 0, dmi; (i < dev->mc_count) && (i < MCAST_MAX); i++) { 992 i = 0;
999 adrp = (u16 *)dmi->dmi_addr; 993 netdev_for_each_mc_addr(dmi, dev) {
1000 iowrite16(adrp[0], ioaddr + MID_1L + 8*i); 994 if (i < MCAST_MAX) {
1001 iowrite16(adrp[1], ioaddr + MID_1M + 8*i); 995 adrp = (u16 *) dmi->dmi_addr;
1002 iowrite16(adrp[2], ioaddr + MID_1H + 8*i); 996 iowrite16(adrp[0], ioaddr + MID_1L + 8 * i);
1003 dmi = dmi->next; 997 iowrite16(adrp[1], ioaddr + MID_1M + 8 * i);
1004 } 998 iowrite16(adrp[2], ioaddr + MID_1H + 8 * i);
1005 for (i = dev->mc_count; i < MCAST_MAX; i++) { 999 } else {
1006 iowrite16(0xffff, ioaddr + MID_0L + 8*i); 1000 iowrite16(0xffff, ioaddr + MID_1L + 8 * i);
1007 iowrite16(0xffff, ioaddr + MID_0M + 8*i); 1001 iowrite16(0xffff, ioaddr + MID_1M + 8 * i);
1008 iowrite16(0xffff, ioaddr + MID_0H + 8*i); 1002 iowrite16(0xffff, ioaddr + MID_1H + 8 * i);
1003 }
1004 i++;
1009 } 1005 }
1010} 1006}
1011 1007
@@ -1223,7 +1219,7 @@ static void __devexit r6040_remove_one(struct pci_dev *pdev)
1223} 1219}
1224 1220
1225 1221
1226static struct pci_device_id r6040_pci_tbl[] = { 1222static DEFINE_PCI_DEVICE_TABLE(r6040_pci_tbl) = {
1227 { PCI_DEVICE(PCI_VENDOR_ID_RDC, 0x6040) }, 1223 { PCI_DEVICE(PCI_VENDOR_ID_RDC, 0x6040) },
1228 { 0 } 1224 { 0 }
1229}; 1225};