AR9285 antenna diversity - a journey

Adrian Chadd adrian at freebsd.org
Wed Jun 5 22:50:25 UTC 2013


Hi all,

I made the mistake of whacking an AR9285 into an EEEPC I have here. It
has one antenna. So, I thought, I'll just whack it onto the primary
antenna as I know the AR9285 only transmits on the main antenna (the
second antenna connector is only for receive.)

And it didn't work.

Thus started the journey of "what the hell kind of weird crap is going on here."

The TL;DR version - if you use an AR9285 or AR2427, please update to
the latest -HEAD.

The short version:

It's a 1x1 chip. But it has two receive inputs - LNA1 and LNA2. LNA1
shares with TX and it's 3dB less sensitive than LNA2. So ideally you
want to configure things so you receive on LNA2. There's also a
receive antenna switch table and switch bit that can connect to an
external antenna switch. If you don't have an AR9285 + bluetooth
combo, you very likely don't have an antenna switch.

So _normally_, this is what you have:

* Antenna 1 / Main : connects to LNA1, is used for TX
* Antenna 2 / Alt : connects to LNA2, is used for RX.

Now if you're using a single-antenna device, that can only connect to LNA1.

Next, there's how it's configured up.

There's this thing called "LNA combining." Where the BB mixes the LNA
signals in different ways. The four configurations are:

* LNA1 only
* LNA2 only
* LNA1-LNA2
* LNA1+LNA2

Then there's two profiles - "main" and "alt." You configure "main" as
the receive profile that the BB tries first. If it has time, it'll try
the "alt" config and if that's better than main, it'll flip over to
using this to receive the frame.

These get programmed in by some settings in the EEPROM.

Now - what happened:

I naively thought that the driver code "just worked." It turns out
that yes, the driver code just worked, except for setting
AR_DEF_ANTENNA to 1 instead of the default (0). This meant the MAC
would tell the PHY that it should just do receive on the alternate
config. If you have a single antenna connected to LNA1 _and_ your NIC
EEPROM settings default to "main = LNA1, alt=LNA2", it'll always
receive on LNA2. This obviously would result in badness - you always
receive on a non-connected antenna.

So, I fixed that. It worked. But I wanted some better
diagnostic/debugging tools.

The first thing I did was to hack the receive path to log the LNA
configuration used in the RX antenna field, rather than having it
default to something useless. So now, athstats shows this:


Antenna profile:
[0] tx     6232 rx    17364
[1] tx        0 rx    64685
[2] tx        0 rx     9615

These map as following:

rx0 = LNA1-LNA2
rx1 = LNA2
rx2 = LNA1
rx3 = LNA1+LNA2

rx4->rx7 is the same as rx0->rx3, but with the "external" RX antenna
diversity switch set to '1'.

So now, you can watch this live:


adrian at lucy:~/work/freebsd/ath/head/src/sys/dev/ath]> athstats -o
input,output,rxstbc,rx0,rx1,rx2,rx3,rx4,rx5,rx6,rx7,rssi 1
   input   output rxstbc ant0(rx) ant1(rx) ant2(rx) ant3(rx) ant4(rx)
ant5(rx) ant6(rx) ant7(rx) rssi
   95610     7740   8242    17364    68075    10171        0        0
      0        0        0   26
      59        2      0        0       53        6        0        0
      0        0        0   35
      50        2      0        0       46        4        0        0
      0        0        0   35
      66        2      0        0       60        6        0        0
      0        0        0   38
      60        0      0        0       56        4        0        0
      0        0        0   33

.. Next, I wanted to log what the default settings were. That way if
people come to me and say that their AR9285 behaves crappy, I at least
have the information needed.

Behold, from the attach code:


[ath] AR9285 Main LNA config: LNA2
[ath] AR9285 Alt LNA config: LNA1
[ath] LNA diversity enabled, Diversity enabled
[ath] Enabling diversity for Kite

It will now tell you what the main/alternate configuration is
specified in the EEPROM and whether diversity is enabled or disabled.

After much discussion and research, I've discovered why - for laptops
with one antenna, the only real guaranteed way to do this without
hacking the driver is to default the EEPROM settings to _not_ enable
diversity. Even if the NIC has two antenna connectors and you do hook
up a separate antenna.

So now this is all done and sorted out, I'm going to document how it
all holds together, add some run time configuration twiddles for
controlling the AR9285 antenna diversity parameters, and see about
writing a tool to log/track the receive antenna configurations so
people can tinker with things and figure out why things are performing
badly or not.

So what's this mean for you?

If you have two antennas hooked up, good.

If you have one antenna hooked up to the AR9285, the above _must_ say
the main configuration is LNA1 if diversity is disabled. or it just
won't work. If it says MAIN=LNA2 and diversity is disabled, it will
_only_ receive on the second (alt) antenna, and thus you'll have
crappy (no) receive performance.


Phew!



Adrian


More information about the freebsd-wireless mailing list