On Sat, Oct 08, 2016 at 07:34:55PM +0200, Mark Kettenis wrote:
> > The addition might need to be tested on a 1TR1 and 2T3R setups.  I can
> > test the latter, but I have no hardware to test the former.
> 
> FWIW, this seems to cause no regressions on:
> 
> iwn0 at pci2 dev 0 function 0 "Intel WiFi Link 5300" rev 0x00: msi, MIMO 
> 3T3R, MoW, address 00:21:6a:13:67:82

The 1T1R devices listed in the man page are:

  Intel Centrino Wireless-N 135
  Intel Centrino Wireless-N 105 

Does anybody have either of these devices?

If so, please test the diff below during regular usage,
and with these commands:

  ifconfig iwn0 mediaopt monitor up
  tcpdump -n -i iwn0 -y IEEE802_11_RADIO

The expected behaviour is that tcpdump displays some frames
(at least beacons from APs on the current channel).

Index: if_iwn.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_iwn.c,v
retrieving revision 1.175
diff -u -p -r1.175 if_iwn.c
--- if_iwn.c    28 Oct 2016 10:11:22 -0000      1.175
+++ if_iwn.c    29 Oct 2016 10:10:19 -0000
@@ -4504,13 +4504,18 @@ iwn_config(struct iwn_softc *sc)
        sc->rxon.ht_triple_mask = 0xff;
        rxchain =
            IWN_RXCHAIN_VALID(sc->rxchainmask) |
-           IWN_RXCHAIN_MIMO_COUNT(2) |
-           IWN_RXCHAIN_IDLE_COUNT(2);
+           IWN_RXCHAIN_MIMO_COUNT(sc->nrxchains) |
+           IWN_RXCHAIN_IDLE_COUNT(sc->nrxchains);
+       if (ic->ic_opmode == IEEE80211_M_MONITOR) {
+               rxchain |= IWN_RXCHAIN_FORCE_SEL(sc->rxchainmask);
+               rxchain |= IWN_RXCHAIN_FORCE_MIMO_SEL(sc->rxchainmask);
+               rxchain |= (IWN_RXCHAIN_DRIVER_FORCE | IWN_RXCHAIN_MIMO_FORCE);
+       }
        sc->rxon.rxchain = htole16(rxchain);
        DPRINTF(("setting configuration\n"));
-       DPRINTF(("%s: rxon chan %d flags %x cck %x ofdm %x\n", __func__,
-           sc->rxon.chan, le32toh(sc->rxon.flags), sc->rxon.cck_mask,
-           sc->rxon.ofdm_mask));
+       DPRINTF(("%s: rxon chan %d flags %x cck %x ofdm %x rxchain %x\n",
+           __func__, sc->rxon.chan, le32toh(sc->rxon.flags), sc->rxon.cck_mask,
+           sc->rxon.ofdm_mask, sc->rxon.rxchain));
        error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, sc->rxonsz, 0);
        if (error != 0) {
                printf("%s: RXON command failed\n", sc->sc_dev.dv_xname);

Reply via email to