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