Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d9a8a0a3 authored by Komuro's avatar Komuro Committed by Jeff Garzik
Browse files

[PATCH] network: fix fmvj18x_cs multicast code



The multicast code of the fmvj18x_cs driver is broken.
I fixed it to work properly.

Signed-off-by: default avatar <komurojun-mbn@nifty.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent 913168de
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -134,7 +134,7 @@ typedef struct local_info_t {
    u_char mc_filter[8];
} local_info_t;

#define MC_FILTERBREAK 64
#define MC_FILTERBREAK 8

/*====================================================================*/
/* 
@@ -1012,7 +1012,7 @@ static void fjn_reset(struct net_device *dev)
	outb(BANK_1U, ioaddr + CONFIG_1);

    /* set the multicast table to accept none. */
    for (i = 0; i < 6; i++) 
    for (i = 0; i < 8; i++) 
        outb(0x00, ioaddr + MAR_ADR + i);

    /* Switch to bank 2 (runtime mode) */
@@ -1269,6 +1269,16 @@ static void set_rx_mode(struct net_device *dev)
    u_long flags;
    int i;
    
    int saved_config_0 = inb(ioaddr + CONFIG_0);
     
    local_irq_save(flags); 

    /* Disable Tx and Rx */
    if (sram_config == 0) 
	outb(CONFIG0_RST, ioaddr + CONFIG_0);
    else
	outb(CONFIG0_RST_1, ioaddr + CONFIG_0);

    if (dev->flags & IFF_PROMISC) {
	/* Unconditionally log net taps. */
	printk("%s: Promiscuous mode enabled.\n", dev->name);
@@ -1290,20 +1300,23 @@ static void set_rx_mode(struct net_device *dev)
	for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
	     i++, mclist = mclist->next) {
	    unsigned int bit =
	    	ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f;
	    mc_filter[bit >> 3] |= (1 << bit);
	    	ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 26;
	    mc_filter[bit >> 3] |= (1 << (bit & 7));
	}
	outb(2, ioaddr + RX_MODE);	/* Use normal mode. */
    }

    local_irq_save(flags); 
    if (memcmp(mc_filter, lp->mc_filter, sizeof(mc_filter))) {
	int saved_bank = inb(ioaddr + CONFIG_1);
	/* Switch to bank 1 and set the multicast table. */
	outb(0xe4, ioaddr + CONFIG_1);
	for (i = 0; i < 8; i++)
	    outb(mc_filter[i], ioaddr + 8 + i);
	    outb(mc_filter[i], ioaddr + MAR_ADR + i);
	memcpy(lp->mc_filter, mc_filter, sizeof(mc_filter));
	outb(saved_bank, ioaddr + CONFIG_1);
    }

    outb(saved_config_0, ioaddr + CONFIG_0);

    local_irq_restore(flags);
}