0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include "b43.h"
0016 #include "tables.h"
0017 #include "phy_g.h"
0018
0019
0020 const u32 b43_tab_rotor[] = {
0021 0xFEB93FFD, 0xFEC63FFD,
0022 0xFED23FFD, 0xFEDF3FFD,
0023 0xFEEC3FFE, 0xFEF83FFE,
0024 0xFF053FFE, 0xFF113FFE,
0025 0xFF1E3FFE, 0xFF2A3FFF,
0026 0xFF373FFF, 0xFF443FFF,
0027 0xFF503FFF, 0xFF5D3FFF,
0028 0xFF693FFF, 0xFF763FFF,
0029 0xFF824000, 0xFF8F4000,
0030 0xFF9B4000, 0xFFA84000,
0031 0xFFB54000, 0xFFC14000,
0032 0xFFCE4000, 0xFFDA4000,
0033 0xFFE74000, 0xFFF34000,
0034 0x00004000, 0x000D4000,
0035 0x00194000, 0x00264000,
0036 0x00324000, 0x003F4000,
0037 0x004B4000, 0x00584000,
0038 0x00654000, 0x00714000,
0039 0x007E4000, 0x008A3FFF,
0040 0x00973FFF, 0x00A33FFF,
0041 0x00B03FFF, 0x00BC3FFF,
0042 0x00C93FFF, 0x00D63FFF,
0043 0x00E23FFE, 0x00EF3FFE,
0044 0x00FB3FFE, 0x01083FFE,
0045 0x01143FFE, 0x01213FFD,
0046 0x012E3FFD, 0x013A3FFD,
0047 0x01473FFD,
0048 };
0049
0050 const u32 b43_tab_retard[] = {
0051 0xDB93CB87, 0xD666CF64,
0052 0xD1FDD358, 0xCDA6D826,
0053 0xCA38DD9F, 0xC729E2B4,
0054 0xC469E88E, 0xC26AEE2B,
0055 0xC0DEF46C, 0xC073FA62,
0056 0xC01D00D5, 0xC0760743,
0057 0xC1560D1E, 0xC2E51369,
0058 0xC4ED18FF, 0xC7AC1ED7,
0059 0xCB2823B2, 0xCEFA28D9,
0060 0xD2F62D3F, 0xD7BB3197,
0061 0xDCE53568, 0xE1FE3875,
0062 0xE7D13B35, 0xED663D35,
0063 0xF39B3EC4, 0xF98E3FA7,
0064 0x00004000, 0x06723FA7,
0065 0x0C653EC4, 0x129A3D35,
0066 0x182F3B35, 0x1E023875,
0067 0x231B3568, 0x28453197,
0068 0x2D0A2D3F, 0x310628D9,
0069 0x34D823B2, 0x38541ED7,
0070 0x3B1318FF, 0x3D1B1369,
0071 0x3EAA0D1E, 0x3F8A0743,
0072 0x3FE300D5, 0x3F8DFA62,
0073 0x3F22F46C, 0x3D96EE2B,
0074 0x3B97E88E, 0x38D7E2B4,
0075 0x35C8DD9F, 0x325AD826,
0076 0x2E03D358, 0x299ACF64,
0077 0x246DCB87,
0078 };
0079
0080 const u16 b43_tab_finefreqa[] = {
0081 0x0082, 0x0082, 0x0102, 0x0182,
0082 0x0202, 0x0282, 0x0302, 0x0382,
0083 0x0402, 0x0482, 0x0502, 0x0582,
0084 0x05E2, 0x0662, 0x06E2, 0x0762,
0085 0x07E2, 0x0842, 0x08C2, 0x0942,
0086 0x09C2, 0x0A22, 0x0AA2, 0x0B02,
0087 0x0B82, 0x0BE2, 0x0C62, 0x0CC2,
0088 0x0D42, 0x0DA2, 0x0E02, 0x0E62,
0089 0x0EE2, 0x0F42, 0x0FA2, 0x1002,
0090 0x1062, 0x10C2, 0x1122, 0x1182,
0091 0x11E2, 0x1242, 0x12A2, 0x12E2,
0092 0x1342, 0x13A2, 0x1402, 0x1442,
0093 0x14A2, 0x14E2, 0x1542, 0x1582,
0094 0x15E2, 0x1622, 0x1662, 0x16C1,
0095 0x1701, 0x1741, 0x1781, 0x17E1,
0096 0x1821, 0x1861, 0x18A1, 0x18E1,
0097 0x1921, 0x1961, 0x19A1, 0x19E1,
0098 0x1A21, 0x1A61, 0x1AA1, 0x1AC1,
0099 0x1B01, 0x1B41, 0x1B81, 0x1BA1,
0100 0x1BE1, 0x1C21, 0x1C41, 0x1C81,
0101 0x1CA1, 0x1CE1, 0x1D01, 0x1D41,
0102 0x1D61, 0x1DA1, 0x1DC1, 0x1E01,
0103 0x1E21, 0x1E61, 0x1E81, 0x1EA1,
0104 0x1EE1, 0x1F01, 0x1F21, 0x1F41,
0105 0x1F81, 0x1FA1, 0x1FC1, 0x1FE1,
0106 0x2001, 0x2041, 0x2061, 0x2081,
0107 0x20A1, 0x20C1, 0x20E1, 0x2101,
0108 0x2121, 0x2141, 0x2161, 0x2181,
0109 0x21A1, 0x21C1, 0x21E1, 0x2201,
0110 0x2221, 0x2241, 0x2261, 0x2281,
0111 0x22A1, 0x22C1, 0x22C1, 0x22E1,
0112 0x2301, 0x2321, 0x2341, 0x2361,
0113 0x2361, 0x2381, 0x23A1, 0x23C1,
0114 0x23E1, 0x23E1, 0x2401, 0x2421,
0115 0x2441, 0x2441, 0x2461, 0x2481,
0116 0x2481, 0x24A1, 0x24C1, 0x24C1,
0117 0x24E1, 0x2501, 0x2501, 0x2521,
0118 0x2541, 0x2541, 0x2561, 0x2561,
0119 0x2581, 0x25A1, 0x25A1, 0x25C1,
0120 0x25C1, 0x25E1, 0x2601, 0x2601,
0121 0x2621, 0x2621, 0x2641, 0x2641,
0122 0x2661, 0x2661, 0x2681, 0x2681,
0123 0x26A1, 0x26A1, 0x26C1, 0x26C1,
0124 0x26E1, 0x26E1, 0x2701, 0x2701,
0125 0x2721, 0x2721, 0x2740, 0x2740,
0126 0x2760, 0x2760, 0x2780, 0x2780,
0127 0x2780, 0x27A0, 0x27A0, 0x27C0,
0128 0x27C0, 0x27E0, 0x27E0, 0x27E0,
0129 0x2800, 0x2800, 0x2820, 0x2820,
0130 0x2820, 0x2840, 0x2840, 0x2840,
0131 0x2860, 0x2860, 0x2880, 0x2880,
0132 0x2880, 0x28A0, 0x28A0, 0x28A0,
0133 0x28C0, 0x28C0, 0x28C0, 0x28E0,
0134 0x28E0, 0x28E0, 0x2900, 0x2900,
0135 0x2900, 0x2920, 0x2920, 0x2920,
0136 0x2940, 0x2940, 0x2940, 0x2960,
0137 0x2960, 0x2960, 0x2960, 0x2980,
0138 0x2980, 0x2980, 0x29A0, 0x29A0,
0139 0x29A0, 0x29A0, 0x29C0, 0x29C0,
0140 0x29C0, 0x29E0, 0x29E0, 0x29E0,
0141 0x29E0, 0x2A00, 0x2A00, 0x2A00,
0142 0x2A00, 0x2A20, 0x2A20, 0x2A20,
0143 0x2A20, 0x2A40, 0x2A40, 0x2A40,
0144 0x2A40, 0x2A60, 0x2A60, 0x2A60,
0145 };
0146
0147 const u16 b43_tab_finefreqg[] = {
0148 0x0089, 0x02E9, 0x0409, 0x04E9,
0149 0x05A9, 0x0669, 0x0709, 0x0789,
0150 0x0829, 0x08A9, 0x0929, 0x0989,
0151 0x0A09, 0x0A69, 0x0AC9, 0x0B29,
0152 0x0BA9, 0x0BE9, 0x0C49, 0x0CA9,
0153 0x0D09, 0x0D69, 0x0DA9, 0x0E09,
0154 0x0E69, 0x0EA9, 0x0F09, 0x0F49,
0155 0x0FA9, 0x0FE9, 0x1029, 0x1089,
0156 0x10C9, 0x1109, 0x1169, 0x11A9,
0157 0x11E9, 0x1229, 0x1289, 0x12C9,
0158 0x1309, 0x1349, 0x1389, 0x13C9,
0159 0x1409, 0x1449, 0x14A9, 0x14E9,
0160 0x1529, 0x1569, 0x15A9, 0x15E9,
0161 0x1629, 0x1669, 0x16A9, 0x16E8,
0162 0x1728, 0x1768, 0x17A8, 0x17E8,
0163 0x1828, 0x1868, 0x18A8, 0x18E8,
0164 0x1928, 0x1968, 0x19A8, 0x19E8,
0165 0x1A28, 0x1A68, 0x1AA8, 0x1AE8,
0166 0x1B28, 0x1B68, 0x1BA8, 0x1BE8,
0167 0x1C28, 0x1C68, 0x1CA8, 0x1CE8,
0168 0x1D28, 0x1D68, 0x1DC8, 0x1E08,
0169 0x1E48, 0x1E88, 0x1EC8, 0x1F08,
0170 0x1F48, 0x1F88, 0x1FE8, 0x2028,
0171 0x2068, 0x20A8, 0x2108, 0x2148,
0172 0x2188, 0x21C8, 0x2228, 0x2268,
0173 0x22C8, 0x2308, 0x2348, 0x23A8,
0174 0x23E8, 0x2448, 0x24A8, 0x24E8,
0175 0x2548, 0x25A8, 0x2608, 0x2668,
0176 0x26C8, 0x2728, 0x2787, 0x27E7,
0177 0x2847, 0x28C7, 0x2947, 0x29A7,
0178 0x2A27, 0x2AC7, 0x2B47, 0x2BE7,
0179 0x2CA7, 0x2D67, 0x2E47, 0x2F67,
0180 0x3247, 0x3526, 0x3646, 0x3726,
0181 0x3806, 0x38A6, 0x3946, 0x39E6,
0182 0x3A66, 0x3AE6, 0x3B66, 0x3BC6,
0183 0x3C45, 0x3CA5, 0x3D05, 0x3D85,
0184 0x3DE5, 0x3E45, 0x3EA5, 0x3EE5,
0185 0x3F45, 0x3FA5, 0x4005, 0x4045,
0186 0x40A5, 0x40E5, 0x4145, 0x4185,
0187 0x41E5, 0x4225, 0x4265, 0x42C5,
0188 0x4305, 0x4345, 0x43A5, 0x43E5,
0189 0x4424, 0x4464, 0x44C4, 0x4504,
0190 0x4544, 0x4584, 0x45C4, 0x4604,
0191 0x4644, 0x46A4, 0x46E4, 0x4724,
0192 0x4764, 0x47A4, 0x47E4, 0x4824,
0193 0x4864, 0x48A4, 0x48E4, 0x4924,
0194 0x4964, 0x49A4, 0x49E4, 0x4A24,
0195 0x4A64, 0x4AA4, 0x4AE4, 0x4B23,
0196 0x4B63, 0x4BA3, 0x4BE3, 0x4C23,
0197 0x4C63, 0x4CA3, 0x4CE3, 0x4D23,
0198 0x4D63, 0x4DA3, 0x4DE3, 0x4E23,
0199 0x4E63, 0x4EA3, 0x4EE3, 0x4F23,
0200 0x4F63, 0x4FC3, 0x5003, 0x5043,
0201 0x5083, 0x50C3, 0x5103, 0x5143,
0202 0x5183, 0x51E2, 0x5222, 0x5262,
0203 0x52A2, 0x52E2, 0x5342, 0x5382,
0204 0x53C2, 0x5402, 0x5462, 0x54A2,
0205 0x5502, 0x5542, 0x55A2, 0x55E2,
0206 0x5642, 0x5682, 0x56E2, 0x5722,
0207 0x5782, 0x57E1, 0x5841, 0x58A1,
0208 0x5901, 0x5961, 0x59C1, 0x5A21,
0209 0x5AA1, 0x5B01, 0x5B81, 0x5BE1,
0210 0x5C61, 0x5D01, 0x5D80, 0x5E20,
0211 0x5EE0, 0x5FA0, 0x6080, 0x61C0,
0212 };
0213
0214 const u16 b43_tab_noisea2[] = {
0215 0x0001, 0x0001, 0x0001, 0xFFFE,
0216 0xFFFE, 0x3FFF, 0x1000, 0x0393,
0217 };
0218
0219 const u16 b43_tab_noisea3[] = {
0220 0x5E5E, 0x5E5E, 0x5E5E, 0x3F48,
0221 0x4C4C, 0x4C4C, 0x4C4C, 0x2D36,
0222 };
0223
0224 const u16 b43_tab_noiseg1[] = {
0225 0x013C, 0x01F5, 0x031A, 0x0631,
0226 0x0001, 0x0001, 0x0001, 0x0001,
0227 };
0228
0229 const u16 b43_tab_noiseg2[] = {
0230 0x5484, 0x3C40, 0x0000, 0x0000,
0231 0x0000, 0x0000, 0x0000, 0x0000,
0232 };
0233
0234 const u16 b43_tab_noisescalea2[] = {
0235 0x6767, 0x6767, 0x6767, 0x6767,
0236 0x6767, 0x6767, 0x6767, 0x6767,
0237 0x6767, 0x6767, 0x6767, 0x6767,
0238 0x6767, 0x6700, 0x6767, 0x6767,
0239 0x6767, 0x6767, 0x6767, 0x6767,
0240 0x6767, 0x6767, 0x6767, 0x6767,
0241 0x6767, 0x6767, 0x0067,
0242 };
0243
0244 const u16 b43_tab_noisescalea3[] = {
0245 0x2323, 0x2323, 0x2323, 0x2323,
0246 0x2323, 0x2323, 0x2323, 0x2323,
0247 0x2323, 0x2323, 0x2323, 0x2323,
0248 0x2323, 0x2300, 0x2323, 0x2323,
0249 0x2323, 0x2323, 0x2323, 0x2323,
0250 0x2323, 0x2323, 0x2323, 0x2323,
0251 0x2323, 0x2323, 0x0023,
0252 };
0253
0254 const u16 b43_tab_noisescaleg1[] = {
0255 0x6C77, 0x5162, 0x3B40, 0x3335,
0256 0x2F2D, 0x2A2A, 0x2527, 0x1F21,
0257 0x1A1D, 0x1719, 0x1616, 0x1414,
0258 0x1414, 0x1400, 0x1414, 0x1614,
0259 0x1716, 0x1A19, 0x1F1D, 0x2521,
0260 0x2A27, 0x2F2A, 0x332D, 0x3B35,
0261 0x5140, 0x6C62, 0x0077,
0262 };
0263
0264 const u16 b43_tab_noisescaleg2[] = {
0265 0xD8DD, 0xCBD4, 0xBCC0, 0xB6B7,
0266 0xB2B0, 0xADAD, 0xA7A9, 0x9FA1,
0267 0x969B, 0x9195, 0x8F8F, 0x8A8A,
0268 0x8A8A, 0x8A00, 0x8A8A, 0x8F8A,
0269 0x918F, 0x9695, 0x9F9B, 0xA7A1,
0270 0xADA9, 0xB2AD, 0xB6B0, 0xBCB7,
0271 0xCBC0, 0xD8D4, 0x00DD,
0272 };
0273
0274 const u16 b43_tab_noisescaleg3[] = {
0275 0xA4A4, 0xA4A4, 0xA4A4, 0xA4A4,
0276 0xA4A4, 0xA4A4, 0xA4A4, 0xA4A4,
0277 0xA4A4, 0xA4A4, 0xA4A4, 0xA4A4,
0278 0xA4A4, 0xA400, 0xA4A4, 0xA4A4,
0279 0xA4A4, 0xA4A4, 0xA4A4, 0xA4A4,
0280 0xA4A4, 0xA4A4, 0xA4A4, 0xA4A4,
0281 0xA4A4, 0xA4A4, 0x00A4,
0282 };
0283
0284 const u16 b43_tab_sigmasqr1[] = {
0285 0x007A, 0x0075, 0x0071, 0x006C,
0286 0x0067, 0x0063, 0x005E, 0x0059,
0287 0x0054, 0x0050, 0x004B, 0x0046,
0288 0x0042, 0x003D, 0x003D, 0x003D,
0289 0x003D, 0x003D, 0x003D, 0x003D,
0290 0x003D, 0x003D, 0x003D, 0x003D,
0291 0x003D, 0x003D, 0x0000, 0x003D,
0292 0x003D, 0x003D, 0x003D, 0x003D,
0293 0x003D, 0x003D, 0x003D, 0x003D,
0294 0x003D, 0x003D, 0x003D, 0x003D,
0295 0x0042, 0x0046, 0x004B, 0x0050,
0296 0x0054, 0x0059, 0x005E, 0x0063,
0297 0x0067, 0x006C, 0x0071, 0x0075,
0298 0x007A,
0299 };
0300
0301 const u16 b43_tab_sigmasqr2[] = {
0302 0x00DE, 0x00DC, 0x00DA, 0x00D8,
0303 0x00D6, 0x00D4, 0x00D2, 0x00CF,
0304 0x00CD, 0x00CA, 0x00C7, 0x00C4,
0305 0x00C1, 0x00BE, 0x00BE, 0x00BE,
0306 0x00BE, 0x00BE, 0x00BE, 0x00BE,
0307 0x00BE, 0x00BE, 0x00BE, 0x00BE,
0308 0x00BE, 0x00BE, 0x0000, 0x00BE,
0309 0x00BE, 0x00BE, 0x00BE, 0x00BE,
0310 0x00BE, 0x00BE, 0x00BE, 0x00BE,
0311 0x00BE, 0x00BE, 0x00BE, 0x00BE,
0312 0x00C1, 0x00C4, 0x00C7, 0x00CA,
0313 0x00CD, 0x00CF, 0x00D2, 0x00D4,
0314 0x00D6, 0x00D8, 0x00DA, 0x00DC,
0315 0x00DE,
0316 };
0317
0318 const u16 b43_tab_rssiagc1[] = {
0319 0xFFF8, 0xFFF8, 0xFFF8, 0xFFF8,
0320 0xFFF8, 0xFFF9, 0xFFFC, 0xFFFE,
0321 0xFFF8, 0xFFF8, 0xFFF8, 0xFFF8,
0322 0xFFF8, 0xFFF8, 0xFFF8, 0xFFF8,
0323 };
0324
0325 const u16 b43_tab_rssiagc2[] = {
0326 0x0820, 0x0820, 0x0920, 0x0C38,
0327 0x0820, 0x0820, 0x0820, 0x0820,
0328 0x0820, 0x0820, 0x0920, 0x0A38,
0329 0x0820, 0x0820, 0x0820, 0x0820,
0330 0x0820, 0x0820, 0x0920, 0x0A38,
0331 0x0820, 0x0820, 0x0820, 0x0820,
0332 0x0820, 0x0820, 0x0920, 0x0A38,
0333 0x0820, 0x0820, 0x0820, 0x0820,
0334 0x0820, 0x0820, 0x0920, 0x0A38,
0335 0x0820, 0x0820, 0x0820, 0x0820,
0336 0x0820, 0x0820, 0x0920, 0x0A38,
0337 0x0820, 0x0820, 0x0820, 0x0820,
0338 };
0339
0340 static inline void assert_sizes(void)
0341 {
0342 BUILD_BUG_ON(B43_TAB_ROTOR_SIZE != ARRAY_SIZE(b43_tab_rotor));
0343 BUILD_BUG_ON(B43_TAB_RETARD_SIZE != ARRAY_SIZE(b43_tab_retard));
0344 BUILD_BUG_ON(B43_TAB_FINEFREQA_SIZE != ARRAY_SIZE(b43_tab_finefreqa));
0345 BUILD_BUG_ON(B43_TAB_FINEFREQG_SIZE != ARRAY_SIZE(b43_tab_finefreqg));
0346 BUILD_BUG_ON(B43_TAB_NOISEA2_SIZE != ARRAY_SIZE(b43_tab_noisea2));
0347 BUILD_BUG_ON(B43_TAB_NOISEA3_SIZE != ARRAY_SIZE(b43_tab_noisea3));
0348 BUILD_BUG_ON(B43_TAB_NOISEG1_SIZE != ARRAY_SIZE(b43_tab_noiseg1));
0349 BUILD_BUG_ON(B43_TAB_NOISEG2_SIZE != ARRAY_SIZE(b43_tab_noiseg2));
0350 BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
0351 ARRAY_SIZE(b43_tab_noisescalea2));
0352 BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
0353 ARRAY_SIZE(b43_tab_noisescalea3));
0354 BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
0355 ARRAY_SIZE(b43_tab_noisescaleg1));
0356 BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
0357 ARRAY_SIZE(b43_tab_noisescaleg2));
0358 BUILD_BUG_ON(B43_TAB_NOISESCALE_SIZE !=
0359 ARRAY_SIZE(b43_tab_noisescaleg3));
0360 BUILD_BUG_ON(B43_TAB_SIGMASQR_SIZE != ARRAY_SIZE(b43_tab_sigmasqr1));
0361 BUILD_BUG_ON(B43_TAB_SIGMASQR_SIZE != ARRAY_SIZE(b43_tab_sigmasqr2));
0362 BUILD_BUG_ON(B43_TAB_RSSIAGC1_SIZE != ARRAY_SIZE(b43_tab_rssiagc1));
0363 BUILD_BUG_ON(B43_TAB_RSSIAGC2_SIZE != ARRAY_SIZE(b43_tab_rssiagc2));
0364 }
0365
0366 u16 b43_ofdmtab_read16(struct b43_wldev *dev, u16 table, u16 offset)
0367 {
0368 struct b43_phy_g *gphy = dev->phy.g;
0369 u16 addr;
0370
0371 addr = table + offset;
0372 if ((gphy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_READ) ||
0373 (addr - 1 != gphy->ofdmtab_addr)) {
0374
0375 b43_phy_write(dev, B43_PHY_OTABLECTL, addr);
0376 gphy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_READ;
0377 }
0378 gphy->ofdmtab_addr = addr;
0379
0380 return b43_phy_read(dev, B43_PHY_OTABLEI);
0381
0382
0383 assert_sizes();
0384 }
0385
0386 void b43_ofdmtab_write16(struct b43_wldev *dev, u16 table,
0387 u16 offset, u16 value)
0388 {
0389 struct b43_phy_g *gphy = dev->phy.g;
0390 u16 addr;
0391
0392 addr = table + offset;
0393 if ((gphy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_WRITE) ||
0394 (addr - 1 != gphy->ofdmtab_addr)) {
0395
0396 b43_phy_write(dev, B43_PHY_OTABLECTL, addr);
0397 gphy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_WRITE;
0398 }
0399 gphy->ofdmtab_addr = addr;
0400 b43_phy_write(dev, B43_PHY_OTABLEI, value);
0401 }
0402
0403 u32 b43_ofdmtab_read32(struct b43_wldev *dev, u16 table, u16 offset)
0404 {
0405 struct b43_phy_g *gphy = dev->phy.g;
0406 u32 ret;
0407 u16 addr;
0408
0409 addr = table + offset;
0410 if ((gphy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_READ) ||
0411 (addr - 1 != gphy->ofdmtab_addr)) {
0412
0413 b43_phy_write(dev, B43_PHY_OTABLECTL, addr);
0414 gphy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_READ;
0415 }
0416 gphy->ofdmtab_addr = addr;
0417 ret = b43_phy_read(dev, B43_PHY_OTABLEQ);
0418 ret <<= 16;
0419 ret |= b43_phy_read(dev, B43_PHY_OTABLEI);
0420
0421 return ret;
0422 }
0423
0424 void b43_ofdmtab_write32(struct b43_wldev *dev, u16 table,
0425 u16 offset, u32 value)
0426 {
0427 struct b43_phy_g *gphy = dev->phy.g;
0428 u16 addr;
0429
0430 addr = table + offset;
0431 if ((gphy->ofdmtab_addr_direction != B43_OFDMTAB_DIRECTION_WRITE) ||
0432 (addr - 1 != gphy->ofdmtab_addr)) {
0433
0434 b43_phy_write(dev, B43_PHY_OTABLECTL, addr);
0435 gphy->ofdmtab_addr_direction = B43_OFDMTAB_DIRECTION_WRITE;
0436 }
0437 gphy->ofdmtab_addr = addr;
0438
0439 b43_phy_write(dev, B43_PHY_OTABLEI, value);
0440 b43_phy_write(dev, B43_PHY_OTABLEQ, (value >> 16));
0441 }
0442
0443 u16 b43_gtab_read(struct b43_wldev *dev, u16 table, u16 offset)
0444 {
0445 b43_phy_write(dev, B43_PHY_GTABCTL, table + offset);
0446 return b43_phy_read(dev, B43_PHY_GTABDATA);
0447 }
0448
0449 void b43_gtab_write(struct b43_wldev *dev, u16 table, u16 offset, u16 value)
0450 {
0451 b43_phy_write(dev, B43_PHY_GTABCTL, table + offset);
0452 b43_phy_write(dev, B43_PHY_GTABDATA, value);
0453 }