PERFORCE change 137809 for review

Sam Leffler sam at FreeBSD.org
Sat Mar 15 22:50:16 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=137809

Change 137809 by sam at sam_ebb on 2008/03/15 22:49:47

	hookup to an mcast update callback now that net80211 handles
	the merge; add a usb task so the update can be done in a
	context that avoids LOR's and such (this is gross)

Affected files ...

.. //depot/projects/vap/sys/dev/usb/if_zyd.c#12 edit
.. //depot/projects/vap/sys/dev/usb/if_zydreg.h#7 edit

Differences ...

==== //depot/projects/vap/sys/dev/usb/if_zyd.c#12 (text+ko) ====

@@ -204,7 +204,8 @@
 static int	zyd_set_bssid(struct zyd_softc *, const uint8_t *);
 static int	zyd_switch_radio(struct zyd_softc *, int);
 static void	zyd_set_led(struct zyd_softc *, int, int);
-static void	zyd_set_multi(struct zyd_softc *);
+static void	zyd_set_multi(void *);
+static void	zyd_update_mcast(struct ifnet *);
 static int	zyd_set_rxfilter(struct zyd_softc *);
 static void	zyd_set_chan(struct zyd_softc *, struct ieee80211_channel *);
 static int	zyd_set_beacon_interval(struct zyd_softc *, int);
@@ -334,6 +335,7 @@
 
 	usb_init_task(&sc->sc_scantask, zyd_scantask, sc);
 	usb_init_task(&sc->sc_task, zyd_task, sc);
+	usb_init_task(&sc->sc_mcasttask, zyd_set_multi, sc);
 
 	callout_init(&sc->sc_watchdog_ch, 0);
 
@@ -409,6 +411,7 @@
 
 	ic->ic_vap_create = zyd_vap_create;
 	ic->ic_vap_delete = zyd_vap_delete;
+	ic->ic_update_mcast = zyd_update_mcast;
 
 	bpfattach(ifp, DLT_IEEE802_11_RADIO,
 	    sizeof(struct ieee80211_frame) + sizeof(sc->sc_txtap));
@@ -1706,8 +1709,9 @@
 }
 
 static void
-zyd_set_multi(struct zyd_softc *sc)
+zyd_set_multi(void *arg)
 {
+	struct zyd_softc *sc = arg;
 	struct ieee80211com *ic = &sc->sc_ic;
 	struct ifnet *ifp = ic->ic_ifp;
 	struct ifmultiaddr *ifma;
@@ -1744,6 +1748,14 @@
 	zyd_write32(sc, ZYD_MAC_GHTBH, high);
 }
 
+static void
+zyd_update_mcast(struct ifnet *ifp)
+{
+	struct zyd_softc *sc = ifp->if_softc;
+
+	usb_add_task(sc->sc_udev, &sc->sc_mcasttask, USB_TASKQ_DRIVER);
+}
+
 static int
 zyd_set_rxfilter(struct zyd_softc *sc)
 {
@@ -2487,11 +2499,6 @@
 		}
 		sc->sc_if_flags = ifp->if_flags;
 		break;
-	case SIOCADDMULTI:
-	case SIOCDELMULTI:
-		if (ifp->if_drv_flags & IFF_DRV_RUNNING)
-			zyd_set_multi(sc);
-		break;
 	case SIOCGIFMEDIA:
 	case SIOCSIFMEDIA:
 		error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);

==== //depot/projects/vap/sys/dev/usb/if_zydreg.h#7 (text+ko) ====

@@ -1195,6 +1195,7 @@
 #define ZYD_SCAN_START	0
 #define ZYD_SCAN_END	1
 #define ZYD_SET_CHANNEL	2
+	struct usb_task			sc_mcasttask;
 	usbd_device_handle		sc_udev;
 	usbd_interface_handle		sc_iface;
 	int				sc_flags;


More information about the p4-projects mailing list