xref: /openbmc/linux/drivers/net/wireless/broadcom/b43/tables_phy_lcn.c (revision 58e16d792a6a8c6b750f637a4649967fcac853dc)
1*ca47d344SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
258619b14SKalle Valo /*
358619b14SKalle Valo 
458619b14SKalle Valo   Broadcom B43 wireless driver
558619b14SKalle Valo   IEEE 802.11n LCN-PHY data tables
658619b14SKalle Valo 
758619b14SKalle Valo   Copyright (c) 2011 Rafał Miłecki <zajec5@gmail.com>
858619b14SKalle Valo 
958619b14SKalle Valo 
1058619b14SKalle Valo */
1158619b14SKalle Valo 
1258619b14SKalle Valo #include "b43.h"
1358619b14SKalle Valo #include "tables_phy_lcn.h"
1458619b14SKalle Valo #include "phy_common.h"
1558619b14SKalle Valo #include "phy_lcn.h"
1658619b14SKalle Valo 
1758619b14SKalle Valo struct b43_lcntab_tx_gain_tbl_entry {
1858619b14SKalle Valo 	u8 gm;
1958619b14SKalle Valo 	u8 pga;
2058619b14SKalle Valo 	u8 pad;
2158619b14SKalle Valo 	u8 dac;
2258619b14SKalle Valo 	u8 bb_mult;
2358619b14SKalle Valo };
2458619b14SKalle Valo 
2558619b14SKalle Valo /**************************************************
2658619b14SKalle Valo  * Static tables.
2758619b14SKalle Valo  **************************************************/
2858619b14SKalle Valo 
2958619b14SKalle Valo static const u16 b43_lcntab_0x02[] = {
3058619b14SKalle Valo 	0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
3158619b14SKalle Valo 	0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
3258619b14SKalle Valo 	0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
3358619b14SKalle Valo 	0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
3458619b14SKalle Valo 	0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
3558619b14SKalle Valo 	0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
3658619b14SKalle Valo 	0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
3758619b14SKalle Valo 	0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
3858619b14SKalle Valo 	0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
3958619b14SKalle Valo 	0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
4058619b14SKalle Valo 	0x014d, 0x014d, 0x014d, 0x014d,
4158619b14SKalle Valo };
4258619b14SKalle Valo 
4358619b14SKalle Valo static const u16 b43_lcntab_0x01[] = {
4458619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
4558619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
4658619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
4758619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
4858619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
4958619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
5058619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
5158619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
5258619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
5358619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
5458619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000,
5558619b14SKalle Valo };
5658619b14SKalle Valo 
5758619b14SKalle Valo static const u32 b43_lcntab_0x0b[] = {
5858619b14SKalle Valo 	0x000141f8, 0x000021f8, 0x000021fb, 0x000041fb,
5958619b14SKalle Valo 	0x0001fedb, 0x0000217b, 0x00002133, 0x000040eb,
6058619b14SKalle Valo 	0x0001fea3, 0x0000024b,
6158619b14SKalle Valo };
6258619b14SKalle Valo 
6358619b14SKalle Valo static const u32 b43_lcntab_0x0c[] = {
6458619b14SKalle Valo 	0x00100001, 0x00200010, 0x00300001, 0x00400010,
6558619b14SKalle Valo 	0x00500022, 0x00600122, 0x00700222, 0x00800322,
6658619b14SKalle Valo 	0x00900422, 0x00a00522, 0x00b00622, 0x00c00722,
6758619b14SKalle Valo 	0x00d00822, 0x00f00922, 0x00100a22, 0x00200b22,
6858619b14SKalle Valo 	0x00300c22, 0x00400d22, 0x00500e22, 0x00600f22,
6958619b14SKalle Valo };
7058619b14SKalle Valo 
7158619b14SKalle Valo static const u32 b43_lcntab_0x0d[] = {
7258619b14SKalle Valo 	0x00000000, 0x00000000, 0x10000000, 0x00000000,
7358619b14SKalle Valo 	0x20000000, 0x00000000, 0x30000000, 0x00000000,
7458619b14SKalle Valo 	0x40000000, 0x00000000, 0x50000000, 0x00000000,
7558619b14SKalle Valo 	0x60000000, 0x00000000, 0x70000000, 0x00000000,
7658619b14SKalle Valo 	0x80000000, 0x00000000, 0x90000000, 0x00000008,
7758619b14SKalle Valo 	0xa0000000, 0x00000008, 0xb0000000, 0x00000008,
7858619b14SKalle Valo 	0xc0000000, 0x00000008, 0xd0000000, 0x00000008,
7958619b14SKalle Valo 	0xe0000000, 0x00000008, 0xf0000000, 0x00000008,
8058619b14SKalle Valo 	0x00000000, 0x00000009, 0x10000000, 0x00000009,
8158619b14SKalle Valo 	0x20000000, 0x00000019, 0x30000000, 0x00000019,
8258619b14SKalle Valo 	0x40000000, 0x00000019, 0x50000000, 0x00000019,
8358619b14SKalle Valo 	0x60000000, 0x00000019, 0x70000000, 0x00000019,
8458619b14SKalle Valo 	0x80000000, 0x00000019, 0x90000000, 0x00000019,
8558619b14SKalle Valo 	0xa0000000, 0x00000019, 0xb0000000, 0x00000019,
8658619b14SKalle Valo 	0xc0000000, 0x00000019, 0xd0000000, 0x00000019,
8758619b14SKalle Valo 	0xe0000000, 0x00000019, 0xf0000000, 0x00000019,
8858619b14SKalle Valo 	0x00000000, 0x0000001a, 0x10000000, 0x0000001a,
8958619b14SKalle Valo 	0x20000000, 0x0000001a, 0x30000000, 0x0000001a,
9058619b14SKalle Valo 	0x40000000, 0x0000001a, 0x50000000, 0x00000002,
9158619b14SKalle Valo 	0x60000000, 0x00000002, 0x70000000, 0x00000002,
9258619b14SKalle Valo 	0x80000000, 0x00000002, 0x90000000, 0x00000002,
9358619b14SKalle Valo 	0xa0000000, 0x00000002, 0xb0000000, 0x00000002,
9458619b14SKalle Valo 	0xc0000000, 0x0000000a, 0xd0000000, 0x0000000a,
9558619b14SKalle Valo 	0xe0000000, 0x0000000a, 0xf0000000, 0x0000000a,
9658619b14SKalle Valo 	0x00000000, 0x0000000b, 0x10000000, 0x0000000b,
9758619b14SKalle Valo 	0x20000000, 0x0000000b, 0x30000000, 0x0000000b,
9858619b14SKalle Valo 	0x40000000, 0x0000000b, 0x50000000, 0x0000001b,
9958619b14SKalle Valo 	0x60000000, 0x0000001b, 0x70000000, 0x0000001b,
10058619b14SKalle Valo 	0x80000000, 0x0000001b, 0x90000000, 0x0000001b,
10158619b14SKalle Valo 	0xa0000000, 0x0000001b, 0xb0000000, 0x0000001b,
10258619b14SKalle Valo 	0xc0000000, 0x0000001b, 0xd0000000, 0x0000001b,
10358619b14SKalle Valo 	0xe0000000, 0x0000001b, 0xf0000000, 0x0000001b,
10458619b14SKalle Valo 	0x00000000, 0x0000001c, 0x10000000, 0x0000001c,
10558619b14SKalle Valo 	0x20000000, 0x0000001c, 0x30000000, 0x0000001c,
10658619b14SKalle Valo 	0x40000000, 0x0000001c, 0x50000000, 0x0000001c,
10758619b14SKalle Valo 	0x60000000, 0x0000001c, 0x70000000, 0x0000001c,
10858619b14SKalle Valo 	0x80000000, 0x0000001c, 0x90000000, 0x0000001c,
10958619b14SKalle Valo };
11058619b14SKalle Valo 
11158619b14SKalle Valo static const u16 b43_lcntab_0x0e[] = {
11258619b14SKalle Valo 	0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406,
11358619b14SKalle Valo 	0x0407, 0x0408, 0x0409, 0x040a, 0x058b, 0x058c,
11458619b14SKalle Valo 	0x058d, 0x058e, 0x058f, 0x0090, 0x0091, 0x0092,
11558619b14SKalle Valo 	0x0193, 0x0194, 0x0195, 0x0196, 0x0197, 0x0198,
11658619b14SKalle Valo 	0x0199, 0x019a, 0x019b, 0x019c, 0x019d, 0x019e,
11758619b14SKalle Valo 	0x019f, 0x01a0, 0x01a1, 0x01a2, 0x01a3, 0x01a4,
11858619b14SKalle Valo 	0x01a5, 0x0000,
11958619b14SKalle Valo };
12058619b14SKalle Valo 
12158619b14SKalle Valo static const u16 b43_lcntab_0x0f[] = {
12258619b14SKalle Valo 	0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
12358619b14SKalle Valo 	0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
12458619b14SKalle Valo 	0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
12558619b14SKalle Valo 	0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
12658619b14SKalle Valo 	0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
12758619b14SKalle Valo 	0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
12858619b14SKalle Valo 	0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
12958619b14SKalle Valo 	0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
13058619b14SKalle Valo 	0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
13158619b14SKalle Valo 	0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
13258619b14SKalle Valo 	0x000a, 0x0009, 0x0006, 0x0005,
13358619b14SKalle Valo };
13458619b14SKalle Valo 
13558619b14SKalle Valo static const u16 b43_lcntab_0x10[] = {
13658619b14SKalle Valo 	0x005f, 0x0036, 0x0029, 0x001f, 0x005f, 0x0036,
13758619b14SKalle Valo 	0x0029, 0x001f, 0x005f, 0x0036, 0x0029, 0x001f,
13858619b14SKalle Valo 	0x005f, 0x0036, 0x0029, 0x001f,
13958619b14SKalle Valo };
14058619b14SKalle Valo 
14158619b14SKalle Valo static const u16 b43_lcntab_0x11[] = {
14258619b14SKalle Valo 	0x0009, 0x000f, 0x0014, 0x0018, 0x00fe, 0x0007,
14358619b14SKalle Valo 	0x000b, 0x000f, 0x00fb, 0x00fe, 0x0001, 0x0005,
14458619b14SKalle Valo 	0x0008, 0x000b, 0x000e, 0x0011, 0x0014, 0x0017,
14558619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
14658619b14SKalle Valo 	0x0000, 0x0003, 0x0006, 0x0009, 0x000c, 0x000f,
14758619b14SKalle Valo 	0x0012, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
14858619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003,
14958619b14SKalle Valo 	0x0006, 0x0009, 0x000c, 0x000f, 0x0012, 0x0015,
15058619b14SKalle Valo 	0x0018, 0x001b, 0x0000, 0x0000, 0x0000, 0x0000,
15158619b14SKalle Valo 	0x0000, 0x0000, 0x0003, 0x00eb, 0x0000, 0x0000,
15258619b14SKalle Valo };
15358619b14SKalle Valo 
15458619b14SKalle Valo static const u32 b43_lcntab_0x12[] = {
15558619b14SKalle Valo 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
15658619b14SKalle Valo 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
15758619b14SKalle Valo 	0x00000004, 0x00000000, 0x00000004, 0x00000008,
15858619b14SKalle Valo 	0x00000001, 0x00000005, 0x00000009, 0x0000000d,
15958619b14SKalle Valo 	0x0000004d, 0x0000008d, 0x0000000d, 0x0000004d,
16058619b14SKalle Valo 	0x0000008d, 0x000000cd, 0x0000004f, 0x0000008f,
16158619b14SKalle Valo 	0x000000cf, 0x000000d3, 0x00000113, 0x00000513,
16258619b14SKalle Valo 	0x00000913, 0x00000953, 0x00000d53, 0x00001153,
16358619b14SKalle Valo 	0x00001193, 0x00005193, 0x00009193, 0x0000d193,
16458619b14SKalle Valo 	0x00011193, 0x00000000, 0x00000000, 0x00000000,
16558619b14SKalle Valo 	0x00000000, 0x00000000, 0x00000000, 0x00000004,
16658619b14SKalle Valo 	0x00000000, 0x00000004, 0x00000008, 0x00000001,
16758619b14SKalle Valo 	0x00000005, 0x00000009, 0x0000000d, 0x0000004d,
16858619b14SKalle Valo 	0x0000008d, 0x0000000d, 0x0000004d, 0x0000008d,
16958619b14SKalle Valo 	0x000000cd, 0x0000004f, 0x0000008f, 0x000000cf,
17058619b14SKalle Valo 	0x000000d3, 0x00000113, 0x00000513, 0x00000913,
17158619b14SKalle Valo 	0x00000953, 0x00000d53, 0x00001153, 0x00005153,
17258619b14SKalle Valo 	0x00009153, 0x0000d153, 0x00011153, 0x00015153,
17358619b14SKalle Valo 	0x00019153, 0x0001d153, 0x00000000, 0x00000000,
17458619b14SKalle Valo 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
17558619b14SKalle Valo 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
17658619b14SKalle Valo 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
17758619b14SKalle Valo 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
17858619b14SKalle Valo 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
17958619b14SKalle Valo };
18058619b14SKalle Valo 
18158619b14SKalle Valo static const u16 b43_lcntab_0x14[] = {
18258619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
18358619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
18458619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
18558619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
18658619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
18758619b14SKalle Valo 	0x0002, 0x0003, 0x0001, 0x0003, 0x0002, 0x0001,
18858619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
18958619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
19058619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
19158619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
19258619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
19358619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
19458619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
19558619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
19658619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
19758619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0003,
19858619b14SKalle Valo 	0x0001, 0x0003, 0x0002, 0x0001, 0x0001, 0x0001,
19958619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
20058619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
20158619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
20258619b14SKalle Valo 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
20358619b14SKalle Valo 	0x0001, 0x0001,
20458619b14SKalle Valo };
20558619b14SKalle Valo 
20658619b14SKalle Valo static const u16 b43_lcntab_0x17[] = {
20758619b14SKalle Valo 	0x001a, 0x0034, 0x004e, 0x0068, 0x009c, 0x00d0,
20858619b14SKalle Valo 	0x00ea, 0x0104, 0x0034, 0x0068, 0x009c, 0x00d0,
20958619b14SKalle Valo 	0x0138, 0x01a0, 0x01d4, 0x0208, 0x004e, 0x009c,
21058619b14SKalle Valo 	0x00ea, 0x0138, 0x01d4, 0x0270, 0x02be, 0x030c,
21158619b14SKalle Valo 	0x0068, 0x00d0, 0x0138, 0x01a0, 0x0270, 0x0340,
21258619b14SKalle Valo 	0x03a8, 0x0410, 0x0018, 0x009c, 0x00d0, 0x0104,
21358619b14SKalle Valo 	0x00ea, 0x0138, 0x0186, 0x00d0, 0x0104, 0x0104,
21458619b14SKalle Valo 	0x0138, 0x016c, 0x016c, 0x01a0, 0x0138, 0x0186,
21558619b14SKalle Valo 	0x0186, 0x01d4, 0x0222, 0x0222, 0x0270, 0x0104,
21658619b14SKalle Valo 	0x0138, 0x016c, 0x0138, 0x016c, 0x01a0, 0x01d4,
21758619b14SKalle Valo 	0x01a0, 0x01d4, 0x0208, 0x0208, 0x023c, 0x0186,
21858619b14SKalle Valo 	0x01d4, 0x0222, 0x01d4, 0x0222, 0x0270, 0x02be,
21958619b14SKalle Valo 	0x0270, 0x02be, 0x030c, 0x030c, 0x035a, 0x0036,
22058619b14SKalle Valo 	0x006c, 0x00a2, 0x00d8, 0x0144, 0x01b0, 0x01e6,
22158619b14SKalle Valo 	0x021c, 0x006c, 0x00d8, 0x0144, 0x01b0, 0x0288,
22258619b14SKalle Valo 	0x0360, 0x03cc, 0x0438, 0x00a2, 0x0144, 0x01e6,
22358619b14SKalle Valo 	0x0288, 0x03cc, 0x0510, 0x05b2, 0x0654, 0x00d8,
22458619b14SKalle Valo 	0x01b0, 0x0288, 0x0360, 0x0510, 0x06c0, 0x0798,
22558619b14SKalle Valo 	0x0870, 0x0018, 0x0144, 0x01b0, 0x021c, 0x01e6,
22658619b14SKalle Valo 	0x0288, 0x032a, 0x01b0, 0x021c, 0x021c, 0x0288,
22758619b14SKalle Valo 	0x02f4, 0x02f4, 0x0360, 0x0288, 0x032a, 0x032a,
22858619b14SKalle Valo 	0x03cc, 0x046e, 0x046e, 0x0510, 0x021c, 0x0288,
22958619b14SKalle Valo 	0x02f4, 0x0288, 0x02f4, 0x0360, 0x03cc, 0x0360,
23058619b14SKalle Valo 	0x03cc, 0x0438, 0x0438, 0x04a4, 0x032a, 0x03cc,
23158619b14SKalle Valo 	0x046e, 0x03cc, 0x046e, 0x0510, 0x05b2, 0x0510,
23258619b14SKalle Valo 	0x05b2, 0x0654, 0x0654, 0x06f6,
23358619b14SKalle Valo };
23458619b14SKalle Valo 
23558619b14SKalle Valo static const u16 b43_lcntab_0x00[] = {
23658619b14SKalle Valo 	0x0200, 0x0300, 0x0400, 0x0600, 0x0800, 0x0b00,
23758619b14SKalle Valo 	0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005,
23858619b14SKalle Valo 	0x1006, 0x1007, 0x1707, 0x2007, 0x2d07, 0x4007,
23958619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
24058619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
24158619b14SKalle Valo 	0x0000, 0x0000, 0x0200, 0x0300, 0x0400, 0x0600,
24258619b14SKalle Valo 	0x0800, 0x0b00, 0x1000, 0x1001, 0x1002, 0x1003,
24358619b14SKalle Valo 	0x1004, 0x1005, 0x1006, 0x1007, 0x1707, 0x2007,
24458619b14SKalle Valo 	0x2d07, 0x4007, 0x0000, 0x0000, 0x0000, 0x0000,
24558619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
24658619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
24758619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
24858619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
24958619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
25058619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000,
25158619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
25258619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
25358619b14SKalle Valo 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
25458619b14SKalle Valo };
25558619b14SKalle Valo 
25658619b14SKalle Valo static const u32 b43_lcntab_0x18[] = {
25758619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
25858619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
25958619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
26058619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
26158619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
26258619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
26358619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
26458619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
26558619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
26658619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
26758619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
26858619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
26958619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
27058619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
27158619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
27258619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
27358619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
27458619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
27558619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
27658619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
27758619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
27858619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
27958619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
28058619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
28158619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
28258619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
28358619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
28458619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
28558619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
28658619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
28758619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
28858619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
28958619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
29058619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
29158619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
29258619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
29358619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
29458619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
29558619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
29658619b14SKalle Valo 	0x00080000, 0x00080000, 0x00080000, 0x00080000,
29758619b14SKalle Valo };
29858619b14SKalle Valo 
29958619b14SKalle Valo /**************************************************
30058619b14SKalle Valo  * TX gain.
30158619b14SKalle Valo  **************************************************/
30258619b14SKalle Valo 
30358619b14SKalle Valo static const struct b43_lcntab_tx_gain_tbl_entry
30458619b14SKalle Valo 	b43_lcntab_tx_gain_tbl_2ghz_ext_pa_rev0[B43_LCNTAB_TX_GAIN_SIZE] = {
30558619b14SKalle Valo 	{ 0x03, 0x00, 0x1f, 0x0, 0x48 },
30658619b14SKalle Valo 	{ 0x03, 0x00, 0x1f, 0x0, 0x46 },
30758619b14SKalle Valo 	{ 0x03, 0x00, 0x1f, 0x0, 0x44 },
30858619b14SKalle Valo 	{ 0x03, 0x00, 0x1e, 0x0, 0x43 },
30958619b14SKalle Valo 	{ 0x03, 0x00, 0x1d, 0x0, 0x44 },
31058619b14SKalle Valo 	{ 0x03, 0x00, 0x1c, 0x0, 0x44 },
31158619b14SKalle Valo 	{ 0x03, 0x00, 0x1b, 0x0, 0x45 },
31258619b14SKalle Valo 	{ 0x03, 0x00, 0x1a, 0x0, 0x46 },
31358619b14SKalle Valo 	{ 0x03, 0x00, 0x19, 0x0, 0x46 },
31458619b14SKalle Valo 	{ 0x03, 0x00, 0x18, 0x0, 0x47 },
31558619b14SKalle Valo 	{ 0x03, 0x00, 0x17, 0x0, 0x48 },
31658619b14SKalle Valo 	{ 0x03, 0x00, 0x17, 0x0, 0x46 },
31758619b14SKalle Valo 	{ 0x03, 0x00, 0x16, 0x0, 0x47 },
31858619b14SKalle Valo 	{ 0x03, 0x00, 0x15, 0x0, 0x48 },
31958619b14SKalle Valo 	{ 0x03, 0x00, 0x15, 0x0, 0x46 },
32058619b14SKalle Valo 	{ 0x03, 0x00, 0x15, 0x0, 0x44 },
32158619b14SKalle Valo 	{ 0x03, 0x00, 0x15, 0x0, 0x42 },
32258619b14SKalle Valo 	{ 0x03, 0x00, 0x15, 0x0, 0x40 },
32358619b14SKalle Valo 	{ 0x03, 0x00, 0x15, 0x0, 0x3f },
32458619b14SKalle Valo 	{ 0x03, 0x00, 0x14, 0x0, 0x40 },
32558619b14SKalle Valo 	{ 0x03, 0x00, 0x13, 0x0, 0x41 },
32658619b14SKalle Valo 	{ 0x03, 0x00, 0x13, 0x0, 0x40 },
32758619b14SKalle Valo 	{ 0x03, 0x00, 0x12, 0x0, 0x41 },
32858619b14SKalle Valo 	{ 0x03, 0x00, 0x12, 0x0, 0x40 },
32958619b14SKalle Valo 	{ 0x03, 0x00, 0x11, 0x0, 0x41 },
33058619b14SKalle Valo 	{ 0x03, 0x00, 0x11, 0x0, 0x40 },
33158619b14SKalle Valo 	{ 0x03, 0x00, 0x10, 0x0, 0x41 },
33258619b14SKalle Valo 	{ 0x03, 0x00, 0x10, 0x0, 0x40 },
33358619b14SKalle Valo 	{ 0x03, 0x00, 0x10, 0x0, 0x3e },
33458619b14SKalle Valo 	{ 0x03, 0x00, 0x10, 0x0, 0x3c },
33558619b14SKalle Valo 	{ 0x03, 0x00, 0x10, 0x0, 0x3a },
33658619b14SKalle Valo 	{ 0x03, 0x00, 0x0f, 0x0, 0x3d },
33758619b14SKalle Valo 	{ 0x03, 0x00, 0x0f, 0x0, 0x3b },
33858619b14SKalle Valo 	{ 0x03, 0x00, 0x0e, 0x0, 0x3d },
33958619b14SKalle Valo 	{ 0x03, 0x00, 0x0e, 0x0, 0x3c },
34058619b14SKalle Valo 	{ 0x03, 0x00, 0x0e, 0x0, 0x3a },
34158619b14SKalle Valo 	{ 0x03, 0x00, 0x0d, 0x0, 0x3c },
34258619b14SKalle Valo 	{ 0x03, 0x00, 0x0d, 0x0, 0x3b },
34358619b14SKalle Valo 	{ 0x03, 0x00, 0x0c, 0x0, 0x3e },
34458619b14SKalle Valo 	{ 0x03, 0x00, 0x0c, 0x0, 0x3c },
34558619b14SKalle Valo 	{ 0x03, 0x00, 0x0c, 0x0, 0x3a },
34658619b14SKalle Valo 	{ 0x03, 0x00, 0x0b, 0x0, 0x3e },
34758619b14SKalle Valo 	{ 0x03, 0x00, 0x0b, 0x0, 0x3c },
34858619b14SKalle Valo 	{ 0x03, 0x00, 0x0b, 0x0, 0x3b },
34958619b14SKalle Valo 	{ 0x03, 0x00, 0x0b, 0x0, 0x39 },
35058619b14SKalle Valo 	{ 0x03, 0x00, 0x0a, 0x0, 0x3d },
35158619b14SKalle Valo 	{ 0x03, 0x00, 0x0a, 0x0, 0x3b },
35258619b14SKalle Valo 	{ 0x03, 0x00, 0x0a, 0x0, 0x39 },
35358619b14SKalle Valo 	{ 0x03, 0x00, 0x09, 0x0, 0x3e },
35458619b14SKalle Valo 	{ 0x03, 0x00, 0x09, 0x0, 0x3c },
35558619b14SKalle Valo 	{ 0x03, 0x00, 0x09, 0x0, 0x3a },
35658619b14SKalle Valo 	{ 0x03, 0x00, 0x09, 0x0, 0x39 },
35758619b14SKalle Valo 	{ 0x03, 0x00, 0x08, 0x0, 0x3e },
35858619b14SKalle Valo 	{ 0x03, 0x00, 0x08, 0x0, 0x3c },
35958619b14SKalle Valo 	{ 0x03, 0x00, 0x08, 0x0, 0x3a },
36058619b14SKalle Valo 	{ 0x03, 0x00, 0x08, 0x0, 0x39 },
36158619b14SKalle Valo 	{ 0x03, 0x00, 0x08, 0x0, 0x37 },
36258619b14SKalle Valo 	{ 0x03, 0x00, 0x07, 0x0, 0x3d },
36358619b14SKalle Valo 	{ 0x03, 0x00, 0x07, 0x0, 0x3c },
36458619b14SKalle Valo 	{ 0x03, 0x00, 0x07, 0x0, 0x3a },
36558619b14SKalle Valo 	{ 0x03, 0x00, 0x07, 0x0, 0x38 },
36658619b14SKalle Valo 	{ 0x03, 0x00, 0x07, 0x0, 0x37 },
36758619b14SKalle Valo 	{ 0x03, 0x00, 0x06, 0x0, 0x3e },
36858619b14SKalle Valo 	{ 0x03, 0x00, 0x06, 0x0, 0x3c },
36958619b14SKalle Valo 	{ 0x03, 0x00, 0x06, 0x0, 0x3a },
37058619b14SKalle Valo 	{ 0x03, 0x00, 0x06, 0x0, 0x39 },
37158619b14SKalle Valo 	{ 0x03, 0x00, 0x06, 0x0, 0x37 },
37258619b14SKalle Valo 	{ 0x03, 0x00, 0x06, 0x0, 0x36 },
37358619b14SKalle Valo 	{ 0x03, 0x00, 0x06, 0x0, 0x34 },
37458619b14SKalle Valo 	{ 0x03, 0x00, 0x05, 0x0, 0x3d },
37558619b14SKalle Valo 	{ 0x03, 0x00, 0x05, 0x0, 0x3b },
37658619b14SKalle Valo 	{ 0x03, 0x00, 0x05, 0x0, 0x39 },
37758619b14SKalle Valo 	{ 0x03, 0x00, 0x05, 0x0, 0x38 },
37858619b14SKalle Valo 	{ 0x03, 0x00, 0x05, 0x0, 0x36 },
37958619b14SKalle Valo 	{ 0x03, 0x00, 0x05, 0x0, 0x35 },
38058619b14SKalle Valo 	{ 0x03, 0x00, 0x05, 0x0, 0x33 },
38158619b14SKalle Valo 	{ 0x03, 0x00, 0x04, 0x0, 0x3e },
38258619b14SKalle Valo 	{ 0x03, 0x00, 0x04, 0x0, 0x3c },
38358619b14SKalle Valo 	{ 0x03, 0x00, 0x04, 0x0, 0x3a },
38458619b14SKalle Valo 	{ 0x03, 0x00, 0x04, 0x0, 0x39 },
38558619b14SKalle Valo 	{ 0x03, 0x00, 0x04, 0x0, 0x37 },
38658619b14SKalle Valo 	{ 0x03, 0x00, 0x04, 0x0, 0x36 },
38758619b14SKalle Valo 	{ 0x03, 0x00, 0x04, 0x0, 0x34 },
38858619b14SKalle Valo 	{ 0x03, 0x00, 0x04, 0x0, 0x33 },
38958619b14SKalle Valo 	{ 0x03, 0x00, 0x04, 0x0, 0x31 },
39058619b14SKalle Valo 	{ 0x03, 0x00, 0x04, 0x0, 0x30 },
39158619b14SKalle Valo 	{ 0x03, 0x00, 0x04, 0x0, 0x2e },
39258619b14SKalle Valo 	{ 0x03, 0x00, 0x03, 0x0, 0x3c },
39358619b14SKalle Valo 	{ 0x03, 0x00, 0x03, 0x0, 0x3a },
39458619b14SKalle Valo 	{ 0x03, 0x00, 0x03, 0x0, 0x39 },
39558619b14SKalle Valo 	{ 0x03, 0x00, 0x03, 0x0, 0x37 },
39658619b14SKalle Valo 	{ 0x03, 0x00, 0x03, 0x0, 0x36 },
39758619b14SKalle Valo 	{ 0x03, 0x00, 0x03, 0x0, 0x34 },
39858619b14SKalle Valo 	{ 0x03, 0x00, 0x03, 0x0, 0x33 },
39958619b14SKalle Valo 	{ 0x03, 0x00, 0x03, 0x0, 0x31 },
40058619b14SKalle Valo 	{ 0x03, 0x00, 0x03, 0x0, 0x30 },
40158619b14SKalle Valo 	{ 0x03, 0x00, 0x03, 0x0, 0x2e },
40258619b14SKalle Valo 	{ 0x03, 0x00, 0x03, 0x0, 0x2d },
40358619b14SKalle Valo 	{ 0x03, 0x00, 0x03, 0x0, 0x2c },
40458619b14SKalle Valo 	{ 0x03, 0x00, 0x03, 0x0, 0x2b },
40558619b14SKalle Valo 	{ 0x03, 0x00, 0x03, 0x0, 0x29 },
40658619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x3d },
40758619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x3b },
40858619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x39 },
40958619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x38 },
41058619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x36 },
41158619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x35 },
41258619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x33 },
41358619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x32 },
41458619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x30 },
41558619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x2f },
41658619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x2e },
41758619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x2c },
41858619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x2b },
41958619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x2a },
42058619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x29 },
42158619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x27 },
42258619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x26 },
42358619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x25 },
42458619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x24 },
42558619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x23 },
42658619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x22 },
42758619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x21 },
42858619b14SKalle Valo 	{ 0x03, 0x00, 0x02, 0x0, 0x20 },
42958619b14SKalle Valo 	{ 0x03, 0x00, 0x01, 0x0, 0x3f },
43058619b14SKalle Valo 	{ 0x03, 0x00, 0x01, 0x0, 0x3d },
43158619b14SKalle Valo 	{ 0x03, 0x00, 0x01, 0x0, 0x3b },
43258619b14SKalle Valo 	{ 0x03, 0x00, 0x01, 0x0, 0x39 },
43358619b14SKalle Valo };
43458619b14SKalle Valo 
43558619b14SKalle Valo /**************************************************
43658619b14SKalle Valo  * SW control.
43758619b14SKalle Valo  **************************************************/
43858619b14SKalle Valo 
43958619b14SKalle Valo static const u16 b43_lcntab_sw_ctl_4313_epa_rev0[] = {
44058619b14SKalle Valo 	0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
44158619b14SKalle Valo 	0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
44258619b14SKalle Valo 	0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
44358619b14SKalle Valo 	0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
44458619b14SKalle Valo 	0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
44558619b14SKalle Valo 	0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
44658619b14SKalle Valo 	0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
44758619b14SKalle Valo 	0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
44858619b14SKalle Valo 	0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
44958619b14SKalle Valo 	0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
45058619b14SKalle Valo 	0x0002, 0x0008, 0x0004, 0x0001,
45158619b14SKalle Valo };
45258619b14SKalle Valo 
45358619b14SKalle Valo /**************************************************
45458619b14SKalle Valo  * R/W ops.
45558619b14SKalle Valo  **************************************************/
45658619b14SKalle Valo 
b43_lcntab_read(struct b43_wldev * dev,u32 offset)45758619b14SKalle Valo u32 b43_lcntab_read(struct b43_wldev *dev, u32 offset)
45858619b14SKalle Valo {
45958619b14SKalle Valo 	u32 type, value;
46058619b14SKalle Valo 
46158619b14SKalle Valo 	type = offset & B43_LCNTAB_TYPEMASK;
46258619b14SKalle Valo 	offset &= ~B43_LCNTAB_TYPEMASK;
46358619b14SKalle Valo 	B43_WARN_ON(offset > 0xFFFF);
46458619b14SKalle Valo 
46558619b14SKalle Valo 	switch (type) {
46658619b14SKalle Valo 	case B43_LCNTAB_8BIT:
46758619b14SKalle Valo 		b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
46858619b14SKalle Valo 		value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO) & 0xFF;
46958619b14SKalle Valo 		break;
47058619b14SKalle Valo 	case B43_LCNTAB_16BIT:
47158619b14SKalle Valo 		b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
47258619b14SKalle Valo 		value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO);
47358619b14SKalle Valo 		break;
47458619b14SKalle Valo 	case B43_LCNTAB_32BIT:
47558619b14SKalle Valo 		b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
47658619b14SKalle Valo 		value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO);
47758619b14SKalle Valo 		value |= (b43_phy_read(dev, B43_PHY_LCN_TABLE_DATAHI) << 16);
47858619b14SKalle Valo 		break;
47958619b14SKalle Valo 	default:
48058619b14SKalle Valo 		B43_WARN_ON(1);
48158619b14SKalle Valo 		value = 0;
48258619b14SKalle Valo 	}
48358619b14SKalle Valo 
48458619b14SKalle Valo 	return value;
48558619b14SKalle Valo }
48658619b14SKalle Valo 
b43_lcntab_read_bulk(struct b43_wldev * dev,u32 offset,unsigned int nr_elements,void * _data)48758619b14SKalle Valo void b43_lcntab_read_bulk(struct b43_wldev *dev, u32 offset,
48858619b14SKalle Valo 			  unsigned int nr_elements, void *_data)
48958619b14SKalle Valo {
49058619b14SKalle Valo 	u32 type;
49158619b14SKalle Valo 	u8 *data = _data;
49258619b14SKalle Valo 	unsigned int i;
49358619b14SKalle Valo 
49458619b14SKalle Valo 	type = offset & B43_LCNTAB_TYPEMASK;
49558619b14SKalle Valo 	offset &= ~B43_LCNTAB_TYPEMASK;
49658619b14SKalle Valo 	B43_WARN_ON(offset > 0xFFFF);
49758619b14SKalle Valo 
49858619b14SKalle Valo 	b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
49958619b14SKalle Valo 
50058619b14SKalle Valo 	for (i = 0; i < nr_elements; i++) {
50158619b14SKalle Valo 		switch (type) {
50258619b14SKalle Valo 		case B43_LCNTAB_8BIT:
50358619b14SKalle Valo 			*data = b43_phy_read(dev,
50458619b14SKalle Valo 					     B43_PHY_LCN_TABLE_DATALO) & 0xFF;
50558619b14SKalle Valo 			data++;
50658619b14SKalle Valo 			break;
50758619b14SKalle Valo 		case B43_LCNTAB_16BIT:
50858619b14SKalle Valo 			*((u16 *)data) = b43_phy_read(dev,
50958619b14SKalle Valo 						      B43_PHY_LCN_TABLE_DATALO);
51058619b14SKalle Valo 			data += 2;
51158619b14SKalle Valo 			break;
51258619b14SKalle Valo 		case B43_LCNTAB_32BIT:
51358619b14SKalle Valo 			*((u32 *)data) = b43_phy_read(dev,
51458619b14SKalle Valo 						B43_PHY_LCN_TABLE_DATALO);
51558619b14SKalle Valo 			*((u32 *)data) |= (b43_phy_read(dev,
51658619b14SKalle Valo 					   B43_PHY_LCN_TABLE_DATAHI) << 16);
51758619b14SKalle Valo 			data += 4;
51858619b14SKalle Valo 			break;
51958619b14SKalle Valo 		default:
52058619b14SKalle Valo 			B43_WARN_ON(1);
52158619b14SKalle Valo 		}
52258619b14SKalle Valo 	}
52358619b14SKalle Valo }
52458619b14SKalle Valo 
b43_lcntab_write(struct b43_wldev * dev,u32 offset,u32 value)52558619b14SKalle Valo void b43_lcntab_write(struct b43_wldev *dev, u32 offset, u32 value)
52658619b14SKalle Valo {
52758619b14SKalle Valo 	u32 type;
52858619b14SKalle Valo 
52958619b14SKalle Valo 	type = offset & B43_LCNTAB_TYPEMASK;
53058619b14SKalle Valo 	offset &= 0xFFFF;
53158619b14SKalle Valo 
53258619b14SKalle Valo 	switch (type) {
53358619b14SKalle Valo 	case B43_LCNTAB_8BIT:
53458619b14SKalle Valo 		B43_WARN_ON(value & ~0xFF);
53558619b14SKalle Valo 		b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
53658619b14SKalle Valo 		b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
53758619b14SKalle Valo 		break;
53858619b14SKalle Valo 	case B43_LCNTAB_16BIT:
53958619b14SKalle Valo 		B43_WARN_ON(value & ~0xFFFF);
54058619b14SKalle Valo 		b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
54158619b14SKalle Valo 		b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
54258619b14SKalle Valo 		break;
54358619b14SKalle Valo 	case B43_LCNTAB_32BIT:
54458619b14SKalle Valo 		b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
54558619b14SKalle Valo 		b43_phy_write(dev, B43_PHY_LCN_TABLE_DATAHI, value >> 16);
54658619b14SKalle Valo 		b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value & 0xFFFF);
54758619b14SKalle Valo 		break;
54858619b14SKalle Valo 	default:
54958619b14SKalle Valo 		B43_WARN_ON(1);
55058619b14SKalle Valo 	}
55158619b14SKalle Valo 
55258619b14SKalle Valo 	return;
55358619b14SKalle Valo }
55458619b14SKalle Valo 
b43_lcntab_write_bulk(struct b43_wldev * dev,u32 offset,unsigned int nr_elements,const void * _data)55558619b14SKalle Valo void b43_lcntab_write_bulk(struct b43_wldev *dev, u32 offset,
55658619b14SKalle Valo 			   unsigned int nr_elements, const void *_data)
55758619b14SKalle Valo {
55858619b14SKalle Valo 	u32 type, value;
55958619b14SKalle Valo 	const u8 *data = _data;
56058619b14SKalle Valo 	unsigned int i;
56158619b14SKalle Valo 
56258619b14SKalle Valo 	type = offset & B43_LCNTAB_TYPEMASK;
56358619b14SKalle Valo 	offset &= ~B43_LCNTAB_TYPEMASK;
56458619b14SKalle Valo 	B43_WARN_ON(offset > 0xFFFF);
56558619b14SKalle Valo 
56658619b14SKalle Valo 	b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
56758619b14SKalle Valo 
56858619b14SKalle Valo 	for (i = 0; i < nr_elements; i++) {
56958619b14SKalle Valo 		switch (type) {
57058619b14SKalle Valo 		case B43_LCNTAB_8BIT:
57158619b14SKalle Valo 			value = *data;
57258619b14SKalle Valo 			data++;
57358619b14SKalle Valo 			B43_WARN_ON(value & ~0xFF);
57458619b14SKalle Valo 			b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
57558619b14SKalle Valo 			break;
57658619b14SKalle Valo 		case B43_LCNTAB_16BIT:
57758619b14SKalle Valo 			value = *((u16 *)data);
57858619b14SKalle Valo 			data += 2;
57958619b14SKalle Valo 			B43_WARN_ON(value & ~0xFFFF);
58058619b14SKalle Valo 			b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
58158619b14SKalle Valo 			break;
58258619b14SKalle Valo 		case B43_LCNTAB_32BIT:
58358619b14SKalle Valo 			value = *((u32 *)data);
58458619b14SKalle Valo 			data += 4;
58558619b14SKalle Valo 			b43_phy_write(dev, B43_PHY_LCN_TABLE_DATAHI,
58658619b14SKalle Valo 				      value >> 16);
58758619b14SKalle Valo 			b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO,
58858619b14SKalle Valo 				      value & 0xFFFF);
58958619b14SKalle Valo 			break;
59058619b14SKalle Valo 		default:
59158619b14SKalle Valo 			B43_WARN_ON(1);
59258619b14SKalle Valo 		}
59358619b14SKalle Valo 	}
59458619b14SKalle Valo }
59558619b14SKalle Valo 
59658619b14SKalle Valo /**************************************************
59758619b14SKalle Valo  * Tables ops.
59858619b14SKalle Valo  **************************************************/
59958619b14SKalle Valo 
60058619b14SKalle Valo #define lcntab_upload(dev, offset, data) do { \
60158619b14SKalle Valo 		b43_lcntab_write_bulk(dev, offset, ARRAY_SIZE(data), data); \
60258619b14SKalle Valo 	} while (0)
b43_phy_lcn_upload_static_tables(struct b43_wldev * dev)60358619b14SKalle Valo static void b43_phy_lcn_upload_static_tables(struct b43_wldev *dev)
60458619b14SKalle Valo {
60558619b14SKalle Valo 	lcntab_upload(dev, B43_LCNTAB16(0x02, 0), b43_lcntab_0x02);
60658619b14SKalle Valo 	lcntab_upload(dev, B43_LCNTAB16(0x01, 0), b43_lcntab_0x01);
60758619b14SKalle Valo 	lcntab_upload(dev, B43_LCNTAB32(0x0b, 0), b43_lcntab_0x0b);
60858619b14SKalle Valo 	lcntab_upload(dev, B43_LCNTAB32(0x0c, 0), b43_lcntab_0x0c);
60958619b14SKalle Valo 	lcntab_upload(dev, B43_LCNTAB32(0x0d, 0), b43_lcntab_0x0d);
61058619b14SKalle Valo 	lcntab_upload(dev, B43_LCNTAB16(0x0e, 0), b43_lcntab_0x0e);
61158619b14SKalle Valo 	lcntab_upload(dev, B43_LCNTAB16(0x0f, 0), b43_lcntab_0x0f);
61258619b14SKalle Valo 	lcntab_upload(dev, B43_LCNTAB16(0x10, 0), b43_lcntab_0x10);
61358619b14SKalle Valo 	lcntab_upload(dev, B43_LCNTAB16(0x11, 0), b43_lcntab_0x11);
61458619b14SKalle Valo 	lcntab_upload(dev, B43_LCNTAB32(0x12, 0), b43_lcntab_0x12);
61558619b14SKalle Valo 	lcntab_upload(dev, B43_LCNTAB16(0x14, 0), b43_lcntab_0x14);
61658619b14SKalle Valo 	lcntab_upload(dev, B43_LCNTAB16(0x17, 0), b43_lcntab_0x17);
61758619b14SKalle Valo 	lcntab_upload(dev, B43_LCNTAB16(0x00, 0), b43_lcntab_0x00);
61858619b14SKalle Valo 	lcntab_upload(dev, B43_LCNTAB32(0x18, 0), b43_lcntab_0x18);
61958619b14SKalle Valo }
62058619b14SKalle Valo 
b43_phy_lcn_load_tx_gain_tab(struct b43_wldev * dev,const struct b43_lcntab_tx_gain_tbl_entry * gain_table)62158619b14SKalle Valo static void b43_phy_lcn_load_tx_gain_tab(struct b43_wldev *dev,
62258619b14SKalle Valo 			const struct b43_lcntab_tx_gain_tbl_entry *gain_table)
62358619b14SKalle Valo {
62458619b14SKalle Valo 	u32 i;
62558619b14SKalle Valo 	u32 val;
62658619b14SKalle Valo 
62758619b14SKalle Valo 	u16 pa_gain = 0x70;
62858619b14SKalle Valo 	if (dev->dev->bus_sprom->boardflags_lo & B43_BFL_FEM)
62958619b14SKalle Valo 		pa_gain = 0x10;
63058619b14SKalle Valo 
63158619b14SKalle Valo 	for (i = 0; i < B43_LCNTAB_TX_GAIN_SIZE; i++) {
63258619b14SKalle Valo 		val = ((pa_gain << 24) |
63358619b14SKalle Valo 		       (gain_table[i].pad << 16) |
63458619b14SKalle Valo 		       (gain_table[i].pga << 8) |
63558619b14SKalle Valo 			gain_table[i].gm);
63658619b14SKalle Valo 		b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0xc0 + i), val);
63758619b14SKalle Valo 
63858619b14SKalle Valo 		/* brcmsmac doesn't maskset, we follow newer wl here */
63958619b14SKalle Valo 		val = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0x140 + i));
64058619b14SKalle Valo 		val &= 0x000fffff;
64158619b14SKalle Valo 		val |= ((gain_table[i].dac << 28) |
64258619b14SKalle Valo 			(gain_table[i].bb_mult << 20));
64358619b14SKalle Valo 		b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0x140 + i), val);
64458619b14SKalle Valo 	}
64558619b14SKalle Valo }
64658619b14SKalle Valo 
64758619b14SKalle Valo /* wlc_lcnphy_load_rfpower */
b43_phy_lcn_load_rfpower(struct b43_wldev * dev)64858619b14SKalle Valo static void b43_phy_lcn_load_rfpower(struct b43_wldev *dev)
64958619b14SKalle Valo {
65058619b14SKalle Valo 	u32 bbmult, rfgain;
65158619b14SKalle Valo 	u8 i;
65258619b14SKalle Valo 
65358619b14SKalle Valo 	for (i = 0; i < 128; i++) {
65458619b14SKalle Valo 		bbmult = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0x140 + i));
65558619b14SKalle Valo 		bbmult >>= 20;
65658619b14SKalle Valo 		rfgain = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0xc0 + i));
65758619b14SKalle Valo 
65858619b14SKalle Valo 		/* TODO: calculate value for 0x240 + i table offset
65958619b14SKalle Valo 		 * b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0x240 + i), val);
66058619b14SKalle Valo 		 */
66158619b14SKalle Valo 	}
66258619b14SKalle Valo }
66358619b14SKalle Valo 
66458619b14SKalle Valo /* Not implemented in brcmsmac, noticed in wl in MMIO dump */
b43_phy_lcn_rewrite_rfpower_table(struct b43_wldev * dev)66558619b14SKalle Valo static void b43_phy_lcn_rewrite_rfpower_table(struct b43_wldev *dev)
66658619b14SKalle Valo {
66758619b14SKalle Valo 	int i;
66858619b14SKalle Valo 	u32 tmp;
66958619b14SKalle Valo 	for (i = 0; i < 128; i++) {
67058619b14SKalle Valo 		tmp = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0x240 + i));
67158619b14SKalle Valo 		b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0x240 + i), tmp);
67258619b14SKalle Valo 	}
67358619b14SKalle Valo }
67458619b14SKalle Valo 
67558619b14SKalle Valo /* wlc_lcnphy_clear_papd_comptable */
b43_phy_lcn_clean_papd_comp_table(struct b43_wldev * dev)67658619b14SKalle Valo static void b43_phy_lcn_clean_papd_comp_table(struct b43_wldev *dev)
67758619b14SKalle Valo {
67858619b14SKalle Valo 	u8 i;
67958619b14SKalle Valo 
68058619b14SKalle Valo 	for (i = 0; i < 0x80; i++)
68158619b14SKalle Valo 		b43_lcntab_write(dev, B43_LCNTAB32(0x18, i), 0x80000);
68258619b14SKalle Valo }
68358619b14SKalle Valo 
68458619b14SKalle Valo /* wlc_lcnphy_tbl_init */
b43_phy_lcn_tables_init(struct b43_wldev * dev)68558619b14SKalle Valo void b43_phy_lcn_tables_init(struct b43_wldev *dev)
68658619b14SKalle Valo {
68758619b14SKalle Valo 	struct ssb_sprom *sprom = dev->dev->bus_sprom;
68858619b14SKalle Valo 
68958619b14SKalle Valo 	b43_phy_lcn_upload_static_tables(dev);
69058619b14SKalle Valo 
69157fbcce3SJohannes Berg 	if (b43_current_band(dev->wl) == NL80211_BAND_2GHZ) {
69258619b14SKalle Valo 		if (sprom->boardflags_lo & B43_BFL_FEM)
69358619b14SKalle Valo 			b43_phy_lcn_load_tx_gain_tab(dev,
69458619b14SKalle Valo 				b43_lcntab_tx_gain_tbl_2ghz_ext_pa_rev0);
69558619b14SKalle Valo 		else
69658619b14SKalle Valo 			b43err(dev->wl,
69758619b14SKalle Valo 			       "TX gain table unknown for this card\n");
69858619b14SKalle Valo 	}
69958619b14SKalle Valo 
70058619b14SKalle Valo 	if (sprom->boardflags_lo & B43_BFL_FEM &&
70158619b14SKalle Valo 	    !(sprom->boardflags_hi & B43_BFH_FEM_BT))
70258619b14SKalle Valo 		b43_lcntab_write_bulk(dev, B43_LCNTAB16(0xf, 0),
70358619b14SKalle Valo 			ARRAY_SIZE(b43_lcntab_sw_ctl_4313_epa_rev0),
70458619b14SKalle Valo 			b43_lcntab_sw_ctl_4313_epa_rev0);
70558619b14SKalle Valo 	else
70658619b14SKalle Valo 		b43err(dev->wl, "SW ctl table is unknown for this card\n");
70758619b14SKalle Valo 
70858619b14SKalle Valo 	b43_phy_lcn_load_rfpower(dev);
70958619b14SKalle Valo 	b43_phy_lcn_rewrite_rfpower_table(dev);
71058619b14SKalle Valo 	b43_phy_lcn_clean_papd_comp_table(dev);
71158619b14SKalle Valo }
712