mirror of https://gitee.com/openkylin/linux.git
smc911x: Fix multicast handling
smc911x_set_multicast_list fails to fill out the multicast hash table correctly; Bit 1 was used rather than bit 5 to decide if the lower or upper register should be used. The function is at the same time cleaned up by calling ether_crc rather than using it's own bit reversal table. Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
8b31cfbcd1
commit
7b31f7ffa9
|
@ -1379,13 +1379,6 @@ static void smc911x_set_multicast_list(struct net_device *dev)
|
||||||
unsigned int multicast_table[2];
|
unsigned int multicast_table[2];
|
||||||
unsigned int mcr, update_multicast = 0;
|
unsigned int mcr, update_multicast = 0;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
/* table for flipping the order of 5 bits */
|
|
||||||
static const unsigned char invert5[] =
|
|
||||||
{0x00, 0x10, 0x08, 0x18, 0x04, 0x14, 0x0C, 0x1C,
|
|
||||||
0x02, 0x12, 0x0A, 0x1A, 0x06, 0x16, 0x0E, 0x1E,
|
|
||||||
0x01, 0x11, 0x09, 0x19, 0x05, 0x15, 0x0D, 0x1D,
|
|
||||||
0x03, 0x13, 0x0B, 0x1B, 0x07, 0x17, 0x0F, 0x1F};
|
|
||||||
|
|
||||||
|
|
||||||
DBG(SMC_DEBUG_FUNC, "%s: --> %s\n", dev->name, __FUNCTION__);
|
DBG(SMC_DEBUG_FUNC, "%s: --> %s\n", dev->name, __FUNCTION__);
|
||||||
|
|
||||||
|
@ -1432,7 +1425,7 @@ static void smc911x_set_multicast_list(struct net_device *dev)
|
||||||
|
|
||||||
cur_addr = dev->mc_list;
|
cur_addr = dev->mc_list;
|
||||||
for (i = 0; i < dev->mc_count; i++, cur_addr = cur_addr->next) {
|
for (i = 0; i < dev->mc_count; i++, cur_addr = cur_addr->next) {
|
||||||
int position;
|
u32 position;
|
||||||
|
|
||||||
/* do we have a pointer here? */
|
/* do we have a pointer here? */
|
||||||
if (!cur_addr)
|
if (!cur_addr)
|
||||||
|
@ -1442,12 +1435,10 @@ static void smc911x_set_multicast_list(struct net_device *dev)
|
||||||
if (!(*cur_addr->dmi_addr & 1))
|
if (!(*cur_addr->dmi_addr & 1))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* only use the low order bits */
|
/* upper 6 bits are used as hash index */
|
||||||
position = crc32_le(~0, cur_addr->dmi_addr, 6) & 0x3f;
|
position = ether_crc(ETH_ALEN, cur_addr->dmi_addr)>>26;
|
||||||
|
|
||||||
/* do some messy swapping to put the bit in the right spot */
|
multicast_table[position>>5] |= 1 << (position&0x1f);
|
||||||
multicast_table[invert5[position&0x1F]&0x1] |=
|
|
||||||
(1<<invert5[(position>>1)&0x1F]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* be sure I get rid of flags I might have set */
|
/* be sure I get rid of flags I might have set */
|
||||||
|
|
Loading…
Reference in New Issue