36 #include <linux/slab.h>
39 static const s8 b43_tssi2dbm_g_table[] = {
58 static const u8 b43_radio_channel_codes_bg[] = {
66 static void b43_calc_nrssi_threshold(
struct b43_wldev *
dev);
69 #define bitrev4(tmp) (bitrev8(tmp) >> 4)
77 return b43_radio_channel_codes_bg[channel - 1];
86 static const struct b43_rfatt rfatt_0[] = {
87 {.
att = 3,.with_padmix = 0,},
88 {.att = 1,.with_padmix = 0,},
89 {.att = 5,.with_padmix = 0,},
90 {.att = 7,.with_padmix = 0,},
91 {.att = 9,.with_padmix = 0,},
92 {.att = 2,.with_padmix = 0,},
93 {.att = 0,.with_padmix = 0,},
94 {.att = 4,.with_padmix = 0,},
95 {.att = 6,.with_padmix = 0,},
96 {.att = 8,.with_padmix = 0,},
97 {.att = 1,.with_padmix = 1,},
98 {.att = 2,.with_padmix = 1,},
99 {.att = 3,.with_padmix = 1,},
100 {.att = 4,.with_padmix = 1,},
103 static const struct b43_rfatt rfatt_1[] = {
104 {.
att = 2,.with_padmix = 1,},
105 {.att = 4,.with_padmix = 1,},
106 {.att = 6,.with_padmix = 1,},
107 {.att = 8,.with_padmix = 1,},
108 {.att = 10,.with_padmix = 1,},
109 {.att = 12,.with_padmix = 1,},
110 {.att = 14,.with_padmix = 1,},
113 static const struct b43_rfatt rfatt_2[] = {
114 {.
att = 0,.with_padmix = 1,},
115 {.att = 2,.with_padmix = 1,},
116 {.att = 4,.with_padmix = 1,},
117 {.att = 6,.with_padmix = 1,},
118 {.att = 8,.with_padmix = 1,},
119 {.att = 9,.with_padmix = 1,},
120 {.att = 9,.with_padmix = 1,},
125 list->
list = rfatt_0;
133 list->
list = rfatt_1;
140 list->
list = rfatt_2;
146 static void generate_bbatt_list(
struct b43_wldev *dev,
149 static const struct b43_bbatt bbatt_0[] = {
161 list->
list = bbatt_0;
167 static void b43_shm_clear_tssi(
struct b43_wldev *dev)
189 channel2freq_bg(channel + 4));
199 u16 baseband_attenuation)
206 baseband_attenuation);
207 }
else if (phy->
analog > 1) {
215 static void b43_set_txpower_g(
struct b43_wldev *dev,
240 b43dbg(dev->
wl,
"Tuning TX-power to bbatt(%u), "
241 "rfatt(%u), tx_control(0x%02X), "
242 "tx_bias(0x%02X), tx_magn(0x%02X)\n",
243 bb, rf, tx_control, tx_bias, tx_magn);
250 (rf & 0x000F) | (tx_control & 0x0070));
264 static void b43_gphy_tssi_power_lt_init(
struct b43_wldev *dev)
270 for (i = 0; i < 32; i++)
272 for (i = 32; i < 64; i++)
274 for (i = 0; i < 64; i += 2) {
282 static void b43_gphy_gain_lt_init(
struct b43_wldev *dev)
293 if (nr_written >= 0x40)
308 static void b43_set_all_gains(
struct b43_wldev *dev,
325 for (i = 0; i < 4; i++)
328 for (i = start; i <
end; i++)
332 tmp = ((
u16) third << 14) | ((
u16) third << 6);
340 static void b43_set_original_gains(
struct b43_wldev *dev)
345 u16 start = 0x0008, end = 0x0018;
355 for (i = 0; i < 4; i++) {
357 tmp |= (i & 0x0001) << 1;
358 tmp |= (i & 0x0002) >> 1;
363 for (i = start; i <
end; i++)
391 static void b43_nrssi_hw_update(
struct b43_wldev *dev,
u16 val)
396 for (i = 0; i < 64; i++) {
397 tmp = b43_nrssi_hw_read(dev, i);
400 b43_nrssi_hw_write(dev, i, tmp);
405 static void b43_nrssi_mem_update(
struct b43_wldev *dev)
411 delta = 0x1F - gphy->
nrssi[0];
412 for (i = 0; i < 64; i++) {
421 static void b43_calc_nrssi_offset(
struct b43_wldev *dev)
424 u16 backup[20] = { 0 };
476 for (i = 7; i >= 4; i--) {
483 if (v47F < 31 && saved == 0xFFFF)
512 b43_set_all_gains(dev, 3, 0, 1);
519 for (i = 0; i < 4; i++) {
527 if (v47F > -31 && saved == 0xFFFF)
556 b43_set_original_gains(dev);
568 static void b43_calc_nrssi_slope(
struct b43_wldev *dev)
572 u16 backup[18] = { 0 };
581 b43_calc_nrssi_offset(dev);
585 backup[7] = b43_read16(dev, 0x03E2);
586 b43_write16(dev, 0x03E2, b43_read16(dev, 0x03E2) | 0x8000);
594 backup[8] = b43_read16(dev, 0x03E6);
623 b43_set_all_gains(dev, 0, 8, 0);
633 if (nrssi0 >= 0x0020)
651 b43_set_all_gains(dev, 3, 0, 1);
665 if (nrssi1 >= 0x0020)
667 if (nrssi0 == nrssi1)
670 gphy->
nrssislope = 0x00400000 / (nrssi0 - nrssi1);
672 gphy->
nrssi[0] = nrssi1;
673 gphy->
nrssi[1] = nrssi0;
689 b43_write16(dev, 0x03E2, backup[7]);
690 b43_write16(dev, 0x03E6, backup[8]);
696 b43_synth_pu_workaround(dev, phy->
channel);
698 b43_set_original_gains(dev);
706 b43_nrssi_mem_update(dev);
707 b43_calc_nrssi_threshold(dev);
710 static void b43_calc_nrssi_threshold(
struct b43_wldev *dev)
722 tmp16 = b43_nrssi_hw_read(dev, 0x20);
743 a += (gphy->
nrssi[0] << 6);
752 b += (gphy->
nrssi[0] << 6);
761 tmp_u16 |= ((
u32) b & 0x0000003F);
762 tmp_u16 |= (((
u32) a & 0x0000003F) << 6);
771 static void _stack_save(
u32 *_stackptr,
size_t *stackidx,
774 u32 *stackptr = &(_stackptr[*stackidx]);
779 *stackptr |= ((
u32)
id) << 12;
780 *stackptr |= ((
u32) value) << 16;
785 static u16 _stack_restore(
u32 *stackptr,
u8 id,
u16 offset)
792 if ((*stackptr & 0x00000FFF) != offset)
794 if (((*stackptr & 0x0000F000) >> 12) !=
id)
796 return ((*stackptr & 0xFFFF0000) >> 16);
803 #define phy_stacksave(offset) \
805 _stack_save(stack, &stackidx, 0x1, (offset), \
806 b43_phy_read(dev, (offset))); \
808 #define phy_stackrestore(offset) \
810 b43_phy_write(dev, (offset), \
811 _stack_restore(stack, 0x1, \
814 #define radio_stacksave(offset) \
816 _stack_save(stack, &stackidx, 0x2, (offset), \
817 b43_radio_read16(dev, (offset))); \
819 #define radio_stackrestore(offset) \
821 b43_radio_write16(dev, (offset), \
822 _stack_restore(stack, 0x2, \
825 #define ofdmtab_stacksave(table, offset) \
827 _stack_save(stack, &stackidx, 0x3, (offset)|(table), \
828 b43_ofdmtab_read16(dev, (table), (offset))); \
830 #define ofdmtab_stackrestore(table, offset) \
832 b43_ofdmtab_write16(dev, (table), (offset), \
833 _stack_restore(stack, 0x3, \
834 (offset)|(table))); \
838 b43_radio_interference_mitigation_enable(
struct b43_wldev *dev,
int mode)
857 if (flipped < 10 && flipped >= 8)
859 else if (flipped >= 10)
861 flipped = (
bitrev4(flipped) << 1) | 0x0020;
864 b43_calc_nrssi_threshold(dev);
926 }
else if (phy->
rev >= 3) {
952 }
else if (phy->
rev == 2) {
991 }
else if (phy->
rev >= 6) {
996 b43_calc_nrssi_slope(dev);
1004 b43_radio_interference_mitigation_disable(
struct b43_wldev *dev,
int mode)
1012 if (phy->
rev != 1) {
1018 b43_calc_nrssi_threshold(dev);
1053 if (phy->
rev >= 2) {
1061 if (phy->
rev == 2) {
1064 }
else if (phy->
rev >= 3) {
1077 b43_calc_nrssi_slope(dev);
1084 #undef phy_stacksave
1085 #undef phy_stackrestore
1086 #undef radio_stacksave
1087 #undef radio_stackrestore
1088 #undef ofdmtab_stacksave
1089 #undef ofdmtab_stackrestore
1091 static u16 b43_radio_core_calibration_value(
struct b43_wldev *dev)
1095 static const u8 rcc_table[] = {
1096 0x02, 0x03, 0x01, 0x0F,
1097 0x06, 0x07, 0x05, 0x0F,
1098 0x0A, 0x0B, 0x09, 0x0F,
1099 0x0E, 0x0F, 0x0D, 0x0F,
1103 index = (reg & 0x001E) >> 1;
1104 ret = rcc_table[
index] << 1;
1105 ret |= (reg & 0x0001);
1111 #define LPD(L, P, D) (((L) << 2) | ((P) << 1) | ((D) << 0))
1113 u16 phy_register,
unsigned int lpd)
1128 max_lb_gain += 0x3E;
1130 max_lb_gain += 0x26;
1131 if (max_lb_gain >= 0x46) {
1133 max_lb_gain -= 0x46;
1134 }
else if (max_lb_gain >= 0x3A) {
1136 max_lb_gain -= 0x3A;
1137 }
else if (max_lb_gain >= 0x2E) {
1139 max_lb_gain -= 0x2E;
1142 max_lb_gain -= 0x10;
1145 for (i = 0; i < 16; i++) {
1146 max_lb_gain -= (i * 6);
1147 if (max_lb_gain < 6)
1151 if ((phy->
rev < 7) ||
1162 return (0x0092 | extlna);
1164 return (0x0093 | extlna);
1180 return (0x8092 | extlna);
1182 return (0x2092 | extlna);
1184 return (0x2093 | extlna);
1191 if ((phy->
rev < 7) ||
1267 memset(&sav, 0,
sizeof(sav));
1279 sav.
reg_3EC = b43_read16(dev, 0x3EC);
1282 b43_write16(dev, 0x3EC, 0x3F3F);
1283 }
else if (phy->
gmode || phy->
rev >= 2) {
1313 b43_write16(dev, 0x3E2, b43_read16(dev, 0x3E2) | 0x8000);
1317 sav.
reg_3E6 = b43_read16(dev, 0x3E6);
1318 sav.
reg_3F4 = b43_read16(dev, 0x3F4);
1321 b43_write16(dev, 0x03E6, 0x0122);
1330 rcc = b43_radio_core_calibration_value(dev);
1356 for (i = 0; i < 16; i++) {
1362 radio2050_rfover_val(dev,
1370 radio2050_rfover_val(dev,
1378 radio2050_rfover_val(dev,
1388 radio2050_rfover_val(dev,
1400 for (i = 0; i < 16; i++) {
1401 radio78 = (
bitrev4(i) << 1) | 0x0020;
1404 for (j = 0; j < 16; j++) {
1410 radio2050_rfover_val(dev,
1419 radio2050_rfover_val(dev,
1428 radio2050_rfover_val(dev,
1439 radio2050_rfover_val(dev,
1460 b43_write16(dev, 0x3E6, sav.
reg_3E6);
1462 b43_write16(dev, 0x3F4, sav.
reg_3F4);
1464 b43_synth_pu_workaround(dev, phy->
channel);
1467 b43_write16(dev, 0x3EC, sav.
reg_3EC);
1468 }
else if (phy->
gmode) {
1492 static void b43_phy_initb5(
struct b43_wldev *dev)
1505 for (offset = 0x00A8; offset < 0x00C7; offset++) {
1544 b43_write16(dev, 0x03EC, 0x3F22);
1552 b43_write16(dev, 0x03E4, 0x3000);
1587 b43_write16(dev, 0x03E4, (b43_read16(dev, 0x03E4) & 0xFFC0) | 0x0004);
1590 static void b43_phy_initb6(
struct b43_wldev *dev)
1635 for (offset = 0x0088; offset < 0x0098; offset++) {
1640 for (offset = 0x0098; offset < 0x00A8; offset++) {
1645 for (offset = 0x00A8; offset < 0x00C8; offset++) {
1659 if (old_channel >= 8)
1696 b43_write16(dev, 0x3E4, 9);
1704 b43_write16(dev, 0x03E6, 0x0);
1707 static void b43_calc_loopback_gain(
struct b43_wldev *dev)
1711 u16 backup_phy[16] = { 0 };
1712 u16 backup_radio[3];
1714 u16 i,
j, loop_i_max;
1716 u16 loop1_outer_done, loop1_inner_done;
1722 if (phy->
rev != 1) {
1736 backup_bband = gphy->
bbatt.att;
1747 if (phy->
rev != 1) {
1763 if (phy->
rev != 1) {
1790 if (phy->
rev >= 7) {
1798 loop_i_max = (phy->
radio_rev == 8) ? 15 : 9;
1799 for (i = 0; i < loop_i_max; i++) {
1800 for (j = 0; j < 16; j++) {
1811 loop1_outer_done =
i;
1812 loop1_inner_done =
j;
1816 for (j = j - 8; j < 16; j++) {
1829 if (phy->
rev != 1) {
1857 ((loop1_inner_done * 6) - (loop1_outer_done * 4)) - 11;
1861 static void b43_hardware_pctl_early_init(
struct b43_wldev *dev)
1892 static void b43_hardware_pctl_init_gphy(
struct b43_wldev *dev)
1905 b43_gphy_tssi_power_lt_init(dev);
1906 b43_gphy_gain_lt_init(dev);
1922 static void b43_phy_init_pctl(
struct b43_wldev *dev)
1928 u8 old_tx_control = 0;
1944 b43_hardware_pctl_early_init(dev);
1952 memcpy(&old_rfatt, &gphy->
rfatt,
sizeof(old_rfatt));
1953 memcpy(&old_bbatt, &gphy->
bbatt,
sizeof(old_bbatt));
1964 b43_set_txpower_g(dev, &bbatt, &rfatt, 0);
1972 "!WARNING! Idle-TSSI phy->cur_idle_tssi "
1973 "measuring failed. (cur=%d, tgt=%d). Disabling TX power "
1982 b43_set_txpower_g(dev, &old_bbatt,
1983 &old_rfatt, old_tx_control);
1986 b43_hardware_pctl_init_gphy(dev);
1987 b43_shm_clear_tssi(dev);
1990 static void b43_phy_initg(
struct b43_wldev *dev)
1997 b43_phy_initb5(dev);
1999 b43_phy_initb6(dev);
2004 if (phy->
rev >= 2) {
2008 if (phy->
rev == 2) {
2019 if (tmp == 3 || tmp == 5) {
2027 if ((phy->
rev <= 2 && phy->
gmode) || phy->
rev >= 2)
2034 b43_calc_loopback_gain(dev);
2038 gphy->
initval = b43_radio_init2050(dev);
2051 if (phy->
rev >= 6) {
2074 b43_nrssi_hw_update(dev, 0xFFFF);
2075 b43_calc_nrssi_threshold(dev);
2076 }
else if (phy->
gmode || phy->
rev >= 2) {
2077 if (gphy->
nrssi[0] == -1000) {
2079 b43_calc_nrssi_slope(dev);
2081 b43_calc_nrssi_threshold(dev);
2085 b43_phy_init_pctl(dev);
2089 if ((dev->
dev->chip_id == 0x4306
2090 && dev->
dev->chip_pkg == 2) || 0) {
2097 unsigned int channel,
2098 bool synthetic_pu_workaround)
2100 if (synthetic_pu_workaround)
2101 b43_synth_pu_workaround(dev, channel);
2105 if (channel == 14) {
2106 if (dev->
dev->bus_sprom->country_code ==
2123 static void default_baseband_attenuation(
struct b43_wldev *dev,
2134 static void default_radio_attenuation(
struct b43_wldev *dev,
2144 if (dev->
dev->board_rev < 0x43) {
2147 }
else if (dev->
dev->board_rev < 0x51) {
2204 else if (bdev->
chip_id == 0x4320)
2250 static u8 b43_gphy_aci_detect(
struct b43_wldev *dev,
u8 channel)
2264 rssi = saved & 0x3F;
2268 for (i = 0; i < 100; i++) {
2282 static u8 b43_gphy_aci_scan(
struct b43_wldev *dev)
2286 unsigned int channel = phy->
channel;
2296 b43_set_all_gains(dev, 3, 8, 1);
2298 start = (channel - 5 > 0) ? channel - 5 : 1;
2299 end = (channel + 5 < 14) ? channel + 5 : 13;
2301 for (i = start; i <=
end; i++) {
2302 if (
abs(channel - i) > 2)
2303 ret[i - 1] = b43_gphy_aci_detect(dev, i);
2309 b43_set_original_gains(dev);
2310 for (i = 0; i < 13; i++) {
2313 end = (i + 5 < 13) ? i + 5 : 13;
2314 for (j = i; j <
end; j++)
2320 return ret[channel - 1];
2328 return (num + den / 2) /
den;
2337 m1 = b43_tssi2dbm_ad(16 * pab0 + index * pab1, 32);
2338 m2 =
max(b43_tssi2dbm_ad(32768 + index * pab2, 256), 1);
2342 q = b43_tssi2dbm_ad(f * 4096 -
2343 b43_tssi2dbm_ad(m2 * f, 16) * f, 2048);
2347 }
while (delta >= 2);
2348 entry[
index] =
clamp_val(b43_tssi2dbm_ad(m1 * f, 8192), -127, 128);
2361 b43err(dev->
wl,
"Could not allocate memory "
2362 "for tssi2dbm table\n");
2365 for (i = 0; i < 64; i++) {
2366 err = b43_tssi2dbm_entry(tab, i, pab0, pab1, pab2);
2368 b43err(dev->
wl,
"Could not generate "
2369 "tssi2dBm table\n");
2379 static int b43_gphy_init_tssi2dbm_table(
struct b43_wldev *dev)
2383 s16 pab0, pab1, pab2;
2385 pab0 = (
s16) (dev->
dev->bus_sprom->pa0b0);
2386 pab1 = (
s16) (dev->
dev->bus_sprom->pa0b1);
2387 pab2 = (
s16) (dev->
dev->bus_sprom->pa0b2);
2394 if (pab0 != 0 && pab1 != 0 && pab2 != 0 &&
2395 pab0 != -1 && pab1 != -1 && pab2 != -1) {
2397 if ((
s8) dev->
dev->bus_sprom->itssi_bg != 0 &&
2398 (
s8) dev->
dev->bus_sprom->itssi_bg != -1) {
2400 (
s8) (dev->
dev->bus_sprom->itssi_bg);
2411 gphy->
tssi2dbm = b43_tssi2dbm_g_table;
2417 static int b43_gphy_op_allocate(
struct b43_wldev *dev)
2437 err = b43_gphy_init_tssi2dbm_table(dev);
2451 static void b43_gphy_op_prepare_structs(
struct b43_wldev *dev)
2468 memset(gphy, 0,
sizeof(*gphy));
2479 gphy->
nrssi[i] = -1000;
2498 static void b43_gphy_op_free(
struct b43_wldev *dev)
2514 static int b43_gphy_op_prepare_hardware(
struct b43_wldev *dev)
2522 default_baseband_attenuation(dev, &gphy->
bbatt);
2523 default_radio_attenuation(dev, &gphy->
rfatt);
2524 gphy->
tx_control = (default_tx_control(dev) << 4);
2531 if (phy->
rev == 1) {
2544 static int b43_gphy_op_init(
struct b43_wldev *dev)
2551 static void b43_gphy_op_exit(
struct b43_wldev *dev)
2588 static bool b43_gphy_op_supports_hwpctl(
struct b43_wldev *dev)
2590 return (dev->
phy.rev >= 6);
2593 static void b43_gphy_op_software_rfkill(
struct b43_wldev *dev,
2635 static int b43_gphy_op_switch_channel(
struct b43_wldev *dev,
2636 unsigned int new_channel)
2638 if ((new_channel < 1) || (new_channel > 14))
2645 static unsigned int b43_gphy_op_get_default_chan(
struct b43_wldev *dev)
2688 if (phy->
rev >= 2) {
2703 static int b43_gphy_op_interf_mitigation(
struct b43_wldev *dev,
2711 if ((phy->
rev == 0) || (!phy->
gmode))
2732 if (currentmode == mode)
2735 b43_radio_interference_mitigation_disable(dev, currentmode);
2741 b43_radio_interference_mitigation_enable(dev, mode);
2750 static s8 b43_gphy_estimate_power_out(
struct b43_wldev *dev,
s8 tssi)
2763 static void b43_put_attenuation_into_ranges(
struct b43_wldev *dev,
2764 int *_bbatt,
int *_rfatt)
2766 int rfatt = *_rfatt;
2767 int bbatt = *_bbatt;
2780 if (rfatt > rf_max && bbatt > bb_max - 4)
2782 if (rfatt < rf_min && bbatt < bb_min + 4)
2784 if (bbatt > bb_max && rfatt > rf_max - 1)
2786 if (bbatt < bb_min && rfatt < rf_min + 1)
2789 if (bbatt > bb_max) {
2794 if (bbatt < bb_min) {
2799 if (rfatt > rf_max) {
2804 if (rfatt < rf_min) {
2812 *_rfatt =
clamp_val(rfatt, rf_min, rf_max);
2813 *_bbatt =
clamp_val(bbatt, bb_min, bb_max);
2816 static void b43_gphy_op_adjust_txpower(
struct b43_wldev *dev)
2826 bbatt = gphy->
bbatt.att;
2828 rfatt = gphy->
rfatt.att;
2831 b43_put_attenuation_into_ranges(dev, &bbatt, &rfatt);
2835 if (tx_control == 0) {
2841 }
else if (dev->
dev->bus_sprom->
2844 bbatt += 4 * (rfatt - 2);
2847 }
else if (rfatt > 4 && tx_control) {
2860 b43_put_attenuation_into_ranges(dev, &bbatt, &rfatt);
2865 b43dbg(dev->
wl,
"Adjusting TX power\n");
2870 b43_set_txpower_g(dev, &gphy->
bbatt, &gphy->
rfatt,
2884 int cck_result, ofdm_result;
2885 int estimated_pwr, desired_pwr, pwr_adjust;
2887 unsigned int max_pwr;
2892 if ((cck_result < 0) && (ofdm_result < 0)) {
2895 goto no_adjustment_needed;
2900 average_tssi = ofdm_result;
2901 else if (ofdm_result < 0)
2902 average_tssi = cck_result;
2904 average_tssi = (cck_result + ofdm_result) / 2;
2907 average_tssi = (average_tssi + gphy->
average_tssi) / 2;
2912 estimated_pwr = b43_gphy_estimate_power_out(dev, average_tssi);
2915 max_pwr = dev->
dev->bus_sprom->maxpwr_bg;
2920 "Invalid max-TX-power value in SPROM.\n");
2922 dev->
dev->bus_sprom->maxpwr_bg = max_pwr;
2931 desired_pwr =
clamp_val(desired_pwr, 0, max_pwr);
2934 "[TX power] current = " Q52_FMT
2943 pwr_adjust = desired_pwr - estimated_pwr;
2944 if (pwr_adjust == 0)
2945 goto no_adjustment_needed;
2948 rfatt_delta = ((pwr_adjust + 7) / 8);
2953 bbatt_delta = pwr_adjust / 2;
2962 int dbm = pwr_adjust < 0 ? -pwr_adjust : pwr_adjust;
2964 "[TX power deltas] %s" Q52_FMT
" dBm => "
2965 "bbatt-delta = %d, rfatt-delta = %d\n",
2966 (pwr_adjust < 0 ?
"-" :
""),
Q52_ARG(dbm),
2967 bbatt_delta, rfatt_delta);
2972 if ((rfatt_delta == 0) && (bbatt_delta == 0))
2973 goto no_adjustment_needed;
2982 no_adjustment_needed:
2986 static void b43_gphy_op_pwork_15sec(
struct b43_wldev *dev)
2996 phy->
ops->interf_mitigation(dev,
3000 if ( !b43_gphy_aci_scan(dev))
3011 static void b43_gphy_op_pwork_60sec(
struct b43_wldev *dev)
3019 b43_calc_nrssi_slope(dev);
3034 .allocate = b43_gphy_op_allocate,
3035 .free = b43_gphy_op_free,
3036 .prepare_structs = b43_gphy_op_prepare_structs,
3037 .prepare_hardware = b43_gphy_op_prepare_hardware,
3038 .init = b43_gphy_op_init,
3039 .exit = b43_gphy_op_exit,
3040 .phy_read = b43_gphy_op_read,
3041 .phy_write = b43_gphy_op_write,
3042 .radio_read = b43_gphy_op_radio_read,
3043 .radio_write = b43_gphy_op_radio_write,
3044 .supports_hwpctl = b43_gphy_op_supports_hwpctl,
3045 .software_rfkill = b43_gphy_op_software_rfkill,
3047 .switch_channel = b43_gphy_op_switch_channel,
3048 .get_default_chan = b43_gphy_op_get_default_chan,
3049 .set_rx_antenna = b43_gphy_op_set_rx_antenna,
3050 .interf_mitigation = b43_gphy_op_interf_mitigation,
3051 .recalc_txpower = b43_gphy_op_recalc_txpower,
3052 .adjust_txpower = b43_gphy_op_adjust_txpower,
3053 .pwork_15sec = b43_gphy_op_pwork_15sec,
3054 .pwork_60sec = b43_gphy_op_pwork_60sec,