b43: HT-PHY: finish calculating values for idle TSSI
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / b43 / phy_ht.c
index 83239fd870402ec5a59580bb12ba54826c55d184..fd9e249e95b8aa53a17d7b85069ad464a1f33392 100644 (file)
@@ -37,8 +37,9 @@
 static void b43_radio_2059_channel_setup(struct b43_wldev *dev,
                        const struct b43_phy_ht_channeltab_e_radio2059 *e)
 {
-       u8 i;
-       u16 routing;
+       static const u16 routing[] = { R2059_C1, R2059_C2, R2059_C3, };
+       u16 r;
+       int core;
 
        b43_radio_write(dev, 0x16, e->radio_syn16);
        b43_radio_write(dev, 0x17, e->radio_syn17);
@@ -53,25 +54,17 @@ static void b43_radio_2059_channel_setup(struct b43_wldev *dev,
        b43_radio_write(dev, 0x41, e->radio_syn41);
        b43_radio_write(dev, 0x43, e->radio_syn43);
        b43_radio_write(dev, 0x47, e->radio_syn47);
-       b43_radio_write(dev, 0x4a, e->radio_syn4a);
-       b43_radio_write(dev, 0x58, e->radio_syn58);
-       b43_radio_write(dev, 0x5a, e->radio_syn5a);
-       b43_radio_write(dev, 0x6a, e->radio_syn6a);
-       b43_radio_write(dev, 0x6d, e->radio_syn6d);
-       b43_radio_write(dev, 0x6e, e->radio_syn6e);
-       b43_radio_write(dev, 0x92, e->radio_syn92);
-       b43_radio_write(dev, 0x98, e->radio_syn98);
-
-       for (i = 0; i < 2; i++) {
-               routing = i ? R2059_RXRX1 : R2059_TXRX0;
-               b43_radio_write(dev, routing | 0x4a, e->radio_rxtx4a);
-               b43_radio_write(dev, routing | 0x58, e->radio_rxtx58);
-               b43_radio_write(dev, routing | 0x5a, e->radio_rxtx5a);
-               b43_radio_write(dev, routing | 0x6a, e->radio_rxtx6a);
-               b43_radio_write(dev, routing | 0x6d, e->radio_rxtx6d);
-               b43_radio_write(dev, routing | 0x6e, e->radio_rxtx6e);
-               b43_radio_write(dev, routing | 0x92, e->radio_rxtx92);
-               b43_radio_write(dev, routing | 0x98, e->radio_rxtx98);
+
+       for (core = 0; core < 3; core++) {
+               r = routing[core];
+               b43_radio_write(dev, r | 0x4a, e->radio_rxtx4a);
+               b43_radio_write(dev, r | 0x58, e->radio_rxtx58);
+               b43_radio_write(dev, r | 0x5a, e->radio_rxtx5a);
+               b43_radio_write(dev, r | 0x6a, e->radio_rxtx6a);
+               b43_radio_write(dev, r | 0x6d, e->radio_rxtx6d);
+               b43_radio_write(dev, r | 0x6e, e->radio_rxtx6e);
+               b43_radio_write(dev, r | 0x92, e->radio_rxtx92);
+               b43_radio_write(dev, r | 0x98, e->radio_rxtx98);
        }
 
        udelay(50);
@@ -87,7 +80,7 @@ static void b43_radio_2059_channel_setup(struct b43_wldev *dev,
 
 static void b43_radio_2059_init(struct b43_wldev *dev)
 {
-       const u16 routing[] = { R2059_SYN, R2059_TXRX0, R2059_RXRX1 };
+       const u16 routing[] = { R2059_C1, R2059_C2, R2059_C3 };
        const u16 radio_values[3][2] = {
                { 0x61, 0xE9 }, { 0x69, 0xD5 }, { 0x73, 0x99 },
        };
@@ -106,17 +99,17 @@ static void b43_radio_2059_init(struct b43_wldev *dev)
        b43_radio_mask(dev, 0xc0, ~0x0080);
 
        if (1) { /* FIXME */
-               b43_radio_set(dev, R2059_RXRX1 | 0x4, 0x1);
+               b43_radio_set(dev, R2059_C3 | 0x4, 0x1);
                udelay(10);
-               b43_radio_set(dev, R2059_RXRX1 | 0x0BF, 0x1);
-               b43_radio_maskset(dev, R2059_RXRX1 | 0x19B, 0x3, 0x2);
+               b43_radio_set(dev, R2059_C3 | 0x0BF, 0x1);
+               b43_radio_maskset(dev, R2059_C3 | 0x19B, 0x3, 0x2);
 
-               b43_radio_set(dev, R2059_RXRX1 | 0x4, 0x2);
+               b43_radio_set(dev, R2059_C3 | 0x4, 0x2);
                udelay(100);
-               b43_radio_mask(dev, R2059_RXRX1 | 0x4, ~0x2);
+               b43_radio_mask(dev, R2059_C3 | 0x4, ~0x2);
 
                for (i = 0; i < 10000; i++) {
-                       if (b43_radio_read(dev, R2059_RXRX1 | 0x145) & 1) {
+                       if (b43_radio_read(dev, R2059_C3 | 0x145) & 1) {
                                i = 0;
                                break;
                        }
@@ -125,7 +118,7 @@ static void b43_radio_2059_init(struct b43_wldev *dev)
                if (i)
                        b43err(dev->wl, "radio 0x945 timeout\n");
 
-               b43_radio_mask(dev, R2059_RXRX1 | 0x4, ~0x1);
+               b43_radio_mask(dev, R2059_C3 | 0x4, ~0x1);
                b43_radio_set(dev, 0xa, 0x60);
 
                for (i = 0; i < 3; i++) {
@@ -397,7 +390,7 @@ static void b43_phy_ht_rssi_select(struct b43_wldev *dev, u8 core_sel,
                { B43_PHY_HT_AFE_C2, B43_PHY_HT_AFE_C2_OVER, },
                { B43_PHY_HT_AFE_C3, B43_PHY_HT_AFE_C3_OVER, },
        };
-       static const u16 radio_r[] = { R2059_SYN, R2059_TXRX0, R2059_RXRX1, };
+       static const u16 radio_r[] = { R2059_C1, R2059_C2, R2059_C3, };
        int core;
 
        if (core_sel == 0) {
@@ -417,7 +410,7 @@ static void b43_phy_ht_rssi_select(struct b43_wldev *dev, u8 core_sel,
                                b43_phy_set(dev, ctl_regs[core][1], 0x1 << 9);
                                b43_phy_set(dev, ctl_regs[core][1], 0x1 << 10);
 
-                               b43_radio_set(dev, R2059_RXRX1 | 0xbf, 0x1);
+                               b43_radio_set(dev, R2059_C3 | 0xbf, 0x1);
                                b43_radio_write(dev, radio_r[core] | 0x159,
                                                0x11);
                                break;
@@ -536,9 +529,21 @@ static void b43_phy_ht_tx_power_ctl(struct b43_wldev *dev, bool enable)
 static void b43_phy_ht_tx_power_ctl_idle_tssi(struct b43_wldev *dev)
 {
        struct b43_phy_ht *phy_ht = dev->phy.ht;
+       static const u16 base[] = { 0x840, 0x860, 0x880 };
+       u16 save_regs[3][3];
        s32 rssi_buf[6];
+       int core;
 
-       /* TODO */
+       for (core = 0; core < 3; core++) {
+               save_regs[core][1] = b43_phy_read(dev, base[core] + 6);
+               save_regs[core][2] = b43_phy_read(dev, base[core] + 7);
+               save_regs[core][0] = b43_phy_read(dev, base[core] + 0);
+
+               b43_phy_write(dev, base[core] + 6, 0);
+               b43_phy_mask(dev, base[core] + 7, ~0xF); /* 0xF? Or just 0x6? */
+               b43_phy_set(dev, base[core] + 0, 0x0400);
+               b43_phy_set(dev, base[core] + 0, 0x1000);
+       }
 
        b43_phy_ht_tx_tone(dev);
        udelay(20);
@@ -550,7 +555,11 @@ static void b43_phy_ht_tx_power_ctl_idle_tssi(struct b43_wldev *dev)
        phy_ht->idle_tssi[1] = rssi_buf[2] & 0xff;
        phy_ht->idle_tssi[2] = rssi_buf[4] & 0xff;
 
-       /* TODO */
+       for (core = 0; core < 3; core++) {
+               b43_phy_write(dev, base[core] + 0, save_regs[core][0]);
+               b43_phy_write(dev, base[core] + 6, save_regs[core][1]);
+               b43_phy_write(dev, base[core] + 7, save_regs[core][2]);
+       }
 }
 
 static void b43_phy_ht_tx_power_ctl_setup(struct b43_wldev *dev)