b43: HT-PHY: switch radio to requested channel
authorRafał Miłecki <zajec5@gmail.com>
Sun, 19 Jun 2011 10:17:21 +0000 (12:17 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 22 Jun 2011 20:09:43 +0000 (16:09 -0400)
Switching channel happens after specific SHM write to B43_SHM_SH_CHAN.
This is the way we found it in BCM4331 MMIO dumps. By comparing with
N-PHY code we noticed there is routing used for SYN and TX/RX.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/b43/phy_ht.c
drivers/net/wireless/b43/radio_2059.h

index 12ad47f38dff7005ee5e868fe807b6af5c73a096..0b13f6f37c2fa4853f8405a012b1e882792bf6ce 100644 (file)
 static void b43_radio_2059_channel_setup(struct b43_wldev *dev,
                        const struct b43_phy_ht_channeltab_e_radio2059 *e)
 {
+       u8 i;
+       u16 routing;
+
+       b43_radio_write(dev, 0x16, e->radio_syn16);
+       b43_radio_write(dev, 0x17, e->radio_syn17);
+       b43_radio_write(dev, 0x22, e->radio_syn22);
+       b43_radio_write(dev, 0x25, e->radio_syn25);
+       b43_radio_write(dev, 0x27, e->radio_syn27);
+       b43_radio_write(dev, 0x28, e->radio_syn28);
+       b43_radio_write(dev, 0x29, e->radio_syn29);
+       b43_radio_write(dev, 0x2c, e->radio_syn2c);
+       b43_radio_write(dev, 0x2d, e->radio_syn2d);
+       b43_radio_write(dev, 0x37, e->radio_syn37);
+       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 ? 0x800 : 0x400;
+               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);
+       }
+
+       udelay(50);
+
        /* TODO */
 }
 
index 69eb46ee376fb1a0ba99f7d97fd574ed86c442b5..c2874b145266e1b39afa12e8ee230fd110d3cf43 100644 (file)
@@ -10,7 +10,35 @@ struct b43_phy_ht_channeltab_e_radio2059 {
        /* The channel frequency in MHz */
        u16 freq;
        /* Values for radio registers */
-       /* TODO */
+       u8 radio_syn16;
+       u8 radio_syn17;
+       u8 radio_syn22;
+       u8 radio_syn25;
+       u8 radio_syn27;
+       u8 radio_syn28;
+       u8 radio_syn29;
+       u8 radio_syn2c;
+       u8 radio_syn2d;
+       u8 radio_syn37;
+       u8 radio_syn41;
+       u8 radio_syn43;
+       u8 radio_syn47;
+       u8 radio_syn4a;
+       u8 radio_syn58;
+       u8 radio_syn5a;
+       u8 radio_syn6a;
+       u8 radio_syn6d;
+       u8 radio_syn6e;
+       u8 radio_syn92;
+       u8 radio_syn98;
+       u8 radio_rxtx4a;
+       u8 radio_rxtx58;
+       u8 radio_rxtx5a;
+       u8 radio_rxtx6a;
+       u8 radio_rxtx6d;
+       u8 radio_rxtx6e;
+       u8 radio_rxtx92;
+       u8 radio_rxtx98;
        /* Values for PHY registers */
        struct b43_phy_ht_channeltab_e_phy phy_regs;
 };