libertas: fix multicast filtering on eth and msh interfaces
authorDavid Woodhouse <dwmw2@infradead.org>
Tue, 20 May 2008 12:32:45 +0000 (13:32 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 22 May 2008 01:47:38 +0000 (21:47 -0400)
commit75bf45a7b4ab81cfa5c5eab68b57bbfee8b8ede2
treebfc740d4eda3a3389c4f4cc567f04609d5d055f5
parente37fc6e11c79899451e394319cff18cc53d6448d
libertas: fix multicast filtering on eth and msh interfaces

We weren't properly handling multicast on the mesh interface. Fix that,
which involves setting up the hardware to use the union of dev->mc_list
for both eth%d and msh%d devices.

This means we can't do it directly from ->set_multicast_list() because
we'd need to lock the other device to read its list, and we can't do
that because it might deadlock. So punt the actual work to keventd.

Also, invoke the same when taking an interface down; for some reason the
core calls ->set_multicast_list while IFF_UP is still set in dev->flags
when we're taking it down, so its addresses don't get removed then.

We also convert MAC_MULTICAST_ADR to a direct command while we're at it,
removing one more entry from the big switch statement in the deprecated
lbs_prepare_and_send_command() function.

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/libertas/cmd.c
drivers/net/wireless/libertas/cmdresp.c
drivers/net/wireless/libertas/dev.h
drivers/net/wireless/libertas/hostcmd.h
drivers/net/wireless/libertas/main.c