// SPDX-License-Identifier: GPL-2.0-or-later
/*
Broadcom B43 wireless driver
IEEE 802.11n LCN-PHY data tables
Copyright (c) 2011 Rafał Miłecki <zajec5@gmail.com>
*/
#include "b43.h"
#include "tables_phy_lcn.h"
#include "phy_common.h"
#include "phy_lcn.h"
struct b43_lcntab_tx_gain_tbl_entry {
u8 gm;
u8 pga;
u8 pad;
u8 dac;
u8 bb_mult;
};
/**************************************************
* Static tables.
**************************************************/
static const u16 b43_lcntab_0x02[] = {
0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d,
0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d,
0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d,
0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d,
0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d,
0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d,
0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d,
0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d,
0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d,
0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d, 0 x014d,
0 x014d, 0 x014d, 0 x014d, 0 x014d,
};
static const u16 b43_lcntab_0x01[] = {
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000,
};
static const u32 b43_lcntab_0x0b[] = {
0 x000141f8, 0 x000021f8, 0 x000021fb, 0 x000041fb,
0 x0001fedb, 0 x0000217b, 0 x00002133, 0 x000040eb,
0 x0001fea3, 0 x0000024b,
};
static const u32 b43_lcntab_0x0c[] = {
0 x00100001, 0 x00200010, 0 x00300001, 0 x00400010,
0 x00500022, 0 x00600122, 0 x00700222, 0 x00800322,
0 x00900422, 0 x00a00522, 0 x00b00622, 0 x00c00722,
0 x00d00822, 0 x00f00922, 0 x00100a22, 0 x00200b22,
0 x00300c22, 0 x00400d22, 0 x00500e22, 0 x00600f22,
};
static const u32 b43_lcntab_0x0d[] = {
0 x00000000, 0 x00000000, 0 x10000000, 0 x00000000,
0 x20000000, 0 x00000000, 0 x30000000, 0 x00000000,
0 x40000000, 0 x00000000, 0 x50000000, 0 x00000000,
0 x60000000, 0 x00000000, 0 x70000000, 0 x00000000,
0 x80000000, 0 x00000000, 0 x90000000, 0 x00000008,
0 xa0000000, 0 x00000008, 0 xb0000000, 0 x00000008,
0 xc0000000, 0 x00000008, 0 xd0000000, 0 x00000008,
0 xe0000000, 0 x00000008, 0 xf0000000, 0 x00000008,
0 x00000000, 0 x00000009, 0 x10000000, 0 x00000009,
0 x20000000, 0 x00000019, 0 x30000000, 0 x00000019,
0 x40000000, 0 x00000019, 0 x50000000, 0 x00000019,
0 x60000000, 0 x00000019, 0 x70000000, 0 x00000019,
0 x80000000, 0 x00000019, 0 x90000000, 0 x00000019,
0 xa0000000, 0 x00000019, 0 xb0000000, 0 x00000019,
0 xc0000000, 0 x00000019, 0 xd0000000, 0 x00000019,
0 xe0000000, 0 x00000019, 0 xf0000000, 0 x00000019,
0 x00000000, 0 x0000001a, 0 x10000000, 0 x0000001a,
0 x20000000, 0 x0000001a, 0 x30000000, 0 x0000001a,
0 x40000000, 0 x0000001a, 0 x50000000, 0 x00000002,
0 x60000000, 0 x00000002, 0 x70000000, 0 x00000002,
0 x80000000, 0 x00000002, 0 x90000000, 0 x00000002,
0 xa0000000, 0 x00000002, 0 xb0000000, 0 x00000002,
0 xc0000000, 0 x0000000a, 0 xd0000000, 0 x0000000a,
0 xe0000000, 0 x0000000a, 0 xf0000000, 0 x0000000a,
0 x00000000, 0 x0000000b, 0 x10000000, 0 x0000000b,
0 x20000000, 0 x0000000b, 0 x30000000, 0 x0000000b,
0 x40000000, 0 x0000000b, 0 x50000000, 0 x0000001b,
0 x60000000, 0 x0000001b, 0 x70000000, 0 x0000001b,
0 x80000000, 0 x0000001b, 0 x90000000, 0 x0000001b,
0 xa0000000, 0 x0000001b, 0 xb0000000, 0 x0000001b,
0 xc0000000, 0 x0000001b, 0 xd0000000, 0 x0000001b,
0 xe0000000, 0 x0000001b, 0 xf0000000, 0 x0000001b,
0 x00000000, 0 x0000001c, 0 x10000000, 0 x0000001c,
0 x20000000, 0 x0000001c, 0 x30000000, 0 x0000001c,
0 x40000000, 0 x0000001c, 0 x50000000, 0 x0000001c,
0 x60000000, 0 x0000001c, 0 x70000000, 0 x0000001c,
0 x80000000, 0 x0000001c, 0 x90000000, 0 x0000001c,
};
static const u16 b43_lcntab_0x0e[] = {
0 x0401, 0 x0402, 0 x0403, 0 x0404, 0 x0405, 0 x0406,
0 x0407, 0 x0408, 0 x0409, 0 x040a, 0 x058b, 0 x058c,
0 x058d, 0 x058e, 0 x058f, 0 x0090, 0 x0091, 0 x0092,
0 x0193, 0 x0194, 0 x0195, 0 x0196, 0 x0197, 0 x0198,
0 x0199, 0 x019a, 0 x019b, 0 x019c, 0 x019d, 0 x019e,
0 x019f, 0 x01a0, 0 x01a1, 0 x01a2, 0 x01a3, 0 x01a4,
0 x01a5, 0 x0000,
};
static const u16 b43_lcntab_0x0f[] = {
0 x000a, 0 x0009, 0 x0006, 0 x0005, 0 x000a, 0 x0009,
0 x0006, 0 x0005, 0 x000a, 0 x0009, 0 x0006, 0 x0005,
0 x000a, 0 x0009, 0 x0006, 0 x0005, 0 x000a, 0 x0009,
0 x0006, 0 x0005, 0 x000a, 0 x0009, 0 x0006, 0 x0005,
0 x000a, 0 x0009, 0 x0006, 0 x0005, 0 x000a, 0 x0009,
0 x0006, 0 x0005, 0 x000a, 0 x0009, 0 x0006, 0 x0005,
0 x000a, 0 x0009, 0 x0006, 0 x0005, 0 x000a, 0 x0009,
0 x0006, 0 x0005, 0 x000a, 0 x0009, 0 x0006, 0 x0005,
0 x000a, 0 x0009, 0 x0006, 0 x0005, 0 x000a, 0 x0009,
0 x0006, 0 x0005, 0 x000a, 0 x0009, 0 x0006, 0 x0005,
0 x000a, 0 x0009, 0 x0006, 0 x0005,
};
static const u16 b43_lcntab_0x10[] = {
0 x005f, 0 x0036, 0 x0029, 0 x001f, 0 x005f, 0 x0036,
0 x0029, 0 x001f, 0 x005f, 0 x0036, 0 x0029, 0 x001f,
0 x005f, 0 x0036, 0 x0029, 0 x001f,
};
static const u16 b43_lcntab_0x11[] = {
0 x0009, 0 x000f, 0 x0014, 0 x0018, 0 x00fe, 0 x0007,
0 x000b, 0 x000f, 0 x00fb, 0 x00fe, 0 x0001, 0 x0005,
0 x0008, 0 x000b, 0 x000e, 0 x0011, 0 x0014, 0 x0017,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0003, 0 x0006, 0 x0009, 0 x000c, 0 x000f,
0 x0012, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0003,
0 x0006, 0 x0009, 0 x000c, 0 x000f, 0 x0012, 0 x0015,
0 x0018, 0 x001b, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0003, 0 x00eb, 0 x0000, 0 x0000,
};
static const u32 b43_lcntab_0x12[] = {
0 x00000000, 0 x00000000, 0 x00000000, 0 x00000000,
0 x00000000, 0 x00000000, 0 x00000000, 0 x00000000,
0 x00000004, 0 x00000000, 0 x00000004, 0 x00000008,
0 x00000001, 0 x00000005, 0 x00000009, 0 x0000000d,
0 x0000004d, 0 x0000008d, 0 x0000000d, 0 x0000004d,
0 x0000008d, 0 x000000cd, 0 x0000004f, 0 x0000008f,
0 x000000cf, 0 x000000d3, 0 x00000113, 0 x00000513,
0 x00000913, 0 x00000953, 0 x00000d53, 0 x00001153,
0 x00001193, 0 x00005193, 0 x00009193, 0 x0000d193,
0 x00011193, 0 x00000000, 0 x00000000, 0 x00000000,
0 x00000000, 0 x00000000, 0 x00000000, 0 x00000004,
0 x00000000, 0 x00000004, 0 x00000008, 0 x00000001,
0 x00000005, 0 x00000009, 0 x0000000d, 0 x0000004d,
0 x0000008d, 0 x0000000d, 0 x0000004d, 0 x0000008d,
0 x000000cd, 0 x0000004f, 0 x0000008f, 0 x000000cf,
0 x000000d3, 0 x00000113, 0 x00000513, 0 x00000913,
0 x00000953, 0 x00000d53, 0 x00001153, 0 x00005153,
0 x00009153, 0 x0000d153, 0 x00011153, 0 x00015153,
0 x00019153, 0 x0001d153, 0 x00000000, 0 x00000000,
0 x00000000, 0 x00000000, 0 x00000000, 0 x00000000,
0 x00000000, 0 x00000000, 0 x00000000, 0 x00000000,
0 x00000000, 0 x00000000, 0 x00000000, 0 x00000000,
0 x00000000, 0 x00000000, 0 x00000000, 0 x00000000,
0 x00000000, 0 x00000000, 0 x00000000, 0 x00000000,
};
static const u16 b43_lcntab_0x14[] = {
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0002, 0 x0003, 0 x0001, 0 x0003, 0 x0002, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0002, 0 x0003,
0 x0001, 0 x0003, 0 x0002, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001, 0 x0001,
0 x0001, 0 x0001,
};
static const u16 b43_lcntab_0x17[] = {
0 x001a, 0 x0034, 0 x004e, 0 x0068, 0 x009c, 0 x00d0,
0 x00ea, 0 x0104, 0 x0034, 0 x0068, 0 x009c, 0 x00d0,
0 x0138, 0 x01a0, 0 x01d4, 0 x0208, 0 x004e, 0 x009c,
0 x00ea, 0 x0138, 0 x01d4, 0 x0270, 0 x02be, 0 x030c,
0 x0068, 0 x00d0, 0 x0138, 0 x01a0, 0 x0270, 0 x0340,
0 x03a8, 0 x0410, 0 x0018, 0 x009c, 0 x00d0, 0 x0104,
0 x00ea, 0 x0138, 0 x0186, 0 x00d0, 0 x0104, 0 x0104,
0 x0138, 0 x016c, 0 x016c, 0 x01a0, 0 x0138, 0 x0186,
0 x0186, 0 x01d4, 0 x0222, 0 x0222, 0 x0270, 0 x0104,
0 x0138, 0 x016c, 0 x0138, 0 x016c, 0 x01a0, 0 x01d4,
0 x01a0, 0 x01d4, 0 x0208, 0 x0208, 0 x023c, 0 x0186,
0 x01d4, 0 x0222, 0 x01d4, 0 x0222, 0 x0270, 0 x02be,
0 x0270, 0 x02be, 0 x030c, 0 x030c, 0 x035a, 0 x0036,
0 x006c, 0 x00a2, 0 x00d8, 0 x0144, 0 x01b0, 0 x01e6,
0 x021c, 0 x006c, 0 x00d8, 0 x0144, 0 x01b0, 0 x0288,
0 x0360, 0 x03cc, 0 x0438, 0 x00a2, 0 x0144, 0 x01e6,
0 x0288, 0 x03cc, 0 x0510, 0 x05b2, 0 x0654, 0 x00d8,
0 x01b0, 0 x0288, 0 x0360, 0 x0510, 0 x06c0, 0 x0798,
0 x0870, 0 x0018, 0 x0144, 0 x01b0, 0 x021c, 0 x01e6,
0 x0288, 0 x032a, 0 x01b0, 0 x021c, 0 x021c, 0 x0288,
0 x02f4, 0 x02f4, 0 x0360, 0 x0288, 0 x032a, 0 x032a,
0 x03cc, 0 x046e, 0 x046e, 0 x0510, 0 x021c, 0 x0288,
0 x02f4, 0 x0288, 0 x02f4, 0 x0360, 0 x03cc, 0 x0360,
0 x03cc, 0 x0438, 0 x0438, 0 x04a4, 0 x032a, 0 x03cc,
0 x046e, 0 x03cc, 0 x046e, 0 x0510, 0 x05b2, 0 x0510,
0 x05b2, 0 x0654, 0 x0654, 0 x06f6,
};
static const u16 b43_lcntab_0x00[] = {
0 x0200, 0 x0300, 0 x0400, 0 x0600, 0 x0800, 0 x0b00,
0 x1000, 0 x1001, 0 x1002, 0 x1003, 0 x1004, 0 x1005,
0 x1006, 0 x1007, 0 x1707, 0 x2007, 0 x2d07, 0 x4007,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0200, 0 x0300, 0 x0400, 0 x0600,
0 x0800, 0 x0b00, 0 x1000, 0 x1001, 0 x1002, 0 x1003,
0 x1004, 0 x1005, 0 x1006, 0 x1007, 0 x1707, 0 x2007,
0 x2d07, 0 x4007, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x4000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000, 0 x0000,
};
static const u32 b43_lcntab_0x18[] = {
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
0 x00080000, 0 x00080000, 0 x00080000, 0 x00080000,
};
/**************************************************
* TX gain.
**************************************************/
static const struct b43_lcntab_tx_gain_tbl_entry
b43_lcntab_tx_gain_tbl_2ghz_ext_pa_rev0[B43_LCNTAB_TX_GAIN_SIZE] = {
{ 0 x03, 0 x00, 0 x1f, 0 x0, 0 x48 },
{ 0 x03, 0 x00, 0 x1f, 0 x0, 0 x46 },
{ 0 x03, 0 x00, 0 x1f, 0 x0, 0 x44 },
{ 0 x03, 0 x00, 0 x1e, 0 x0, 0 x43 },
{ 0 x03, 0 x00, 0 x1d, 0 x0, 0 x44 },
{ 0 x03, 0 x00, 0 x1c, 0 x0, 0 x44 },
{ 0 x03, 0 x00, 0 x1b, 0 x0, 0 x45 },
{ 0 x03, 0 x00, 0 x1a, 0 x0, 0 x46 },
{ 0 x03, 0 x00, 0 x19, 0 x0, 0 x46 },
{ 0 x03, 0 x00, 0 x18, 0 x0, 0 x47 },
{ 0 x03, 0 x00, 0 x17, 0 x0, 0 x48 },
{ 0 x03, 0 x00, 0 x17, 0 x0, 0 x46 },
{ 0 x03, 0 x00, 0 x16, 0 x0, 0 x47 },
{ 0 x03, 0 x00, 0 x15, 0 x0, 0 x48 },
{ 0 x03, 0 x00, 0 x15, 0 x0, 0 x46 },
{ 0 x03, 0 x00, 0 x15, 0 x0, 0 x44 },
{ 0 x03, 0 x00, 0 x15, 0 x0, 0 x42 },
{ 0 x03, 0 x00, 0 x15, 0 x0, 0 x40 },
{ 0 x03, 0 x00, 0 x15, 0 x0, 0 x3f },
{ 0 x03, 0 x00, 0 x14, 0 x0, 0 x40 },
{ 0 x03, 0 x00, 0 x13, 0 x0, 0 x41 },
{ 0 x03, 0 x00, 0 x13, 0 x0, 0 x40 },
{ 0 x03, 0 x00, 0 x12, 0 x0, 0 x41 },
{ 0 x03, 0 x00, 0 x12, 0 x0, 0 x40 },
{ 0 x03, 0 x00, 0 x11, 0 x0, 0 x41 },
{ 0 x03, 0 x00, 0 x11, 0 x0, 0 x40 },
{ 0 x03, 0 x00, 0 x10, 0 x0, 0 x41 },
{ 0 x03, 0 x00, 0 x10, 0 x0, 0 x40 },
{ 0 x03, 0 x00, 0 x10, 0 x0, 0 x3e },
{ 0 x03, 0 x00, 0 x10, 0 x0, 0 x3c },
{ 0 x03, 0 x00, 0 x10, 0 x0, 0 x3a },
{ 0 x03, 0 x00, 0 x0f, 0 x0, 0 x3d },
{ 0 x03, 0 x00, 0 x0f, 0 x0, 0 x3b },
{ 0 x03, 0 x00, 0 x0e, 0 x0, 0 x3d },
{ 0 x03, 0 x00, 0 x0e, 0 x0, 0 x3c },
{ 0 x03, 0 x00, 0 x0e, 0 x0, 0 x3a },
{ 0 x03, 0 x00, 0 x0d, 0 x0, 0 x3c },
{ 0 x03, 0 x00, 0 x0d, 0 x0, 0 x3b },
{ 0 x03, 0 x00, 0 x0c, 0 x0, 0 x3e },
{ 0 x03, 0 x00, 0 x0c, 0 x0, 0 x3c },
{ 0 x03, 0 x00, 0 x0c, 0 x0, 0 x3a },
{ 0 x03, 0 x00, 0 x0b, 0 x0, 0 x3e },
{ 0 x03, 0 x00, 0 x0b, 0 x0, 0 x3c },
{ 0 x03, 0 x00, 0 x0b, 0 x0, 0 x3b },
{ 0 x03, 0 x00, 0 x0b, 0 x0, 0 x39 },
{ 0 x03, 0 x00, 0 x0a, 0 x0, 0 x3d },
{ 0 x03, 0 x00, 0 x0a, 0 x0, 0 x3b },
{ 0 x03, 0 x00, 0 x0a, 0 x0, 0 x39 },
{ 0 x03, 0 x00, 0 x09, 0 x0, 0 x3e },
{ 0 x03, 0 x00, 0 x09, 0 x0, 0 x3c },
{ 0 x03, 0 x00, 0 x09, 0 x0, 0 x3a },
{ 0 x03, 0 x00, 0 x09, 0 x0, 0 x39 },
{ 0 x03, 0 x00, 0 x08, 0 x0, 0 x3e },
{ 0 x03, 0 x00, 0 x08, 0 x0, 0 x3c },
{ 0 x03, 0 x00, 0 x08, 0 x0, 0 x3a },
{ 0 x03, 0 x00, 0 x08, 0 x0, 0 x39 },
{ 0 x03, 0 x00, 0 x08, 0 x0, 0 x37 },
{ 0 x03, 0 x00, 0 x07, 0 x0, 0 x3d },
{ 0 x03, 0 x00, 0 x07, 0 x0, 0 x3c },
{ 0 x03, 0 x00, 0 x07, 0 x0, 0 x3a },
{ 0 x03, 0 x00, 0 x07, 0 x0, 0 x38 },
{ 0 x03, 0 x00, 0 x07, 0 x0, 0 x37 },
{ 0 x03, 0 x00, 0 x06, 0 x0, 0 x3e },
{ 0 x03, 0 x00, 0 x06, 0 x0, 0 x3c },
{ 0 x03, 0 x00, 0 x06, 0 x0, 0 x3a },
{ 0 x03, 0 x00, 0 x06, 0 x0, 0 x39 },
{ 0 x03, 0 x00, 0 x06, 0 x0, 0 x37 },
{ 0 x03, 0 x00, 0 x06, 0 x0, 0 x36 },
{ 0 x03, 0 x00, 0 x06, 0 x0, 0 x34 },
{ 0 x03, 0 x00, 0 x05, 0 x0, 0 x3d },
{ 0 x03, 0 x00, 0 x05, 0 x0, 0 x3b },
{ 0 x03, 0 x00, 0 x05, 0 x0, 0 x39 },
{ 0 x03, 0 x00, 0 x05, 0 x0, 0 x38 },
{ 0 x03, 0 x00, 0 x05, 0 x0, 0 x36 },
{ 0 x03, 0 x00, 0 x05, 0 x0, 0 x35 },
{ 0 x03, 0 x00, 0 x05, 0 x0, 0 x33 },
{ 0 x03, 0 x00, 0 x04, 0 x0, 0 x3e },
{ 0 x03, 0 x00, 0 x04, 0 x0, 0 x3c },
{ 0 x03, 0 x00, 0 x04, 0 x0, 0 x3a },
{ 0 x03, 0 x00, 0 x04, 0 x0, 0 x39 },
{ 0 x03, 0 x00, 0 x04, 0 x0, 0 x37 },
{ 0 x03, 0 x00, 0 x04, 0 x0, 0 x36 },
{ 0 x03, 0 x00, 0 x04, 0 x0, 0 x34 },
{ 0 x03, 0 x00, 0 x04, 0 x0, 0 x33 },
{ 0 x03, 0 x00, 0 x04, 0 x0, 0 x31 },
{ 0 x03, 0 x00, 0 x04, 0 x0, 0 x30 },
{ 0 x03, 0 x00, 0 x04, 0 x0, 0 x2e },
{ 0 x03, 0 x00, 0 x03, 0 x0, 0 x3c },
{ 0 x03, 0 x00, 0 x03, 0 x0, 0 x3a },
{ 0 x03, 0 x00, 0 x03, 0 x0, 0 x39 },
{ 0 x03, 0 x00, 0 x03, 0 x0, 0 x37 },
{ 0 x03, 0 x00, 0 x03, 0 x0, 0 x36 },
{ 0 x03, 0 x00, 0 x03, 0 x0, 0 x34 },
{ 0 x03, 0 x00, 0 x03, 0 x0, 0 x33 },
{ 0 x03, 0 x00, 0 x03, 0 x0, 0 x31 },
{ 0 x03, 0 x00, 0 x03, 0 x0, 0 x30 },
{ 0 x03, 0 x00, 0 x03, 0 x0, 0 x2e },
{ 0 x03, 0 x00, 0 x03, 0 x0, 0 x2d },
{ 0 x03, 0 x00, 0 x03, 0 x0, 0 x2c },
{ 0 x03, 0 x00, 0 x03, 0 x0, 0 x2b },
{ 0 x03, 0 x00, 0 x03, 0 x0, 0 x29 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x3d },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x3b },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x39 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x38 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x36 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x35 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x33 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x32 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x30 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x2f },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x2e },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x2c },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x2b },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x2a },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x29 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x27 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x26 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x25 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x24 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x23 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x22 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x21 },
{ 0 x03, 0 x00, 0 x02, 0 x0, 0 x20 },
{ 0 x03, 0 x00, 0 x01, 0 x0, 0 x3f },
{ 0 x03, 0 x00, 0 x01, 0 x0, 0 x3d },
{ 0 x03, 0 x00, 0 x01, 0 x0, 0 x3b },
{ 0 x03, 0 x00, 0 x01, 0 x0, 0 x39 },
};
/**************************************************
* SW control.
**************************************************/
static const u16 b43_lcntab_sw_ctl_4313_epa_rev0[] = {
0 x0002, 0 x0008, 0 x0004, 0 x0001, 0 x0002, 0 x0008,
0 x0004, 0 x0001, 0 x0002, 0 x0008, 0 x0004, 0 x0001,
0 x0002, 0 x0008, 0 x0004, 0 x0001, 0 x0002, 0 x0008,
0 x0004, 0 x0001, 0 x0002, 0 x0008, 0 x0004, 0 x0001,
0 x0002, 0 x0008, 0 x0004, 0 x0001, 0 x0002, 0 x0008,
0 x0004, 0 x0001, 0 x0002, 0 x0008, 0 x0004, 0 x0001,
0 x0002, 0 x0008, 0 x0004, 0 x0001, 0 x0002, 0 x0008,
0 x0004, 0 x0001, 0 x0002, 0 x0008, 0 x0004, 0 x0001,
0 x0002, 0 x0008, 0 x0004, 0 x0001, 0 x0002, 0 x0008,
0 x0004, 0 x0001, 0 x0002, 0 x0008, 0 x0004, 0 x0001,
0 x0002, 0 x0008, 0 x0004, 0 x0001,
};
/**************************************************
* R/W ops.
**************************************************/
u32 b43_lcntab_read(struct b43_wldev *dev, u32 offset)
{
u32 type, value;
type = offset & B43_LCNTAB_TYPEMASK;
offset &= ~B43_LCNTAB_TYPEMASK;
B43_WARN_ON(offset > 0 xFFFF);
switch (type) {
case B43_LCNTAB_8BIT:
b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO) & 0 xFF;
break ;
case B43_LCNTAB_16BIT:
b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO);
break ;
case B43_LCNTAB_32BIT:
b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO);
value |= (b43_phy_read(dev, B43_PHY_LCN_TABLE_DATAHI) << 16 );
break ;
default :
B43_WARN_ON(1 );
value = 0 ;
}
return value;
}
void b43_lcntab_read_bulk(struct b43_wldev *dev, u32 offset,
unsigned int nr_elements, void *_data)
{
u32 type;
u8 *data = _data;
unsigned int i;
type = offset & B43_LCNTAB_TYPEMASK;
offset &= ~B43_LCNTAB_TYPEMASK;
B43_WARN_ON(offset > 0 xFFFF);
b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
for (i = 0 ; i < nr_elements; i++) {
switch (type) {
case B43_LCNTAB_8BIT:
*data = b43_phy_read(dev,
B43_PHY_LCN_TABLE_DATALO) & 0 xFF;
data++;
break ;
case B43_LCNTAB_16BIT:
*((u16 *)data) = b43_phy_read(dev,
B43_PHY_LCN_TABLE_DATALO);
data += 2 ;
break ;
case B43_LCNTAB_32BIT:
*((u32 *)data) = b43_phy_read(dev,
B43_PHY_LCN_TABLE_DATALO);
*((u32 *)data) |= (b43_phy_read(dev,
B43_PHY_LCN_TABLE_DATAHI) << 16 );
data += 4 ;
break ;
default :
B43_WARN_ON(1 );
}
}
}
void b43_lcntab_write(struct b43_wldev *dev, u32 offset, u32 value)
{
u32 type;
type = offset & B43_LCNTAB_TYPEMASK;
offset &= 0 xFFFF;
switch (type) {
case B43_LCNTAB_8BIT:
B43_WARN_ON(value & ~0 xFF);
b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
break ;
case B43_LCNTAB_16BIT:
B43_WARN_ON(value & ~0 xFFFF);
b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
break ;
case B43_LCNTAB_32BIT:
b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
b43_phy_write(dev, B43_PHY_LCN_TABLE_DATAHI, value >> 16 );
b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value & 0 xFFFF);
break ;
default :
B43_WARN_ON(1 );
}
return ;
}
void b43_lcntab_write_bulk(struct b43_wldev *dev, u32 offset,
unsigned int nr_elements, const void *_data)
{
u32 type, value;
const u8 *data = _data;
unsigned int i;
type = offset & B43_LCNTAB_TYPEMASK;
offset &= ~B43_LCNTAB_TYPEMASK;
B43_WARN_ON(offset > 0 xFFFF);
b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
for (i = 0 ; i < nr_elements; i++) {
switch (type) {
case B43_LCNTAB_8BIT:
value = *data;
data++;
B43_WARN_ON(value & ~0 xFF);
b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
break ;
case B43_LCNTAB_16BIT:
value = *((u16 *)data);
data += 2 ;
B43_WARN_ON(value & ~0 xFFFF);
b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
break ;
case B43_LCNTAB_32BIT:
value = *((u32 *)data);
data += 4 ;
b43_phy_write(dev, B43_PHY_LCN_TABLE_DATAHI,
value >> 16 );
b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO,
value & 0 xFFFF);
break ;
default :
B43_WARN_ON(1 );
}
}
}
/**************************************************
* Tables ops.
**************************************************/
#define lcntab_upload(dev, offset, data) do { \
b43_lcntab_write_bulk(dev, offset, ARRAY_SIZE(data), data); \
} while (0 )
static void b43_phy_lcn_upload_static_tables(struct b43_wldev *dev)
{
lcntab_upload(dev, B43_LCNTAB16(0 x02, 0 ), b43_lcntab_0x02);
lcntab_upload(dev, B43_LCNTAB16(0 x01, 0 ), b43_lcntab_0x01);
lcntab_upload(dev, B43_LCNTAB32(0 x0b, 0 ), b43_lcntab_0x0b);
lcntab_upload(dev, B43_LCNTAB32(0 x0c, 0 ), b43_lcntab_0x0c);
lcntab_upload(dev, B43_LCNTAB32(0 x0d, 0 ), b43_lcntab_0x0d);
lcntab_upload(dev, B43_LCNTAB16(0 x0e, 0 ), b43_lcntab_0x0e);
lcntab_upload(dev, B43_LCNTAB16(0 x0f, 0 ), b43_lcntab_0x0f);
lcntab_upload(dev, B43_LCNTAB16(0 x10, 0 ), b43_lcntab_0x10);
lcntab_upload(dev, B43_LCNTAB16(0 x11, 0 ), b43_lcntab_0x11);
lcntab_upload(dev, B43_LCNTAB32(0 x12, 0 ), b43_lcntab_0x12);
lcntab_upload(dev, B43_LCNTAB16(0 x14, 0 ), b43_lcntab_0x14);
lcntab_upload(dev, B43_LCNTAB16(0 x17, 0 ), b43_lcntab_0x17);
lcntab_upload(dev, B43_LCNTAB16(0 x00, 0 ), b43_lcntab_0x00);
lcntab_upload(dev, B43_LCNTAB32(0 x18, 0 ), b43_lcntab_0x18);
}
static void b43_phy_lcn_load_tx_gain_tab(struct b43_wldev *dev,
const struct b43_lcntab_tx_gain_tbl_entry *gain_table)
{
u32 i;
u32 val;
u16 pa_gain = 0 x70;
if (dev->dev->bus_sprom->boardflags_lo & B43_BFL_FEM)
pa_gain = 0 x10;
for (i = 0 ; i < B43_LCNTAB_TX_GAIN_SIZE; i++) {
val = ((pa_gain << 24 ) |
(gain_table[i].pad << 16 ) |
(gain_table[i].pga << 8 ) |
gain_table[i].gm);
b43_lcntab_write(dev, B43_LCNTAB32(0 x7, 0 xc0 + i), val);
/* brcmsmac doesn't maskset, we follow newer wl here */
val = b43_lcntab_read(dev, B43_LCNTAB32(0 x7, 0 x140 + i));
val &= 0 x000fffff;
val |= ((gain_table[i].dac << 28 ) |
(gain_table[i].bb_mult << 20 ));
b43_lcntab_write(dev, B43_LCNTAB32(0 x7, 0 x140 + i), val);
}
}
/* wlc_lcnphy_load_rfpower */
static void b43_phy_lcn_load_rfpower(struct b43_wldev *dev)
{
u32 bbmult, rfgain;
u8 i;
for (i = 0 ; i < 128 ; i++) {
bbmult = b43_lcntab_read(dev, B43_LCNTAB32(0 x7, 0 x140 + i));
bbmult >>= 20 ;
rfgain = b43_lcntab_read(dev, B43_LCNTAB32(0 x7, 0 xc0 + i));
/* TODO: calculate value for 0x240 + i table offset
* b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0x240 + i), val);
*/
}
}
/* Not implemented in brcmsmac, noticed in wl in MMIO dump */
static void b43_phy_lcn_rewrite_rfpower_table(struct b43_wldev *dev)
{
int i;
u32 tmp;
for (i = 0 ; i < 128 ; i++) {
tmp = b43_lcntab_read(dev, B43_LCNTAB32(0 x7, 0 x240 + i));
b43_lcntab_write(dev, B43_LCNTAB32(0 x7, 0 x240 + i), tmp);
}
}
/* wlc_lcnphy_clear_papd_comptable */
static void b43_phy_lcn_clean_papd_comp_table(struct b43_wldev *dev)
{
u8 i;
for (i = 0 ; i < 0 x80; i++)
b43_lcntab_write(dev, B43_LCNTAB32(0 x18, i), 0 x80000);
}
/* wlc_lcnphy_tbl_init */
void b43_phy_lcn_tables_init(struct b43_wldev *dev)
{
struct ssb_sprom *sprom = dev->dev->bus_sprom;
b43_phy_lcn_upload_static_tables(dev);
if (b43_current_band(dev->wl) == NL80211_BAND_2GHZ) {
if (sprom->boardflags_lo & B43_BFL_FEM)
b43_phy_lcn_load_tx_gain_tab(dev,
b43_lcntab_tx_gain_tbl_2ghz_ext_pa_rev0);
else
b43err(dev->wl,
"TX gain table unknown for this card\n" );
}
if (sprom->boardflags_lo & B43_BFL_FEM &&
!(sprom->boardflags_hi & B43_BFH_FEM_BT))
b43_lcntab_write_bulk(dev, B43_LCNTAB16(0 xf, 0 ),
ARRAY_SIZE(b43_lcntab_sw_ctl_4313_epa_rev0),
b43_lcntab_sw_ctl_4313_epa_rev0);
else
b43err(dev->wl, "SW ctl table is unknown for this card\n" );
b43_phy_lcn_load_rfpower(dev);
b43_phy_lcn_rewrite_rfpower_table(dev);
b43_phy_lcn_clean_papd_comp_table(dev);
}
Messung V0.5 in Prozent C=96 H=92 G=93