Lines Matching refs:mac

126 static uint16_t	bwn_phy_g_txctl(struct bwn_mac *mac);
127 static int bwn_phy_shm_tssi_read(struct bwn_mac *mac, uint16_t shm_offset);
128 static void bwn_phy_g_setatt(struct bwn_mac *mac, int *bbattp, int *rfattp);
129 static void bwn_phy_lock(struct bwn_mac *mac);
130 static void bwn_phy_unlock(struct bwn_mac *mac);
131 static void bwn_rf_lock(struct bwn_mac *mac);
132 static void bwn_rf_unlock(struct bwn_mac *mac);
142 bwn_has_hwpctl(struct bwn_mac *mac)
145 if (mac->mac_phy.hwpctl == 0 || mac->mac_phy.use_hwpctl == NULL)
147 return (mac->mac_phy.use_hwpctl(mac));
151 bwn_phy_g_attach(struct bwn_mac *mac)
153 struct bwn_softc *sc = mac->mac_sc;
154 struct bwn_phy *phy = &mac->mac_phy;
227 bwn_phy_g_detach(struct bwn_mac *mac)
229 struct bwn_phy_g *pg = &mac->mac_phy.phy_g;
239 bwn_phy_g_init_pre(struct bwn_mac *mac)
241 struct bwn_phy *phy = &mac->mac_phy;
272 bwn_phy_g_prepare_hw(struct bwn_mac *mac)
274 struct bwn_phy *phy = &mac->mac_phy;
276 struct bwn_softc *sc = mac->mac_sc;
405 pg->pg_txctl = (bwn_phy_g_txctl(mac) << 4);
407 if (!bwn_has_hwpctl(mac)) {
431 BWN_READ_4(mac, BWN_MACCTL);
434 bwn_reset_core(mac, 0);
435 bwn_phy_g_init_sub(mac);
437 bwn_reset_core(mac, 1);
443 bwn_phy_g_txctl(struct bwn_mac *mac)
445 struct bwn_phy *phy = &mac->mac_phy;
459 bwn_phy_g_init(struct bwn_mac *mac)
462 bwn_phy_g_init_sub(mac);
467 bwn_phy_g_exit(struct bwn_mac *mac)
469 struct bwn_txpwr_loctl *lo = &mac->mac_phy.phy_g.pg_loctl;
481 bwn_phy_g_read(struct bwn_mac *mac, uint16_t reg)
484 BWN_WRITE_2(mac, BWN_PHYCTL, reg);
485 return (BWN_READ_2(mac, BWN_PHYDATA));
489 bwn_phy_g_write(struct bwn_mac *mac, uint16_t reg, uint16_t value)
492 BWN_WRITE_2(mac, BWN_PHYCTL, reg);
493 BWN_WRITE_2(mac, BWN_PHYDATA, value);
497 bwn_phy_g_rf_read(struct bwn_mac *mac, uint16_t reg)
501 BWN_WRITE_2(mac, BWN_RFCTL, reg | 0x80);
502 return (BWN_READ_2(mac, BWN_RFDATALO));
506 bwn_phy_g_rf_write(struct bwn_mac *mac, uint16_t reg, uint16_t value)
510 BWN_WRITE_2(mac, BWN_RFCTL, reg);
511 BWN_WRITE_2(mac, BWN_RFDATALO, value);
515 bwn_phy_g_hwpctl(struct bwn_mac *mac)
518 return (mac->mac_phy.rev >= 6);
522 bwn_phy_g_rf_onoff(struct bwn_mac *mac, int on)
524 struct bwn_phy *phy = &mac->mac_phy;
533 BWN_PHY_WRITE(mac, 0x15, 0x8000);
534 BWN_PHY_WRITE(mac, 0x15, 0xcc00);
535 BWN_PHY_WRITE(mac, 0x15, (phy->gmode ? 0xc0 : 0x0));
537 BWN_PHY_WRITE(mac, BWN_PHY_RFOVER,
539 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL,
544 bwn_phy_g_switch_chan(mac, 6, 1);
545 bwn_phy_g_switch_chan(mac, channel, 0);
549 rfover = BWN_PHY_READ(mac, BWN_PHY_RFOVER);
550 rfoverval = BWN_PHY_READ(mac, BWN_PHY_RFOVERVAL);
554 BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, rfover | 0x008c);
555 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, rfoverval & 0xff73);
559 bwn_phy_g_switch_channel(struct bwn_mac *mac, uint32_t newchan)
564 bwn_phy_g_switch_chan(mac, newchan, 0);
570 bwn_phy_g_get_default_chan(struct bwn_mac *mac)
577 bwn_phy_g_set_antenna(struct bwn_mac *mac, int antenna)
579 struct bwn_phy *phy = &mac->mac_phy;
587 hf = bwn_hf_read(mac) & ~BWN_HF_UCODE_ANTDIV_HELPER;
588 bwn_hf_write(mac, hf);
590 BWN_PHY_WRITE(mac, BWN_PHY_BBANDCFG,
591 (BWN_PHY_READ(mac, BWN_PHY_BBANDCFG) & ~BWN_PHY_BBANDCFG_RXANT) |
596 tmp = BWN_PHY_READ(mac, BWN_PHY_ANTDWELL);
601 BWN_PHY_WRITE(mac, BWN_PHY_ANTDWELL, tmp);
603 tmp = BWN_PHY_READ(mac, BWN_PHY_ANTWRSETT);
608 BWN_PHY_WRITE(mac, BWN_PHY_ANTWRSETT, tmp);
610 BWN_PHY_WRITE(mac, BWN_PHY_OFDM61,
611 BWN_PHY_READ(mac, BWN_PHY_OFDM61) | BWN_PHY_OFDM61_10);
612 BWN_PHY_WRITE(mac, BWN_PHY_DIVSRCHGAINBACK,
613 (BWN_PHY_READ(mac, BWN_PHY_DIVSRCHGAINBACK) & 0xff00) |
616 BWN_PHY_WRITE(mac, BWN_PHY_ADIVRELATED, 8);
618 BWN_PHY_WRITE(mac, BWN_PHY_ADIVRELATED,
619 (BWN_PHY_READ(mac, BWN_PHY_ADIVRELATED) & 0xff00) |
623 BWN_PHY_WRITE(mac, BWN_PHY_OFDM9B, 0xdc);
626 bwn_hf_write(mac, hf);
630 bwn_phy_g_im(struct bwn_mac *mac, int mode)
632 struct bwn_phy *phy = &mac->mac_phy;
646 bwn_phy_g_recalc_txpwr(struct bwn_mac *mac, int ignore_tssi)
648 struct bwn_phy *phy = &mac->mac_phy;
650 struct bwn_softc *sc = mac->mac_sc;
659 cck = bwn_phy_shm_tssi_read(mac, BWN_SHARED_TSSI_CCK);
660 ofdm = bwn_phy_shm_tssi_read(mac, BWN_SHARED_TSSI_OFDM_G);
698 bwn_phy_g_set_txpwr(struct bwn_mac *mac)
700 struct bwn_phy *phy = &mac->mac_phy;
702 struct bwn_softc *sc = mac->mac_sc;
706 bwn_mac_suspend(mac);
715 bwn_phy_g_setatt(mac, &bbatt, &rfatt);
740 bwn_phy_g_setatt(mac, &bbatt, &rfatt);
746 bwn_phy_lock(mac);
747 bwn_rf_lock(mac);
748 bwn_phy_g_set_txpwr_sub(mac, &pg->pg_bbatt, &pg->pg_rfatt,
750 bwn_rf_unlock(mac);
751 bwn_phy_unlock(mac);
753 bwn_mac_enable(mac);
757 bwn_phy_g_task_15s(struct bwn_mac *mac)
759 struct bwn_phy *phy = &mac->mac_phy;
761 struct bwn_softc *sc = mac->mac_sc;
767 bwn_mac_suspend(mac);
773 if (bwn_has_hwpctl(mac)) {
776 bwn_lo_get_powervector(mac);
777 bwn_phy_g_dc_lookup_init(mac, 0);
800 cal = bwn_lo_calibset(mac, &pg->pg_bbatt,
808 bwn_lo_write(mac, &cal->ctl);
812 bwn_mac_enable(mac);
816 bwn_phy_g_task_60s(struct bwn_mac *mac)
818 struct bwn_phy *phy = &mac->mac_phy;
819 struct bwn_softc *sc = mac->mac_sc;
825 bwn_mac_suspend(mac);
826 bwn_nrssi_slope_11g(mac);
828 bwn_switch_channel(mac, (old >= 8) ? 1 : 13);
829 bwn_switch_channel(mac, old);
831 bwn_mac_enable(mac);
835 bwn_phy_switch_analog(struct bwn_mac *mac, int on)
838 BWN_WRITE_2(mac, BWN_PHY0, on ? 0 : 0xf4);
842 bwn_phy_g_init_sub(struct bwn_mac *mac)
844 struct bwn_phy *phy = &mac->mac_phy;
846 struct bwn_softc *sc = mac->mac_sc;
850 bwn_phy_init_b5(mac);
852 bwn_phy_init_b6(mac);
855 bwn_phy_init_a(mac);
858 BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVER, 0);
859 BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVERVAL, 0);
862 BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, 0);
863 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xc0);
866 BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, 0x400);
867 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xc0);
870 tmp = BWN_PHY_READ(mac, BWN_PHY_VERSION_OFDM);
873 BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0xc2), 0x1816);
874 BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0xc3), 0x8006);
877 BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0xcc), 0x00ff,
882 BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0x7e), 0x78);
884 BWN_PHY_SET(mac, BWN_PHY_EXTG(0x01), 0x80);
885 BWN_PHY_SET(mac, BWN_PHY_OFDM(0x3e), 0x4);
888 bwn_loopback_calcgain(mac);
892 pg->pg_initval = bwn_rf_init_bcm2050(mac);
894 BWN_RF_WRITE(mac, 0x0078, pg->pg_initval);
896 bwn_lo_g_init(mac);
898 BWN_RF_WRITE(mac, 0x52,
899 (BWN_RF_READ(mac, 0x52) & 0xff00)
903 BWN_RF_SETMASK(mac, 0x52, 0xfff0, pg->pg_loctl.tx_bias);
906 BWN_PHY_SETMASK(mac, BWN_PHY_CCK(0x36), 0x0fff,
910 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2e), 0x8075);
912 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2e), 0x807f);
914 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2f), 0x101);
916 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2f), 0x202);
918 bwn_lo_g_adjust(mac);
919 BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0x8078);
924 BWN_PHY_WRITE(mac, BWN_PHY_NRSSI_CTRL, i);
925 BWN_PHY_WRITE(mac, BWN_PHY_NRSSI_DATA,
926 (uint16_t)MIN(MAX(bwn_nrssi_read(mac, i) - 0xffff,
929 bwn_nrssi_threshold(mac);
934 bwn_nrssi_slope_11g(mac);
936 bwn_nrssi_threshold(mac);
939 BWN_PHY_WRITE(mac, BWN_PHY_EXTG(0x05), 0x3230);
940 bwn_phy_hwpctl_init(mac);
943 BWN_PHY_MASK(mac, BWN_PHY_CRS0, 0xbfff);
944 BWN_PHY_MASK(mac, BWN_PHY_OFDM(0xc3), 0x7fff);
949 bwn_phy_init_b5(struct bwn_mac *mac)
951 struct bwn_phy *phy = &mac->mac_phy;
953 struct bwn_softc *sc = mac->mac_sc;
958 BWN_RF_SET(mac, 0x007a, 0x0050);
963 BWN_PHY_WRITE(mac, offset, value);
967 BWN_PHY_SETMASK(mac, 0x0035, 0xf0ff, 0x0700);
969 BWN_PHY_WRITE(mac, 0x0038, 0x0667);
973 BWN_RF_SET(mac, 0x007a, 0x0020);
974 BWN_RF_SET(mac, 0x0051, 0x0004);
976 BWN_WRITE_2(mac, BWN_PHY_RADIO, 0x0000);
978 BWN_PHY_SET(mac, 0x0802, 0x0100);
979 BWN_PHY_SET(mac, 0x042b, 0x2000);
981 BWN_PHY_WRITE(mac, 0x001c, 0x186a);
983 BWN_PHY_SETMASK(mac, 0x0013, 0x00ff, 0x1900);
984 BWN_PHY_SETMASK(mac, 0x0035, 0xffc0, 0x0064);
985 BWN_PHY_SETMASK(mac, 0x005d, 0xff80, 0x000a);
988 if (mac->mac_flags & BWN_MAC_FLAG_BADFRAME_PREEMP)
989 BWN_PHY_SET(mac, BWN_PHY_RADIO_BITFIELD, (1 << 11));
992 BWN_PHY_WRITE(mac, 0x0026, 0xce00);
993 BWN_PHY_WRITE(mac, 0x0021, 0x3763);
994 BWN_PHY_WRITE(mac, 0x0022, 0x1bc3);
995 BWN_PHY_WRITE(mac, 0x0023, 0x06f9);
996 BWN_PHY_WRITE(mac, 0x0024, 0x037e);
998 BWN_PHY_WRITE(mac, 0x0026, 0xcc00);
999 BWN_PHY_WRITE(mac, 0x0030, 0x00c6);
1000 BWN_WRITE_2(mac, 0x03ec, 0x3f22);
1003 BWN_PHY_WRITE(mac, 0x0020, 0x3e1c);
1005 BWN_PHY_WRITE(mac, 0x0020, 0x301c);
1008 BWN_WRITE_2(mac, 0x03e4, 0x3000);
1011 bwn_phy_g_switch_chan(mac, 7, 0);
1014 BWN_RF_WRITE(mac, 0x0075, 0x0080);
1015 BWN_RF_WRITE(mac, 0x0079, 0x0081);
1018 BWN_RF_WRITE(mac, 0x0050, 0x0020);
1019 BWN_RF_WRITE(mac, 0x0050, 0x0023);
1022 BWN_RF_WRITE(mac, 0x0050, 0x0020);
1023 BWN_RF_WRITE(mac, 0x005a, 0x0070);
1026 BWN_RF_WRITE(mac, 0x005b, 0x007b);
1027 BWN_RF_WRITE(mac, 0x005c, 0x00b0);
1028 BWN_RF_SET(mac, 0x007a, 0x0007);
1030 bwn_phy_g_switch_chan(mac, old_channel, 0);
1031 BWN_PHY_WRITE(mac, 0x0014, 0x0080);
1032 BWN_PHY_WRITE(mac, 0x0032, 0x00ca);
1033 BWN_PHY_WRITE(mac, 0x002a, 0x88a3);
1035 bwn_phy_g_set_txpwr_sub(mac, &pg->pg_bbatt, &pg->pg_rfatt,
1039 BWN_RF_WRITE(mac, 0x005d, 0x000d);
1041 BWN_WRITE_2(mac, 0x03e4, (BWN_READ_2(mac, 0x03e4) & 0xffc0) | 0x0004);
1045 bwn_loopback_calcgain(struct bwn_mac *mac)
1047 struct bwn_phy *phy = &mac->mac_phy;
1049 struct bwn_softc *sc = mac->mac_sc;
1057 backup_phy[0] = BWN_PHY_READ(mac, BWN_PHY_CRS0);
1058 backup_phy[1] = BWN_PHY_READ(mac, BWN_PHY_CCKBBANDCFG);
1059 backup_phy[2] = BWN_PHY_READ(mac, BWN_PHY_RFOVER);
1060 backup_phy[3] = BWN_PHY_READ(mac, BWN_PHY_RFOVERVAL);
1062 backup_phy[4] = BWN_PHY_READ(mac, BWN_PHY_ANALOGOVER);
1063 backup_phy[5] = BWN_PHY_READ(mac, BWN_PHY_ANALOGOVERVAL);
1065 backup_phy[6] = BWN_PHY_READ(mac, BWN_PHY_CCK(0x5a));
1066 backup_phy[7] = BWN_PHY_READ(mac, BWN_PHY_CCK(0x59));
1067 backup_phy[8] = BWN_PHY_READ(mac, BWN_PHY_CCK(0x58));
1068 backup_phy[9] = BWN_PHY_READ(mac, BWN_PHY_CCK(0x0a));
1069 backup_phy[10] = BWN_PHY_READ(mac, BWN_PHY_CCK(0x03));
1070 backup_phy[11] = BWN_PHY_READ(mac, BWN_PHY_LO_MASK);
1071 backup_phy[12] = BWN_PHY_READ(mac, BWN_PHY_LO_CTL);
1072 backup_phy[13] = BWN_PHY_READ(mac, BWN_PHY_CCK(0x2b));
1073 backup_phy[14] = BWN_PHY_READ(mac, BWN_PHY_PGACTL);
1074 backup_phy[15] = BWN_PHY_READ(mac, BWN_PHY_LO_LEAKAGE);
1076 backup_radio[0] = BWN_RF_READ(mac, 0x52);
1077 backup_radio[1] = BWN_RF_READ(mac, 0x43);
1078 backup_radio[2] = BWN_RF_READ(mac, 0x7a);
1080 BWN_PHY_MASK(mac, BWN_PHY_CRS0, 0x3fff);
1081 BWN_PHY_SET(mac, BWN_PHY_CCKBBANDCFG, 0x8000);
1082 BWN_PHY_SET(mac, BWN_PHY_RFOVER, 0x0002);
1083 BWN_PHY_MASK(mac, BWN_PHY_RFOVERVAL, 0xfffd);
1084 BWN_PHY_SET(mac, BWN_PHY_RFOVER, 0x0001);
1085 BWN_PHY_MASK(mac, BWN_PHY_RFOVERVAL, 0xfffe);
1087 BWN_PHY_SET(mac, BWN_PHY_ANALOGOVER, 0x0001);
1088 BWN_PHY_MASK(mac, BWN_PHY_ANALOGOVERVAL, 0xfffe);
1089 BWN_PHY_SET(mac, BWN_PHY_ANALOGOVER, 0x0002);
1090 BWN_PHY_MASK(mac, BWN_PHY_ANALOGOVERVAL, 0xfffd);
1092 BWN_PHY_SET(mac, BWN_PHY_RFOVER, 0x000c);
1093 BWN_PHY_SET(mac, BWN_PHY_RFOVERVAL, 0x000c);
1094 BWN_PHY_SET(mac, BWN_PHY_RFOVER, 0x0030);
1095 BWN_PHY_SETMASK(mac, BWN_PHY_RFOVERVAL, 0xffcf, 0x10);
1097 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x5a), 0x0780);
1098 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x59), 0xc810);
1099 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), 0x000d);
1101 BWN_PHY_SET(mac, BWN_PHY_CCK(0x0a), 0x2000);
1103 BWN_PHY_SET(mac, BWN_PHY_ANALOGOVER, 0x0004);
1104 BWN_PHY_MASK(mac, BWN_PHY_ANALOGOVERVAL, 0xfffb);
1106 BWN_PHY_SETMASK(mac, BWN_PHY_CCK(0x03), 0xff9f, 0x40);
1109 BWN_RF_WRITE(mac, 0x43, 0x000f);
1111 BWN_RF_WRITE(mac, 0x52, 0);
1112 BWN_RF_SETMASK(mac, 0x43, 0xfff0, 0x9);
1114 bwn_phy_g_set_bbatt(mac, 11);
1117 BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0xc020);
1119 BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0x8020);
1120 BWN_PHY_WRITE(mac, BWN_PHY_LO_CTL, 0);
1122 BWN_PHY_SETMASK(mac, BWN_PHY_CCK(0x2b), 0xffc0, 0x01);
1123 BWN_PHY_SETMASK(mac, BWN_PHY_CCK(0x2b), 0xc0ff, 0x800);
1125 BWN_PHY_SET(mac, BWN_PHY_RFOVER, 0x0100);
1126 BWN_PHY_MASK(mac, BWN_PHY_RFOVERVAL, 0xcfff);
1130 BWN_PHY_SET(mac, BWN_PHY_RFOVER, 0x0800);
1131 BWN_PHY_SET(mac, BWN_PHY_RFOVERVAL, 0x8000);
1134 BWN_RF_MASK(mac, 0x7a, 0x00f7);
1140 BWN_RF_WRITE(mac, 0x43, i);
1141 BWN_PHY_SETMASK(mac, BWN_PHY_RFOVERVAL, 0xf0ff,
1143 BWN_PHY_SETMASK(mac, BWN_PHY_PGACTL, 0x0fff, 0xa000);
1144 BWN_PHY_SET(mac, BWN_PHY_PGACTL, 0xf000);
1146 if (BWN_PHY_READ(mac, BWN_PHY_LO_LEAKAGE) >= 0xdfc)
1154 BWN_PHY_SET(mac, BWN_PHY_RFOVERVAL, 0x30);
1157 BWN_PHY_SETMASK(mac, BWN_PHY_RFOVERVAL, 0xf0ff, j << 8);
1158 BWN_PHY_SETMASK(mac, BWN_PHY_PGACTL, 0x0fff, 0xa000);
1159 BWN_PHY_SET(mac, BWN_PHY_PGACTL, 0xf000);
1162 if (BWN_PHY_READ(mac, BWN_PHY_LO_LEAKAGE) >= 0xdfc)
1170 BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVER, backup_phy[4]);
1171 BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVERVAL, backup_phy[5]);
1173 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x5a), backup_phy[6]);
1174 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x59), backup_phy[7]);
1175 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), backup_phy[8]);
1176 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x0a), backup_phy[9]);
1177 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x03), backup_phy[10]);
1178 BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, backup_phy[11]);
1179 BWN_PHY_WRITE(mac, BWN_PHY_LO_CTL, backup_phy[12]);
1180 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2b), backup_phy[13]);
1181 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, backup_phy[14]);
1183 bwn_phy_g_set_bbatt(mac, backup_bband);
1185 BWN_RF_WRITE(mac, 0x52, backup_radio[0]);
1186 BWN_RF_WRITE(mac, 0x43, backup_radio[1]);
1187 BWN_RF_WRITE(mac, 0x7a, backup_radio[2]);
1189 BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, backup_phy[2] | 0x0003);
1191 BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, backup_phy[2]);
1192 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, backup_phy[3]);
1193 BWN_PHY_WRITE(mac, BWN_PHY_CRS0, backup_phy[0]);
1194 BWN_PHY_WRITE(mac, BWN_PHY_CCKBBANDCFG, backup_phy[1]);
1202 bwn_rf_init_bcm2050(struct bwn_mac *mac)
1204 struct bwn_phy *phy = &mac->mac_phy;
1218 radio0 = BWN_RF_READ(mac, 0x43);
1219 radio1 = BWN_RF_READ(mac, 0x51);
1220 radio2 = BWN_RF_READ(mac, 0x52);
1221 pgactl = BWN_PHY_READ(mac, BWN_PHY_PGACTL);
1222 cck0 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x5a));
1223 cck1 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x59));
1224 cck2 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x58));
1227 cck3 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x30));
1228 reg0 = BWN_READ_2(mac, 0x3ec);
1230 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x30), 0xff);
1231 BWN_WRITE_2(mac, 0x3ec, 0x3f3f);
1233 rfover = BWN_PHY_READ(mac, BWN_PHY_RFOVER);
1234 rfoverval = BWN_PHY_READ(mac, BWN_PHY_RFOVERVAL);
1235 analogover = BWN_PHY_READ(mac, BWN_PHY_ANALOGOVER);
1236 analogoverval = BWN_PHY_READ(mac, BWN_PHY_ANALOGOVERVAL);
1237 crs0 = BWN_PHY_READ(mac, BWN_PHY_CRS0);
1238 classctl = BWN_PHY_READ(mac, BWN_PHY_CLASSCTL);
1240 BWN_PHY_SET(mac, BWN_PHY_ANALOGOVER, 0x0003);
1241 BWN_PHY_MASK(mac, BWN_PHY_ANALOGOVERVAL, 0xfffc);
1242 BWN_PHY_MASK(mac, BWN_PHY_CRS0, 0x7fff);
1243 BWN_PHY_MASK(mac, BWN_PHY_CLASSCTL, 0xfffc);
1245 lomask = BWN_PHY_READ(mac, BWN_PHY_LO_MASK);
1246 loctl = BWN_PHY_READ(mac, BWN_PHY_LO_CTL);
1248 BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0xc020);
1250 BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0x8020);
1251 BWN_PHY_WRITE(mac, BWN_PHY_LO_CTL, 0);
1254 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL,
1255 bwn_rf_2050_rfoverval(mac, BWN_PHY_RFOVERVAL,
1257 BWN_PHY_WRITE(mac, BWN_PHY_RFOVER,
1258 bwn_rf_2050_rfoverval(mac, BWN_PHY_RFOVER, 0));
1260 BWN_WRITE_2(mac, 0x3e2, BWN_READ_2(mac, 0x3e2) | 0x8000);
1262 syncctl = BWN_PHY_READ(mac, BWN_PHY_SYNCCTL);
1263 BWN_PHY_MASK(mac, BWN_PHY_SYNCCTL, 0xff7f);
1264 reg1 = BWN_READ_2(mac, 0x3e6);
1265 reg2 = BWN_READ_2(mac, 0x3f4);
1268 BWN_WRITE_2(mac, 0x03e6, 0x0122);
1271 BWN_PHY_SETMASK(mac, BWN_PHY_CCK(0x03), 0xffbf, 0x40);
1272 BWN_WRITE_2(mac, BWN_CHANNEL_EXT,
1273 (BWN_READ_2(mac, BWN_CHANNEL_EXT) | 0x2000));
1276 reg = BWN_RF_READ(mac, 0x60);
1281 BWN_RF_WRITE(mac, 0x78, 0x26);
1283 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL,
1284 bwn_rf_2050_rfoverval(mac, BWN_PHY_RFOVERVAL,
1287 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xbfaf);
1288 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2b), 0x1403);
1290 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL,
1291 bwn_rf_2050_rfoverval(mac, BWN_PHY_RFOVERVAL,
1294 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xbfa0);
1295 BWN_RF_SET(mac, 0x51, 0x0004);
1297 BWN_RF_WRITE(mac, 0x43, 0x1f);
1299 BWN_RF_WRITE(mac, 0x52, 0);
1300 BWN_RF_SETMASK(mac, 0x43, 0xfff0, 0x0009);
1302 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), 0);
1305 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x5a), 0x0480);
1306 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x59), 0xc810);
1307 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), 0x000d);
1309 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL,
1310 bwn_rf_2050_rfoverval(mac,
1313 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xafb0);
1316 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL,
1317 bwn_rf_2050_rfoverval(mac,
1320 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xefb0);
1323 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL,
1324 bwn_rf_2050_rfoverval(mac,
1327 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xfff0);
1329 tmp1 += BWN_PHY_READ(mac, BWN_PHY_LO_LEAKAGE);
1330 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), 0);
1332 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL,
1333 bwn_rf_2050_rfoverval(mac,
1336 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xafb0);
1340 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), 0);
1346 BWN_RF_WRITE(mac, 0x78, radio78);
1349 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x5a), 0x0d80);
1350 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x59), 0xc810);
1351 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), 0x000d);
1353 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL,
1354 bwn_rf_2050_rfoverval(mac,
1357 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xafb0);
1360 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL,
1361 bwn_rf_2050_rfoverval(mac,
1364 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xefb0);
1367 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL,
1368 bwn_rf_2050_rfoverval(mac,
1371 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xfff0);
1373 tmp2 += BWN_PHY_READ(mac, BWN_PHY_LO_LEAKAGE);
1374 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), 0);
1376 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL,
1377 bwn_rf_2050_rfoverval(mac,
1380 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xafb0);
1388 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, pgactl);
1389 BWN_RF_WRITE(mac, 0x51, radio1);
1390 BWN_RF_WRITE(mac, 0x52, radio2);
1391 BWN_RF_WRITE(mac, 0x43, radio0);
1392 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x5a), cck0);
1393 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x59), cck1);
1394 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), cck2);
1395 BWN_WRITE_2(mac, 0x3e6, reg1);
1397 BWN_WRITE_2(mac, 0x3f4, reg2);
1398 BWN_PHY_WRITE(mac, BWN_PHY_SYNCCTL, syncctl);
1399 bwn_spu_workaround(mac, phy->chan);
1401 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x30), cck3);
1402 BWN_WRITE_2(mac, 0x3ec, reg0);
1404 BWN_WRITE_2(mac, BWN_PHY_RADIO,
1405 BWN_READ_2(mac, BWN_PHY_RADIO)
1407 BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, rfover);
1408 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, rfoverval);
1409 BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVER, analogover);
1410 BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVERVAL,
1412 BWN_PHY_WRITE(mac, BWN_PHY_CRS0, crs0);
1413 BWN_PHY_WRITE(mac, BWN_PHY_CLASSCTL, classctl);
1415 BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, lomask);
1416 BWN_PHY_WRITE(mac, BWN_PHY_LO_CTL, loctl);
1424 bwn_phy_init_b6(struct bwn_mac *mac)
1426 struct bwn_phy *phy = &mac->mac_phy;
1428 struct bwn_softc *sc = mac->mac_sc;
1435 BWN_PHY_WRITE(mac, 0x003e, 0x817a);
1436 BWN_RF_WRITE(mac, 0x007a, BWN_RF_READ(mac, 0x007a) | 0x0058);
1438 BWN_RF_WRITE(mac, 0x51, 0x37);
1439 BWN_RF_WRITE(mac, 0x52, 0x70);
1440 BWN_RF_WRITE(mac, 0x53, 0xb3);
1441 BWN_RF_WRITE(mac, 0x54, 0x9b);
1442 BWN_RF_WRITE(mac, 0x5a, 0x88);
1443 BWN_RF_WRITE(mac, 0x5b, 0x88);
1444 BWN_RF_WRITE(mac, 0x5d, 0x88);
1445 BWN_RF_WRITE(mac, 0x5e, 0x88);
1446 BWN_RF_WRITE(mac, 0x7d, 0x88);
1447 bwn_hf_write(mac,
1448 bwn_hf_read(mac) | BWN_HF_TSSI_RESET_PSM_WORKAROUN);
1451 BWN_RF_WRITE(mac, 0x51, 0);
1452 BWN_RF_WRITE(mac, 0x52, 0x40);
1453 BWN_RF_WRITE(mac, 0x53, 0xb7);
1454 BWN_RF_WRITE(mac, 0x54, 0x98);
1455 BWN_RF_WRITE(mac, 0x5a, 0x88);
1456 BWN_RF_WRITE(mac, 0x5b, 0x6b);
1457 BWN_RF_WRITE(mac, 0x5c, 0x0f);
1459 BWN_RF_WRITE(mac, 0x5d, 0xfa);
1460 BWN_RF_WRITE(mac, 0x5e, 0xd8);
1462 BWN_RF_WRITE(mac, 0x5d, 0xf5);
1463 BWN_RF_WRITE(mac, 0x5e, 0xb8);
1465 BWN_RF_WRITE(mac, 0x0073, 0x0003);
1466 BWN_RF_WRITE(mac, 0x007d, 0x00a8);
1467 BWN_RF_WRITE(mac, 0x007c, 0x0001);
1468 BWN_RF_WRITE(mac, 0x007e, 0x0008);
1471 BWN_PHY_WRITE(mac, offset, val);
1475 BWN_PHY_WRITE(mac, offset, val);
1479 BWN_PHY_WRITE(mac, offset, (val & 0x3f3f));
1483 BWN_RF_SET(mac, 0x007a, 0x0020);
1484 BWN_RF_SET(mac, 0x0051, 0x0004);
1485 BWN_PHY_SET(mac, 0x0802, 0x0100);
1486 BWN_PHY_SET(mac, 0x042b, 0x2000);
1487 BWN_PHY_WRITE(mac, 0x5b, 0);
1488 BWN_PHY_WRITE(mac, 0x5c, 0);
1492 bwn_phy_g_switch_chan(mac, (old_channel >= 8) ? 1 : 13, 0);
1494 BWN_RF_WRITE(mac, 0x0050, 0x0020);
1495 BWN_RF_WRITE(mac, 0x0050, 0x0023);
1498 BWN_RF_WRITE(mac, 0x7c, BWN_RF_READ(mac, 0x7c) | 0x0002);
1499 BWN_RF_WRITE(mac, 0x50, 0x20);
1502 BWN_RF_WRITE(mac, 0x7c, 0x20);
1503 BWN_RF_WRITE(mac, 0x5a, 0x70);
1504 BWN_RF_WRITE(mac, 0x5b, 0x7b);
1505 BWN_RF_WRITE(mac, 0x5c, 0xb0);
1507 BWN_RF_SETMASK(mac, 0x007a, 0x00f8, 0x0007);
1509 bwn_phy_g_switch_chan(mac, old_channel, 0);
1511 BWN_PHY_WRITE(mac, 0x0014, 0x0200);
1513 BWN_PHY_WRITE(mac, 0x2a, 0x88c2);
1515 BWN_PHY_WRITE(mac, 0x2a, 0x8ac0);
1516 BWN_PHY_WRITE(mac, 0x0038, 0x0668);
1517 bwn_phy_g_set_txpwr_sub(mac, &pg->pg_bbatt, &pg->pg_rfatt,
1520 BWN_PHY_SETMASK(mac, 0x5d, 0xff80, 0x0003);
1522 BWN_RF_WRITE(mac, 0x005d, 0x000d);
1525 BWN_WRITE_2(mac, 0x3e4, 9);
1526 BWN_PHY_MASK(mac, 0x61, 0x0fff);
1528 BWN_PHY_SETMASK(mac, 0x0002, 0xffc0, 0x0004);
1532 BWN_WRITE_2(mac, 0x03e6, 0x0);
1536 bwn_phy_init_a(struct bwn_mac *mac)
1538 struct bwn_phy *phy = &mac->mac_phy;
1539 struct bwn_softc *sc = mac->mac_sc;
1546 BWN_PHY_MASK(mac, BWN_PHY_OFDM(0x1b), ~0x1000);
1547 if (BWN_PHY_READ(mac, BWN_PHY_ENCORE) & BWN_PHY_ENCORE_EN)
1548 BWN_PHY_SET(mac, BWN_PHY_ENCORE, 0x0010);
1550 BWN_PHY_MASK(mac, BWN_PHY_ENCORE, ~0x1010);
1553 bwn_wa_init(mac);
1557 BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x6e), 0xe000, 0x3cf);
1561 bwn_wa_write_noisescale(struct bwn_mac *mac, const uint16_t *nst)
1566 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_NOISESCALE, i, nst[i]);
1570 bwn_wa_agc(struct bwn_mac *mac)
1572 struct bwn_phy *phy = &mac->mac_phy;
1575 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1_R1, 0, 254);
1576 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1_R1, 1, 13);
1577 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1_R1, 2, 19);
1578 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1_R1, 3, 25);
1579 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, 0, 0x2710);
1580 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, 1, 0x9b83);
1581 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, 2, 0x9b83);
1582 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, 3, 0x0f8d);
1583 BWN_PHY_WRITE(mac, BWN_PHY_LMS, 4);
1585 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1, 0, 254);
1586 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1, 1, 13);
1587 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1, 2, 19);
1588 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1, 3, 25);
1591 BWN_PHY_SETMASK(mac, BWN_PHY_CCKSHIFTBITS_WA, (uint16_t)~0xff00,
1593 BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x1a), ~0x007f, 0x000f);
1594 BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x1a), ~0x3f80, 0x2b80);
1595 BWN_PHY_SETMASK(mac, BWN_PHY_ANTWRSETT, 0xf0ff, 0x0300);
1596 BWN_RF_SET(mac, 0x7a, 0x0008);
1597 BWN_PHY_SETMASK(mac, BWN_PHY_N1P1GAIN, ~0x000f, 0x0008);
1598 BWN_PHY_SETMASK(mac, BWN_PHY_P1P2GAIN, ~0x0f00, 0x0600);
1599 BWN_PHY_SETMASK(mac, BWN_PHY_N1N2GAIN, ~0x0f00, 0x0700);
1600 BWN_PHY_SETMASK(mac, BWN_PHY_N1P1GAIN, ~0x0f00, 0x0100);
1602 BWN_PHY_SETMASK(mac, BWN_PHY_N1N2GAIN, ~0x000f, 0x0007);
1603 BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x88), ~0x00ff, 0x001c);
1604 BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x88), ~0x3f00, 0x0200);
1605 BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x96), ~0x00ff, 0x001c);
1606 BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x89), ~0x00ff, 0x0020);
1607 BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x89), ~0x3f00, 0x0200);
1608 BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x82), ~0x00ff, 0x002e);
1609 BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x96), (uint16_t)~0xff00, 0x1a00);
1610 BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x81), ~0x00ff, 0x0028);
1611 BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x81), (uint16_t)~0xff00, 0x2c00);
1613 BWN_PHY_WRITE(mac, BWN_PHY_PEAK_COUNT, 0x092b);
1614 BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x1b), ~0x001e, 0x0002);
1616 BWN_PHY_MASK(mac, BWN_PHY_OFDM(0x1b), ~0x001e);
1617 BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0x1f), 0x287a);
1618 BWN_PHY_SETMASK(mac, BWN_PHY_LPFGAINCTL, ~0x000f, 0x0004);
1620 BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0x22), 0x287a);
1621 BWN_PHY_SETMASK(mac, BWN_PHY_LPFGAINCTL,
1625 BWN_PHY_SETMASK(mac, BWN_PHY_DIVSRCHIDX, 0x8080, 0x7874);
1626 BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0x8e), 0x1c00);
1628 BWN_PHY_SETMASK(mac, BWN_PHY_DIVP1P2GAIN, ~0x0f00, 0x0600);
1629 BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0x8b), 0x005e);
1630 BWN_PHY_SETMASK(mac, BWN_PHY_ANTWRSETT, ~0x00ff, 0x001e);
1631 BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0x8d), 0x0002);
1632 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3_R1, 0, 0);
1633 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3_R1, 1, 7);
1634 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3_R1, 2, 16);
1635 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3_R1, 3, 28);
1637 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3, 0, 0);
1638 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3, 1, 7);
1639 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3, 2, 16);
1640 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3, 3, 28);
1643 BWN_PHY_MASK(mac, BWN_PHY_OFDM(0x26), ~0x0003);
1644 BWN_PHY_MASK(mac, BWN_PHY_OFDM(0x26), ~0x1000);
1646 BWN_PHY_READ(mac, BWN_PHY_VERSION_OFDM);
1650 bwn_wa_grev1(struct bwn_mac *mac)
1652 struct bwn_phy *phy = &mac->mac_phy;
1662 BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES1_R1, 0x4f19);
1664 BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES1, 0x1861);
1665 BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES2, 0x0271);
1666 BWN_PHY_SET(mac, BWN_PHY_ANTDWELL, 0x0800);
1668 BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES1, 0x0098);
1669 BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES2, 0x0070);
1670 BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0xc9), 0x0080);
1671 BWN_PHY_SET(mac, BWN_PHY_ANTDWELL, 0x0800);
1673 BWN_PHY_SETMASK(mac, BWN_PHY_CRS0, ~0x03c0, 0xd000);
1674 BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0x2c), 0x005a);
1675 BWN_PHY_WRITE(mac, BWN_PHY_CCKSHIFTBITS, 0x0026);
1679 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_DACRFPABB, i,
1685 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, i,
1689 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, i,
1693 bwn_ofdmtab_write_4(mac, BWN_OFDMTAB_ROTOR, i,
1698 if (BWN_PHY_READ(mac, BWN_PHY_ENCORE) &
1700 bwn_wa_write_noisescale(mac, bwn_tab_noisescale_g3);
1702 bwn_wa_write_noisescale(mac, bwn_tab_noisescale_g2);
1704 bwn_wa_write_noisescale(mac, bwn_tab_noisescale_g1);
1707 bwn_ofdmtab_write_4(mac, BWN_OFDMTAB_ADVRETARD, i,
1712 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_WRSSI_R1,
1716 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_WRSSI, i, 0x0820);
1719 bwn_wa_agc(mac);
1723 bwn_wa_grev26789(struct bwn_mac *mac)
1725 struct bwn_phy *phy = &mac->mac_phy;
1732 bwn_gtab_write(mac, BWN_GTAB_ORIGTR, 0, 0xc480);
1736 BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES1_R1, 0x4f19);
1738 BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES1, 0x1861);
1739 BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES2, 0x0271);
1740 BWN_PHY_SET(mac, BWN_PHY_ANTDWELL, 0x0800);
1742 BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES1, 0x0098);
1743 BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES2, 0x0070);
1744 BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0xc9), 0x0080);
1745 BWN_PHY_SET(mac, BWN_PHY_ANTDWELL, 0x0800);
1749 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_RSSI, i, i);
1754 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, i,
1758 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, i,
1763 if (BWN_PHY_READ(mac, BWN_PHY_ENCORE) &
1765 bwn_wa_write_noisescale(mac, bwn_tab_noisescale_g3);
1767 bwn_wa_write_noisescale(mac, bwn_tab_noisescale_g2);
1769 bwn_wa_write_noisescale(mac, bwn_tab_noisescale_g1);
1772 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_MINSIGSQ, i,
1777 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_WRSSI_R1, i,
1781 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_WRSSI, i, 0x0820);
1784 bwn_wa_agc(mac);
1786 ofdmrev = BWN_PHY_READ(mac, BWN_PHY_VERSION_OFDM) & BWN_PHYVER_VERSION;
1789 BWN_PHY_WRITE(mac, BWN_PHY_PWRDOWN, 0x1808);
1791 BWN_PHY_WRITE(mac, BWN_PHY_PWRDOWN, 0x1000);
1793 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_DAC, 3, 0x1044);
1794 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_DAC, 4, 0x7201);
1795 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_DAC, 6, 0x0040);
1798 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_UNKNOWN_0F, 2, 15);
1799 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_UNKNOWN_0F, 3, 20);
1803 bwn_wa_init(struct bwn_mac *mac)
1805 struct bwn_phy *phy = &mac->mac_phy;
1806 struct bwn_softc *sc = mac->mac_sc;
1812 bwn_wa_grev1(mac);
1819 bwn_wa_grev26789(mac);
1829 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX_R1, 1,
1831 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX_R1, 2,
1834 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX, 1, 0x0002);
1835 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX, 2, 0x0001);
1839 BWN_PHY_MASK(mac, BWN_PHY_EXTG(0x11), 0xf7ff);
1840 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX,
1842 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX,
1844 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX,
1846 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX,
1848 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX,
1850 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX,
1856 BWN_PHY_WRITE(mac, BWN_PHY_GTABCTL, 0x3120);
1857 BWN_PHY_WRITE(mac, BWN_PHY_GTABDATA, 0xc480);
1860 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_UNKNOWN_11, 0, 0);
1861 bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_UNKNOWN_11, 1, 0);
1865 bwn_ofdmtab_write_2(struct bwn_mac *mac, uint16_t table, uint16_t offset,
1868 struct bwn_phy_g *pg = &mac->mac_phy.phy_g;
1874 BWN_PHY_WRITE(mac, BWN_PHY_OTABLECTL, addr);
1878 BWN_PHY_WRITE(mac, BWN_PHY_OTABLEI, value);
1882 bwn_ofdmtab_write_4(struct bwn_mac *mac, uint16_t table, uint16_t offset,
1885 struct bwn_phy_g *pg = &mac->mac_phy.phy_g;
1891 BWN_PHY_WRITE(mac, BWN_PHY_OTABLECTL, addr);
1896 BWN_PHY_WRITE(mac, BWN_PHY_OTABLEI, value);
1897 BWN_PHY_WRITE(mac, BWN_PHY_OTABLEQ, (value >> 16));
1901 bwn_gtab_write(struct bwn_mac *mac, uint16_t table, uint16_t offset,
1905 BWN_PHY_WRITE(mac, BWN_PHY_GTABCTL, table + offset);
1906 BWN_PHY_WRITE(mac, BWN_PHY_GTABDATA, value);
1910 bwn_lo_write(struct bwn_mac *mac, struct bwn_loctl *ctl)
1914 KASSERT(mac->mac_phy.type == BWN_PHYTYPE_G,
1919 BWN_PHY_WRITE(mac, BWN_PHY_LO_CTL, value);
1923 bwn_lo_calcfeed(struct bwn_mac *mac,
1926 struct bwn_phy *phy = &mac->mac_phy;
1927 struct bwn_softc *sc = mac->mac_sc;
1947 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xe300);
1948 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, rfover);
1951 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, rfover);
1954 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, rfover);
1956 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xf300);
1959 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, pga);
1962 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, pga);
1965 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, pga);
1968 feedthrough = BWN_PHY_READ(mac, BWN_PHY_LO_LEAKAGE);
1974 bwn_lo_txctl_regtable(struct bwn_mac *mac,
1977 struct bwn_phy *phy = &mac->mac_phy;
2009 bwn_lo_measure_txctl_values(struct bwn_mac *mac)
2011 struct bwn_phy *phy = &mac->mac_phy;
2063 BWN_RF_SETMASK(mac, 0x43, 0xfff0, rf_pctl_reg);
2064 bwn_phy_g_set_bbatt(mac, 2);
2066 reg = bwn_lo_txctl_regtable(mac, &mask, NULL);
2068 BWN_RF_MASK(mac, reg, mask);
2078 BWN_RF_SETMASK(mac, 0x52, 0xff0f, tx_magn);
2081 BWN_RF_SETMASK(mac, 0x52, 0xfff0, tx_bias);
2082 feedthrough = bwn_lo_calcfeed(mac, 0, pga,
2092 BWN_RF_WRITE(mac, 0x52,
2093 (BWN_RF_READ(mac, 0x52)
2100 BWN_RF_MASK(mac, 0x52, 0xfff0);
2107 bwn_lo_get_powervector(struct bwn_mac *mac)
2109 struct bwn_phy *phy = &mac->mac_phy;
2117 tmp = bwn_shm_read_2(mac, BWN_SHARED, 0x310 + i);
2119 bwn_shm_write_2(mac, BWN_SHARED, 0x310 + i, 0);
2128 bwn_lo_measure_gain_values(struct bwn_mac *mac, int16_t max_rx_gain,
2131 struct bwn_phy *phy = &mac->mac_phy;
2181 tmp = BWN_RF_READ(mac, 0x7a);
2186 BWN_RF_WRITE(mac, 0x7a, tmp);
2190 bwn_lo_save(struct bwn_mac *mac, struct bwn_lo_g_value *sav)
2192 struct bwn_phy *phy = &mac->mac_phy;
2194 struct bwn_softc *sc = mac->mac_sc;
2199 if (bwn_has_hwpctl(mac)) {
2200 sav->phy_lomask = BWN_PHY_READ(mac, BWN_PHY_LO_MASK);
2201 sav->phy_extg = BWN_PHY_READ(mac, BWN_PHY_EXTG(0x01));
2202 sav->phy_dacctl_hwpctl = BWN_PHY_READ(mac, BWN_PHY_DACCTL);
2203 sav->phy_cck4 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x14));
2204 sav->phy_hpwr_tssictl = BWN_PHY_READ(mac, BWN_PHY_HPWR_TSSICTL);
2206 BWN_PHY_SET(mac, BWN_PHY_HPWR_TSSICTL, 0x100);
2207 BWN_PHY_SET(mac, BWN_PHY_EXTG(0x01), 0x40);
2208 BWN_PHY_SET(mac, BWN_PHY_DACCTL, 0x40);
2209 BWN_PHY_SET(mac, BWN_PHY_CCK(0x14), 0x200);
2213 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x16), 0x410);
2214 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x17), 0x820);
2217 sav->phy_analogover = BWN_PHY_READ(mac, BWN_PHY_ANALOGOVER);
2219 BWN_PHY_READ(mac, BWN_PHY_ANALOGOVERVAL);
2220 sav->phy_rfover = BWN_PHY_READ(mac, BWN_PHY_RFOVER);
2221 sav->phy_rfoverval = BWN_PHY_READ(mac, BWN_PHY_RFOVERVAL);
2222 sav->phy_classctl = BWN_PHY_READ(mac, BWN_PHY_CLASSCTL);
2223 sav->phy_cck3 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x3e));
2224 sav->phy_crs0 = BWN_PHY_READ(mac, BWN_PHY_CRS0);
2226 BWN_PHY_MASK(mac, BWN_PHY_CLASSCTL, 0xfffc);
2227 BWN_PHY_MASK(mac, BWN_PHY_CRS0, 0x7fff);
2228 BWN_PHY_SET(mac, BWN_PHY_ANALOGOVER, 0x0003);
2229 BWN_PHY_MASK(mac, BWN_PHY_ANALOGOVERVAL, 0xfffc);
2234 BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, 0x933);
2236 BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, 0x133);
2239 BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, 0);
2241 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x3e), 0);
2243 sav->reg0 = BWN_READ_2(mac, 0x3f4);
2244 sav->reg1 = BWN_READ_2(mac, 0x3e2);
2245 sav->rf0 = BWN_RF_READ(mac, 0x43);
2246 sav->rf1 = BWN_RF_READ(mac, 0x7a);
2247 sav->phy_pgactl = BWN_PHY_READ(mac, BWN_PHY_PGACTL);
2248 sav->phy_cck2 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x2a));
2249 sav->phy_syncctl = BWN_PHY_READ(mac, BWN_PHY_SYNCCTL);
2250 sav->phy_dacctl = BWN_PHY_READ(mac, BWN_PHY_DACCTL);
2253 sav->rf2 = BWN_RF_READ(mac, 0x52);
2257 sav->phy_cck0 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x30));
2258 sav->phy_cck1 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x06));
2259 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x30), 0x00ff);
2260 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x06), 0x3f3f);
2262 BWN_WRITE_2(mac, 0x3e2, BWN_READ_2(mac, 0x3e2)
2265 BWN_WRITE_2(mac, 0x3f4, BWN_READ_2(mac, 0x3f4)
2270 BWN_PHY_WRITE(mac, tmp, 0x007f);
2273 BWN_PHY_WRITE(mac, BWN_PHY_SYNCCTL, tmp & 0xff7f);
2275 BWN_RF_WRITE(mac, 0x007a, tmp & 0xfff0);
2277 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2a), 0x8a3);
2281 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2b), 0x1003);
2283 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2b), 0x0802);
2285 bwn_dummy_transmission(mac, 0, 1);
2286 bwn_phy_g_switch_chan(mac, 6, 0);
2287 BWN_RF_READ(mac, 0x51);
2289 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2f), 0);
2294 bwn_lo_measure_txctl_values(mac);
2297 BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0xc078);
2300 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2e), 0x8078);
2302 BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0x8078);
2307 bwn_lo_restore(struct bwn_mac *mac, struct bwn_lo_g_value *sav)
2309 struct bwn_phy *phy = &mac->mac_phy;
2314 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xe300);
2316 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, tmp | 0xa0);
2318 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, tmp | 0xa2);
2320 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, tmp | 0xa3);
2323 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, tmp);
2327 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2e), 0xc078);
2329 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2e), 0x8078);
2331 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2f), 0x0202);
2333 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2f), 0x0101);
2335 BWN_WRITE_2(mac, 0x3f4, sav->reg0);
2336 BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, sav->phy_pgactl);
2337 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2a), sav->phy_cck2);
2338 BWN_PHY_WRITE(mac, BWN_PHY_SYNCCTL, sav->phy_syncctl);
2339 BWN_PHY_WRITE(mac, BWN_PHY_DACCTL, sav->phy_dacctl);
2340 BWN_RF_WRITE(mac, 0x43, sav->rf0);
2341 BWN_RF_WRITE(mac, 0x7a, sav->rf1);
2344 BWN_RF_SETMASK(mac, 0x52, 0xff0f, tmp);
2346 BWN_WRITE_2(mac, 0x3e2, sav->reg1);
2349 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x30), sav->phy_cck0);
2350 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x06), sav->phy_cck1);
2353 BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVER, sav->phy_analogover);
2354 BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVERVAL,
2356 BWN_PHY_WRITE(mac, BWN_PHY_CLASSCTL, sav->phy_classctl);
2357 BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, sav->phy_rfover);
2358 BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, sav->phy_rfoverval);
2359 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x3e), sav->phy_cck3);
2360 BWN_PHY_WRITE(mac, BWN_PHY_CRS0, sav->phy_crs0);
2362 if (bwn_has_hwpctl(mac)) {
2364 BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, tmp);
2365 BWN_PHY_WRITE(mac, BWN_PHY_EXTG(0x01), sav->phy_extg);
2366 BWN_PHY_WRITE(mac, BWN_PHY_DACCTL, sav->phy_dacctl_hwpctl);
2367 BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x14), sav->phy_cck4);
2368 BWN_PHY_WRITE(mac, BWN_PHY_HPWR_TSSICTL, sav->phy_hpwr_tssictl);
2370 bwn_phy_g_switch_chan(mac, sav->old_channel, 1);
2374 bwn_lo_probe_loctl(struct bwn_mac *mac,
2377 struct bwn_phy *phy = &mac->mac_phy;
2413 bwn_lo_write(mac, &test);
2414 feedth = bwn_lo_calcfeed(mac, pg->pg_lna_gain,
2439 bwn_lo_probe_sm(struct bwn_mac *mac, struct bwn_loctl *loctl, int *rxgain)
2441 struct bwn_phy *phy = &mac->mac_phy;
2457 bwn_lo_write(mac, &d.loctl);
2458 feedth = bwn_lo_calcfeed(mac, pg->pg_lna_gain,
2465 feedth = bwn_lo_calcfeed(mac, pg->pg_lna_gain,
2475 lower = bwn_lo_probe_loctl(mac, &probe, &d);
2499 bwn_lo_measure_gain_values(mac, *rxgain, BWN_HAS_LOOPBACK(phy));
2504 bwn_lo_calibset(struct bwn_mac *mac,
2507 struct bwn_phy *phy = &mac->mac_phy;
2516 bwn_mac_suspend(mac);
2517 bwn_lo_save(mac, &sval);
2519 reg = bwn_lo_txctl_regtable(mac, &value, &pad);
2520 BWN_RF_SETMASK(mac, 0x43, 0xfff0, rfatt->att);
2521 BWN_RF_SETMASK(mac, reg, ~value, (rfatt->padmix ? value :0));
2528 bwn_lo_measure_gain_values(mac, rxgain, BWN_HAS_LOOPBACK(phy));
2529 bwn_phy_g_set_bbatt(mac, bbatt->att);
2530 bwn_lo_probe_sm(mac, &loctl, &rxgain);
2532 bwn_lo_restore(mac, &sval);
2533 bwn_mac_enable(mac);
2537 device_printf(mac->mac_sc->sc_dev, "out of memory\n");
2550 bwn_lo_get_calib(struct bwn_mac *mac, const struct bwn_bbatt *bbatt,
2553 struct bwn_txpwr_loctl *lo = &mac->mac_phy.phy_g.pg_loctl;
2564 c = bwn_lo_calibset(mac, bbatt, rfatt);
2573 bwn_phy_g_dc_lookup_init(struct bwn_mac *mac, uint8_t update)
2575 struct bwn_phy *phy = &mac->mac_phy;
2577 struct bwn_softc *sc = mac->mac_sc;
2594 bwn_mac_suspend(mac);
2608 cal = bwn_lo_calibset(mac, bbatt, rfatt);
2629 BWN_PHY_WRITE(mac, 0x3a0 + i, lo->dc_lt[i]);
2631 bwn_mac_enable(mac);
2645 bwn_lo_g_adjust(struct bwn_mac *mac)
2647 struct bwn_phy_g *pg = &mac->mac_phy.phy_g;
2654 cal = bwn_lo_get_calib(mac, &pg->pg_bbatt, &rf);
2657 bwn_lo_write(mac, &cal->ctl);
2661 bwn_lo_g_init(struct bwn_mac *mac)
2664 if (!bwn_has_hwpctl(mac))
2667 bwn_lo_get_powervector(mac);
2668 bwn_phy_g_dc_lookup_init(mac, 1);
2672 bwn_nrssi_read(struct bwn_mac *mac, uint16_t offset)
2675 BWN_PHY_WRITE(mac, BWN_PHY_NRSSI_CTRL, offset);
2676 return ((int16_t)BWN_PHY_READ(mac, BWN_PHY_NRSSI_DATA));
2680 bwn_nrssi_threshold(struct bwn_mac *mac)
2682 struct bwn_phy *phy = &mac->mac_phy;
2684 struct bwn_softc *sc = mac->mac_sc;
2715 tmpu16 = BWN_PHY_READ(mac, 0x048a) & 0xf000;
2718 BWN_PHY_WRITE(mac, 0x048a, tmpu16);
2722 tmp16 = bwn_nrssi_read(mac, 0x20);
2725 BWN_PHY_SETMASK(mac, 0x048a, 0xf000, (tmp16 < 3) ? 0x09eb : 0x0aed);
2729 bwn_nrssi_slope_11g(struct bwn_mac *mac)
2742 struct bwn_phy *phy = &mac->mac_phy;
2758 bwn_nrssi_offset(mac);
2760 BWN_PHY_MASK(mac, BWN_PHY_G_CRS, 0x7fff);
2761 BWN_PHY_MASK(mac, 0x0802, 0xfffc);
2766 ant_div = BWN_READ_2(mac, 0x03e2);
2767 BWN_WRITE_2(mac, 0x03e2, BWN_READ_2(mac, 0x03e2) | 0x8000);
2769 save_rf[i] = BWN_RF_READ(mac, save_rf_regs[i]);
2771 save_phy_comm[i] = BWN_PHY_READ(mac, save_phy_comm_regs[i]);
2773 phy0 = BWN_READ_2(mac, BWN_PHY0);
2774 chan_ex = BWN_READ_2(mac, BWN_CHANNEL_EXT);
2777 save_phy3[i] = BWN_PHY_READ(mac, save_phy3_regs[i]);
2778 BWN_PHY_WRITE(mac, 0x002e, 0);
2779 BWN_PHY_WRITE(mac, BWN_PHY_G_LOCTL, 0);
2784 BWN_PHY_SET(mac, 0x0478, 0x0100);
2785 BWN_PHY_SET(mac, 0x0801, 0x0040);
2789 BWN_PHY_MASK(mac, 0x0801, 0xffbf);
2792 BWN_PHY_SET(mac, 0x0060, 0x0040);
2793 BWN_PHY_SET(mac, 0x0014, 0x0200);
2798 BWN_RF_SET(mac, 0x007a, 0x0070);
2799 bwn_set_all_gains(mac, 0, 8, 0);
2800 BWN_RF_MASK(mac, 0x007a, 0x00f7);
2802 BWN_PHY_SETMASK(mac, 0x0811, 0xffcf, 0x0030);
2803 BWN_PHY_SETMASK(mac, 0x0812, 0xffcf, 0x0010);
2805 BWN_RF_SET(mac, 0x007a, 0x0080);
2808 nrssi0 = (int16_t) ((BWN_PHY_READ(mac, 0x047f) >> 8) & 0x003f);
2815 BWN_RF_MASK(mac, 0x007a, 0x007f);
2817 BWN_PHY_SETMASK(mac, 0x0003, 0xff9f, 0x0040);
2819 BWN_WRITE_2(mac, BWN_CHANNEL_EXT,
2820 BWN_READ_2(mac, BWN_CHANNEL_EXT) | 0x2000);
2821 BWN_RF_SET(mac, 0x007a, 0x000f);
2822 BWN_PHY_WRITE(mac, 0x0015, 0xf330);
2824 BWN_PHY_SETMASK(mac, 0x0812, 0xffcf, 0x0020);
2825 BWN_PHY_SETMASK(mac, 0x0811, 0xffcf, 0x0020);
2828 bwn_set_all_gains(mac, 3, 0, 1);
2830 BWN_RF_WRITE(mac, 0x0043, 0x001f);
2832 tmp = BWN_RF_READ(mac, 0x0052) & 0xff0f;
2833 BWN_RF_WRITE(mac, 0x0052, tmp | 0x0060);
2834 tmp = BWN_RF_READ(mac, 0x0043) & 0xfff0;
2835 BWN_RF_WRITE(mac, 0x0043, tmp | 0x0009);
2837 BWN_PHY_WRITE(mac, 0x005a, 0x0480);
2838 BWN_PHY_WRITE(mac, 0x0059, 0x0810);
2839 BWN_PHY_WRITE(mac, 0x0058, 0x000d);
2841 nrssi1 = (int16_t) ((BWN_PHY_READ(mac, 0x047f) >> 8) & 0x003f);
2862 BWN_PHY_WRITE(mac, save_phy3_regs[phy3_idx],
2867 BWN_PHY_MASK(mac, 0x0812, 0xffcf);
2868 BWN_PHY_MASK(mac, 0x0811, 0xffcf);
2872 BWN_RF_WRITE(mac, save_rf_regs[i], save_rf[i]);
2874 BWN_WRITE_2(mac, 0x03e2, ant_div);
2875 BWN_WRITE_2(mac, 0x03e6, phy0);
2876 BWN_WRITE_2(mac, BWN_CHANNEL_EXT, chan_ex);
2879 BWN_PHY_WRITE(mac, save_phy_comm_regs[i], save_phy_comm[i]);
2881 bwn_spu_workaround(mac, phy->chan);
2882 BWN_PHY_SET(mac, 0x0802, (0x0001 | 0x0002));
2883 bwn_set_original_gains(mac);
2884 BWN_PHY_SET(mac, BWN_PHY_G_CRS, 0x8000);
2887 BWN_PHY_WRITE(mac, save_phy3_regs[phy3_idx],
2899 bwn_nrssi_threshold(mac);
2906 bwn_nrssi_offset(struct bwn_mac *mac)
2922 struct bwn_phy *phy = &mac->mac_phy;
2931 save_phy_comm[i] = BWN_PHY_READ(mac, save_phy_comm_regs[i]);
2933 save_rf[i] = BWN_RF_READ(mac, save_rf_regs[i]);
2935 BWN_PHY_MASK(mac, 0x0429, 0x7fff);
2936 BWN_PHY_SETMASK(mac, 0x0001, 0x3fff, 0x4000);
2937 BWN_PHY_SET(mac, 0x0811, 0x000c);
2938 BWN_PHY_SETMASK(mac, 0x0812, 0xfff3, 0x0004);
2939 BWN_PHY_MASK(mac, 0x0802, ~(0x1 | 0x2));
2942 save_phy6[i] = BWN_PHY_READ(mac, save_phy6_regs[i]);
2944 BWN_PHY_WRITE(mac, 0x002e, 0);
2945 BWN_PHY_WRITE(mac, 0x002f, 0);
2946 BWN_PHY_WRITE(mac, 0x080f, 0);
2947 BWN_PHY_WRITE(mac, 0x0810, 0);
2948 BWN_PHY_SET(mac, 0x0478, 0x0100);
2949 BWN_PHY_SET(mac, 0x0801, 0x0040);
2950 BWN_PHY_SET(mac, 0x0060, 0x0040);
2951 BWN_PHY_SET(mac, 0x0014, 0x0200);
2953 BWN_RF_SET(mac, 0x007a, 0x0070);
2954 BWN_RF_SET(mac, 0x007a, 0x0080);
2957 nrssi = (int16_t) ((BWN_PHY_READ(mac, 0x047f) >> 8) & 0x003f);
2962 BWN_RF_WRITE(mac, 0x007b, i);
2964 nrssi = (int16_t) ((BWN_PHY_READ(mac, 0x047f) >> 8) &
2974 BWN_RF_MASK(mac, 0x007a, 0x007f);
2976 BWN_PHY_SET(mac, 0x0814, 0x0001);
2977 BWN_PHY_MASK(mac, 0x0815, 0xfffe);
2979 BWN_PHY_SET(mac, 0x0811, 0x000c);
2980 BWN_PHY_SET(mac, 0x0812, 0x000c);
2981 BWN_PHY_SET(mac, 0x0811, 0x0030);
2982 BWN_PHY_SET(mac, 0x0812, 0x0030);
2983 BWN_PHY_WRITE(mac, 0x005a, 0x0480);
2984 BWN_PHY_WRITE(mac, 0x0059, 0x0810);
2985 BWN_PHY_WRITE(mac, 0x0058, 0x000d);
2987 BWN_PHY_WRITE(mac, 0x0003, 0x0122);
2989 BWN_PHY_SET(mac, 0x000a, 0x2000);
2991 BWN_PHY_SET(mac, 0x0814, 0x0004);
2992 BWN_PHY_MASK(mac, 0x0815, 0xfffb);
2994 BWN_PHY_SETMASK(mac, 0x0003, 0xff9f, 0x0040);
2995 BWN_RF_SET(mac, 0x007a, 0x000f);
2996 bwn_set_all_gains(mac, 3, 0, 1);
2997 BWN_RF_SETMASK(mac, 0x0043, 0x00f0, 0x000f);
2999 nrssi = (int16_t) ((BWN_PHY_READ(mac, 0x047f) >> 8) & 0x003f);
3004 BWN_RF_WRITE(mac, 0x007b, i);
3006 nrssi = (int16_t)((BWN_PHY_READ(mac,
3018 BWN_RF_WRITE(mac, 0x007b, saved);
3025 BWN_PHY_WRITE(mac, save_phy6_regs[phy6_idx],
3031 BWN_PHY_WRITE(mac, save_phy_comm_regs[i],
3035 BWN_PHY_WRITE(mac, save_phy_comm_regs[i], save_phy_comm[i]);
3038 BWN_RF_WRITE(mac, save_rf_regs[i], save_rf[i]);
3040 BWN_PHY_WRITE(mac, 0x0802, BWN_PHY_READ(mac, 0x0802) | 0x1 | 0x2);
3041 BWN_PHY_SET(mac, 0x0429, 0x8000);
3042 bwn_set_original_gains(mac);
3045 BWN_PHY_WRITE(mac, save_phy6_regs[phy6_idx],
3050 BWN_PHY_WRITE(mac, save_phy_comm_regs[0], save_phy_comm[0]);
3051 BWN_PHY_WRITE(mac, save_phy_comm_regs[2], save_phy_comm[2]);
3052 BWN_PHY_WRITE(mac, save_phy_comm_regs[1], save_phy_comm[1]);
3056 bwn_set_all_gains(struct bwn_mac *mac, int16_t first, int16_t second,
3059 struct bwn_phy *phy = &mac->mac_phy;
3074 bwn_ofdmtab_write_2(mac, table, i, first);
3077 bwn_ofdmtab_write_2(mac, table, i, second);
3081 BWN_PHY_SETMASK(mac, 0x04a0, 0xbfbf, tmp);
3082 BWN_PHY_SETMASK(mac, 0x04a1, 0xbfbf, tmp);
3083 BWN_PHY_SETMASK(mac, 0x04a2, 0xbfbf, tmp);
3085 bwn_dummy_transmission(mac, 0, 1);
3089 bwn_set_original_gains(struct bwn_mac *mac)
3091 struct bwn_phy *phy = &mac->mac_phy;
3109 bwn_ofdmtab_write_2(mac, table, i, tmp);
3113 bwn_ofdmtab_write_2(mac, table, i, i - start);
3115 BWN_PHY_SETMASK(mac, 0x04a0, 0xbfbf, 0x4040);
3116 BWN_PHY_SETMASK(mac, 0x04a1, 0xbfbf, 0x4040);
3117 BWN_PHY_SETMASK(mac, 0x04a2, 0xbfbf, 0x4000);
3118 bwn_dummy_transmission(mac, 0, 1);
3122 bwn_phy_hwpctl_init(struct bwn_mac *mac)
3124 struct bwn_phy *phy = &mac->mac_phy;
3128 struct bwn_softc *sc = mac->mac_sc;
3138 BWN_PHY_WRITE(mac, 0x0028, 0x8018);
3140 BWN_WRITE_2(mac, BWN_PHY0, BWN_READ_2(mac, BWN_PHY0) & 0xffdf);
3144 bwn_hwpctl_early_init(mac);
3147 BWN_RF_SETMASK(mac, 0x0076, 0x00f7, 0x0084);
3161 bwn_phy_g_set_txpwr_sub(mac, &bbatt, &rfatt, 0);
3163 bwn_dummy_transmission(mac, 0, 1);
3164 pg->pg_curtssi = BWN_PHY_READ(mac, BWN_PHY_TSSI);
3166 BWN_RF_MASK(mac, 0x0076, 0xff7b);
3168 bwn_phy_g_set_txpwr_sub(mac, &old_bbatt,
3171 bwn_hwpctl_init_gphy(mac);
3174 bwn_shm_write_2(mac, BWN_SHARED, 0x0058, 0x7f7f);
3175 bwn_shm_write_2(mac, BWN_SHARED, 0x005a, 0x7f7f);
3176 bwn_shm_write_2(mac, BWN_SHARED, 0x0070, 0x7f7f);
3177 bwn_shm_write_2(mac, BWN_SHARED, 0x0072, 0x7f7f);
3181 bwn_hwpctl_early_init(struct bwn_mac *mac)
3183 struct bwn_phy *phy = &mac->mac_phy;
3185 if (!bwn_has_hwpctl(mac)) {
3186 BWN_PHY_WRITE(mac, 0x047a, 0xc111);
3190 BWN_PHY_MASK(mac, 0x0036, 0xfeff);
3191 BWN_PHY_WRITE(mac, 0x002f, 0x0202);
3192 BWN_PHY_SET(mac, 0x047c, 0x0002);
3193 BWN_PHY_SET(mac, 0x047a, 0xf000);
3195 BWN_PHY_SETMASK(mac, 0x047a, 0xff0f, 0x0010);
3196 BWN_PHY_SET(mac, 0x005d, 0x8000);
3197 BWN_PHY_SETMASK(mac, 0x004e, 0xffc0, 0x0010);
3198 BWN_PHY_WRITE(mac, 0x002e, 0xc07f);
3199 BWN_PHY_SET(mac, 0x0036, 0x0400);
3201 BWN_PHY_SET(mac, 0x0036, 0x0200);
3202 BWN_PHY_SET(mac, 0x0036, 0x0400);
3203 BWN_PHY_MASK(mac, 0x005d, 0x7fff);
3204 BWN_PHY_MASK(mac, 0x004f, 0xfffe);
3205 BWN_PHY_SETMASK(mac, 0x004e, 0xffc0, 0x0010);
3206 BWN_PHY_WRITE(mac, 0x002e, 0xc07f);
3207 BWN_PHY_SETMASK(mac, 0x047a, 0xff0f, 0x0010);
3212 bwn_hwpctl_init_gphy(struct bwn_mac *mac)
3214 struct bwn_phy *phy = &mac->mac_phy;
3221 if (!bwn_has_hwpctl(mac)) {
3222 bwn_hf_write(mac, bwn_hf_read(mac) & ~BWN_HF_HW_POWERCTL);
3226 BWN_PHY_SETMASK(mac, 0x0036, 0xffc0,
3228 BWN_PHY_SETMASK(mac, 0x0478, 0xff00,
3232 bwn_ofdmtab_write_2(mac, 0x3c20, i, pg->pg_tssi2dbm[i]);
3234 bwn_ofdmtab_write_2(mac, 0x3c00, i - 32, pg->pg_tssi2dbm[i]);
3238 BWN_PHY_WRITE(mac, 0x380 + (i / 2), value);
3252 BWN_PHY_WRITE(mac, 0x3c0 + nr_written, tmp);
3257 BWN_PHY_MASK(mac, 0x0060, 0xffbf);
3258 BWN_PHY_WRITE(mac, 0x0014, 0x0000);
3261 BWN_PHY_SET(mac, 0x0478, 0x0800);
3262 BWN_PHY_MASK(mac, 0x0478, 0xfeff);
3263 BWN_PHY_MASK(mac, 0x0801, 0xffbf);
3265 bwn_phy_g_dc_lookup_init(mac, 1);
3266 bwn_hf_write(mac, bwn_hf_read(mac) | BWN_HF_HW_POWERCTL);
3270 bwn_phy_g_switch_chan(struct bwn_mac *mac, int channel, uint8_t spu)
3272 struct bwn_softc *sc = mac->mac_sc;
3276 bwn_spu_workaround(mac, channel);
3278 BWN_WRITE_2(mac, BWN_CHANNEL, bwn_phy_g_chan2freq(channel));
3292 bwn_hf_write(mac,
3293 bwn_hf_read(mac) & ~BWN_HF_JAPAN_CHAN14_OFF);
3295 bwn_hf_write(mac,
3296 bwn_hf_read(mac) | BWN_HF_JAPAN_CHAN14_OFF);
3297 BWN_WRITE_2(mac, BWN_CHANNEL_EXT,
3298 BWN_READ_2(mac, BWN_CHANNEL_EXT) | (1 << 11));
3302 BWN_WRITE_2(mac, BWN_CHANNEL_EXT,
3303 BWN_READ_2(mac, BWN_CHANNEL_EXT) & 0xf7bf);
3318 bwn_phy_g_set_txpwr_sub(struct bwn_mac *mac, const struct bwn_bbatt *bbatt,
3321 struct bwn_phy *phy = &mac->mac_phy;
3338 bwn_phy_g_set_bbatt(mac, bb);
3339 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_RADIO_ATT, rf);
3341 BWN_RF_WRITE(mac, 0x43, (rf & 0x000f) | (txctl & 0x0070));
3343 BWN_RF_SETMASK(mac, 0x43, 0xfff0, (rf & 0x000f));
3344 BWN_RF_SETMASK(mac, 0x52, ~0x0070, (txctl & 0x0070));
3347 BWN_RF_WRITE(mac, 0x52, tx_magn | tx_bias);
3349 BWN_RF_SETMASK(mac, 0x52, 0xfff0, (tx_bias & 0x000f));
3350 bwn_lo_g_adjust(mac);
3354 bwn_phy_g_set_bbatt(struct bwn_mac *mac,
3357 struct bwn_phy *phy = &mac->mac_phy;
3360 BWN_WRITE_2(mac, BWN_PHY0,
3361 (BWN_READ_2(mac, BWN_PHY0) & 0xfff0) | bbatt);
3365 BWN_PHY_SETMASK(mac, BWN_PHY_DACCTL, 0xffc3, bbatt << 2);
3368 BWN_PHY_SETMASK(mac, BWN_PHY_DACCTL, 0xff87, bbatt << 3);
3372 bwn_rf_2050_rfoverval(struct bwn_mac *mac, uint16_t reg, uint32_t lpd)
3374 struct bwn_phy *phy = &mac->mac_phy;
3376 struct bwn_softc *sc = mac->mac_sc;
3493 bwn_spu_workaround(struct bwn_mac *mac, uint8_t channel)
3496 if (mac->mac_phy.rf_ver != 0x2050 || mac->mac_phy.rf_rev >= 6)
3498 BWN_WRITE_2(mac, BWN_CHANNEL, (channel <= 10) ?
3501 BWN_WRITE_2(mac, BWN_CHANNEL, bwn_phy_g_chan2freq(channel));
3505 bwn_phy_shm_tssi_read(struct bwn_mac *mac, uint16_t shm_offset)
3512 tmp = bwn_shm_read_4(mac, BWN_SHARED, shm_offset);
3520 bwn_shm_write_4(mac, BWN_SHARED, shm_offset,
3533 if (bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_HFLO)
3541 bwn_phy_g_setatt(struct bwn_mac *mac, int *bbattp, int *rfattp)
3543 struct bwn_txpwr_loctl *lo = &mac->mac_phy.phy_g.pg_loctl;
3584 bwn_phy_lock(struct bwn_mac *mac)
3586 struct bwn_softc *sc = mac->mac_sc;
3593 bwn_psctl(mac, BWN_PS_AWAKE);
3597 bwn_phy_unlock(struct bwn_mac *mac)
3599 struct bwn_softc *sc = mac->mac_sc;
3606 bwn_psctl(mac, 0);
3610 bwn_rf_lock(struct bwn_mac *mac)
3613 BWN_WRITE_4(mac, BWN_MACCTL,
3614 BWN_READ_4(mac, BWN_MACCTL) | BWN_MACCTL_RADIO_LOCK);
3615 BWN_READ_4(mac, BWN_MACCTL);
3620 bwn_rf_unlock(struct bwn_mac *mac)
3623 BWN_READ_2(mac, BWN_PHYVER);
3624 BWN_WRITE_4(mac, BWN_MACCTL,
3625 BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_RADIO_LOCK);