GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / net / wireless / broadcom / b43 / radio_2059.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3
4   Broadcom B43 wireless driver
5   IEEE 802.11n 2059 radio device data tables
6
7   Copyright (c) 2011 Rafał Miłecki <zajec5@gmail.com>
8
9
10 */
11
12 #include "b43.h"
13 #include "radio_2059.h"
14
15 /* Extracted from MMIO dump of 6.30.223.141 */
16 static u16 r2059_phy_rev1_init[][2] = {
17         { 0x051, 0x70 }, { 0x05a, 0x03 }, { 0x079, 0x01 }, { 0x082, 0x70 },
18         { 0x083, 0x00 }, { 0x084, 0x70 }, { 0x09a, 0x7f }, { 0x0b6, 0x10 },
19         { 0x188, 0x05 },
20 };
21
22 #define RADIOREGS(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \
23                   r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \
24                   r20) \
25         .radio_syn16                    = r00,  \
26         .radio_syn17                    = r01,  \
27         .radio_syn22                    = r02,  \
28         .radio_syn25                    = r03,  \
29         .radio_syn27                    = r04,  \
30         .radio_syn28                    = r05,  \
31         .radio_syn29                    = r06,  \
32         .radio_syn2c                    = r07,  \
33         .radio_syn2d                    = r08,  \
34         .radio_syn37                    = r09,  \
35         .radio_syn41                    = r10,  \
36         .radio_syn43                    = r11,  \
37         .radio_syn47                    = r12,  \
38         .radio_rxtx4a                   = r13,  \
39         .radio_rxtx58                   = r14,  \
40         .radio_rxtx5a                   = r15,  \
41         .radio_rxtx6a                   = r16,  \
42         .radio_rxtx6d                   = r17,  \
43         .radio_rxtx6e                   = r18,  \
44         .radio_rxtx92                   = r19,  \
45         .radio_rxtx98                   = r20
46
47 #define PHYREGS(r0, r1, r2, r3, r4, r5) \
48         .phy_regs.bw1   = r0,   \
49         .phy_regs.bw2   = r1,   \
50         .phy_regs.bw3   = r2,   \
51         .phy_regs.bw4   = r3,   \
52         .phy_regs.bw5   = r4,   \
53         .phy_regs.bw6   = r5
54
55 /* Extracted from MMIO dump of 6.30.223.141
56  * TODO: Values for channels 12 & 13 are outdated (from some old 5.x driver)!
57  */
58 static const struct b43_phy_ht_channeltab_e_radio2059 b43_phy_ht_channeltab_radio2059[] = {
59         {
60                 .freq                   = 2412,
61                 RADIOREGS(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c,
62                           0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x61, 0x73,
63                           0x00, 0x00, 0x00, 0xd0, 0x00),
64                 PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),
65         },
66         {
67                 .freq                   = 2417,
68                 RADIOREGS(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71,
69                           0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x61, 0x73,
70                           0x00, 0x00, 0x00, 0xd0, 0x00),
71                 PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),
72         },
73         {
74                 .freq                   = 2422,
75                 RADIOREGS(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76,
76                           0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x61, 0x73,
77                           0x00, 0x00, 0x00, 0xd0, 0x00),
78                 PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),
79         },
80         {
81                 .freq                   = 2427,
82                 RADIOREGS(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b,
83                           0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x61, 0x73,
84                           0x00, 0x00, 0x00, 0xa0, 0x00),
85                 PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),
86         },
87         {
88                 .freq                   = 2432,
89                 RADIOREGS(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80,
90                           0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x61, 0x73,
91                           0x00, 0x00, 0x00, 0xa0, 0x00),
92                 PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),
93         },
94         {
95                 .freq                   = 2437,
96                 RADIOREGS(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85,
97                           0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x61, 0x73,
98                           0x00, 0x00, 0x00, 0xa0, 0x00),
99                 PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),
100         },
101         {
102                 .freq                   = 2442,
103                 RADIOREGS(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a,
104                           0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x73,
105                           0x00, 0x00, 0x00, 0x80, 0x00),
106                 PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),
107         },
108         {
109                 .freq                   = 2447,
110                 RADIOREGS(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f,
111                           0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x73,
112                           0x00, 0x00, 0x00, 0x80, 0x00),
113                 PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),
114         },
115         {
116                 .freq                   = 2452,
117                 RADIOREGS(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94,
118                           0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x73,
119                           0x00, 0x00, 0x00, 0x80, 0x00),
120                 PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),
121         },
122         {
123                 .freq                   = 2457,
124                 RADIOREGS(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99,
125                           0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x61, 0x73,
126                           0x00, 0x00, 0x00, 0x60, 0x00),
127                 PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),
128         },
129         {
130                 .freq                   = 2462,
131                 RADIOREGS(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e,
132                           0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x61, 0x73,
133                           0x00, 0x00, 0x00, 0x60, 0x00),
134                 PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),
135         },
136   {     .freq                   = 2467,
137         RADIOREGS(0x6c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa3,
138                   0x09, 0x0f, 0x05, 0x00, 0x05, 0x00, 0x61, 0x03,
139                   0x00, 0x00, 0x00, 0xf0, 0x00),
140         PHYREGS(0x03df, 0x03db, 0x03d7, 0x0422, 0x0427, 0x042b),
141   },
142   {     .freq                   = 2472,
143         RADIOREGS(0x70, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa8,
144                   0x09, 0x0f, 0x05, 0x00, 0x05, 0x00, 0x61, 0x03,
145                   0x00, 0x00, 0x00, 0xf0, 0x00),
146         PHYREGS(0x03e1, 0x03dd, 0x03d9, 0x0420, 0x0424, 0x0429),
147   },
148         {
149                 .freq                   = 5180,
150                 RADIOREGS(0xbe, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x06,
151                           0x02, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00,
152                           0x0f, 0x4f, 0xa3, 0x00, 0xfc),
153                 PHYREGS(0x081c, 0x0818, 0x0814, 0x01f9, 0x01fa, 0x01fb),
154         },
155         {
156                 .freq                   = 5200,
157                 RADIOREGS(0xc5, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x08,
158                           0x02, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00,
159                           0x0f, 0x4f, 0x93, 0x00, 0xfb),
160                 PHYREGS(0x0824, 0x0820, 0x081c, 0x01f7, 0x01f8, 0x01f9),
161         },
162         {
163                 .freq                   = 5220,
164                 RADIOREGS(0xcc, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0a,
165                           0x02, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00,
166                           0x0f, 0x4f, 0x93, 0x00, 0xea),
167                 PHYREGS(0x082c, 0x0828, 0x0824, 0x01f5, 0x01f6, 0x01f7),
168         },
169         {
170                 .freq                   = 5240,
171                 RADIOREGS(0xd2, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0c,
172                           0x02, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00,
173                           0x0f, 0x4f, 0x93, 0x00, 0xda),
174                 PHYREGS(0x0834, 0x0830, 0x082c, 0x01f3, 0x01f4, 0x01f5),
175         },
176         {
177                 .freq                   = 5260,
178                 RADIOREGS(0xd9, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0e,
179                           0x02, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x00,
180                           0x0f, 0x4f, 0x93, 0x00, 0xca),
181                 PHYREGS(0x083c, 0x0838, 0x0834, 0x01f1, 0x01f2, 0x01f3),
182         },
183         {
184                 .freq                   = 5280,
185                 RADIOREGS(0xe0, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x10,
186                           0x02, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x00,
187                           0x0f, 0x4f, 0x93, 0x00, 0xb9),
188                 PHYREGS(0x0844, 0x0840, 0x083c, 0x01f0, 0x01f0, 0x01f1),
189         },
190         {
191                 .freq                   = 5300,
192                 RADIOREGS(0xe6, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x12,
193                           0x02, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x00,
194                           0x0f, 0x4c, 0x83, 0x00, 0xb8),
195                 PHYREGS(0x084c, 0x0848, 0x0844, 0x01ee, 0x01ef, 0x01f0),
196         },
197         {
198                 .freq                   = 5320,
199                 RADIOREGS(0xed, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x14,
200                           0x02, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x00,
201                           0x0f, 0x4c, 0x83, 0x00, 0xa8),
202                 PHYREGS(0x0854, 0x0850, 0x084c, 0x01ec, 0x01ed, 0x01ee),
203         },
204         {
205                 .freq                   = 5500,
206                 RADIOREGS(0x29, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x26,
207                           0x02, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x00,
208                           0x0a, 0x46, 0x43, 0x00, 0x75),
209                 PHYREGS(0x089c, 0x0898, 0x0894, 0x01dc, 0x01dd, 0x01dd),
210         },
211         {
212                 .freq                   = 5520,
213                 RADIOREGS(0x30, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x28,
214                           0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
215                           0x0a, 0x46, 0x43, 0x00, 0x75),
216                 PHYREGS(0x08a4, 0x08a0, 0x089c, 0x01da, 0x01db, 0x01dc),
217         },
218         {
219                 .freq                   = 5540,
220                 RADIOREGS(0x36, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x2a,
221                           0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
222                           0x0a, 0x46, 0x43, 0x00, 0x75),
223                 PHYREGS(0x08ac, 0x08a8, 0x08a4, 0x01d8, 0x01d9, 0x01da),
224         },
225         {
226                 .freq                   = 5560,
227                 RADIOREGS(0x3d, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x2c,
228                           0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
229                           0x0a, 0x46, 0x43, 0x00, 0x75),
230                 PHYREGS(0x08b4, 0x08b0, 0x08ac, 0x01d7, 0x01d7, 0x01d8),
231         },
232         {
233                 .freq                   = 5580,
234                 RADIOREGS(0x44, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x2e,
235                           0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
236                           0x0a, 0x46, 0x43, 0x00, 0x74),
237                 PHYREGS(0x08bc, 0x08b8, 0x08b4, 0x01d5, 0x01d6, 0x01d7),
238         },
239         {
240                 .freq                   = 5600,
241                 RADIOREGS(0x4a, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x30,
242                           0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
243                           0x09, 0x44, 0x23, 0x00, 0x54),
244                 PHYREGS(0x08c4, 0x08c0, 0x08bc, 0x01d3, 0x01d4, 0x01d5),
245         },
246         {
247                 .freq                   = 5620,
248                 RADIOREGS(0x51, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x32,
249                           0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
250                           0x09, 0x44, 0x23, 0x00, 0x54),
251                 PHYREGS(0x08cc, 0x08c8, 0x08c4, 0x01d2, 0x01d2, 0x01d3),
252         },
253         {
254                 .freq                   = 5640,
255                 RADIOREGS(0x58, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x34,
256                           0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
257                           0x09, 0x44, 0x23, 0x00, 0x43),
258                 PHYREGS(0x08d4, 0x08d0, 0x08cc, 0x01d0, 0x01d1, 0x01d2),
259         },
260         {
261                 .freq                   = 5660,
262                 RADIOREGS(0x5e, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x36,
263                           0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
264                           0x09, 0x43, 0x23, 0x00, 0x43),
265                 PHYREGS(0x08dc, 0x08d8, 0x08d4, 0x01ce, 0x01cf, 0x01d0),
266         },
267         {
268                 .freq                   = 5680,
269                 RADIOREGS(0x65, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x38,
270                           0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
271                           0x09, 0x42, 0x23, 0x00, 0x43),
272                 PHYREGS(0x08e4, 0x08e0, 0x08dc, 0x01cd, 0x01ce, 0x01ce),
273         },
274         {
275                 .freq                   = 5700,
276                 RADIOREGS(0x6c, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x3a,
277                           0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
278                           0x08, 0x42, 0x13, 0x00, 0x32),
279                 PHYREGS(0x08ec, 0x08e8, 0x08e4, 0x01cb, 0x01cc, 0x01cd),
280         },
281         {
282                 .freq                   = 5745,
283                 RADIOREGS(0x7b, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x7d,
284                           0x04, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00,
285                           0x08, 0x42, 0x13, 0x00, 0x21),
286                 PHYREGS(0x08fe, 0x08fa, 0x08f6, 0x01c8, 0x01c8, 0x01c9),
287         },
288         {
289                 .freq                   = 5765,
290                 RADIOREGS(0x81, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x81,
291                           0x04, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00,
292                           0x08, 0x42, 0x13, 0x00, 0x11),
293                 PHYREGS(0x0906, 0x0902, 0x08fe, 0x01c6, 0x01c7, 0x01c8),
294         },
295         {
296                 .freq                   = 5785,
297                 RADIOREGS(0x88, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x85,
298                           0x04, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00,
299                           0x08, 0x42, 0x13, 0x00, 0x00),
300                 PHYREGS(0x090e, 0x090a, 0x0906, 0x01c4, 0x01c5, 0x01c6),
301         },
302         {
303                 .freq                   = 5805,
304                 RADIOREGS(0x8f, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x89,
305                           0x04, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00,
306                           0x06, 0x41, 0x03, 0x00, 0x00),
307                 PHYREGS(0x0916, 0x0912, 0x090e, 0x01c3, 0x01c4, 0x01c4),
308         },
309         {
310                 .freq                   = 5825,
311                 RADIOREGS(0x95, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x8d,
312                           0x04, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00,
313                           0x06, 0x41, 0x03, 0x00, 0x00),
314                 PHYREGS(0x091e, 0x091a, 0x0916, 0x01c1, 0x01c2, 0x01c3),
315         },
316 };
317
318 void r2059_upload_inittabs(struct b43_wldev *dev)
319 {
320         struct b43_phy *phy = &dev->phy;
321         u16 *table = NULL;
322         u16 size, i;
323
324         switch (phy->rev) {
325         case 1:
326                 table = r2059_phy_rev1_init[0];
327                 size = ARRAY_SIZE(r2059_phy_rev1_init);
328                 break;
329         default:
330                 B43_WARN_ON(1);
331                 return;
332         }
333
334         for (i = 0; i < size; i++, table += 2)
335                 b43_radio_write(dev, R2059_ALL | table[0], table[1]);
336 }
337
338 const struct b43_phy_ht_channeltab_e_radio2059
339 *b43_phy_ht_get_channeltab_e_r2059(struct b43_wldev *dev, u16 freq)
340 {
341         const struct b43_phy_ht_channeltab_e_radio2059 *e;
342         unsigned int i;
343
344         e = b43_phy_ht_channeltab_radio2059;
345         for (i = 0; i < ARRAY_SIZE(b43_phy_ht_channeltab_radio2059); i++, e++) {
346                 if (e->freq == freq)
347                         return e;
348         }
349
350         return NULL;
351 }