1300016Sadrian 2300016Sadrian/* 3300016Sadrian 4300016Sadrian Broadcom B43 wireless driver 5300016Sadrian IEEE 802.11n PHY data tables 6300016Sadrian 7300016Sadrian Copyright (c) 2008 Michael Buesch <m@bues.ch> 8300016Sadrian Copyright (c) 2010 Rafa�� Mi��ecki <zajec5@gmail.com> 9300016Sadrian 10300016Sadrian This program is free software; you can redistribute it and/or modify 11300016Sadrian it under the terms of the GNU General Public License as published by 12300016Sadrian the Free Software Foundation; either version 2 of the License, or 13300016Sadrian (at your option) any later version. 14300016Sadrian 15300016Sadrian This program is distributed in the hope that it will be useful, 16300016Sadrian but WITHOUT ANY WARRANTY; without even the implied warranty of 17300016Sadrian MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18300016Sadrian GNU General Public License for more details. 19300016Sadrian 20300016Sadrian You should have received a copy of the GNU General Public License 21300016Sadrian along with this program; see the file COPYING. If not, write to 22300016Sadrian the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, 23300016Sadrian Boston, MA 02110-1301, USA. 24300016Sadrian 25300016Sadrian*/ 26300016Sadrian 27300016Sadrian#include <sys/cdefs.h> 28300016Sadrian__FBSDID("$FreeBSD$"); 29300016Sadrian 30300016Sadrian/* 31300016Sadrian * The Broadcom Wireless LAN controller driver. 32300016Sadrian */ 33300016Sadrian 34300190Sadrian#include "opt_wlan.h" 35300193Sadrian#include "opt_bwn.h" 36300190Sadrian 37300016Sadrian#include <sys/param.h> 38300016Sadrian#include <sys/systm.h> 39300016Sadrian#include <sys/kernel.h> 40300016Sadrian#include <sys/malloc.h> 41300016Sadrian#include <sys/module.h> 42300016Sadrian#include <sys/endian.h> 43300016Sadrian#include <sys/errno.h> 44300016Sadrian#include <sys/firmware.h> 45300016Sadrian#include <sys/lock.h> 46300016Sadrian#include <sys/mutex.h> 47300016Sadrian#include <machine/bus.h> 48300016Sadrian#include <machine/resource.h> 49300016Sadrian#include <sys/bus.h> 50300016Sadrian#include <sys/rman.h> 51300016Sadrian#include <sys/socket.h> 52300016Sadrian#include <sys/sockio.h> 53300016Sadrian 54300016Sadrian#include <net/ethernet.h> 55300016Sadrian#include <net/if.h> 56300016Sadrian#include <net/if_var.h> 57300016Sadrian#include <net/if_arp.h> 58300016Sadrian#include <net/if_dl.h> 59300016Sadrian#include <net/if_llc.h> 60300016Sadrian#include <net/if_media.h> 61300016Sadrian#include <net/if_types.h> 62300016Sadrian 63300016Sadrian#include <dev/pci/pcivar.h> 64300016Sadrian#include <dev/pci/pcireg.h> 65300016Sadrian#include <dev/siba/siba_ids.h> 66300016Sadrian#include <dev/siba/sibareg.h> 67300016Sadrian#include <dev/siba/sibavar.h> 68300016Sadrian 69300016Sadrian#include <net80211/ieee80211_var.h> 70300016Sadrian#include <net80211/ieee80211_radiotap.h> 71300016Sadrian#include <net80211/ieee80211_regdomain.h> 72300016Sadrian#include <net80211/ieee80211_phy.h> 73300016Sadrian#include <net80211/ieee80211_ratectl.h> 74300016Sadrian 75300016Sadrian#include <dev/bwn/if_bwnreg.h> 76300016Sadrian#include <dev/bwn/if_bwnvar.h> 77300016Sadrian#include <dev/bwn/if_bwn_debug.h> 78300016Sadrian 79300016Sadrian#include <gnu/dev/bwn/phy_n/if_bwn_phy_n_regs.h> 80300016Sadrian#include <gnu/dev/bwn/phy_n/if_bwn_phy_n_ppr.h> 81300016Sadrian#include <gnu/dev/bwn/phy_n/if_bwn_phy_n_tables.h> 82300016Sadrian#include <gnu/dev/bwn/phy_n/if_bwn_phy_n_core.h> 83300016Sadrian#include <gnu/dev/bwn/phy_n/if_bwn_radio_2057.h> 84300016Sadrian 85300016Sadrianstatic uint16_t r2057_rev4_init[][2] = { 86300016Sadrian { 0x0E, 0x20 }, { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, 87300016Sadrian { 0x35, 0x26 }, { 0x3C, 0xff }, { 0x3D, 0xff }, { 0x3E, 0xff }, 88300016Sadrian { 0x3F, 0xff }, { 0x62, 0x33 }, { 0x8A, 0xf0 }, { 0x8B, 0x10 }, 89300016Sadrian { 0x8C, 0xf0 }, { 0x91, 0x3f }, { 0x92, 0x36 }, { 0xA4, 0x8c }, 90300016Sadrian { 0xA8, 0x55 }, { 0xAF, 0x01 }, { 0x10F, 0xf0 }, { 0x110, 0x10 }, 91300016Sadrian { 0x111, 0xf0 }, { 0x116, 0x3f }, { 0x117, 0x36 }, { 0x129, 0x8c }, 92300016Sadrian { 0x12D, 0x55 }, { 0x134, 0x01 }, { 0x15E, 0x00 }, { 0x15F, 0x00 }, 93300016Sadrian { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 }, 94300016Sadrian { 0x169, 0x02 }, { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 }, 95300016Sadrian { 0x1A4, 0x00 }, { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, 96300016Sadrian { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, 97300016Sadrian}; 98300016Sadrian 99300016Sadrianstatic uint16_t r2057_rev5_init[][2] = { 100300016Sadrian { 0x00, 0x00 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x23, 0x6 }, 101300016Sadrian { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, 102300016Sadrian { 0x59, 0x88 }, { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, 103300016Sadrian { 0x64, 0x0f }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 }, 104300016Sadrian { 0xA1, 0x20 }, { 0xD6, 0x70 }, { 0xDE, 0x88 }, { 0xE1, 0x20 }, 105300016Sadrian { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0x106, 0x01 }, { 0x116, 0x3f }, 106300016Sadrian { 0x117, 0x36 }, { 0x126, 0x20 }, { 0x15E, 0x00 }, { 0x15F, 0x00 }, 107300016Sadrian { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 }, 108300016Sadrian { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 }, 109300016Sadrian { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, 110300016Sadrian { 0x1AC, 0x00 }, { 0x1B7, 0x0c }, { 0x1C1, 0x01 }, { 0x1C2, 0x80 }, 111300016Sadrian}; 112300016Sadrian 113300016Sadrianstatic uint16_t r2057_rev5a_init[][2] = { 114300016Sadrian { 0x00, 0x15 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x23, 0x6 }, 115300016Sadrian { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, 116300016Sadrian { 0x59, 0x88 }, { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, 117300016Sadrian { 0x64, 0x0f }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 }, 118300016Sadrian { 0xC9, 0x01 }, { 0xD6, 0x70 }, { 0xDE, 0x88 }, { 0xE1, 0x20 }, 119300016Sadrian { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0x106, 0x01 }, { 0x116, 0x3f }, 120300016Sadrian { 0x117, 0x36 }, { 0x126, 0x20 }, { 0x14E, 0x01 }, { 0x15E, 0x00 }, 121300016Sadrian { 0x15F, 0x00 }, { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 }, 122300016Sadrian { 0x163, 0x00 }, { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 }, 123300016Sadrian { 0x1A4, 0x00 }, { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, 124300016Sadrian { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, { 0x1B7, 0x0c }, { 0x1C1, 0x01 }, 125300016Sadrian { 0x1C2, 0x80 }, 126300016Sadrian}; 127300016Sadrian 128300016Sadrianstatic uint16_t r2057_rev7_init[][2] = { 129300016Sadrian { 0x00, 0x00 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x31, 0x00 }, 130300016Sadrian { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, { 0x59, 0x88 }, 131300016Sadrian { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, { 0x64, 0x13 }, 132300016Sadrian { 0x66, 0xee }, { 0x6E, 0x58 }, { 0x75, 0x13 }, { 0x7B, 0x13 }, 133300016Sadrian { 0x7C, 0x14 }, { 0x7D, 0xee }, { 0x81, 0x01 }, { 0x91, 0x3f }, 134300016Sadrian { 0x92, 0x36 }, { 0xA1, 0x20 }, { 0xD6, 0x70 }, { 0xDE, 0x88 }, 135300016Sadrian { 0xE1, 0x20 }, { 0xE8, 0x0f }, { 0xE9, 0x13 }, { 0xEB, 0xee }, 136300016Sadrian { 0xF3, 0x58 }, { 0xFA, 0x13 }, { 0x100, 0x13 }, { 0x101, 0x14 }, 137300016Sadrian { 0x102, 0xee }, { 0x106, 0x01 }, { 0x116, 0x3f }, { 0x117, 0x36 }, 138300016Sadrian { 0x126, 0x20 }, { 0x15E, 0x00 }, { 0x15F, 0x00 }, { 0x160, 0x00 }, 139300016Sadrian { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 }, { 0x16A, 0x00 }, 140300016Sadrian { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 }, { 0x1A5, 0x00 }, 141300016Sadrian { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, 142300016Sadrian { 0x1B7, 0x05 }, { 0x1C2, 0xa0 }, 143300016Sadrian}; 144300016Sadrian 145300016Sadrian/* TODO: Which devices should use it? 146300016Sadrianstatic uint16_t r2057_rev8_init[][2] = { 147300016Sadrian { 0x00, 0x08 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x31, 0x00 }, 148300016Sadrian { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, { 0x59, 0x88 }, 149300016Sadrian { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, { 0x64, 0x0f }, 150300016Sadrian { 0x6E, 0x58 }, { 0x75, 0x13 }, { 0x7B, 0x13 }, { 0x7C, 0x0f }, 151300016Sadrian { 0x7D, 0xee }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 }, 152300016Sadrian { 0xA1, 0x20 }, { 0xC9, 0x01 }, { 0xD6, 0x70 }, { 0xDE, 0x88 }, 153300016Sadrian { 0xE1, 0x20 }, { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0xF3, 0x58 }, 154300016Sadrian { 0xFA, 0x13 }, { 0x100, 0x13 }, { 0x101, 0x0f }, { 0x102, 0xee }, 155300016Sadrian { 0x106, 0x01 }, { 0x116, 0x3f }, { 0x117, 0x36 }, { 0x126, 0x20 }, 156300016Sadrian { 0x14E, 0x01 }, { 0x15E, 0x00 }, { 0x15F, 0x00 }, { 0x160, 0x00 }, 157300016Sadrian { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 }, { 0x16A, 0x00 }, 158300016Sadrian { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 }, { 0x1A5, 0x00 }, 159300016Sadrian { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, 160300016Sadrian { 0x1B7, 0x05 }, { 0x1C2, 0xa0 }, 161300016Sadrian}; 162300016Sadrian*/ 163300016Sadrian 164300016Sadrian/* Extracted from MMIO dump of 6.30.223.141 */ 165300016Sadrianstatic uint16_t r2057_rev9_init[][2] = { 166300016Sadrian { 0x27, 0x1f }, { 0x28, 0x0a }, { 0x29, 0x2f }, { 0x42, 0x1f }, 167300016Sadrian { 0x48, 0x3f }, { 0x5c, 0x41 }, { 0x63, 0x14 }, { 0x64, 0x12 }, 168300016Sadrian { 0x66, 0xff }, { 0x74, 0xa3 }, { 0x7b, 0x14 }, { 0x7c, 0x14 }, 169300016Sadrian { 0x7d, 0xee }, { 0x86, 0xc0 }, { 0xc4, 0x10 }, { 0xc9, 0x01 }, 170300016Sadrian { 0xe1, 0x41 }, { 0xe8, 0x14 }, { 0xe9, 0x12 }, { 0xeb, 0xff }, 171300016Sadrian { 0xf5, 0x0a }, { 0xf8, 0x09 }, { 0xf9, 0xa3 }, { 0x100, 0x14 }, 172300016Sadrian { 0x101, 0x10 }, { 0x102, 0xee }, { 0x10b, 0xc0 }, { 0x149, 0x10 }, 173300016Sadrian { 0x14e, 0x01 }, { 0x1b7, 0x05 }, { 0x1c2, 0xa0 }, 174300016Sadrian}; 175300016Sadrian 176300016Sadrian/* Extracted from MMIO dump of 6.30.223.248 */ 177300016Sadrianstatic uint16_t r2057_rev14_init[][2] = { 178300016Sadrian { 0x011, 0xfc }, { 0x030, 0x24 }, { 0x040, 0x1c }, { 0x082, 0x08 }, 179300016Sadrian { 0x0b4, 0x44 }, { 0x0c8, 0x01 }, { 0x0c9, 0x01 }, { 0x107, 0x08 }, 180300016Sadrian { 0x14d, 0x01 }, { 0x14e, 0x01 }, { 0x1af, 0x40 }, { 0x1b0, 0x40 }, 181300016Sadrian { 0x1cc, 0x01 }, { 0x1cf, 0x10 }, { 0x1d0, 0x0f }, { 0x1d3, 0x10 }, 182300016Sadrian { 0x1d4, 0x0f }, 183300016Sadrian}; 184300016Sadrian 185300016Sadrian#define RADIOREGS7(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \ 186300016Sadrian r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \ 187300016Sadrian r20, r21, r22, r23, r24, r25, r26, r27) \ 188300016Sadrian .radio_vcocal_countval0 = r00, \ 189300016Sadrian .radio_vcocal_countval1 = r01, \ 190300016Sadrian .radio_rfpll_refmaster_sparextalsize = r02, \ 191300016Sadrian .radio_rfpll_loopfilter_r1 = r03, \ 192300016Sadrian .radio_rfpll_loopfilter_c2 = r04, \ 193300016Sadrian .radio_rfpll_loopfilter_c1 = r05, \ 194300016Sadrian .radio_cp_kpd_idac = r06, \ 195300016Sadrian .radio_rfpll_mmd0 = r07, \ 196300016Sadrian .radio_rfpll_mmd1 = r08, \ 197300016Sadrian .radio_vcobuf_tune = r09, \ 198300016Sadrian .radio_logen_mx2g_tune = r10, \ 199300016Sadrian .radio_logen_mx5g_tune = r11, \ 200300016Sadrian .radio_logen_indbuf2g_tune = r12, \ 201300016Sadrian .radio_logen_indbuf5g_tune = r13, \ 202300016Sadrian .radio_txmix2g_tune_boost_pu_core0 = r14, \ 203300016Sadrian .radio_pad2g_tune_pus_core0 = r15, \ 204300016Sadrian .radio_pga_boost_tune_core0 = r16, \ 205300016Sadrian .radio_txmix5g_boost_tune_core0 = r17, \ 206300016Sadrian .radio_pad5g_tune_misc_pus_core0 = r18, \ 207300016Sadrian .radio_lna2g_tune_core0 = r19, \ 208300016Sadrian .radio_lna5g_tune_core0 = r20, \ 209300016Sadrian .radio_txmix2g_tune_boost_pu_core1 = r21, \ 210300016Sadrian .radio_pad2g_tune_pus_core1 = r22, \ 211300016Sadrian .radio_pga_boost_tune_core1 = r23, \ 212300016Sadrian .radio_txmix5g_boost_tune_core1 = r24, \ 213300016Sadrian .radio_pad5g_tune_misc_pus_core1 = r25, \ 214300016Sadrian .radio_lna2g_tune_core1 = r26, \ 215300016Sadrian .radio_lna5g_tune_core1 = r27 216300016Sadrian 217300016Sadrian#define RADIOREGS7_2G(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \ 218300016Sadrian r10, r11, r12, r13, r14, r15, r16, r17) \ 219300016Sadrian .radio_vcocal_countval0 = r00, \ 220300016Sadrian .radio_vcocal_countval1 = r01, \ 221300016Sadrian .radio_rfpll_refmaster_sparextalsize = r02, \ 222300016Sadrian .radio_rfpll_loopfilter_r1 = r03, \ 223300016Sadrian .radio_rfpll_loopfilter_c2 = r04, \ 224300016Sadrian .radio_rfpll_loopfilter_c1 = r05, \ 225300016Sadrian .radio_cp_kpd_idac = r06, \ 226300016Sadrian .radio_rfpll_mmd0 = r07, \ 227300016Sadrian .radio_rfpll_mmd1 = r08, \ 228300016Sadrian .radio_vcobuf_tune = r09, \ 229300016Sadrian .radio_logen_mx2g_tune = r10, \ 230300016Sadrian .radio_logen_indbuf2g_tune = r11, \ 231300016Sadrian .radio_txmix2g_tune_boost_pu_core0 = r12, \ 232300016Sadrian .radio_pad2g_tune_pus_core0 = r13, \ 233300016Sadrian .radio_lna2g_tune_core0 = r14, \ 234300016Sadrian .radio_txmix2g_tune_boost_pu_core1 = r15, \ 235300016Sadrian .radio_pad2g_tune_pus_core1 = r16, \ 236300016Sadrian .radio_lna2g_tune_core1 = r17 237300016Sadrian 238300016Sadrian#define PHYREGS(r0, r1, r2, r3, r4, r5) \ 239300016Sadrian .phy_regs.phy_bw1a = r0, \ 240300016Sadrian .phy_regs.phy_bw2 = r1, \ 241300016Sadrian .phy_regs.phy_bw3 = r2, \ 242300016Sadrian .phy_regs.phy_bw4 = r3, \ 243300016Sadrian .phy_regs.phy_bw5 = r4, \ 244300016Sadrian .phy_regs.phy_bw6 = r5 245300016Sadrian 246300016Sadrian/* Copied from brcmsmac (5.75.11): chan_info_nphyrev8_2057_rev5 */ 247300016Sadrianstatic const struct bwn_nphy_chantabent_rev7_2g bwn_nphy_chantab_phy_rev8_radio_rev5[] = { 248300016Sadrian { 249300016Sadrian .freq = 2412, 250300016Sadrian RADIOREGS7_2G(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c, 251300016Sadrian 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61, 252300016Sadrian 0x03, 0xff), 253300016Sadrian PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443), 254300016Sadrian }, 255300016Sadrian { 256300016Sadrian .freq = 2417, 257300016Sadrian RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71, 258300016Sadrian 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61, 259300016Sadrian 0x03, 0xff), 260300016Sadrian PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441), 261300016Sadrian }, 262300016Sadrian { 263300016Sadrian .freq = 2422, 264300016Sadrian RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76, 265300016Sadrian 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xef, 0x61, 266300016Sadrian 0x03, 0xef), 267300016Sadrian PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f), 268300016Sadrian }, 269300016Sadrian { 270300016Sadrian .freq = 2427, 271300016Sadrian RADIOREGS7_2G(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b, 272300016Sadrian 0x09, 0x0c, 0x08, 0x0e, 0x61, 0x03, 0xdf, 0x61, 273300016Sadrian 0x03, 0xdf), 274300016Sadrian PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d), 275300016Sadrian }, 276300016Sadrian { 277300016Sadrian .freq = 2432, 278300016Sadrian RADIOREGS7_2G(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80, 279300016Sadrian 0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xcf, 0x61, 280300016Sadrian 0x03, 0xcf), 281300016Sadrian PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a), 282300016Sadrian }, 283300016Sadrian { 284300016Sadrian .freq = 2437, 285300016Sadrian RADIOREGS7_2G(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85, 286300016Sadrian 0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xbf, 0x61, 287300016Sadrian 0x03, 0xbf), 288300016Sadrian PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438), 289300016Sadrian }, 290300016Sadrian { 291300016Sadrian .freq = 2442, 292300016Sadrian RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a, 293300016Sadrian 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0xaf, 0x61, 294300016Sadrian 0x03, 0xaf), 295300016Sadrian PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436), 296300016Sadrian }, 297300016Sadrian { 298300016Sadrian .freq = 2447, 299300016Sadrian RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f, 300300016Sadrian 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x9f, 0x61, 301300016Sadrian 0x03, 0x9f), 302300016Sadrian PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434), 303300016Sadrian }, 304300016Sadrian { 305300016Sadrian .freq = 2452, 306300016Sadrian RADIOREGS7_2G(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94, 307300016Sadrian 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x8f, 0x61, 308300016Sadrian 0x03, 0x8f), 309300016Sadrian PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431), 310300016Sadrian }, 311300016Sadrian { 312300016Sadrian .freq = 2457, 313300016Sadrian RADIOREGS7_2G(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99, 314300016Sadrian 0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x7f, 0x61, 315300016Sadrian 0x03, 0x7f), 316300016Sadrian PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f), 317300016Sadrian }, 318300016Sadrian { 319300016Sadrian .freq = 2462, 320300016Sadrian RADIOREGS7_2G(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e, 321300016Sadrian 0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x6f, 0x61, 322300016Sadrian 0x03, 0x6f), 323300016Sadrian PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d), 324300016Sadrian }, 325300016Sadrian { 326300016Sadrian .freq = 2467, 327300016Sadrian RADIOREGS7_2G(0x6c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa3, 328300016Sadrian 0x09, 0x0b, 0x06, 0x0c, 0x61, 0x03, 0x5f, 0x61, 329300016Sadrian 0x03, 0x5f), 330300016Sadrian PHYREGS(0x03df, 0x03db, 0x03d7, 0x0422, 0x0427, 0x042b), 331300016Sadrian }, 332300016Sadrian { 333300016Sadrian .freq = 2472, 334300016Sadrian RADIOREGS7_2G(0x70, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa8, 335300016Sadrian 0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x4f, 0x61, 336300016Sadrian 0x03, 0x4f), 337300016Sadrian PHYREGS(0x03e1, 0x03dd, 0x03d9, 0x0420, 0x0424, 0x0429), 338300016Sadrian }, 339300016Sadrian { 340300016Sadrian .freq = 2484, 341300016Sadrian RADIOREGS7_2G(0x78, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xb4, 342300016Sadrian 0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x3f, 0x61, 343300016Sadrian 0x03, 0x3f), 344300016Sadrian PHYREGS(0x03e6, 0x03e2, 0x03de, 0x041b, 0x041f, 0x0424), 345300016Sadrian } 346300016Sadrian}; 347300016Sadrian 348300016Sadrian/* Extracted from MMIO dump of 6.30.223.248 */ 349300016Sadrianstatic const struct bwn_nphy_chantabent_rev7_2g bwn_nphy_chantab_phy_rev17_radio_rev14[] = { 350300016Sadrian { 351300016Sadrian .freq = 2412, 352300016Sadrian RADIOREGS7_2G(0x48, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x6c, 353300016Sadrian 0x09, 0x0d, 0x09, 0x03, 0x21, 0x53, 0xff, 0x21, 354300016Sadrian 0x53, 0xff), 355300016Sadrian PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443), 356300016Sadrian }, 357300016Sadrian { 358300016Sadrian .freq = 2417, 359300016Sadrian RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x71, 360300016Sadrian 0x09, 0x0d, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 361300016Sadrian 0x53, 0xff), 362300016Sadrian PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441), 363300016Sadrian }, 364300016Sadrian { 365300016Sadrian .freq = 2422, 366300016Sadrian RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x76, 367300016Sadrian 0x09, 0x0d, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 368300016Sadrian 0x53, 0xff), 369300016Sadrian PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f), 370300016Sadrian }, 371300016Sadrian { 372300016Sadrian .freq = 2427, 373300016Sadrian RADIOREGS7_2G(0x52, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x7b, 374300016Sadrian 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 375300016Sadrian 0x53, 0xff), 376300016Sadrian PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d), 377300016Sadrian }, 378300016Sadrian { 379300016Sadrian .freq = 2432, 380300016Sadrian RADIOREGS7_2G(0x55, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x80, 381300016Sadrian 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 382300016Sadrian 0x53, 0xff), 383300016Sadrian PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a), 384300016Sadrian }, 385300016Sadrian { 386300016Sadrian .freq = 2437, 387300016Sadrian RADIOREGS7_2G(0x58, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x85, 388300016Sadrian 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 389300016Sadrian 0x53, 0xff), 390300016Sadrian PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438), 391300016Sadrian }, 392300016Sadrian { 393300016Sadrian .freq = 2442, 394300016Sadrian RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x8a, 395300016Sadrian 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21, 396300016Sadrian 0x43, 0xff), 397300016Sadrian PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436), 398300016Sadrian }, 399300016Sadrian { 400300016Sadrian .freq = 2447, 401300016Sadrian RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x8f, 402300016Sadrian 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21, 403300016Sadrian 0x43, 0xff), 404300016Sadrian PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434), 405300016Sadrian }, 406300016Sadrian { 407300016Sadrian .freq = 2452, 408300016Sadrian RADIOREGS7_2G(0x62, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x94, 409300016Sadrian 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21, 410300016Sadrian 0x43, 0xff), 411300016Sadrian PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431), 412300016Sadrian }, 413300016Sadrian { 414300016Sadrian .freq = 2457, 415300016Sadrian RADIOREGS7_2G(0x66, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x99, 416300016Sadrian 0x09, 0x0b, 0x07, 0x03, 0x21, 0x43, 0xff, 0x21, 417300016Sadrian 0x43, 0xff), 418300016Sadrian PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f), 419300016Sadrian }, 420300016Sadrian { 421300016Sadrian .freq = 2462, 422300016Sadrian RADIOREGS7_2G(0x69, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x9e, 423300016Sadrian 0x09, 0x0b, 0x07, 0x03, 0x01, 0x43, 0xff, 0x01, 424300016Sadrian 0x43, 0xff), 425300016Sadrian PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d), 426300016Sadrian }, 427300016Sadrian}; 428300016Sadrian 429300016Sadrian/* Extracted from MMIO dump of 6.30.223.141 */ 430300016Sadrianstatic const struct bwn_nphy_chantabent_rev7 bwn_nphy_chantab_phy_rev16_radio_rev9[] = { 431300016Sadrian { 432300016Sadrian .freq = 2412, 433300016Sadrian RADIOREGS7(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c, 434300016Sadrian 0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63, 435300016Sadrian 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 436300016Sadrian 0x00, 0x00, 0xf0, 0x00), 437300016Sadrian PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443), 438300016Sadrian }, 439300016Sadrian { 440300016Sadrian .freq = 2417, 441300016Sadrian RADIOREGS7(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71, 442300016Sadrian 0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63, 443300016Sadrian 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 444300016Sadrian 0x00, 0x00, 0xf0, 0x00), 445300016Sadrian PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441), 446300016Sadrian }, 447300016Sadrian { 448300016Sadrian .freq = 2422, 449300016Sadrian RADIOREGS7(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76, 450300016Sadrian 0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63, 451300016Sadrian 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 452300016Sadrian 0x00, 0x00, 0xf0, 0x00), 453300016Sadrian PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f), 454300016Sadrian }, 455300016Sadrian { 456300016Sadrian .freq = 2427, 457300016Sadrian RADIOREGS7(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b, 458300016Sadrian 0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63, 459300016Sadrian 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 460300016Sadrian 0x00, 0x00, 0xf0, 0x00), 461300016Sadrian PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d), 462300016Sadrian }, 463300016Sadrian { 464300016Sadrian .freq = 2432, 465300016Sadrian RADIOREGS7(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80, 466300016Sadrian 0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63, 467300016Sadrian 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 468300016Sadrian 0x00, 0x00, 0xf0, 0x00), 469300016Sadrian PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a), 470300016Sadrian }, 471300016Sadrian { 472300016Sadrian .freq = 2437, 473300016Sadrian RADIOREGS7(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85, 474300016Sadrian 0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63, 475300016Sadrian 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 476300016Sadrian 0x00, 0x00, 0xf0, 0x00), 477300016Sadrian PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438), 478300016Sadrian }, 479300016Sadrian { 480300016Sadrian .freq = 2442, 481300016Sadrian RADIOREGS7(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a, 482300016Sadrian 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63, 483300016Sadrian 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 484300016Sadrian 0x00, 0x00, 0xf0, 0x00), 485300016Sadrian PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436), 486300016Sadrian }, 487300016Sadrian { 488300016Sadrian .freq = 2447, 489300016Sadrian RADIOREGS7(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f, 490300016Sadrian 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63, 491300016Sadrian 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 492300016Sadrian 0x00, 0x00, 0xf0, 0x00), 493300016Sadrian PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434), 494300016Sadrian }, 495300016Sadrian { 496300016Sadrian .freq = 2452, 497300016Sadrian RADIOREGS7(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94, 498300016Sadrian 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63, 499300016Sadrian 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 500300016Sadrian 0x00, 0x00, 0xf0, 0x00), 501300016Sadrian PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431), 502300016Sadrian }, 503300016Sadrian { 504300016Sadrian .freq = 2457, 505300016Sadrian RADIOREGS7(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99, 506300016Sadrian 0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63, 507300016Sadrian 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 508300016Sadrian 0x00, 0x00, 0xf0, 0x00), 509300016Sadrian PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f), 510300016Sadrian }, 511300016Sadrian { 512300016Sadrian .freq = 2462, 513300016Sadrian RADIOREGS7(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e, 514300016Sadrian 0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63, 515300016Sadrian 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 516300016Sadrian 0x00, 0x00, 0xf0, 0x00), 517300016Sadrian PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d), 518300016Sadrian }, 519300016Sadrian { 520300016Sadrian .freq = 5180, 521300016Sadrian RADIOREGS7(0xbe, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x06, 522300016Sadrian 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00, 523300016Sadrian 0x9f, 0x2f, 0xa3, 0x00, 0xfc, 0x00, 0x00, 0x4f, 524300016Sadrian 0x3a, 0x83, 0x00, 0xfc), 525300016Sadrian PHYREGS(0x081c, 0x0818, 0x0814, 0x01f9, 0x01fa, 0x01fb), 526300016Sadrian }, 527300016Sadrian { 528300016Sadrian .freq = 5200, 529300016Sadrian RADIOREGS7(0xc5, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x08, 530300016Sadrian 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00, 531300016Sadrian 0x7f, 0x2f, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x4c, 532300016Sadrian 0x4a, 0x83, 0x00, 0xf8), 533300016Sadrian PHYREGS(0x0824, 0x0820, 0x081c, 0x01f7, 0x01f8, 0x01f9), 534300016Sadrian }, 535300016Sadrian { 536300016Sadrian .freq = 5220, 537300016Sadrian RADIOREGS7(0xcc, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0a, 538300016Sadrian 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00, 539300016Sadrian 0x6d, 0x3d, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x2d, 540300016Sadrian 0x2a, 0x73, 0x00, 0xf8), 541300016Sadrian PHYREGS(0x082c, 0x0828, 0x0824, 0x01f5, 0x01f6, 0x01f7), 542300016Sadrian }, 543300016Sadrian { 544300016Sadrian .freq = 5240, 545300016Sadrian RADIOREGS7(0xd2, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0c, 546300016Sadrian 0x02, 0x0d, 0x00, 0x0d, 0x00, 0x8d, 0x00, 0x00, 547300016Sadrian 0x4d, 0x1c, 0x73, 0x00, 0xf8, 0x00, 0x00, 0x4d, 548300016Sadrian 0x2b, 0x73, 0x00, 0xf8), 549300016Sadrian PHYREGS(0x0834, 0x0830, 0x082c, 0x01f3, 0x01f4, 0x01f5), 550300016Sadrian }, 551300016Sadrian { 552300016Sadrian .freq = 5745, 553300016Sadrian RADIOREGS7(0x7b, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x7d, 554300016Sadrian 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, 555300016Sadrian 0x08, 0x03, 0x03, 0x00, 0x30, 0x00, 0x00, 0x06, 556300016Sadrian 0x02, 0x03, 0x00, 0x30), 557300016Sadrian PHYREGS(0x08fe, 0x08fa, 0x08f6, 0x01c8, 0x01c8, 0x01c9), 558300016Sadrian }, 559300016Sadrian { 560300016Sadrian .freq = 5765, 561300016Sadrian RADIOREGS7(0x81, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x81, 562300016Sadrian 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, 563300016Sadrian 0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 564300016Sadrian 0x02, 0x03, 0x00, 0x00), 565300016Sadrian PHYREGS(0x0906, 0x0902, 0x08fe, 0x01c6, 0x01c7, 0x01c8), 566300016Sadrian }, 567300016Sadrian { 568300016Sadrian .freq = 5785, 569300016Sadrian RADIOREGS7(0x88, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x85, 570300016Sadrian 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, 571300016Sadrian 0x08, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 572300016Sadrian 0x21, 0x03, 0x00, 0x00), 573300016Sadrian PHYREGS(0x090e, 0x090a, 0x0906, 0x01c4, 0x01c5, 0x01c6), 574300016Sadrian }, 575300016Sadrian { 576300016Sadrian .freq = 5805, 577300016Sadrian RADIOREGS7(0x8f, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x89, 578300016Sadrian 0x04, 0x07, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 579300016Sadrian 0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 580300016Sadrian 0x00, 0x03, 0x00, 0x00), 581300016Sadrian PHYREGS(0x0916, 0x0912, 0x090e, 0x01c3, 0x01c4, 0x01c4), 582300016Sadrian }, 583300016Sadrian { 584300016Sadrian .freq = 5825, 585300016Sadrian RADIOREGS7(0x95, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x8d, 586300016Sadrian 0x04, 0x07, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 587300016Sadrian 0x05, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 588300016Sadrian 0x00, 0x03, 0x00, 0x00), 589300016Sadrian PHYREGS(0x091e, 0x091a, 0x0916, 0x01c1, 0x01c2, 0x01c3), 590300016Sadrian }, 591300016Sadrian}; 592300016Sadrian 593300016Sadrianvoid r2057_upload_inittabs(struct bwn_mac *mac) 594300016Sadrian{ 595300016Sadrian struct bwn_phy *phy = &mac->mac_phy; 596300016Sadrian uint16_t *table = NULL; 597300016Sadrian uint16_t size, i; 598300016Sadrian 599300016Sadrian switch (phy->rev) { 600300016Sadrian case 7: 601300016Sadrian table = r2057_rev4_init[0]; 602300016Sadrian size = nitems(r2057_rev4_init); 603300016Sadrian break; 604300016Sadrian case 8: 605300016Sadrian if (phy->rf_rev == 5) { 606300016Sadrian table = r2057_rev5_init[0]; 607300016Sadrian size = nitems(r2057_rev5_init); 608300016Sadrian } else if (phy->rf_rev == 7) { 609300016Sadrian table = r2057_rev7_init[0]; 610300016Sadrian size = nitems(r2057_rev7_init); 611300016Sadrian } 612300016Sadrian break; 613300016Sadrian case 9: 614300016Sadrian if (phy->rf_rev == 5) { 615300016Sadrian table = r2057_rev5a_init[0]; 616300016Sadrian size = nitems(r2057_rev5a_init); 617300016Sadrian } 618300016Sadrian break; 619300016Sadrian case 16: 620300016Sadrian if (phy->rf_rev == 9) { 621300016Sadrian table = r2057_rev9_init[0]; 622300016Sadrian size = nitems(r2057_rev9_init); 623300016Sadrian } 624300016Sadrian break; 625300016Sadrian case 17: 626300016Sadrian if (phy->rf_rev == 14) { 627300016Sadrian table = r2057_rev14_init[0]; 628300016Sadrian size = nitems(r2057_rev14_init); 629300016Sadrian } 630300016Sadrian break; 631300016Sadrian } 632300016Sadrian 633300016Sadrian if (! table) { 634300016Sadrian device_printf(mac->mac_sc->sc_dev, 635300016Sadrian "%s: couldn't find a suitable table (phy ref=%d, rf_ref=%d)\n", 636300016Sadrian __func__, 637300016Sadrian phy->rev, 638300016Sadrian phy->rf_rev); 639300016Sadrian } 640300016Sadrian 641300016Sadrian if (table) { 642300016Sadrian for (i = 0; i < size; i++, table += 2) 643300016Sadrian BWN_RF_WRITE(mac, table[0], table[1]); 644300016Sadrian } 645300016Sadrian} 646300016Sadrian 647300016Sadrianvoid r2057_get_chantabent_rev7(struct bwn_mac *mac, uint16_t freq, 648300016Sadrian const struct bwn_nphy_chantabent_rev7 **tabent_r7, 649300016Sadrian const struct bwn_nphy_chantabent_rev7_2g **tabent_r7_2g) 650300016Sadrian{ 651300016Sadrian struct bwn_phy *phy = &mac->mac_phy; 652300016Sadrian const struct bwn_nphy_chantabent_rev7 *e_r7 = NULL; 653300016Sadrian const struct bwn_nphy_chantabent_rev7_2g *e_r7_2g = NULL; 654300016Sadrian unsigned int len, i; 655300016Sadrian 656300016Sadrian *tabent_r7 = NULL; 657300016Sadrian *tabent_r7_2g = NULL; 658300016Sadrian 659300016Sadrian switch (phy->rev) { 660300016Sadrian case 8: 661300016Sadrian if (phy->rf_rev == 5) { 662300016Sadrian e_r7_2g = bwn_nphy_chantab_phy_rev8_radio_rev5; 663300016Sadrian len = nitems(bwn_nphy_chantab_phy_rev8_radio_rev5); 664300016Sadrian } 665300016Sadrian break; 666300016Sadrian case 16: 667300016Sadrian if (phy->rf_rev == 9) { 668300016Sadrian e_r7 = bwn_nphy_chantab_phy_rev16_radio_rev9; 669300016Sadrian len = nitems(bwn_nphy_chantab_phy_rev16_radio_rev9); 670300016Sadrian } 671300016Sadrian break; 672300016Sadrian case 17: 673300016Sadrian if (phy->rf_rev == 14) { 674300016Sadrian e_r7_2g = bwn_nphy_chantab_phy_rev17_radio_rev14; 675300016Sadrian len = nitems(bwn_nphy_chantab_phy_rev17_radio_rev14); 676300016Sadrian } 677300016Sadrian break; 678300016Sadrian default: 679300016Sadrian break; 680300016Sadrian } 681300016Sadrian 682300016Sadrian if (e_r7) { 683300016Sadrian for (i = 0; i < len; i++, e_r7++) { 684300016Sadrian if (e_r7->freq == freq) { 685300016Sadrian *tabent_r7 = e_r7; 686300016Sadrian return; 687300016Sadrian } 688300016Sadrian } 689300016Sadrian } else if (e_r7_2g) { 690300016Sadrian for (i = 0; i < len; i++, e_r7_2g++) { 691300016Sadrian if (e_r7_2g->freq == freq) { 692300016Sadrian *tabent_r7_2g = e_r7_2g; 693300016Sadrian return; 694300016Sadrian } 695300016Sadrian } 696300016Sadrian } else { 697300016Sadrian device_printf(mac->mac_sc->sc_dev, 698300016Sadrian "%s: couldn't find a suitable chantab\n", 699300016Sadrian __func__); 700300016Sadrian } 701300016Sadrian} 702