28
28
(alt_rssi_avg > main_rssi_avg + mindelta)) && (pkt_count > 50);
31
static inline bool ath_ant_div_comb_alt_check(u8 div_group, int alt_ratio,
32
int curr_main_set, int curr_alt_set,
33
int alt_rssi_avg, int main_rssi_avg)
38
if (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)
42
if ((((curr_main_set == ATH_ANT_DIV_COMB_LNA2) &&
43
(curr_alt_set == ATH_ANT_DIV_COMB_LNA1) &&
44
(alt_rssi_avg >= (main_rssi_avg - 5))) ||
45
((curr_main_set == ATH_ANT_DIV_COMB_LNA1) &&
46
(curr_alt_set == ATH_ANT_DIV_COMB_LNA2) &&
47
(alt_rssi_avg >= (main_rssi_avg - 2)))) &&
31
58
static inline bool ath9k_check_auto_sleep(struct ath_softc *sc)
33
60
return sc->ps_enabled &&
34
61
(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP);
37
static struct ieee80211_hw * ath_get_virt_hw(struct ath_softc *sc,
38
struct ieee80211_hdr *hdr)
40
struct ieee80211_hw *hw = sc->pri_wiphy->hw;
43
spin_lock_bh(&sc->wiphy_lock);
44
for (i = 0; i < sc->num_sec_wiphy; i++) {
45
struct ath_wiphy *aphy = sc->sec_wiphy[i];
48
if (compare_ether_addr(hdr->addr1, aphy->hw->wiphy->perm_addr)
54
spin_unlock_bh(&sc->wiphy_lock);
59
65
* Setup and link descriptors.
972
939
struct ieee80211_hdr *hdr,
973
940
struct ath_rx_status *rx_stats)
975
struct ath_wiphy *aphy = hw->priv;
942
struct ath_softc *sc = hw->priv;
976
943
struct ath_hw *ah = common->ah;
980
if (ah->opmode != NL80211_IFTYPE_STATION)
947
if ((ah->opmode != NL80211_IFTYPE_STATION) &&
948
(ah->opmode != NL80211_IFTYPE_ADHOC))
983
951
fc = hdr->frame_control;
984
952
if (!ieee80211_is_beacon(fc) ||
985
compare_ether_addr(hdr->addr3, common->curbssid))
953
compare_ether_addr(hdr->addr3, common->curbssid)) {
954
/* TODO: This doesn't work well if you have stations
955
* associated to two different APs because curbssid
956
* is just the last AP that any of the stations associated
988
962
if (rx_stats->rs_rssi != ATH9K_RSSI_BAD && !rx_stats->rs_moreaggr)
989
ATH_RSSI_LPF(aphy->last_rssi, rx_stats->rs_rssi);
963
ATH_RSSI_LPF(sc->last_rssi, rx_stats->rs_rssi);
991
last_rssi = aphy->last_rssi;
965
last_rssi = sc->last_rssi;
992
966
if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
993
967
rx_stats->rs_rssi = ATH_EP_RND(last_rssi,
994
968
ATH_RSSI_EP_MULTIPLIER);
1342
static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf)
1320
static void ath_ant_div_conf_fast_divbias(struct ath_hw_antcomb_conf *ant_conf,
1321
struct ath_ant_comb *antcomb, int alt_ratio)
1344
/* Adjust the fast_div_bias based on main and alt lna conf */
1345
switch ((ant_conf->main_lna_conf << 4) | ant_conf->alt_lna_conf) {
1346
case (0x01): /* A-B LNA2 */
1347
ant_conf->fast_div_bias = 0x3b;
1349
case (0x02): /* A-B LNA1 */
1350
ant_conf->fast_div_bias = 0x3d;
1352
case (0x03): /* A-B A+B */
1353
ant_conf->fast_div_bias = 0x1;
1355
case (0x10): /* LNA2 A-B */
1356
ant_conf->fast_div_bias = 0x7;
1358
case (0x12): /* LNA2 LNA1 */
1359
ant_conf->fast_div_bias = 0x2;
1361
case (0x13): /* LNA2 A+B */
1362
ant_conf->fast_div_bias = 0x7;
1364
case (0x20): /* LNA1 A-B */
1365
ant_conf->fast_div_bias = 0x6;
1367
case (0x21): /* LNA1 LNA2 */
1368
ant_conf->fast_div_bias = 0x0;
1370
case (0x23): /* LNA1 A+B */
1371
ant_conf->fast_div_bias = 0x6;
1373
case (0x30): /* A+B A-B */
1374
ant_conf->fast_div_bias = 0x1;
1376
case (0x31): /* A+B LNA2 */
1377
ant_conf->fast_div_bias = 0x3b;
1379
case (0x32): /* A+B LNA1 */
1380
ant_conf->fast_div_bias = 0x3d;
1323
if (ant_conf->div_group == 0) {
1324
/* Adjust the fast_div_bias based on main and alt lna conf */
1325
switch ((ant_conf->main_lna_conf << 4) |
1326
ant_conf->alt_lna_conf) {
1327
case (0x01): /* A-B LNA2 */
1328
ant_conf->fast_div_bias = 0x3b;
1330
case (0x02): /* A-B LNA1 */
1331
ant_conf->fast_div_bias = 0x3d;
1333
case (0x03): /* A-B A+B */
1334
ant_conf->fast_div_bias = 0x1;
1336
case (0x10): /* LNA2 A-B */
1337
ant_conf->fast_div_bias = 0x7;
1339
case (0x12): /* LNA2 LNA1 */
1340
ant_conf->fast_div_bias = 0x2;
1342
case (0x13): /* LNA2 A+B */
1343
ant_conf->fast_div_bias = 0x7;
1345
case (0x20): /* LNA1 A-B */
1346
ant_conf->fast_div_bias = 0x6;
1348
case (0x21): /* LNA1 LNA2 */
1349
ant_conf->fast_div_bias = 0x0;
1351
case (0x23): /* LNA1 A+B */
1352
ant_conf->fast_div_bias = 0x6;
1354
case (0x30): /* A+B A-B */
1355
ant_conf->fast_div_bias = 0x1;
1357
case (0x31): /* A+B LNA2 */
1358
ant_conf->fast_div_bias = 0x3b;
1360
case (0x32): /* A+B LNA1 */
1361
ant_conf->fast_div_bias = 0x3d;
1366
} else if (ant_conf->div_group == 2) {
1367
/* Adjust the fast_div_bias based on main and alt_lna_conf */
1368
switch ((ant_conf->main_lna_conf << 4) |
1369
ant_conf->alt_lna_conf) {
1370
case (0x01): /* A-B LNA2 */
1371
ant_conf->fast_div_bias = 0x1;
1372
ant_conf->main_gaintb = 0;
1373
ant_conf->alt_gaintb = 0;
1375
case (0x02): /* A-B LNA1 */
1376
ant_conf->fast_div_bias = 0x1;
1377
ant_conf->main_gaintb = 0;
1378
ant_conf->alt_gaintb = 0;
1380
case (0x03): /* A-B A+B */
1381
ant_conf->fast_div_bias = 0x1;
1382
ant_conf->main_gaintb = 0;
1383
ant_conf->alt_gaintb = 0;
1385
case (0x10): /* LNA2 A-B */
1386
if (!(antcomb->scan) &&
1387
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1388
ant_conf->fast_div_bias = 0x1;
1390
ant_conf->fast_div_bias = 0x2;
1391
ant_conf->main_gaintb = 0;
1392
ant_conf->alt_gaintb = 0;
1394
case (0x12): /* LNA2 LNA1 */
1395
ant_conf->fast_div_bias = 0x1;
1396
ant_conf->main_gaintb = 0;
1397
ant_conf->alt_gaintb = 0;
1399
case (0x13): /* LNA2 A+B */
1400
if (!(antcomb->scan) &&
1401
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1402
ant_conf->fast_div_bias = 0x1;
1404
ant_conf->fast_div_bias = 0x2;
1405
ant_conf->main_gaintb = 0;
1406
ant_conf->alt_gaintb = 0;
1408
case (0x20): /* LNA1 A-B */
1409
if (!(antcomb->scan) &&
1410
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1411
ant_conf->fast_div_bias = 0x1;
1413
ant_conf->fast_div_bias = 0x2;
1414
ant_conf->main_gaintb = 0;
1415
ant_conf->alt_gaintb = 0;
1417
case (0x21): /* LNA1 LNA2 */
1418
ant_conf->fast_div_bias = 0x1;
1419
ant_conf->main_gaintb = 0;
1420
ant_conf->alt_gaintb = 0;
1422
case (0x23): /* LNA1 A+B */
1423
if (!(antcomb->scan) &&
1424
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1425
ant_conf->fast_div_bias = 0x1;
1427
ant_conf->fast_div_bias = 0x2;
1428
ant_conf->main_gaintb = 0;
1429
ant_conf->alt_gaintb = 0;
1431
case (0x30): /* A+B A-B */
1432
ant_conf->fast_div_bias = 0x1;
1433
ant_conf->main_gaintb = 0;
1434
ant_conf->alt_gaintb = 0;
1436
case (0x31): /* A+B LNA2 */
1437
ant_conf->fast_div_bias = 0x1;
1438
ant_conf->main_gaintb = 0;
1439
ant_conf->alt_gaintb = 0;
1441
case (0x32): /* A+B LNA1 */
1442
ant_conf->fast_div_bias = 0x1;
1443
ant_conf->main_gaintb = 0;
1444
ant_conf->alt_gaintb = 0;
1387
1454
/* Antenna diversity and combining */