On Sun, Jul 08, 2012 at 07:17:21PM +0200, Stefan Sperling wrote: > On Sun, Jul 08, 2012 at 08:00:28PM +0300, Lazaros Koromilas wrote: > > On Sun, Jul 08, 2012 at 10:59:09AM +0200, Stefan Sperling wrote: > > > The linux driver ("iwlegacy") doesn't run this command in async mode. > > > Is there a reason why you're passing 1 for the last param, i.e. not > > > waiting for a command-complete interrupt when sending WPI_CMD_ASSOCIATE? > > > > Not really, no. Fixed that. I added printing because all sync > > command calls are handled this way, but can be removed if it's > > not acceptable. > > I think that printf() is fine. > > > > You don't need all of if_flags, just the IFF_PROMISC bit. > > > Why not add a new flag to sc->sc_flags and use that instead? > > > > You are right, I originally added the extra sc_if_flags in order to XOR > > with if_flags and detect the promisc status change. Does this logic > > seem simpler/better? Also removed the initialization above. > > I don't like this approach because it is adding a new 32bit flags field > to the softc, all for checking a single bit from this flags field, > while the existing sc_flags field has lots of unused bits. > > The xor is cute but usually we just use & to check for flags.
Or ISSET()! .... Ken > > So adding, say, WPI_FLAG_PROMISC to sc_flags and then cross-checking > that with the IFF_PROMISC flag will look nicer IMO. > > > > > > > Index: if_wpivar.h > > =================================================================== > > RCS file: /cvs/src/sys/dev/pci/if_wpivar.h,v > > retrieving revision 1.23 > > diff -u -p -r1.23 if_wpivar.h > > --- if_wpivar.h 7 Sep 2010 16:21:45 -0000 1.23 > > +++ if_wpivar.h 8 Jul 2012 16:45:14 -0000 > > @@ -144,6 +144,8 @@ struct wpi_softc { > > #define WPI_FLAG_HAS_5GHZ (1 << 0) > > #define WPI_FLAG_BUSY (1 << 1) > > > > + int sc_if_flags; > > + > > /* Shared area. */ > > struct wpi_dma_info shared_dma; > > struct wpi_shared *shared; > > Index: if_wpi.c > > =================================================================== > > RCS file: /cvs/src/sys/dev/pci/if_wpi.c,v > > retrieving revision 1.110 > > diff -u -p -r1.110 if_wpi.c > > --- if_wpi.c 2 Jun 2011 18:36:53 -0000 1.110 > > +++ if_wpi.c 8 Jul 2012 16:45:15 -0000 > > @@ -120,6 +120,7 @@ int wpi_ioctl(struct ifnet *, u_long, c > > int wpi_cmd(struct wpi_softc *, int, const void *, int, > > int); > > int wpi_mrr_setup(struct wpi_softc *); > > void wpi_updateedca(struct ieee80211com *); > > +int wpi_set_promisc(struct wpi_softc *); > > void wpi_set_led(struct wpi_softc *, uint8_t, uint8_t, > > uint8_t); > > int wpi_set_timing(struct wpi_softc *, struct > > ieee80211_node *); > > void wpi_power_calibration(struct wpi_softc *); > > @@ -2002,12 +2003,17 @@ wpi_ioctl(struct ifnet *ifp, u_long cmd, > > /* FALLTHROUGH */ > > case SIOCSIFFLAGS: > > if (ifp->if_flags & IFF_UP) { > > - if (!(ifp->if_flags & IFF_RUNNING)) > > + if (ifp->if_flags & IFF_RUNNING) { > > + if ((ifp->if_flags ^ sc->sc_if_flags) & > > + IFF_PROMISC) > > + error = wpi_set_promisc(sc); > > + } else > > error = wpi_init(ifp); > > } else { > > if (ifp->if_flags & IFF_RUNNING) > > wpi_stop(ifp, 1); > > } > > + sc->sc_if_flags = ifp->if_flags; > > break; > > > > case SIOCADDMULTI: > > @@ -2203,6 +2209,34 @@ wpi_updateedca(struct ieee80211com *ic) > > } > > (void)wpi_cmd(sc, WPI_CMD_EDCA_PARAMS, &cmd, sizeof cmd, 1); > > #undef WPI_EXP2 > > +} > > + > > +int > > +wpi_set_promisc(struct wpi_softc *sc) > > +{ > > + struct ieee80211com *ic = &sc->sc_ic; > > + struct ifnet *ifp = &ic->ic_if; > > + struct wpi_assoc cmd; > > + int error; > > + > > + if (ifp->if_flags & IFF_PROMISC) > > + sc->rxon.filter |= htole32(WPI_FILTER_PROMISC | > > + WPI_FILTER_CTL); > > + else > > + sc->rxon.filter &= ~htole32(WPI_FILTER_PROMISC | > > + WPI_FILTER_CTL); > > + > > + memset(&cmd, 0, sizeof cmd); > > + cmd.flags = sc->rxon.flags; > > + cmd.filter = sc->rxon.filter; > > + cmd.ofdm_mask = sc->rxon.ofdm_mask; > > + cmd.cck_mask = sc->rxon.cck_mask; > > + error = wpi_cmd(sc, WPI_CMD_ASSOCIATE, &cmd, sizeof cmd, 0); > > + if (error != 0) { > > + printf("%s: could not set filter\n", sc->sc_dev.dv_xname); > > + return error; > > + } > > + return 0; > > } > > > > void