svn commit: r258085 - head/sys/dev/iwn
Adrian Chadd
adrian at FreeBSD.org
Wed Nov 13 07:09:01 UTC 2013
Author: adrian
Date: Wed Nov 13 07:09:00 2013
New Revision: 258085
URL: http://svnweb.freebsd.org/changeset/base/258085
Log:
Correctly initialise the 2-chain antenna mask in the link quality table.
The previous code simply hard-coded IWN_ANT_AB which is only correct for
some of the NICs.
Now, if the NIC is a 1-stream TX, you need to set IWN_ANT_AB and _not_
just a single antenna. The Intel 5100 firmware panics the moment the
link quality table is updated.
So!
* no secondary antenna? Set it to IWN_ANT_AB;
* two-stream device? Transmit on the full transmit antenna configuration.
Tested:
* Intel 5100, STA
* Intel 2200 (eadler)
Obtained from: Linux iwlwifi
Modified:
head/sys/dev/iwn/if_iwn.c
Modified: head/sys/dev/iwn/if_iwn.c
==============================================================================
--- head/sys/dev/iwn/if_iwn.c Wed Nov 13 05:25:49 2013 (r258084)
+++ head/sys/dev/iwn/if_iwn.c Wed Nov 13 07:09:00 2013 (r258085)
@@ -4788,11 +4788,49 @@ iwn_set_link_quality(struct iwn_softc *s
memset(&linkq, 0, sizeof linkq);
linkq.id = wn->id;
linkq.antmsk_1stream = txant;
- linkq.antmsk_2stream = IWN_ANT_AB;
+
+ /*
+ * The '2 stream' setup is a bit .. odd.
+ *
+ * For NICs that support only 1 antenna, default to IWN_ANT_AB or
+ * the firmware panics (eg Intel 5100.)
+ *
+ * For NICs that support two antennas, we use ANT_AB.
+ *
+ * For NICs that support three antennas, we use the two that
+ * wasn't the default one.
+ *
+ * XXX TODO: if bluetooth (full concurrent) is enabled, restrict
+ * this to only one antenna.
+ */
+
+ /* So - if there's no secondary antenna, assume IWN_ANT_AB */
+
+ /* Default - transmit on the other antennas */
+ linkq.antmsk_2stream = (sc->txchainmask & ~IWN_LSB(sc->txchainmask));
+
+ /* Now, if it's zero, set it to IWN_ANT_AB, so to not panic firmware */
+ if (linkq.antmsk_2stream == 0)
+ linkq.antmsk_2stream = IWN_ANT_AB;
+
+ /*
+ * If the NIC is a two-stream TX NIC, configure the TX mask to
+ * the default chainmask
+ */
+ else if (sc->ntxchains == 2)
+ linkq.antmsk_2stream = sc->txchainmask;
+
linkq.ampdu_max = 32; /* XXX negotiated? */
linkq.ampdu_threshold = 3;
linkq.ampdu_limit = htole16(4000); /* 4ms */
+ DPRINTF(sc, IWN_DEBUG_XMIT,
+ "%s: 1stream antenna=0x%02x, 2stream antenna=0x%02x, ntxstreams=%d\n",
+ __func__,
+ linkq.antmsk_1stream,
+ linkq.antmsk_2stream,
+ sc->ntxchains);
+
/*
* Are we using 11n rates? Ensure the channel is
* 11n _and_ we have some 11n rates, or don't
More information about the svn-src-all
mailing list