FreeBSD committed a couple of interesting things in r307529
https://svnweb.freebsd.org/base?view=revision&revision=r307529
Unfortunately the commit is a giant patch bomb which makes
it hard to pick out individual fixes :-(

This patch extracts what I believe "fix IQ calibration bug" refers to.
The current code is only ever setting bits but not clearing bits which
should be cleared.

My diff looks very different because FreeBSD made a lot of style
changes in their driver (e.g. they have an rtwn_bb_setbits() function
which we don't have). We could think about porting these over but
for now I'd like to focus on fixing bugs instead of style.

Index: rtwn.c
===================================================================
RCS file: /cvs/src/sys/dev/ic/rtwn.c,v
retrieving revision 1.11
diff -u -p -r1.11 rtwn.c
--- rtwn.c      8 Jan 2017 05:48:27 -0000       1.11
+++ rtwn.c      22 Jan 2017 17:50:37 -0000
@@ -2272,9 +2272,10 @@ rtwn_iq_calib_write_results(struct rtwn_
        reg = rtwn_bb_read(sc, R92C_OFDM0_TXIQIMBALANCE(chain)); 
        val = ((reg >> 22) & 0x3ff);
        x = tx[0];
-       if (x & 0x0200)
-               x |= 0xfc00;
-       reg = (((x * val) >> 8) & 0x3ff);
+       if (x & 0x00000200)
+               x |= 0xfffffc00;
+       reg &= ~0x3ff;
+       reg |= (((x * val) >> 8) & 0x3ff);
        rtwn_bb_write(sc, R92C_OFDM0_TXIQIMBALANCE(chain), reg);
 
        reg = rtwn_bb_read(sc, R92C_OFDM0_ECCATHRESHOLD);
@@ -2289,11 +2290,13 @@ rtwn_iq_calib_write_results(struct rtwn_
                y |= 0xfffffc00;
        tx_c = (y * val) >> 8;
        reg = rtwn_bb_read(sc, R92C_OFDM0_TXAFE(chain));
-       reg |= ((((tx_c & 0x3c0) >> 6) << 24) & 0xf0000000);
+       reg &= ~0xf0000000;
+       reg |= ((tx_c & 0x3c0) << 22);
        rtwn_bb_write(sc, R92C_OFDM0_TXAFE(chain), reg);
 
        reg = rtwn_bb_read(sc, R92C_OFDM0_TXIQIMBALANCE(chain)); 
-       reg |= (((tx_c & 0x3f) << 16) & 0x003F0000);
+       reg &= ~0x003f0000;
+       reg |= ((tx_c & 0x3f) << 16);
        rtwn_bb_write(sc, R92C_OFDM0_TXIQIMBALANCE(chain), reg);
 
        reg = rtwn_bb_read(sc, R92C_OFDM0_ECCATHRESHOLD);
@@ -2307,18 +2310,23 @@ rtwn_iq_calib_write_results(struct rtwn_
                return;
 
        reg = rtwn_bb_read(sc, R92C_OFDM0_RXIQIMBALANCE(chain));
+       reg &= ~0x3ff;
        reg |= (rx[0] & 0x3ff);
        rtwn_bb_write(sc, R92C_OFDM0_RXIQIMBALANCE(chain), reg);
-       reg |= (((rx[1] & 0x03f) << 8) & 0xFC00);
+
+       reg &= ~0xfc00;
+       reg |= ((rx[1] & 0x03f) << 10);
        rtwn_bb_write(sc, R92C_OFDM0_RXIQIMBALANCE(chain), reg);
 
        if (chain == 0) {
                reg = rtwn_bb_read(sc, R92C_OFDM0_RXIQEXTANTA);
-               reg |= (((rx[1] & 0xf) >> 6) & 0x000f);
+               reg &= ~0xf0000000;
+               reg |= ((rx[1] & 0x3c0) << 22);
                rtwn_bb_write(sc, R92C_OFDM0_RXIQEXTANTA, reg);
        } else {
                reg = rtwn_bb_read(sc, R92C_OFDM0_AGCRSSITABLE);
-               reg |= ((((rx[1] & 0xf) >> 6) << 12) & 0xf000);
+               reg &= ~0xf000;
+               reg |= ((rx[1] & 0x3c0) << 6);
                rtwn_bb_write(sc, R92C_OFDM0_AGCRSSITABLE, reg);
        }
 }


Reply via email to