Changeset 27877 for branches/backfire


Ignore:
Timestamp:
2011-08-02T16:13:15+02:00 (5 years ago)
Author:
florian
Message:

backport r27876

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/backfire/target/linux/rdc/patches-2.6.30/015-r6040_fix_multicast.patch

    r22853 r27877  
    1 --- 
    21--- a/drivers/net/r6040.c 
    32+++ b/drivers/net/r6040.c 
    4 @@ -136,7 +136,7 @@ 
    5  #define RX_DESC_SIZE   (RX_DCNT * sizeof(struct r6040_descriptor)) 
    6  #define TX_DESC_SIZE   (TX_DCNT * sizeof(struct r6040_descriptor)) 
    7  #define MBCR_DEFAULT   0x012A  /* MAC Bus Control Register */ 
    8 -#define MCAST_MAX      4       /* Max number multicast addresses to filter */ 
    9 +#define MCAST_MAX      3       /* Max number multicast addresses to filter */ 
     3@@ -70,6 +70,8 @@ 
    104  
    11  /* Descriptor status */ 
    12  #define DSC_OWNER_MAC  0x8000  /* MAC is the owner of this descriptor */ 
    13 @@ -887,9 +887,6 @@ static void r6040_multicast_list(struct  
     5 /* MAC registers */ 
     6 #define MCR0           0x00    /* Control register 0 */ 
     7+#define  PROMISC       0x0020  /* Promiscuous mode */ 
     8+#define  HASH_EN       0x0100  /* Enable multicast hash table function */ 
     9 #define MCR1           0x04    /* Control register 1 */ 
     10 #define  MAC_RST       0x0001  /* Reset the MAC */ 
     11 #define MBCR           0x08    /* Bus control */ 
     12@@ -837,76 +839,96 @@ 
     13 { 
     14        struct r6040_private *lp = netdev_priv(dev); 
     15        void __iomem *ioaddr = lp->base; 
     16-       u16 *adrp; 
     17-       u16 reg; 
     18        unsigned long flags; 
     19        struct dev_mc_list *dmi = dev->mc_list; 
     20        int i; 
     21+       u16 *adrp; 
     22+       u16 hash_table[4] = { 0 }; 
     23+ 
     24+       spin_lock_irqsave(&lp->lock, flags); 
     25  
     26-       /* MAC Address */ 
     27+       /* Keep our MAC Address */ 
     28        adrp = (u16 *)dev->dev_addr; 
     29        iowrite16(adrp[0], ioaddr + MID_0L); 
     30        iowrite16(adrp[1], ioaddr + MID_0M); 
     31        iowrite16(adrp[2], ioaddr + MID_0H); 
     32  
     33-       /* Promiscous Mode */ 
     34-       spin_lock_irqsave(&lp->lock, flags); 
     35- 
     36        /* Clear AMCP & PROM bits */ 
     37-       reg = ioread16(ioaddr) & ~0x0120; 
     38+       lp->mcr0 = ioread16(ioaddr + MCR0) & ~(PROMISC | HASH_EN); 
     39+ 
     40+       /* Promiscuous mode */ 
     41        if (dev->flags & IFF_PROMISC) { 
     42-               reg |= 0x0020; 
     43-               lp->mcr0 |= 0x0020; 
     44+               lp->mcr0 |= PROMISC; 
     45        } 
     46-       /* Too many multicast addresses 
     47-        * accept all traffic */ 
     48-       else if ((dev->mc_count > MCAST_MAX) 
     49-               || (dev->flags & IFF_ALLMULTI)) 
     50-               reg |= 0x0020; 
     51  
     52-       iowrite16(reg, ioaddr); 
     53-       spin_unlock_irqrestore(&lp->lock, flags); 
     54- 
     55-       /* Build the hash table */ 
     56-       if (dev->mc_count > MCAST_MAX) { 
     57-               u16 hash_table[4]; 
     58-               u32 crc; 
     59+       /* Enable multicast hash table function to 
     60+        * receive all multicast packets. */ 
     61+       else if (dev->flags & IFF_ALLMULTI) { 
     62+               lp->mcr0 |= HASH_EN; 
     63+ 
     64+               for (i = 0; i < MCAST_MAX ; i++) { 
     65+                       iowrite16(0, ioaddr + MID_1L + 8 * i); 
     66+                       iowrite16(0, ioaddr + MID_1M + 8 * i); 
     67+                       iowrite16(0, ioaddr + MID_1H + 8 * i); 
     68+               } 
     69  
     70                for (i = 0; i < 4; i++) 
     71-                       hash_table[i] = 0; 
     72+                       hash_table[i] = 0xffff; 
     73+       } 
     74  
     75-               for (i = 0; i < dev->mc_count; i++) { 
     76-                       char *addrs = dmi->dmi_addr; 
     77+       /* Use internal multicast address registers if the number of 
     78+        * multicast addresses is not greater than MCAST_MAX. */ 
     79+       else if (dev->mc_count <= MCAST_MAX) { 
     80+               i = 0; 
     81+               while (i < dev->mc_count) { 
     82+                       u16 *adrp = (u16 *)dmi->dmi_addr; 
     83  
     84                        dmi = dmi->next; 
     85+                       iowrite16(adrp[0], ioaddr + MID_1L + 8 * i); 
     86+                       iowrite16(adrp[1], ioaddr + MID_1M + 8 * i); 
     87+                       iowrite16(adrp[2], ioaddr + MID_1H + 8 * i); 
     88+                       i++; 
     89+               } 
     90+               while (i < MCAST_MAX) { 
     91+                       iowrite16(0, ioaddr + MID_1L + 8 * i); 
     92+                       iowrite16(0, ioaddr + MID_1M + 8 * i); 
     93+                       iowrite16(0, ioaddr + MID_1H + 8 * i); 
     94+                       i++; 
     95+               } 
     96+       } 
     97+       /* Otherwise, Enable multicast hash table function. */ 
     98+       else { 
     99+               u32 crc; 
     100+ 
     101+               lp->mcr0 |= HASH_EN; 
     102  
     103-                       if (!(*addrs & 1)) 
     104-                               continue; 
     105+               for (i = 0; i < MCAST_MAX ; i++) { 
     106+                       iowrite16(0, ioaddr + MID_1L + 8 * i); 
     107+                       iowrite16(0, ioaddr + MID_1M + 8 * i); 
     108+                       iowrite16(0, ioaddr + MID_1H + 8 * i); 
     109+               } 
     110+ 
     111+               /* Build multicast hash table */ 
     112+               for (i = 0; i < dev->mc_count; i++) { 
     113+                       u8 *addrs = dmi->dmi_addr; 
     114+                       dmi = dmi->next; 
     115  
     116-                       crc = ether_crc_le(6, addrs); 
     117+                       crc = ether_crc(ETH_ALEN, addrs); 
    14118                        crc >>= 26; 
    15                         hash_table[crc >> 4] |= 1 << (15 - (crc & 0xf)); 
     119-                       hash_table[crc >> 4] |= 1 << (15 - (crc & 0xf)); 
     120+                       hash_table[crc >> 4] |= 1 << (crc & 0xf); 
    16121                } 
    17 -               /* Write the index of the hash table */ 
    18 -               for (i = 0; i < 4; i++) 
    19 -                       iowrite16(hash_table[i] << 14, ioaddr + MCR1); 
    20                 /* Fill the MAC hash tables with their values */ 
     122-               /* Fill the MAC hash tables with their values */ 
     123+       } 
     124+       iowrite16(lp->mcr0, ioaddr + MCR0); 
     125+ 
     126+       /* Fill the MAC hash tables with their values */ 
     127+       if (lp->mcr0 && HASH_EN) { 
    21128                iowrite16(hash_table[0], ioaddr + MAR0); 
    22129                iowrite16(hash_table[1], ioaddr + MAR1); 
    23 @@ -905,9 +902,9 @@ static void r6040_multicast_list(struct  
    24                 dmi = dmi->next; 
     130                iowrite16(hash_table[2], ioaddr + MAR2); 
     131                iowrite16(hash_table[3], ioaddr + MAR3); 
    25132        } 
    26         for (i = dev->mc_count; i < MCAST_MAX; i++) { 
    27 -               iowrite16(0xffff, ioaddr + MID_0L + 8*i); 
    28 -               iowrite16(0xffff, ioaddr + MID_0M + 8*i); 
    29 -               iowrite16(0xffff, ioaddr + MID_0H + 8*i); 
    30 +               iowrite16(0xffff, ioaddr + MID_1L + 8 * i); 
    31 +               iowrite16(0xffff, ioaddr + MID_1M + 8 * i); 
    32 +               iowrite16(0xffff, ioaddr + MID_1H + 8 * i); 
    33         } 
     133-       /* Multicast Address 1~4 case */ 
     134-       dmi = dev->mc_list; 
     135-       for (i = 0, dmi; (i < dev->mc_count) && (i < MCAST_MAX); i++) { 
     136-               adrp = (u16 *)dmi->dmi_addr; 
     137-               iowrite16(adrp[0], ioaddr + MID_1L + 8*i); 
     138-               iowrite16(adrp[1], ioaddr + MID_1M + 8*i); 
     139-               iowrite16(adrp[2], ioaddr + MID_1H + 8*i); 
     140-               dmi = dmi->next; 
     141-       } 
     142-       for (i = dev->mc_count; i < MCAST_MAX; i++) { 
     143-               iowrite16(0xffff, ioaddr + MID_1L + 8*i); 
     144-               iowrite16(0xffff, ioaddr + MID_1M + 8*i); 
     145-               iowrite16(0xffff, ioaddr + MID_1H + 8*i); 
     146-       } 
     147+ 
     148+       spin_unlock_irqrestore(&lp->lock, flags); 
    34149 } 
    35150  
     151 static void netdev_get_drvinfo(struct net_device *dev, 
Note: See TracChangeset for help on using the changeset viewer.