Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

b43: HT-PHY: switch radio to requested channel

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>

authored by

Rafał Miłecki and committed by
John W. Linville
a6b7da5d 39ca554c

+68 -1
+39
drivers/net/wireless/b43/phy_ht.c
··· 30 30 static void b43_radio_2059_channel_setup(struct b43_wldev *dev, 31 31 const struct b43_phy_ht_channeltab_e_radio2059 *e) 32 32 { 33 + u8 i; 34 + u16 routing; 35 + 36 + b43_radio_write(dev, 0x16, e->radio_syn16); 37 + b43_radio_write(dev, 0x17, e->radio_syn17); 38 + b43_radio_write(dev, 0x22, e->radio_syn22); 39 + b43_radio_write(dev, 0x25, e->radio_syn25); 40 + b43_radio_write(dev, 0x27, e->radio_syn27); 41 + b43_radio_write(dev, 0x28, e->radio_syn28); 42 + b43_radio_write(dev, 0x29, e->radio_syn29); 43 + b43_radio_write(dev, 0x2c, e->radio_syn2c); 44 + b43_radio_write(dev, 0x2d, e->radio_syn2d); 45 + b43_radio_write(dev, 0x37, e->radio_syn37); 46 + b43_radio_write(dev, 0x41, e->radio_syn41); 47 + b43_radio_write(dev, 0x43, e->radio_syn43); 48 + b43_radio_write(dev, 0x47, e->radio_syn47); 49 + b43_radio_write(dev, 0x4a, e->radio_syn4a); 50 + b43_radio_write(dev, 0x58, e->radio_syn58); 51 + b43_radio_write(dev, 0x5a, e->radio_syn5a); 52 + b43_radio_write(dev, 0x6a, e->radio_syn6a); 53 + b43_radio_write(dev, 0x6d, e->radio_syn6d); 54 + b43_radio_write(dev, 0x6e, e->radio_syn6e); 55 + b43_radio_write(dev, 0x92, e->radio_syn92); 56 + b43_radio_write(dev, 0x98, e->radio_syn98); 57 + 58 + for (i = 0; i < 2; i++) { 59 + routing = i ? 0x800 : 0x400; 60 + b43_radio_write(dev, routing | 0x4a, e->radio_rxtx4a); 61 + b43_radio_write(dev, routing | 0x58, e->radio_rxtx58); 62 + b43_radio_write(dev, routing | 0x5a, e->radio_rxtx5a); 63 + b43_radio_write(dev, routing | 0x6a, e->radio_rxtx6a); 64 + b43_radio_write(dev, routing | 0x6d, e->radio_rxtx6d); 65 + b43_radio_write(dev, routing | 0x6e, e->radio_rxtx6e); 66 + b43_radio_write(dev, routing | 0x92, e->radio_rxtx92); 67 + b43_radio_write(dev, routing | 0x98, e->radio_rxtx98); 68 + } 69 + 70 + udelay(50); 71 + 33 72 /* TODO */ 34 73 } 35 74
+29 -1
drivers/net/wireless/b43/radio_2059.h
··· 10 10 /* The channel frequency in MHz */ 11 11 u16 freq; 12 12 /* Values for radio registers */ 13 - /* TODO */ 13 + u8 radio_syn16; 14 + u8 radio_syn17; 15 + u8 radio_syn22; 16 + u8 radio_syn25; 17 + u8 radio_syn27; 18 + u8 radio_syn28; 19 + u8 radio_syn29; 20 + u8 radio_syn2c; 21 + u8 radio_syn2d; 22 + u8 radio_syn37; 23 + u8 radio_syn41; 24 + u8 radio_syn43; 25 + u8 radio_syn47; 26 + u8 radio_syn4a; 27 + u8 radio_syn58; 28 + u8 radio_syn5a; 29 + u8 radio_syn6a; 30 + u8 radio_syn6d; 31 + u8 radio_syn6e; 32 + u8 radio_syn92; 33 + u8 radio_syn98; 34 + u8 radio_rxtx4a; 35 + u8 radio_rxtx58; 36 + u8 radio_rxtx5a; 37 + u8 radio_rxtx6a; 38 + u8 radio_rxtx6d; 39 + u8 radio_rxtx6e; 40 + u8 radio_rxtx92; 41 + u8 radio_rxtx98; 14 42 /* Values for PHY registers */ 15 43 struct b43_phy_ht_channeltab_e_phy phy_regs; 16 44 };