Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license as published by the free software foundation either version 2 of the license or at your option any later version this program is distributed in the hope that it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details you should have received a copy of the gnu general public license along with this program see the file copying if not write to the free software foundation inc 51 franklin steet fifth floor boston ma 02110 1301 usa extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 41 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Jilayne Lovejoy <opensource@jilayne.com> Reviewed-by: Steve Winslow <swinslow@gmail.com> Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org> Reviewed-by: Allison Randal <allison@lohutok.net> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190519154042.524645346@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
711 lines
24 KiB
C
711 lines
24 KiB
C
// 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[] = {
|
|
0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
|
|
0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
|
|
0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
|
|
0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
|
|
0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
|
|
0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
|
|
0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
|
|
0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
|
|
0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
|
|
0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
|
|
0x014d, 0x014d, 0x014d, 0x014d,
|
|
};
|
|
|
|
static const u16 b43_lcntab_0x01[] = {
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000,
|
|
};
|
|
|
|
static const u32 b43_lcntab_0x0b[] = {
|
|
0x000141f8, 0x000021f8, 0x000021fb, 0x000041fb,
|
|
0x0001fedb, 0x0000217b, 0x00002133, 0x000040eb,
|
|
0x0001fea3, 0x0000024b,
|
|
};
|
|
|
|
static const u32 b43_lcntab_0x0c[] = {
|
|
0x00100001, 0x00200010, 0x00300001, 0x00400010,
|
|
0x00500022, 0x00600122, 0x00700222, 0x00800322,
|
|
0x00900422, 0x00a00522, 0x00b00622, 0x00c00722,
|
|
0x00d00822, 0x00f00922, 0x00100a22, 0x00200b22,
|
|
0x00300c22, 0x00400d22, 0x00500e22, 0x00600f22,
|
|
};
|
|
|
|
static const u32 b43_lcntab_0x0d[] = {
|
|
0x00000000, 0x00000000, 0x10000000, 0x00000000,
|
|
0x20000000, 0x00000000, 0x30000000, 0x00000000,
|
|
0x40000000, 0x00000000, 0x50000000, 0x00000000,
|
|
0x60000000, 0x00000000, 0x70000000, 0x00000000,
|
|
0x80000000, 0x00000000, 0x90000000, 0x00000008,
|
|
0xa0000000, 0x00000008, 0xb0000000, 0x00000008,
|
|
0xc0000000, 0x00000008, 0xd0000000, 0x00000008,
|
|
0xe0000000, 0x00000008, 0xf0000000, 0x00000008,
|
|
0x00000000, 0x00000009, 0x10000000, 0x00000009,
|
|
0x20000000, 0x00000019, 0x30000000, 0x00000019,
|
|
0x40000000, 0x00000019, 0x50000000, 0x00000019,
|
|
0x60000000, 0x00000019, 0x70000000, 0x00000019,
|
|
0x80000000, 0x00000019, 0x90000000, 0x00000019,
|
|
0xa0000000, 0x00000019, 0xb0000000, 0x00000019,
|
|
0xc0000000, 0x00000019, 0xd0000000, 0x00000019,
|
|
0xe0000000, 0x00000019, 0xf0000000, 0x00000019,
|
|
0x00000000, 0x0000001a, 0x10000000, 0x0000001a,
|
|
0x20000000, 0x0000001a, 0x30000000, 0x0000001a,
|
|
0x40000000, 0x0000001a, 0x50000000, 0x00000002,
|
|
0x60000000, 0x00000002, 0x70000000, 0x00000002,
|
|
0x80000000, 0x00000002, 0x90000000, 0x00000002,
|
|
0xa0000000, 0x00000002, 0xb0000000, 0x00000002,
|
|
0xc0000000, 0x0000000a, 0xd0000000, 0x0000000a,
|
|
0xe0000000, 0x0000000a, 0xf0000000, 0x0000000a,
|
|
0x00000000, 0x0000000b, 0x10000000, 0x0000000b,
|
|
0x20000000, 0x0000000b, 0x30000000, 0x0000000b,
|
|
0x40000000, 0x0000000b, 0x50000000, 0x0000001b,
|
|
0x60000000, 0x0000001b, 0x70000000, 0x0000001b,
|
|
0x80000000, 0x0000001b, 0x90000000, 0x0000001b,
|
|
0xa0000000, 0x0000001b, 0xb0000000, 0x0000001b,
|
|
0xc0000000, 0x0000001b, 0xd0000000, 0x0000001b,
|
|
0xe0000000, 0x0000001b, 0xf0000000, 0x0000001b,
|
|
0x00000000, 0x0000001c, 0x10000000, 0x0000001c,
|
|
0x20000000, 0x0000001c, 0x30000000, 0x0000001c,
|
|
0x40000000, 0x0000001c, 0x50000000, 0x0000001c,
|
|
0x60000000, 0x0000001c, 0x70000000, 0x0000001c,
|
|
0x80000000, 0x0000001c, 0x90000000, 0x0000001c,
|
|
};
|
|
|
|
static const u16 b43_lcntab_0x0e[] = {
|
|
0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406,
|
|
0x0407, 0x0408, 0x0409, 0x040a, 0x058b, 0x058c,
|
|
0x058d, 0x058e, 0x058f, 0x0090, 0x0091, 0x0092,
|
|
0x0193, 0x0194, 0x0195, 0x0196, 0x0197, 0x0198,
|
|
0x0199, 0x019a, 0x019b, 0x019c, 0x019d, 0x019e,
|
|
0x019f, 0x01a0, 0x01a1, 0x01a2, 0x01a3, 0x01a4,
|
|
0x01a5, 0x0000,
|
|
};
|
|
|
|
static const u16 b43_lcntab_0x0f[] = {
|
|
0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
|
|
0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
|
|
0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
|
|
0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
|
|
0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
|
|
0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
|
|
0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
|
|
0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
|
|
0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
|
|
0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
|
|
0x000a, 0x0009, 0x0006, 0x0005,
|
|
};
|
|
|
|
static const u16 b43_lcntab_0x10[] = {
|
|
0x005f, 0x0036, 0x0029, 0x001f, 0x005f, 0x0036,
|
|
0x0029, 0x001f, 0x005f, 0x0036, 0x0029, 0x001f,
|
|
0x005f, 0x0036, 0x0029, 0x001f,
|
|
};
|
|
|
|
static const u16 b43_lcntab_0x11[] = {
|
|
0x0009, 0x000f, 0x0014, 0x0018, 0x00fe, 0x0007,
|
|
0x000b, 0x000f, 0x00fb, 0x00fe, 0x0001, 0x0005,
|
|
0x0008, 0x000b, 0x000e, 0x0011, 0x0014, 0x0017,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0003, 0x0006, 0x0009, 0x000c, 0x000f,
|
|
0x0012, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003,
|
|
0x0006, 0x0009, 0x000c, 0x000f, 0x0012, 0x0015,
|
|
0x0018, 0x001b, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0003, 0x00eb, 0x0000, 0x0000,
|
|
};
|
|
|
|
static const u32 b43_lcntab_0x12[] = {
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000004, 0x00000000, 0x00000004, 0x00000008,
|
|
0x00000001, 0x00000005, 0x00000009, 0x0000000d,
|
|
0x0000004d, 0x0000008d, 0x0000000d, 0x0000004d,
|
|
0x0000008d, 0x000000cd, 0x0000004f, 0x0000008f,
|
|
0x000000cf, 0x000000d3, 0x00000113, 0x00000513,
|
|
0x00000913, 0x00000953, 0x00000d53, 0x00001153,
|
|
0x00001193, 0x00005193, 0x00009193, 0x0000d193,
|
|
0x00011193, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000004,
|
|
0x00000000, 0x00000004, 0x00000008, 0x00000001,
|
|
0x00000005, 0x00000009, 0x0000000d, 0x0000004d,
|
|
0x0000008d, 0x0000000d, 0x0000004d, 0x0000008d,
|
|
0x000000cd, 0x0000004f, 0x0000008f, 0x000000cf,
|
|
0x000000d3, 0x00000113, 0x00000513, 0x00000913,
|
|
0x00000953, 0x00000d53, 0x00001153, 0x00005153,
|
|
0x00009153, 0x0000d153, 0x00011153, 0x00015153,
|
|
0x00019153, 0x0001d153, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
|
};
|
|
|
|
static const u16 b43_lcntab_0x14[] = {
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0002, 0x0003, 0x0001, 0x0003, 0x0002, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0003,
|
|
0x0001, 0x0003, 0x0002, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
|
|
0x0001, 0x0001,
|
|
};
|
|
|
|
static const u16 b43_lcntab_0x17[] = {
|
|
0x001a, 0x0034, 0x004e, 0x0068, 0x009c, 0x00d0,
|
|
0x00ea, 0x0104, 0x0034, 0x0068, 0x009c, 0x00d0,
|
|
0x0138, 0x01a0, 0x01d4, 0x0208, 0x004e, 0x009c,
|
|
0x00ea, 0x0138, 0x01d4, 0x0270, 0x02be, 0x030c,
|
|
0x0068, 0x00d0, 0x0138, 0x01a0, 0x0270, 0x0340,
|
|
0x03a8, 0x0410, 0x0018, 0x009c, 0x00d0, 0x0104,
|
|
0x00ea, 0x0138, 0x0186, 0x00d0, 0x0104, 0x0104,
|
|
0x0138, 0x016c, 0x016c, 0x01a0, 0x0138, 0x0186,
|
|
0x0186, 0x01d4, 0x0222, 0x0222, 0x0270, 0x0104,
|
|
0x0138, 0x016c, 0x0138, 0x016c, 0x01a0, 0x01d4,
|
|
0x01a0, 0x01d4, 0x0208, 0x0208, 0x023c, 0x0186,
|
|
0x01d4, 0x0222, 0x01d4, 0x0222, 0x0270, 0x02be,
|
|
0x0270, 0x02be, 0x030c, 0x030c, 0x035a, 0x0036,
|
|
0x006c, 0x00a2, 0x00d8, 0x0144, 0x01b0, 0x01e6,
|
|
0x021c, 0x006c, 0x00d8, 0x0144, 0x01b0, 0x0288,
|
|
0x0360, 0x03cc, 0x0438, 0x00a2, 0x0144, 0x01e6,
|
|
0x0288, 0x03cc, 0x0510, 0x05b2, 0x0654, 0x00d8,
|
|
0x01b0, 0x0288, 0x0360, 0x0510, 0x06c0, 0x0798,
|
|
0x0870, 0x0018, 0x0144, 0x01b0, 0x021c, 0x01e6,
|
|
0x0288, 0x032a, 0x01b0, 0x021c, 0x021c, 0x0288,
|
|
0x02f4, 0x02f4, 0x0360, 0x0288, 0x032a, 0x032a,
|
|
0x03cc, 0x046e, 0x046e, 0x0510, 0x021c, 0x0288,
|
|
0x02f4, 0x0288, 0x02f4, 0x0360, 0x03cc, 0x0360,
|
|
0x03cc, 0x0438, 0x0438, 0x04a4, 0x032a, 0x03cc,
|
|
0x046e, 0x03cc, 0x046e, 0x0510, 0x05b2, 0x0510,
|
|
0x05b2, 0x0654, 0x0654, 0x06f6,
|
|
};
|
|
|
|
static const u16 b43_lcntab_0x00[] = {
|
|
0x0200, 0x0300, 0x0400, 0x0600, 0x0800, 0x0b00,
|
|
0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005,
|
|
0x1006, 0x1007, 0x1707, 0x2007, 0x2d07, 0x4007,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0200, 0x0300, 0x0400, 0x0600,
|
|
0x0800, 0x0b00, 0x1000, 0x1001, 0x1002, 0x1003,
|
|
0x1004, 0x1005, 0x1006, 0x1007, 0x1707, 0x2007,
|
|
0x2d07, 0x4007, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
|
};
|
|
|
|
static const u32 b43_lcntab_0x18[] = {
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
0x00080000, 0x00080000, 0x00080000, 0x00080000,
|
|
};
|
|
|
|
/**************************************************
|
|
* 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] = {
|
|
{ 0x03, 0x00, 0x1f, 0x0, 0x48 },
|
|
{ 0x03, 0x00, 0x1f, 0x0, 0x46 },
|
|
{ 0x03, 0x00, 0x1f, 0x0, 0x44 },
|
|
{ 0x03, 0x00, 0x1e, 0x0, 0x43 },
|
|
{ 0x03, 0x00, 0x1d, 0x0, 0x44 },
|
|
{ 0x03, 0x00, 0x1c, 0x0, 0x44 },
|
|
{ 0x03, 0x00, 0x1b, 0x0, 0x45 },
|
|
{ 0x03, 0x00, 0x1a, 0x0, 0x46 },
|
|
{ 0x03, 0x00, 0x19, 0x0, 0x46 },
|
|
{ 0x03, 0x00, 0x18, 0x0, 0x47 },
|
|
{ 0x03, 0x00, 0x17, 0x0, 0x48 },
|
|
{ 0x03, 0x00, 0x17, 0x0, 0x46 },
|
|
{ 0x03, 0x00, 0x16, 0x0, 0x47 },
|
|
{ 0x03, 0x00, 0x15, 0x0, 0x48 },
|
|
{ 0x03, 0x00, 0x15, 0x0, 0x46 },
|
|
{ 0x03, 0x00, 0x15, 0x0, 0x44 },
|
|
{ 0x03, 0x00, 0x15, 0x0, 0x42 },
|
|
{ 0x03, 0x00, 0x15, 0x0, 0x40 },
|
|
{ 0x03, 0x00, 0x15, 0x0, 0x3f },
|
|
{ 0x03, 0x00, 0x14, 0x0, 0x40 },
|
|
{ 0x03, 0x00, 0x13, 0x0, 0x41 },
|
|
{ 0x03, 0x00, 0x13, 0x0, 0x40 },
|
|
{ 0x03, 0x00, 0x12, 0x0, 0x41 },
|
|
{ 0x03, 0x00, 0x12, 0x0, 0x40 },
|
|
{ 0x03, 0x00, 0x11, 0x0, 0x41 },
|
|
{ 0x03, 0x00, 0x11, 0x0, 0x40 },
|
|
{ 0x03, 0x00, 0x10, 0x0, 0x41 },
|
|
{ 0x03, 0x00, 0x10, 0x0, 0x40 },
|
|
{ 0x03, 0x00, 0x10, 0x0, 0x3e },
|
|
{ 0x03, 0x00, 0x10, 0x0, 0x3c },
|
|
{ 0x03, 0x00, 0x10, 0x0, 0x3a },
|
|
{ 0x03, 0x00, 0x0f, 0x0, 0x3d },
|
|
{ 0x03, 0x00, 0x0f, 0x0, 0x3b },
|
|
{ 0x03, 0x00, 0x0e, 0x0, 0x3d },
|
|
{ 0x03, 0x00, 0x0e, 0x0, 0x3c },
|
|
{ 0x03, 0x00, 0x0e, 0x0, 0x3a },
|
|
{ 0x03, 0x00, 0x0d, 0x0, 0x3c },
|
|
{ 0x03, 0x00, 0x0d, 0x0, 0x3b },
|
|
{ 0x03, 0x00, 0x0c, 0x0, 0x3e },
|
|
{ 0x03, 0x00, 0x0c, 0x0, 0x3c },
|
|
{ 0x03, 0x00, 0x0c, 0x0, 0x3a },
|
|
{ 0x03, 0x00, 0x0b, 0x0, 0x3e },
|
|
{ 0x03, 0x00, 0x0b, 0x0, 0x3c },
|
|
{ 0x03, 0x00, 0x0b, 0x0, 0x3b },
|
|
{ 0x03, 0x00, 0x0b, 0x0, 0x39 },
|
|
{ 0x03, 0x00, 0x0a, 0x0, 0x3d },
|
|
{ 0x03, 0x00, 0x0a, 0x0, 0x3b },
|
|
{ 0x03, 0x00, 0x0a, 0x0, 0x39 },
|
|
{ 0x03, 0x00, 0x09, 0x0, 0x3e },
|
|
{ 0x03, 0x00, 0x09, 0x0, 0x3c },
|
|
{ 0x03, 0x00, 0x09, 0x0, 0x3a },
|
|
{ 0x03, 0x00, 0x09, 0x0, 0x39 },
|
|
{ 0x03, 0x00, 0x08, 0x0, 0x3e },
|
|
{ 0x03, 0x00, 0x08, 0x0, 0x3c },
|
|
{ 0x03, 0x00, 0x08, 0x0, 0x3a },
|
|
{ 0x03, 0x00, 0x08, 0x0, 0x39 },
|
|
{ 0x03, 0x00, 0x08, 0x0, 0x37 },
|
|
{ 0x03, 0x00, 0x07, 0x0, 0x3d },
|
|
{ 0x03, 0x00, 0x07, 0x0, 0x3c },
|
|
{ 0x03, 0x00, 0x07, 0x0, 0x3a },
|
|
{ 0x03, 0x00, 0x07, 0x0, 0x38 },
|
|
{ 0x03, 0x00, 0x07, 0x0, 0x37 },
|
|
{ 0x03, 0x00, 0x06, 0x0, 0x3e },
|
|
{ 0x03, 0x00, 0x06, 0x0, 0x3c },
|
|
{ 0x03, 0x00, 0x06, 0x0, 0x3a },
|
|
{ 0x03, 0x00, 0x06, 0x0, 0x39 },
|
|
{ 0x03, 0x00, 0x06, 0x0, 0x37 },
|
|
{ 0x03, 0x00, 0x06, 0x0, 0x36 },
|
|
{ 0x03, 0x00, 0x06, 0x0, 0x34 },
|
|
{ 0x03, 0x00, 0x05, 0x0, 0x3d },
|
|
{ 0x03, 0x00, 0x05, 0x0, 0x3b },
|
|
{ 0x03, 0x00, 0x05, 0x0, 0x39 },
|
|
{ 0x03, 0x00, 0x05, 0x0, 0x38 },
|
|
{ 0x03, 0x00, 0x05, 0x0, 0x36 },
|
|
{ 0x03, 0x00, 0x05, 0x0, 0x35 },
|
|
{ 0x03, 0x00, 0x05, 0x0, 0x33 },
|
|
{ 0x03, 0x00, 0x04, 0x0, 0x3e },
|
|
{ 0x03, 0x00, 0x04, 0x0, 0x3c },
|
|
{ 0x03, 0x00, 0x04, 0x0, 0x3a },
|
|
{ 0x03, 0x00, 0x04, 0x0, 0x39 },
|
|
{ 0x03, 0x00, 0x04, 0x0, 0x37 },
|
|
{ 0x03, 0x00, 0x04, 0x0, 0x36 },
|
|
{ 0x03, 0x00, 0x04, 0x0, 0x34 },
|
|
{ 0x03, 0x00, 0x04, 0x0, 0x33 },
|
|
{ 0x03, 0x00, 0x04, 0x0, 0x31 },
|
|
{ 0x03, 0x00, 0x04, 0x0, 0x30 },
|
|
{ 0x03, 0x00, 0x04, 0x0, 0x2e },
|
|
{ 0x03, 0x00, 0x03, 0x0, 0x3c },
|
|
{ 0x03, 0x00, 0x03, 0x0, 0x3a },
|
|
{ 0x03, 0x00, 0x03, 0x0, 0x39 },
|
|
{ 0x03, 0x00, 0x03, 0x0, 0x37 },
|
|
{ 0x03, 0x00, 0x03, 0x0, 0x36 },
|
|
{ 0x03, 0x00, 0x03, 0x0, 0x34 },
|
|
{ 0x03, 0x00, 0x03, 0x0, 0x33 },
|
|
{ 0x03, 0x00, 0x03, 0x0, 0x31 },
|
|
{ 0x03, 0x00, 0x03, 0x0, 0x30 },
|
|
{ 0x03, 0x00, 0x03, 0x0, 0x2e },
|
|
{ 0x03, 0x00, 0x03, 0x0, 0x2d },
|
|
{ 0x03, 0x00, 0x03, 0x0, 0x2c },
|
|
{ 0x03, 0x00, 0x03, 0x0, 0x2b },
|
|
{ 0x03, 0x00, 0x03, 0x0, 0x29 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x3d },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x3b },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x39 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x38 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x36 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x35 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x33 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x32 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x30 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x2f },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x2e },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x2c },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x2b },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x2a },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x29 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x27 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x26 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x25 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x24 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x23 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x22 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x21 },
|
|
{ 0x03, 0x00, 0x02, 0x0, 0x20 },
|
|
{ 0x03, 0x00, 0x01, 0x0, 0x3f },
|
|
{ 0x03, 0x00, 0x01, 0x0, 0x3d },
|
|
{ 0x03, 0x00, 0x01, 0x0, 0x3b },
|
|
{ 0x03, 0x00, 0x01, 0x0, 0x39 },
|
|
};
|
|
|
|
/**************************************************
|
|
* SW control.
|
|
**************************************************/
|
|
|
|
static const u16 b43_lcntab_sw_ctl_4313_epa_rev0[] = {
|
|
0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
|
|
0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
|
|
0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
|
|
0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
|
|
0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
|
|
0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
|
|
0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
|
|
0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
|
|
0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
|
|
0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
|
|
0x0002, 0x0008, 0x0004, 0x0001,
|
|
};
|
|
|
|
/**************************************************
|
|
* 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 > 0xFFFF);
|
|
|
|
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) & 0xFF;
|
|
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 > 0xFFFF);
|
|
|
|
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) & 0xFF;
|
|
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 &= 0xFFFF;
|
|
|
|
switch (type) {
|
|
case B43_LCNTAB_8BIT:
|
|
B43_WARN_ON(value & ~0xFF);
|
|
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 & ~0xFFFF);
|
|
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 & 0xFFFF);
|
|
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 > 0xFFFF);
|
|
|
|
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 & ~0xFF);
|
|
b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
|
|
break;
|
|
case B43_LCNTAB_16BIT:
|
|
value = *((u16 *)data);
|
|
data += 2;
|
|
B43_WARN_ON(value & ~0xFFFF);
|
|
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 & 0xFFFF);
|
|
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(0x02, 0), b43_lcntab_0x02);
|
|
lcntab_upload(dev, B43_LCNTAB16(0x01, 0), b43_lcntab_0x01);
|
|
lcntab_upload(dev, B43_LCNTAB32(0x0b, 0), b43_lcntab_0x0b);
|
|
lcntab_upload(dev, B43_LCNTAB32(0x0c, 0), b43_lcntab_0x0c);
|
|
lcntab_upload(dev, B43_LCNTAB32(0x0d, 0), b43_lcntab_0x0d);
|
|
lcntab_upload(dev, B43_LCNTAB16(0x0e, 0), b43_lcntab_0x0e);
|
|
lcntab_upload(dev, B43_LCNTAB16(0x0f, 0), b43_lcntab_0x0f);
|
|
lcntab_upload(dev, B43_LCNTAB16(0x10, 0), b43_lcntab_0x10);
|
|
lcntab_upload(dev, B43_LCNTAB16(0x11, 0), b43_lcntab_0x11);
|
|
lcntab_upload(dev, B43_LCNTAB32(0x12, 0), b43_lcntab_0x12);
|
|
lcntab_upload(dev, B43_LCNTAB16(0x14, 0), b43_lcntab_0x14);
|
|
lcntab_upload(dev, B43_LCNTAB16(0x17, 0), b43_lcntab_0x17);
|
|
lcntab_upload(dev, B43_LCNTAB16(0x00, 0), b43_lcntab_0x00);
|
|
lcntab_upload(dev, B43_LCNTAB32(0x18, 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 = 0x70;
|
|
if (dev->dev->bus_sprom->boardflags_lo & B43_BFL_FEM)
|
|
pa_gain = 0x10;
|
|
|
|
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(0x7, 0xc0 + i), val);
|
|
|
|
/* brcmsmac doesn't maskset, we follow newer wl here */
|
|
val = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0x140 + i));
|
|
val &= 0x000fffff;
|
|
val |= ((gain_table[i].dac << 28) |
|
|
(gain_table[i].bb_mult << 20));
|
|
b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0x140 + 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(0x7, 0x140 + i));
|
|
bbmult >>= 20;
|
|
rfgain = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0xc0 + 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(0x7, 0x240 + i));
|
|
b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0x240 + 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 < 0x80; i++)
|
|
b43_lcntab_write(dev, B43_LCNTAB32(0x18, i), 0x80000);
|
|
}
|
|
|
|
/* 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(0xf, 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);
|
|
}
|