// SPDX-License-Identifier: GPL-2.0-or-later
/*
Broadcom B43 wireless driver
Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>,
Copyright (c) 2005-2007 Stefano Brivio <stefano.brivio@polimi.it>
Copyright (c) 2006, 2006 Michael Buesch <m@bues.ch>
Copyright (c) 2005 Danny van Dyk <kugelfang@gentoo.org>
Copyright (c) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch>
*/
#include "b43.h"
#include "tables.h"
#include "phy_g.h"
const u32 b43_tab_rotor[] = {
0 xFEB93FFD, 0 xFEC63FFD, /* 0 */
0 xFED23FFD, 0 xFEDF3FFD,
0 xFEEC3FFE, 0 xFEF83FFE,
0 xFF053FFE, 0 xFF113FFE,
0 xFF1E3FFE, 0 xFF2A3FFF, /* 8 */
0 xFF373FFF, 0 xFF443FFF,
0 xFF503FFF, 0 xFF5D3FFF,
0 xFF693FFF, 0 xFF763FFF,
0 xFF824000, 0 xFF8F4000, /* 16 */
0 xFF9B4000, 0 xFFA84000,
0 xFFB54000, 0 xFFC14000,
0 xFFCE4000, 0 xFFDA4000,
0 xFFE74000, 0 xFFF34000, /* 24 */
0 x00004000, 0 x000D4000,
0 x00194000, 0 x00264000,
0 x00324000, 0 x003F4000,
0 x004B4000, 0 x00584000, /* 32 */
0 x00654000, 0 x00714000,
0 x007E4000, 0 x008A3FFF,
0 x00973FFF, 0 x00A33FFF,
0 x00B03FFF, 0 x00BC3FFF, /* 40 */
0 x00C93FFF, 0 x00D63FFF,
0 x00E23FFE, 0 x00EF3FFE,
0 x00FB3FFE, 0 x01083FFE,
0 x01143FFE, 0 x01213FFD, /* 48 */
0 x012E3FFD, 0 x013A3FFD,
0 x01473FFD,
};
const u32 b43_tab_retard[] = {
0 xDB93CB87, 0 xD666CF64, /* 0 */
0 xD1FDD358, 0 xCDA6D826,
0 xCA38DD9F, 0 xC729E2B4,
0 xC469E88E, 0 xC26AEE2B,
0 xC0DEF46C, 0 xC073FA62, /* 8 */
0 xC01D00D5, 0 xC0760743,
0 xC1560D1E, 0 xC2E51369,
0 xC4ED18FF, 0 xC7AC1ED7,
0 xCB2823B2, 0 xCEFA28D9, /* 16 */
0 xD2F62D3F, 0 xD7BB3197,
0 xDCE53568, 0 xE1FE3875,
0 xE7D13B35, 0 xED663D35,
0 xF39B3EC4, 0 xF98E3FA7, /* 24 */
0 x00004000, 0 x06723FA7,
0 x0C653EC4, 0 x129A3D35,
0 x182F3B35, 0 x1E023875,
0 x231B3568, 0 x28453197, /* 32 */
0 x2D0A2D3F, 0 x310628D9,
0 x34D823B2, 0 x38541ED7,
0 x3B1318FF, 0 x3D1B1369,
0 x3EAA0D1E, 0 x3F8A0743, /* 40 */
0 x3FE300D5, 0 x3F8DFA62,
0 x3F22F46C, 0 x3D96EE2B,
0 x3B97E88E, 0 x38D7E2B4,
0 x35C8DD9F, 0 x325AD826, /* 48 */
0 x2E03D358, 0 x299ACF64,
0 x246DCB87,
};
const u16 b43_tab_finefreqa[] = {
0 x0082, 0 x0082, 0 x0102, 0 x0182, /* 0 */
0 x0202, 0 x0282, 0 x0302, 0 x0382,
0 x0402, 0 x0482, 0 x0502, 0 x0582,
0 x05E2, 0 x0662, 0 x06E2, 0 x0762,
0 x07E2, 0 x0842, 0 x08C2, 0 x0942, /* 16 */
0 x09C2, 0 x0A22, 0 x0AA2, 0 x0B02,
0 x0B82, 0 x0BE2, 0 x0C62, 0 x0CC2,
0 x0D42, 0 x0DA2, 0 x0E02, 0 x0E62,
0 x0EE2, 0 x0F42, 0 x0FA2, 0 x1002, /* 32 */
0 x1062, 0 x10C2, 0 x1122, 0 x1182,
0 x11E2, 0 x1242, 0 x12A2, 0 x12E2,
0 x1342, 0 x13A2, 0 x1402, 0 x1442,
0 x14A2, 0 x14E2, 0 x1542, 0 x1582, /* 48 */
0 x15E2, 0 x1622, 0 x1662, 0 x16C1,
0 x1701, 0 x1741, 0 x1781, 0 x17E1,
0 x1821, 0 x1861, 0 x18A1, 0 x18E1,
0 x1921, 0 x1961, 0 x19A1, 0 x19E1, /* 64 */
0 x1A21, 0 x1A61, 0 x1AA1, 0 x1AC1,
0 x1B01, 0 x1B41, 0 x1B81, 0 x1BA1,
0 x1BE1, 0 x1C21, 0 x1C41, 0 x1C81,
0 x1CA1, 0 x1CE1, 0 x1D01, 0 x1D41, /* 80 */
0 x1D61, 0 x1DA1, 0 x1DC1, 0 x1E01,
0 x1E21, 0 x1E61, 0 x1E81, 0 x1EA1,
0 x1EE1, 0 x1F01, 0 x1F21, 0 x1F41,
0 x1F81, 0 x1FA1, 0 x1FC1, 0 x1FE1, /* 96 */
0 x2001, 0 x2041, 0 x2061, 0 x2081,
0 x20A1, 0 x20C1, 0 x20E1, 0 x2101,
0 x2121, 0 x2141, 0 x2161, 0 x2181,
0 x21A1, 0 x21C1, 0 x21E1, 0 x2201, /* 112 */
0 x2221, 0 x2241, 0 x2261, 0 x2281,
0 x22A1, 0 x22C1, 0 x22C1, 0 x22E1,
0 x2301, 0 x2321, 0 x2341, 0 x2361,
0 x2361, 0 x2381, 0 x23A1, 0 x23C1, /* 128 */
0 x23E1, 0 x23E1, 0 x2401, 0 x2421,
0 x2441, 0 x2441, 0 x2461, 0 x2481,
0 x2481, 0 x24A1, 0 x24C1, 0 x24C1,
0 x24E1, 0 x2501, 0 x2501, 0 x2521, /* 144 */
0 x2541, 0 x2541, 0 x2561, 0 x2561,
0 x2581, 0 x25A1, 0 x25A1, 0 x25C1,
0 x25C1, 0 x25E1, 0 x2601, 0 x2601,
0 x2621, 0 x2621, 0 x2641, 0 x2641, /* 160 */
0 x2661, 0 x2661, 0 x2681, 0 x2681,
0 x26A1, 0 x26A1, 0 x26C1, 0 x26C1,
0 x26E1, 0 x26E1, 0 x2701, 0 x2701,
0 x2721, 0 x2721, 0 x2740, 0 x2740, /* 176 */
0 x2760, 0 x2760, 0 x2780, 0 x2780,
0 x2780, 0 x27A0, 0 x27A0, 0 x27C0,
0 x27C0, 0 x27E0, 0 x27E0, 0 x27E0,
0 x2800, 0 x2800, 0 x2820, 0 x2820, /* 192 */
0 x2820, 0 x2840, 0 x2840, 0 x2840,
0 x2860, 0 x2860, 0 x2880, 0 x2880,
0 x2880, 0 x28A0, 0 x28A0, 0 x28A0,
0 x28C0, 0 x28C0, 0 x28C0, 0 x28E0, /* 208 */
0 x28E0, 0 x28E0, 0 x2900, 0 x2900,
0 x2900, 0 x2920, 0 x2920, 0 x2920,
0 x2940, 0 x2940, 0 x2940, 0 x2960,
0 x2960, 0 x2960, 0 x2960, 0 x2980, /* 224 */
0 x2980, 0 x2980, 0 x29A0, 0 x29A0,
0 x29A0, 0 x29A0, 0 x29C0, 0 x29C0,
0 x29C0, 0 x29E0, 0 x29E0, 0 x29E0,
0 x29E0, 0 x2A00, 0 x2A00, 0 x2A00, /* 240 */
0 x2A00, 0 x2A20, 0 x2A20, 0 x2A20,
0 x2A20, 0 x2A40, 0 x2A40, 0 x2A40,
0 x2A40, 0 x2A60, 0 x2A60, 0 x2A60,
};
const u16 b43_tab_finefreqg[] = {
0 x0089, 0 x02E9, 0 x0409, 0 x04E9, /* 0 */
0 x05A9, 0 x0669, 0 x0709, 0 x0789,
0 x0829, 0 x08A9, 0 x0929, 0 x0989,
0 x0A09, 0 x0A69, 0 x0AC9, 0 x0B29,
0 x0BA9, 0 x0BE9, 0 x0C49, 0 x0CA9, /* 16 */
0 x0D09, 0 x0D69, 0 x0DA9, 0 x0E09,
0 x0E69, 0 x0EA9, 0 x0F09, 0 x0F49,
0 x0FA9, 0 x0FE9, 0 x1029, 0 x1089,
0 x10C9, 0 x1109, 0 x1169, 0 x11A9, /* 32 */
0 x11E9, 0 x1229, 0 x1289, 0 x12C9,
0 x1309, 0 x1349, 0 x1389, 0 x13C9,
0 x1409, 0 x1449, 0 x14A9, 0 x14E9,
0 x1529, 0 x1569, 0 x15A9, 0 x15E9, /* 48 */
0 x1629, 0 x1669, 0 x16A9, 0 x16E8,
0 x1728, 0 x1768, 0 x17A8, 0 x17E8,
0 x1828, 0 x1868, 0 x18A8, 0 x18E8,
0 x1928, 0 x1968, 0 x19A8, 0 x19E8, /* 64 */
0 x1A28, 0 x1A68, 0 x1AA8, 0 x1AE8,
0 x1B28, 0 x1B68, 0 x1BA8, 0 x1BE8,
0 x1C28, 0 x1C68, 0 x1CA8, 0 x1CE8,
0 x1D28, 0 x1D68, 0 x1DC8, 0 x1E08, /* 80 */
0 x1E48, 0 x1E88, 0 x1EC8, 0 x1F08,
0 x1F48, 0 x1F88, 0 x1FE8, 0 x2028,
0 x2068, 0 x20A8, 0 x2108, 0 x2148,
0 x2188, 0 x21C8, 0 x2228, 0 x2268, /* 96 */
0 x22C8, 0 x2308, 0 x2348, 0 x23A8,
0 x23E8, 0 x2448, 0 x24A8, 0 x24E8,
0 x2548, 0 x25A8, 0 x2608, 0 x2668,
0 x26C8, 0 x2728, 0 x2787, 0 x27E7, /* 112 */
0 x2847, 0 x28C7, 0 x2947, 0 x29A7,
0 x2A27, 0 x2AC7, 0 x2B47, 0 x2BE7,
0 x2CA7, 0 x2D67, 0 x2E47, 0 x2F67,
0 x3247, 0 x3526, 0 x3646, 0 x3726, /* 128 */
0 x3806, 0 x38A6, 0 x3946, 0 x39E6,
0 x3A66, 0 x3AE6, 0 x3B66, 0 x3BC6,
0 x3C45, 0 x3CA5, 0 x3D05, 0 x3D85,
0 x3DE5, 0 x3E45, 0 x3EA5, 0 x3EE5, /* 144 */
0 x3F45, 0 x3FA5, 0 x4005, 0 x4045,
0 x40A5, 0 x40E5, 0 x4145, 0 x4185,
0 x41E5, 0 x4225, 0 x4265, 0 x42C5,
0 x4305, 0 x4345, 0 x43A5, 0 x43E5, /* 160 */
0 x4424, 0 x4464, 0 x44C4, 0 x4504,
0 x4544, 0 x4584, 0 x45C4, 0 x4604,
0 x4644, 0 x46A4, 0 x46E4, 0 x4724,
0 x4764, 0 x47A4, 0 x47E4, 0 x4824, /* 176 */
0 x4864, 0 x48A4, 0 x48E4, 0 x4924,
0 x4964, 0 x49A4, 0 x49E4, 0 x4A24,
0 x4A64, 0 x4AA4, 0 x4AE4, 0 x4B23,
0 x4B63, 0 x4BA3, 0 x4BE3, 0 x4C23, /* 192 */
0 x4C63, 0 x4CA3, 0 x4CE3, 0 x4D23,
0 x4D63, 0 x4DA3, 0 x4DE3, 0 x4E23,
0 x4E63, 0 x4EA3, 0 x4EE3, 0 x4F23,
0 x4F63, 0 x4FC3, 0 x5003, 0 x5043, /* 208 */
0 x5083, 0 x50C3, 0 x5103, 0 x5143,
0 x5183, 0 x51E2, 0 x5222, 0 x5262,
0 x52A2, 0 x52E2, 0 x5342, 0 x5382,
0 x53C2, 0 x5402, 0 x5462, 0 x54A2, /* 224 */
0 x5502, 0 x5542, 0 x55A2, 0 x55E2,
0 x5642, 0 x5682, 0 x56E2, 0 x5722,
0 x5782, 0 x57E1, 0 x5841, 0 x58A1,
0 x5901, 0 x5961, 0 x59C1, 0 x5A21, /* 240 */
0 x5AA1, 0 x5B01, 0 x5B81, 0 x5BE1,
0 x5C61, 0 x5D01, 0 x5D80, 0 x5E20,
0 x5EE0, 0 x5FA0, 0 x6080, 0 x61C0,
};
const u16 b43_tab_noisea2[] = {
0 x0001, 0 x0001, 0 x0001, 0 xFFFE,
0 xFFFE, 0 x3FFF, 0 x1000, 0 x0393,
};
const u16 b43_tab_noisea3[] = {
0 x5E5E, 0 x5E5E, 0 x5E5E, 0 x3F48,
0 x4C4C, 0 x4C4C, 0 x4C4C, 0 x2D36,
};
const u16 b43_tab_noiseg1[] = {
0 x013C, 0 x01F5, 0 x031A, 0 x0631,
0 x0001, 0 x0001, 0 x0001, 0 x0001,
};
const u16 b43_tab_noiseg2[] = {
0 x5484, 0 x3C40, 0 x0000, 0 x0000,
0 x0000, 0 x0000, 0 x0000, 0 x0000,
};
const u16 b43_tab_noisescalea2[] = {
0 x6767, 0 x6767, 0 x6767, 0 x6767, /* 0 */
0 x6767, 0 x6767, 0 x6767, 0 x6767,
0 x6767, 0 x6767, 0 x6767, 0 x6767,
0 x6767, 0 x6700, 0 x6767, 0 x6767,
0 x6767, 0 x6767, 0 x6767, 0 x6767, /* 16 */
0 x6767, 0 x6767, 0 x6767, 0 x6767,
0 x6767, 0 x6767, 0 x0067,
};
const u16 b43_tab_noisescalea3[] = {
0 x2323, 0 x2323, 0 x2323, 0 x2323, /* 0 */
0 x2323, 0 x2323, 0 x2323, 0 x2323,
0 x2323, 0 x2323, 0 x2323, 0 x2323,
0 x2323, 0 x2300, 0 x2323, 0 x2323,
0 x2323, 0 x2323, 0 x2323, 0 x2323, /* 16 */
0 x2323, 0 x2323, 0 x2323, 0 x2323,
0 x2323, 0 x2323, 0 x0023,
};
const u16 b43_tab_noisescaleg1[] = {
0 x6C77, 0 x5162, 0 x3B40, 0 x3335, /* 0 */
0 x2F2D, 0 x2A2A, 0 x2527, 0 x1F21,
0 x1A1D, 0 x1719, 0 x1616, 0 x1414,
0 x1414, 0 x1400, 0 x1414, 0 x1614,
0 x1716, 0 x1A19, 0 x1F1D, 0 x2521, /* 16 */
0 x2A27, 0 x2F2A, 0 x332D, 0 x3B35,
0 x5140, 0 x6C62, 0 x0077,
};
const u16 b43_tab_noisescaleg2[] = {
0 xD8DD, 0 xCBD4, 0 xBCC0, 0 xB6B7, /* 0 */
0 xB2B0, 0 xADAD, 0 xA7A9, 0 x9FA1,
0 x969B, 0 x9195, 0 x8F8F, 0 x8A8A,
0 x8A8A, 0 x8A00, 0 x8A8A, 0 x8F8A,
0 x918F, 0 x9695, 0 x9F9B, 0 xA7A1, /* 16 */
0 xADA9, 0 xB2AD, 0 xB6B0, 0 xBCB7,
0 xCBC0, 0 xD8D4, 0 x00DD,
};
const u16 b43_tab_noisescaleg3[] = {
0 xA4A4, 0 xA4A4, 0 xA4A4, 0 xA4A4, /* 0 */
0 xA4A4, 0 xA4A4, 0 xA4A4, 0 xA4A4,
0 xA4A4, 0 xA4A4, 0 xA4A4, 0 xA4A4,
0 xA4A4, 0 xA400, 0 xA4A4, 0 xA4A4,
0 xA4A4, 0 xA4A4, 0 xA4A4, 0 xA4A4, /* 16 */
0 xA4A4, 0 xA4A4, 0 xA4A4, 0 xA4A4,
0 xA4A4, 0 xA4A4, 0 x00A4,
};
const u16 b43_tab_sigmasqr1[] = {
0 x007A, 0 x0075, 0 x0071, 0 x006C, /* 0 */
0 x0067, 0 x0063, 0 x005E, 0 x0059,
0 x0054, 0 x0050, 0 x004B, 0 x0046,
0 x0042, 0 x003D, 0 x003D, 0 x003D,
0 x003D, 0 x003D, 0 x003D, 0 x003D, /* 16 */
0 x003D, 0 x003D, 0 x003D, 0 x003D,
0 x003D, 0 x003D, 0 x0000, 0 x003D,
0 x003D, 0 x003D, 0 x003D, 0 x003D,
0 x003D, 0 x003D, 0 x003D, 0 x003D, /* 32 */
0 x003D, 0 x003D, 0 x003D, 0 x003D,
0 x0042, 0 x0046, 0 x004B, 0 x0050,
0 x0054, 0 x0059, 0 x005E, 0 x0063,
0 x0067, 0 x006C, 0 x0071, 0 x0075, /* 48 */
0 x007A,
};
const u16 b43_tab_sigmasqr2[] = {
0 x00DE, 0 x00DC, 0 x00DA, 0 x00D8, /* 0 */
0 x00D6, 0 x00D4, 0 x00D2, 0 x00CF,
0 x00CD, 0 x00CA, 0 x00C7, 0 x00C4,
0 x00C1, 0 x00BE, 0 x00BE, 0 x00BE,
0 x00BE, 0 x00BE, 0 x00BE, 0 x00BE, /* 16 */
0 x00BE, 0 x00BE, 0 x00BE, 0 x00BE,
0 x00BE, 0 x00BE, 0 x0000, 0 x00BE,
0 x00BE, 0 x00BE, 0 x00BE, 0 x00BE,
0 x00BE, 0 x00BE, 0 x00BE, 0 x00BE, /* 32 */
0 x00BE, 0 x00BE, 0 x00BE, 0 x00BE,
0 x00C1, 0 x00C4, 0 x00C7, 0 x00CA,
0 x00CD, 0 x00CF, 0 x00D2, 0 x00D4,
0 x00D6, 0 x00D8, 0 x00DA, 0 x00DC, /* 48 */
0 x00DE,
};
const u16 b43_tab_rssiagc1[] = {
0 xFFF8, 0 xFFF8, 0 xFFF8, 0 xFFF8, /* 0 */
0 xFFF8, 0 xFFF9, 0 xFFFC, 0 xFFFE,
0 xFFF8, 0 xFFF8, 0 xFFF8, 0 xFFF8,
0 xFFF8, 0 xFFF8, 0 xFFF8, 0 xFFF8,
};
const u16 b43_tab_rssiagc2[] = {
0 x0820, 0 x0820, 0 x0920, 0 x0C38, /* 0 */
0 x0820, 0 x0820, 0 x0820, 0 x0820,
0 x0820, 0 x0820, 0 x0920, 0 x0A38,
0 x0820, 0 x0820, 0 x0820, 0 x0820,
0 x0820, 0 x0820, 0 x0920, 0 x0A38, /* 16 */
0 x0820, 0 x0820, 0 x0820, 0 x0820,
0 x0820, 0 x0820, 0 x0920, 0 x0A38,
0 x0820, 0 x0820, 0 x0820, 0 x0820,
0 x0820, 0 x0820, 0 x0920, 0 x0A38, /* 32 */
0 x0820, 0 x0820, 0 x0820, 0 x0820,
0 x0820, 0 x0820, 0 x0920, 0 x0A38,
0 x0820, 0 x0820, 0 x0820, 0 x0820,
};
static inline void assert_sizes(void )
{
BUILD_BUG_ON(B43_TAB_ROTOR_SIZE != ARRAY_SIZE(b43_tab_rotor));
BUILD_BUG_ON(B43_TAB_RETARD_SIZE != ARRAY_SIZE(b43_tab_retard));
BUILD_BUG_ON(B43_TAB_FINEFREQA_SIZE != ARRAY_SIZE(b43_tab_finefreqa));
BUILD_BUG_ON(B43_TAB_FINEFREQG_SIZE != ARRAY_SIZE(b43_tab_finefreqg));
BUILD_BUG_ON(B43_TAB_NOISEA2_SIZE != ARRAY_SIZE(b43_tab_noisea2));
BUILD_BUG_ON(B43_TAB_NOISEA3_SIZE != ARRAY_SIZE(b43_tab_noisea3));
BUILD_BUG_ON(B43_TAB_NOISEG1_SIZE != ARRAY_SIZE(b43_tab_noiseg1));
BUILD_BUG_ON(B43_TAB_NOISEG2_SIZE != ARRAY_SIZE(b43_tab_noiseg2));
BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
ARRAY_SIZE(b43_tab_noisescalea2));
BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
ARRAY_SIZE(b43_tab_noisescalea3));
BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
ARRAY_SIZE(b43_tab_noisescaleg1));
BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
ARRAY_SIZE(b43_tab_noisescaleg2));
BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
ARRAY_SIZE(b43_tab_noisescaleg3));
BUILD_BUG_ON(B43_TAB_SIGMASQR_SIZE != ARRAY_SIZE(b43_tab_sigmasqr1));
BUILD_BUG_ON(B43_TAB_SIGMASQR_SIZE != ARRAY_SIZE(b43_tab_sigmasqr2));
BUILD_BUG_ON(B43_TAB_RSSIAGC1_SIZE != ARRAY_SIZE(b43_tab_rssiagc1));
BUILD_BUG_ON(B43_TAB_RSSIAGC2_SIZE != ARRAY_SIZE(b43_tab_rssiagc2));
}
u16 b43_ofdmtab_read16(struct b43_wldev *dev, u16 table, u16 offset)
{
struct b43_phy_g *gphy = dev->phy.g;
u16 addr;
addr = table + offset;
if ((gphy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_READ) ||
(addr - 1 != gphy->ofdmtab_addr)) {
/* The hardware has a different address in memory. Update it. */
b43_phy_write(dev, B43_PHY_OTABLECTL, addr);
gphy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_READ;
}
gphy->ofdmtab_addr = addr;
return b43_phy_read(dev, B43_PHY_OTABLEI);
/* Some compiletime assertions... */
assert_sizes();
}
void b43_ofdmtab_write16(struct b43_wldev *dev, u16 table,
u16 offset, u16 value)
{
struct b43_phy_g *gphy = dev->phy.g;
u16 addr;
addr = table + offset;
if ((gphy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_WRITE) ||
(addr - 1 != gphy->ofdmtab_addr)) {
/* The hardware has a different address in memory. Update it. */
b43_phy_write(dev, B43_PHY_OTABLECTL, addr);
gphy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_WRITE;
}
gphy->ofdmtab_addr = addr;
b43_phy_write(dev, B43_PHY_OTABLEI, value);
}
u32 b43_ofdmtab_read32(struct b43_wldev *dev, u16 table, u16 offset)
{
struct b43_phy_g *gphy = dev->phy.g;
u32 ret;
u16 addr;
addr = table + offset;
if ((gphy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_READ) ||
(addr - 1 != gphy->ofdmtab_addr)) {
/* The hardware has a different address in memory. Update it. */
b43_phy_write(dev, B43_PHY_OTABLECTL, addr);
gphy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_READ;
}
gphy->ofdmtab_addr = addr;
ret = b43_phy_read(dev, B43_PHY_OTABLEQ);
ret <<= 16 ;
ret |= b43_phy_read(dev, B43_PHY_OTABLEI);
return ret;
}
void b43_ofdmtab_write32(struct b43_wldev *dev, u16 table,
u16 offset, u32 value)
{
struct b43_phy_g *gphy = dev->phy.g;
u16 addr;
addr = table + offset;
if ((gphy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_WRITE) ||
(addr - 1 != gphy->ofdmtab_addr)) {
/* The hardware has a different address in memory. Update it. */
b43_phy_write(dev, B43_PHY_OTABLECTL, addr);
gphy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_WRITE;
}
gphy->ofdmtab_addr = addr;
b43_phy_write(dev, B43_PHY_OTABLEI, value);
b43_phy_write(dev, B43_PHY_OTABLEQ, (value >> 16 ));
}
u16 b43_gtab_read(struct b43_wldev *dev, u16 table, u16 offset)
{
b43_phy_write(dev, B43_PHY_GTABCTL, table + offset);
return b43_phy_read(dev, B43_PHY_GTABDATA);
}
void b43_gtab_write(struct b43_wldev *dev, u16 table, u16 offset, u16 value)
{
b43_phy_write(dev, B43_PHY_GTABCTL, table + offset);
b43_phy_write(dev, B43_PHY_GTABDATA, value);
}
Messung V0.5 in Prozent C=96 H=92 G=93