mv643xx_eth: implement ->set_rx_mode()
authorLennert Buytenhek <buytenh@marvell.com>
Thu, 20 Nov 2008 11:58:27 +0000 (03:58 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 20 Nov 2008 11:58:27 +0000 (03:58 -0800)
commit66e63ffbc04706568d8789cbb00eaa8ddbcae648
tree665aad7d94bc9d97a4413bfd15d65dd7db173388
parent66823b928d746df21485deeff6744c77702abf29
mv643xx_eth: implement ->set_rx_mode()

Currently, if multiple unicast addresses are programmed into a
mv643xx_eth interface, the core networking will resort to enabling
promiscuous mode on the interface, as mv643xx_eth does not implement
->set_rx_mode().

This patch switches mv643xx_eth over from ->set_multicast_list()
to ->set_rx_mode(), and implements support for secondary unicast
addresses.  The hardware can handle multiple unicast addresses as
long as their first 11 nibbles are the same (i.e. are of the form
xx:xx:xx:xx:xx:xy where the x part is the same for all addresses), so
if that is the case, we use that mode.  If it's not the case, we enable
unicast promiscuous mode in the hardware, which is slightly better than
enabling promiscuous mode for multicasts as well, which is what would
happen before.

While we are at it, change the programming sequence so that we
don't clear all filter bits first, so we don't lose all incoming
packets while the filter is being reprogrammed.

Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/mv643xx_eth.c