843
852
if (rx_stats->rs_status != 0) {
844
if (rx_stats->rs_status & ATH9K_RXERR_CRC)
855
if (rx_stats->rs_status & ATH9K_RXERR_CRC) {
845
856
rxs->flag |= RX_FLAG_FAILED_FCS_CRC;
846
859
if (rx_stats->rs_status & ATH9K_RXERR_PHY)
849
if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) {
862
if ((rx_stats->rs_status & ATH9K_RXERR_DECRYPT) ||
863
(!is_mc && (rx_stats->rs_status & ATH9K_RXERR_KEYMISS))) {
850
864
*decrypt_error = true;
851
} else if (rx_stats->rs_status & ATH9K_RXERR_MIC) {
854
* The MIC error bit is only valid if the frame
855
* is not a control frame or fragment, and it was
856
* decrypted using a valid TKIP key.
858
is_mc = !!is_multicast_ether_addr(hdr->addr1);
860
if (!ieee80211_is_ctl(fc) &&
861
!ieee80211_has_morefrags(fc) &&
862
!(le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG) &&
863
is_mc_or_valid_tkip_keyix)
864
rxs->flag |= RX_FLAG_MMIC_ERROR;
866
rx_stats->rs_status &= ~ATH9K_RXERR_MIC;
869
869
* Reject error frames with the exception of
870
870
* decryption and MIC failures. For monitor mode,
871
871
* we also ignore the CRC error.
873
if (ah->is_monitoring) {
874
if (rx_stats->rs_status &
875
~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC |
879
if (rx_stats->rs_status &
880
~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC)) {
873
status_mask = ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC |
876
if (ah->is_monitoring && (sc->rx.rxfilter & FIF_FCSFAIL))
877
status_mask |= ATH9K_RXERR_CRC;
879
if (rx_stats->rs_status & ~status_mask)
884
* For unicast frames the MIC error bit can have false positives,
885
* so all MIC error reports need to be validated in software.
886
* False negatives are not common, so skip software verification
887
* if the hardware considers the MIC valid.
890
rxs->flag |= RX_FLAG_MMIC_STRIPPED;
891
else if (is_mc && mic_error)
892
rxs->flag |= RX_FLAG_MMIC_ERROR;
1072
1072
antcomb->rssi_lna1 = main_rssi_avg;
1074
1074
switch ((ant_conf.main_lna_conf << 4) | ant_conf.alt_lna_conf) {
1075
case (0x10): /* LNA2 A-B */
1075
case 0x10: /* LNA2 A-B */
1076
1076
antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2;
1077
1077
antcomb->first_quick_scan_conf =
1078
1078
ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2;
1079
1079
antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA1;
1081
case (0x20): /* LNA1 A-B */
1081
case 0x20: /* LNA1 A-B */
1082
1082
antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2;
1083
1083
antcomb->first_quick_scan_conf =
1084
1084
ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2;
1085
1085
antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA2;
1087
case (0x21): /* LNA1 LNA2 */
1087
case 0x21: /* LNA1 LNA2 */
1088
1088
antcomb->main_conf = ATH_ANT_DIV_COMB_LNA2;
1089
1089
antcomb->first_quick_scan_conf =
1090
1090
ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2;
1091
1091
antcomb->second_quick_scan_conf =
1092
1092
ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2;
1094
case (0x12): /* LNA2 LNA1 */
1094
case 0x12: /* LNA2 LNA1 */
1095
1095
antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1;
1096
1096
antcomb->first_quick_scan_conf =
1097
1097
ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2;
1098
1098
antcomb->second_quick_scan_conf =
1099
1099
ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2;
1101
case (0x13): /* LNA2 A+B */
1101
case 0x13: /* LNA2 A+B */
1102
1102
antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2;
1103
1103
antcomb->first_quick_scan_conf =
1104
1104
ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2;
1105
1105
antcomb->second_quick_scan_conf = ATH_ANT_DIV_COMB_LNA1;
1107
case (0x23): /* LNA1 A+B */
1107
case 0x23: /* LNA1 A+B */
1108
1108
antcomb->main_conf = ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2;
1109
1109
antcomb->first_quick_scan_conf =
1110
1110
ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2;
1321
1321
/* Adjust the fast_div_bias based on main and alt lna conf */
1322
1322
switch ((ant_conf->main_lna_conf << 4) |
1323
1323
ant_conf->alt_lna_conf) {
1324
case (0x01): /* A-B LNA2 */
1324
case 0x01: /* A-B LNA2 */
1325
1325
ant_conf->fast_div_bias = 0x3b;
1327
case (0x02): /* A-B LNA1 */
1327
case 0x02: /* A-B LNA1 */
1328
1328
ant_conf->fast_div_bias = 0x3d;
1330
case (0x03): /* A-B A+B */
1330
case 0x03: /* A-B A+B */
1331
1331
ant_conf->fast_div_bias = 0x1;
1333
case (0x10): /* LNA2 A-B */
1333
case 0x10: /* LNA2 A-B */
1334
1334
ant_conf->fast_div_bias = 0x7;
1336
case (0x12): /* LNA2 LNA1 */
1336
case 0x12: /* LNA2 LNA1 */
1337
1337
ant_conf->fast_div_bias = 0x2;
1339
case (0x13): /* LNA2 A+B */
1339
case 0x13: /* LNA2 A+B */
1340
1340
ant_conf->fast_div_bias = 0x7;
1342
case (0x20): /* LNA1 A-B */
1342
case 0x20: /* LNA1 A-B */
1343
1343
ant_conf->fast_div_bias = 0x6;
1345
case (0x21): /* LNA1 LNA2 */
1345
case 0x21: /* LNA1 LNA2 */
1346
1346
ant_conf->fast_div_bias = 0x0;
1348
case (0x23): /* LNA1 A+B */
1348
case 0x23: /* LNA1 A+B */
1349
1349
ant_conf->fast_div_bias = 0x6;
1351
case (0x30): /* A+B A-B */
1351
case 0x30: /* A+B A-B */
1352
1352
ant_conf->fast_div_bias = 0x1;
1354
case (0x31): /* A+B LNA2 */
1354
case 0x31: /* A+B LNA2 */
1355
1355
ant_conf->fast_div_bias = 0x3b;
1357
case (0x32): /* A+B LNA1 */
1357
case 0x32: /* A+B LNA1 */
1358
1358
ant_conf->fast_div_bias = 0x3d;
1363
} else if (ant_conf->div_group == 1) {
1364
/* Adjust the fast_div_bias based on main and alt_lna_conf */
1365
switch ((ant_conf->main_lna_conf << 4) |
1366
ant_conf->alt_lna_conf) {
1367
case 0x01: /* A-B LNA2 */
1368
ant_conf->fast_div_bias = 0x1;
1369
ant_conf->main_gaintb = 0;
1370
ant_conf->alt_gaintb = 0;
1372
case 0x02: /* A-B LNA1 */
1373
ant_conf->fast_div_bias = 0x1;
1374
ant_conf->main_gaintb = 0;
1375
ant_conf->alt_gaintb = 0;
1377
case 0x03: /* A-B A+B */
1378
ant_conf->fast_div_bias = 0x1;
1379
ant_conf->main_gaintb = 0;
1380
ant_conf->alt_gaintb = 0;
1382
case 0x10: /* LNA2 A-B */
1383
if (!(antcomb->scan) &&
1384
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1385
ant_conf->fast_div_bias = 0x3f;
1387
ant_conf->fast_div_bias = 0x1;
1388
ant_conf->main_gaintb = 0;
1389
ant_conf->alt_gaintb = 0;
1391
case 0x12: /* LNA2 LNA1 */
1392
ant_conf->fast_div_bias = 0x1;
1393
ant_conf->main_gaintb = 0;
1394
ant_conf->alt_gaintb = 0;
1396
case 0x13: /* LNA2 A+B */
1397
if (!(antcomb->scan) &&
1398
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1399
ant_conf->fast_div_bias = 0x3f;
1401
ant_conf->fast_div_bias = 0x1;
1402
ant_conf->main_gaintb = 0;
1403
ant_conf->alt_gaintb = 0;
1405
case 0x20: /* LNA1 A-B */
1406
if (!(antcomb->scan) &&
1407
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1408
ant_conf->fast_div_bias = 0x3f;
1410
ant_conf->fast_div_bias = 0x1;
1411
ant_conf->main_gaintb = 0;
1412
ant_conf->alt_gaintb = 0;
1414
case 0x21: /* LNA1 LNA2 */
1415
ant_conf->fast_div_bias = 0x1;
1416
ant_conf->main_gaintb = 0;
1417
ant_conf->alt_gaintb = 0;
1419
case 0x23: /* LNA1 A+B */
1420
if (!(antcomb->scan) &&
1421
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1422
ant_conf->fast_div_bias = 0x3f;
1424
ant_conf->fast_div_bias = 0x1;
1425
ant_conf->main_gaintb = 0;
1426
ant_conf->alt_gaintb = 0;
1428
case 0x30: /* A+B A-B */
1429
ant_conf->fast_div_bias = 0x1;
1430
ant_conf->main_gaintb = 0;
1431
ant_conf->alt_gaintb = 0;
1433
case 0x31: /* A+B LNA2 */
1434
ant_conf->fast_div_bias = 0x1;
1435
ant_conf->main_gaintb = 0;
1436
ant_conf->alt_gaintb = 0;
1438
case 0x32: /* A+B LNA1 */
1439
ant_conf->fast_div_bias = 0x1;
1440
ant_conf->main_gaintb = 0;
1441
ant_conf->alt_gaintb = 0;
1363
1446
} else if (ant_conf->div_group == 2) {
1364
1447
/* Adjust the fast_div_bias based on main and alt_lna_conf */
1365
1448
switch ((ant_conf->main_lna_conf << 4) |
1366
1449
ant_conf->alt_lna_conf) {
1367
case (0x01): /* A-B LNA2 */
1368
ant_conf->fast_div_bias = 0x1;
1369
ant_conf->main_gaintb = 0;
1370
ant_conf->alt_gaintb = 0;
1372
case (0x02): /* A-B LNA1 */
1373
ant_conf->fast_div_bias = 0x1;
1374
ant_conf->main_gaintb = 0;
1375
ant_conf->alt_gaintb = 0;
1377
case (0x03): /* A-B A+B */
1378
ant_conf->fast_div_bias = 0x1;
1379
ant_conf->main_gaintb = 0;
1380
ant_conf->alt_gaintb = 0;
1382
case (0x10): /* LNA2 A-B */
1383
if (!(antcomb->scan) &&
1384
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1385
ant_conf->fast_div_bias = 0x1;
1387
ant_conf->fast_div_bias = 0x2;
1388
ant_conf->main_gaintb = 0;
1389
ant_conf->alt_gaintb = 0;
1391
case (0x12): /* LNA2 LNA1 */
1392
ant_conf->fast_div_bias = 0x1;
1393
ant_conf->main_gaintb = 0;
1394
ant_conf->alt_gaintb = 0;
1396
case (0x13): /* LNA2 A+B */
1397
if (!(antcomb->scan) &&
1398
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1399
ant_conf->fast_div_bias = 0x1;
1401
ant_conf->fast_div_bias = 0x2;
1402
ant_conf->main_gaintb = 0;
1403
ant_conf->alt_gaintb = 0;
1405
case (0x20): /* LNA1 A-B */
1406
if (!(antcomb->scan) &&
1407
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1408
ant_conf->fast_div_bias = 0x1;
1410
ant_conf->fast_div_bias = 0x2;
1411
ant_conf->main_gaintb = 0;
1412
ant_conf->alt_gaintb = 0;
1414
case (0x21): /* LNA1 LNA2 */
1415
ant_conf->fast_div_bias = 0x1;
1416
ant_conf->main_gaintb = 0;
1417
ant_conf->alt_gaintb = 0;
1419
case (0x23): /* LNA1 A+B */
1420
if (!(antcomb->scan) &&
1421
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1422
ant_conf->fast_div_bias = 0x1;
1424
ant_conf->fast_div_bias = 0x2;
1425
ant_conf->main_gaintb = 0;
1426
ant_conf->alt_gaintb = 0;
1428
case (0x30): /* A+B A-B */
1429
ant_conf->fast_div_bias = 0x1;
1430
ant_conf->main_gaintb = 0;
1431
ant_conf->alt_gaintb = 0;
1433
case (0x31): /* A+B LNA2 */
1434
ant_conf->fast_div_bias = 0x1;
1435
ant_conf->main_gaintb = 0;
1436
ant_conf->alt_gaintb = 0;
1438
case (0x32): /* A+B LNA1 */
1450
case 0x01: /* A-B LNA2 */
1451
ant_conf->fast_div_bias = 0x1;
1452
ant_conf->main_gaintb = 0;
1453
ant_conf->alt_gaintb = 0;
1455
case 0x02: /* A-B LNA1 */
1456
ant_conf->fast_div_bias = 0x1;
1457
ant_conf->main_gaintb = 0;
1458
ant_conf->alt_gaintb = 0;
1460
case 0x03: /* A-B A+B */
1461
ant_conf->fast_div_bias = 0x1;
1462
ant_conf->main_gaintb = 0;
1463
ant_conf->alt_gaintb = 0;
1465
case 0x10: /* LNA2 A-B */
1466
if (!(antcomb->scan) &&
1467
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1468
ant_conf->fast_div_bias = 0x1;
1470
ant_conf->fast_div_bias = 0x2;
1471
ant_conf->main_gaintb = 0;
1472
ant_conf->alt_gaintb = 0;
1474
case 0x12: /* LNA2 LNA1 */
1475
ant_conf->fast_div_bias = 0x1;
1476
ant_conf->main_gaintb = 0;
1477
ant_conf->alt_gaintb = 0;
1479
case 0x13: /* LNA2 A+B */
1480
if (!(antcomb->scan) &&
1481
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1482
ant_conf->fast_div_bias = 0x1;
1484
ant_conf->fast_div_bias = 0x2;
1485
ant_conf->main_gaintb = 0;
1486
ant_conf->alt_gaintb = 0;
1488
case 0x20: /* LNA1 A-B */
1489
if (!(antcomb->scan) &&
1490
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1491
ant_conf->fast_div_bias = 0x1;
1493
ant_conf->fast_div_bias = 0x2;
1494
ant_conf->main_gaintb = 0;
1495
ant_conf->alt_gaintb = 0;
1497
case 0x21: /* LNA1 LNA2 */
1498
ant_conf->fast_div_bias = 0x1;
1499
ant_conf->main_gaintb = 0;
1500
ant_conf->alt_gaintb = 0;
1502
case 0x23: /* LNA1 A+B */
1503
if (!(antcomb->scan) &&
1504
(alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO))
1505
ant_conf->fast_div_bias = 0x1;
1507
ant_conf->fast_div_bias = 0x2;
1508
ant_conf->main_gaintb = 0;
1509
ant_conf->alt_gaintb = 0;
1511
case 0x30: /* A+B A-B */
1512
ant_conf->fast_div_bias = 0x1;
1513
ant_conf->main_gaintb = 0;
1514
ant_conf->alt_gaintb = 0;
1516
case 0x31: /* A+B LNA2 */
1517
ant_conf->fast_div_bias = 0x1;
1518
ant_conf->main_gaintb = 0;
1519
ant_conf->alt_gaintb = 0;
1521
case 0x32: /* A+B LNA1 */
1439
1522
ant_conf->fast_div_bias = 0x1;
1440
1523
ant_conf->main_gaintb = 0;
1441
1524
ant_conf->alt_gaintb = 0;