r6040: fix r6040_multicast_list
Subsystems (2)
PATCH 1/1 r6040: fix r6040_multicast_list
As reported in <https://bugzilla.kernel.org/show_bug.cgi?id=15355>, r6040_ multicast_list currently crashes. This is due a wrong maximum of multicast entries. This patch fixes the following issues with multicast:
- number of maximum entries if off-by-one (4 instead of 3)
- the writing of the hash table index is not necessary and leads to invalid values being written into the MCR1 register, so the MAC is simply put in a non coherent state
- when we exceed the maximum number of mutlticast address, writing the broadcast address should be done in registers MID_1{L,M,H} instead of MID_O{L,M,H}, otherwise we would loose the adapter's MAC address
---
drivers/net/r6040.c +4 -7
@@ -135,7 +135,7 @@#define RX_DESC_SIZE (RX_DCNT * sizeof(struct r6040_descriptor))#define TX_DESC_SIZE (TX_DCNT * sizeof(struct r6040_descriptor))#define MBCR_DEFAULT 0x012A/* MAC Bus Control Register */ -#define MCAST_MAX 4/* Max number multicast addresses to filter */ +#define MCAST_MAX 3/* Max number multicast addresses to filter */ /* Descriptor status */ #define DSC_OWNER_MAC 0x8000/* MAC is the owner of this descriptor */
@@ -983,9 +983,6 @@ static void r6040_multicast_list(struct net_device *dev) crc >>=26 ; hash_table[crc >>4 ] |=1 << (15 - (crc &0xf )); } -/* Write the index of the hash table */ -for (i =0 ; i <4 ; i++) -iowrite16 (hash_table[i] <<14 , ioaddr +MCR1 );/* Fill the MAC hash tables with their values */ iowrite16 (hash_table[0 ], ioaddr +MAR0 );iowrite16 (hash_table[1 ], ioaddr +MAR1 );
@@ -1001,9 +998,9 @@ static void r6040_multicast_list(struct net_device *dev)iowrite16 (adrp[1 ], ioaddr +MID_1M +8 * i);iowrite16 (adrp[2 ], ioaddr +MID_1H +8 * i); }else { -iowrite16 (0xffff , ioaddr +MID_0L +8 * i); -iowrite16 (0xffff , ioaddr +MID_0M +8 * i); -iowrite16 (0xffff , ioaddr +MID_0H +8 * i); +iowrite16 (0xffff , ioaddr +MID_1L +8 * i); +iowrite16 (0xffff , ioaddr +MID_1M +8 * i); +iowrite16 (0xffff , ioaddr +MID_1H +8 * i); } i++; }
From: Florian Fainelli <[email protected]>
Date: Wed, 7 Apr 2010 13:18:48 +0200
Quoted 10 lines
As reported in <https://bugzilla.kernel.org/show_bug.cgi?id=15355>,
r6040_multicast_listcurrently crashes. This is due a wrong maximum of multicast entries. This patch fixes the following issues with multicast:- number of maximum entries if off-by-one (4 instead of 3)
- the writing of the hash table index is not necessary and leads to invalid values being written into the MCR1 register, so the MAC is simply put in a non coherent state
Quoted 5 lines
- when we exceed the maximum number of mutlticast address, writing the broadcast address should be done in registers MID_1{L,M,H} instead of MID_O{L,M,H}, otherwise we would loose the adapter's MAC address
Signed-off-by Florian Fainelli <[email protected]>
Applied, thanks Florian.