hc
2024-05-10 23fa18eaa71266feff7ba8d83022d9e1cc83c65a
kernel/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 Copyright (C) 2010 Willow Garage <http://www.willowgarage.com>
34 Copyright (C) 2010 Ivo van Doorn <IvDoorn@gmail.com>
....@@ -13,18 +14,6 @@
1314 Copyright (C) 2009 Xose Vazquez Perez <xose.vazquez@gmail.com>
1415 <http://rt2x00.serialmonkey.com>
1516
16
- This program is free software; you can redistribute it and/or modify
17
- it under the terms of the GNU General Public License as published by
18
- the Free Software Foundation; either version 2 of the License, or
19
- (at your option) any later version.
20
-
21
- This program is distributed in the hope that it will be useful,
22
- but WITHOUT ANY WARRANTY; without even the implied warranty of
23
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24
- GNU General Public License for more details.
25
-
26
- You should have received a copy of the GNU General Public License
27
- along with this program; if not, see <http://www.gnu.org/licenses/>.
2817 */
2918
3019 /*
....@@ -40,6 +29,10 @@
4029 #include "rt2x00.h"
4130 #include "rt2800lib.h"
4231 #include "rt2800.h"
32
+
33
+static bool modparam_watchdog;
34
+module_param_named(watchdog, modparam_watchdog, bool, S_IRUGO);
35
+MODULE_PARM_DESC(watchdog, "Enable watchdog to detect tx/rx hangs and reset hardware if detected");
4336
4437 /*
4538 * Register access.
....@@ -381,7 +374,8 @@
381374 wiphy_name(rt2x00dev->hw->wiphy), word))
382375 return 0;
383376
384
- if (rt2x00_rt(rt2x00dev, RT3593))
377
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
378
+ rt2x00_rt(rt2x00dev, RT3883))
385379 map = rt2800_eeprom_map_ext;
386380 else
387381 map = rt2800_eeprom_map;
....@@ -590,6 +584,7 @@
590584 {
591585 switch (rt2x00dev->chip.rt) {
592586 case RT3593:
587
+ case RT3883:
593588 *txwi_size = TXWI_DESC_SIZE_4WORDS;
594589 *rxwi_size = RXWI_DESC_SIZE_5WORDS;
595590 break;
....@@ -933,7 +928,7 @@
933928 switch (rt2x00_get_field32(status, TX_STA_FIFO_PHYMODE)) {
934929 case RATE_MODE_HT_GREENFIELD:
935930 flags |= IEEE80211_TX_RC_GREEN_FIELD;
936
- /* fall through */
931
+ fallthrough;
937932 case RATE_MODE_HT_MIX:
938933 flags |= IEEE80211_TX_RC_MCS;
939934 break;
....@@ -955,6 +950,47 @@
955950
956951 skbdesc->tx_rate_idx = idx;
957952 skbdesc->tx_rate_flags = flags;
953
+}
954
+
955
+static bool rt2800_txdone_entry_check(struct queue_entry *entry, u32 reg)
956
+{
957
+ __le32 *txwi;
958
+ u32 word;
959
+ int wcid, ack, pid;
960
+ int tx_wcid, tx_ack, tx_pid, is_agg;
961
+
962
+ /*
963
+ * This frames has returned with an IO error,
964
+ * so the status report is not intended for this
965
+ * frame.
966
+ */
967
+ if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags))
968
+ return false;
969
+
970
+ wcid = rt2x00_get_field32(reg, TX_STA_FIFO_WCID);
971
+ ack = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED);
972
+ pid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE);
973
+ is_agg = rt2x00_get_field32(reg, TX_STA_FIFO_TX_AGGRE);
974
+
975
+ /*
976
+ * Validate if this TX status report is intended for
977
+ * this entry by comparing the WCID/ACK/PID fields.
978
+ */
979
+ txwi = rt2800_drv_get_txwi(entry);
980
+
981
+ word = rt2x00_desc_read(txwi, 1);
982
+ tx_wcid = rt2x00_get_field32(word, TXWI_W1_WIRELESS_CLI_ID);
983
+ tx_ack = rt2x00_get_field32(word, TXWI_W1_ACK);
984
+ tx_pid = rt2x00_get_field32(word, TXWI_W1_PACKETID);
985
+
986
+ if (wcid != tx_wcid || ack != tx_ack || (!is_agg && pid != tx_pid)) {
987
+ rt2x00_dbg(entry->queue->rt2x00dev,
988
+ "TX status report missed for queue %d entry %d\n",
989
+ entry->queue->qid, entry->entry_idx);
990
+ return false;
991
+ }
992
+
993
+ return true;
958994 }
959995
960996 void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi,
....@@ -1058,6 +1094,184 @@
10581094 }
10591095 }
10601096 EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
1097
+
1098
+void rt2800_txdone(struct rt2x00_dev *rt2x00dev, unsigned int quota)
1099
+{
1100
+ struct data_queue *queue;
1101
+ struct queue_entry *entry;
1102
+ u32 reg;
1103
+ u8 qid;
1104
+ bool match;
1105
+
1106
+ while (quota-- > 0 && kfifo_get(&rt2x00dev->txstatus_fifo, &reg)) {
1107
+ /*
1108
+ * TX_STA_FIFO_PID_QUEUE is a 2-bit field, thus qid is
1109
+ * guaranteed to be one of the TX QIDs .
1110
+ */
1111
+ qid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_QUEUE);
1112
+ queue = rt2x00queue_get_tx_queue(rt2x00dev, qid);
1113
+
1114
+ if (unlikely(rt2x00queue_empty(queue))) {
1115
+ rt2x00_dbg(rt2x00dev, "Got TX status for an empty queue %u, dropping\n",
1116
+ qid);
1117
+ break;
1118
+ }
1119
+
1120
+ entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
1121
+
1122
+ if (unlikely(test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) ||
1123
+ !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))) {
1124
+ rt2x00_warn(rt2x00dev, "Data pending for entry %u in queue %u\n",
1125
+ entry->entry_idx, qid);
1126
+ break;
1127
+ }
1128
+
1129
+ match = rt2800_txdone_entry_check(entry, reg);
1130
+ rt2800_txdone_entry(entry, reg, rt2800_drv_get_txwi(entry), match);
1131
+ }
1132
+}
1133
+EXPORT_SYMBOL_GPL(rt2800_txdone);
1134
+
1135
+static inline bool rt2800_entry_txstatus_timeout(struct rt2x00_dev *rt2x00dev,
1136
+ struct queue_entry *entry)
1137
+{
1138
+ bool ret;
1139
+ unsigned long tout;
1140
+
1141
+ if (!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))
1142
+ return false;
1143
+
1144
+ if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags))
1145
+ tout = msecs_to_jiffies(50);
1146
+ else
1147
+ tout = msecs_to_jiffies(2000);
1148
+
1149
+ ret = time_after(jiffies, entry->last_action + tout);
1150
+ if (unlikely(ret))
1151
+ rt2x00_dbg(entry->queue->rt2x00dev,
1152
+ "TX status timeout for entry %d in queue %d\n",
1153
+ entry->entry_idx, entry->queue->qid);
1154
+ return ret;
1155
+}
1156
+
1157
+bool rt2800_txstatus_timeout(struct rt2x00_dev *rt2x00dev)
1158
+{
1159
+ struct data_queue *queue;
1160
+ struct queue_entry *entry;
1161
+
1162
+ tx_queue_for_each(rt2x00dev, queue) {
1163
+ entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
1164
+ if (rt2800_entry_txstatus_timeout(rt2x00dev, entry))
1165
+ return true;
1166
+ }
1167
+
1168
+ return false;
1169
+}
1170
+EXPORT_SYMBOL_GPL(rt2800_txstatus_timeout);
1171
+
1172
+/*
1173
+ * test if there is an entry in any TX queue for which DMA is done
1174
+ * but the TX status has not been returned yet
1175
+ */
1176
+bool rt2800_txstatus_pending(struct rt2x00_dev *rt2x00dev)
1177
+{
1178
+ struct data_queue *queue;
1179
+
1180
+ tx_queue_for_each(rt2x00dev, queue) {
1181
+ if (rt2x00queue_get_entry(queue, Q_INDEX_DMA_DONE) !=
1182
+ rt2x00queue_get_entry(queue, Q_INDEX_DONE))
1183
+ return true;
1184
+ }
1185
+ return false;
1186
+}
1187
+EXPORT_SYMBOL_GPL(rt2800_txstatus_pending);
1188
+
1189
+void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev)
1190
+{
1191
+ struct data_queue *queue;
1192
+ struct queue_entry *entry;
1193
+
1194
+ /*
1195
+ * Process any trailing TX status reports for IO failures,
1196
+ * we loop until we find the first non-IO error entry. This
1197
+ * can either be a frame which is free, is being uploaded,
1198
+ * or has completed the upload but didn't have an entry
1199
+ * in the TX_STAT_FIFO register yet.
1200
+ */
1201
+ tx_queue_for_each(rt2x00dev, queue) {
1202
+ while (!rt2x00queue_empty(queue)) {
1203
+ entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
1204
+
1205
+ if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) ||
1206
+ !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))
1207
+ break;
1208
+
1209
+ if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags) ||
1210
+ rt2800_entry_txstatus_timeout(rt2x00dev, entry))
1211
+ rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE);
1212
+ else
1213
+ break;
1214
+ }
1215
+ }
1216
+}
1217
+EXPORT_SYMBOL_GPL(rt2800_txdone_nostatus);
1218
+
1219
+static int rt2800_check_hung(struct data_queue *queue)
1220
+{
1221
+ unsigned int cur_idx = rt2800_drv_get_dma_done(queue);
1222
+
1223
+ if (queue->wd_idx != cur_idx)
1224
+ queue->wd_count = 0;
1225
+ else
1226
+ queue->wd_count++;
1227
+
1228
+ return queue->wd_count > 16;
1229
+}
1230
+
1231
+void rt2800_watchdog(struct rt2x00_dev *rt2x00dev)
1232
+{
1233
+ struct data_queue *queue;
1234
+ bool hung_tx = false;
1235
+ bool hung_rx = false;
1236
+
1237
+ if (test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags))
1238
+ return;
1239
+
1240
+ queue_for_each(rt2x00dev, queue) {
1241
+ switch (queue->qid) {
1242
+ case QID_AC_VO:
1243
+ case QID_AC_VI:
1244
+ case QID_AC_BE:
1245
+ case QID_AC_BK:
1246
+ case QID_MGMT:
1247
+ if (rt2x00queue_empty(queue))
1248
+ continue;
1249
+ hung_tx = rt2800_check_hung(queue);
1250
+ break;
1251
+ case QID_RX:
1252
+ /* For station mode we should reactive at least
1253
+ * beacons. TODO: need to find good way detect
1254
+ * RX hung for AP mode.
1255
+ */
1256
+ if (rt2x00dev->intf_sta_count == 0)
1257
+ continue;
1258
+ hung_rx = rt2800_check_hung(queue);
1259
+ break;
1260
+ default:
1261
+ break;
1262
+ }
1263
+ }
1264
+
1265
+ if (hung_tx)
1266
+ rt2x00_warn(rt2x00dev, "Watchdog TX hung detected\n");
1267
+
1268
+ if (hung_rx)
1269
+ rt2x00_warn(rt2x00dev, "Watchdog RX hung detected\n");
1270
+
1271
+ if (hung_tx || hung_rx)
1272
+ ieee80211_restart_hw(rt2x00dev->hw);
1273
+}
1274
+EXPORT_SYMBOL_GPL(rt2800_watchdog);
10611275
10621276 static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
10631277 unsigned int index)
....@@ -1438,6 +1652,9 @@
14381652 rt2800_register_write(rt2x00dev, offset, reg);
14391653 }
14401654
1655
+ if (test_bit(DEVICE_STATE_RESET, &rt2x00dev->flags))
1656
+ return;
1657
+
14411658 offset = MAC_IVEIV_ENTRY(key->hw_key_idx);
14421659
14431660 memset(&iveiv_entry, 0, sizeof(iveiv_entry));
....@@ -1447,7 +1664,7 @@
14471664 iveiv_entry.iv[3] |= 0x20;
14481665 iveiv_entry.iv[3] |= key->keyidx << 6;
14491666 rt2800_register_multiwrite(rt2x00dev, offset,
1450
- &iveiv_entry, sizeof(iveiv_entry));
1667
+ &iveiv_entry, sizeof(iveiv_entry));
14511668 }
14521669
14531670 int rt2800_config_shared_key(struct rt2x00_dev *rt2x00dev,
....@@ -1635,6 +1852,25 @@
16351852 return 0;
16361853 }
16371854 EXPORT_SYMBOL_GPL(rt2800_sta_remove);
1855
+
1856
+void rt2800_pre_reset_hw(struct rt2x00_dev *rt2x00dev)
1857
+{
1858
+ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
1859
+ struct data_queue *queue = rt2x00dev->bcn;
1860
+ struct queue_entry *entry;
1861
+ int i, wcid;
1862
+
1863
+ for (wcid = WCID_START; wcid < WCID_END; wcid++) {
1864
+ drv_data->wcid_to_sta[wcid - WCID_START] = NULL;
1865
+ __clear_bit(wcid - WCID_START, drv_data->sta_ids);
1866
+ }
1867
+
1868
+ for (i = 0; i < queue->limit; i++) {
1869
+ entry = &queue->entries[i];
1870
+ clear_bit(ENTRY_BCN_ASSIGNED, &entry->flags);
1871
+ }
1872
+}
1873
+EXPORT_SYMBOL_GPL(rt2800_pre_reset_hw);
16381874
16391875 void rt2800_config_filter(struct rt2x00_dev *rt2x00dev,
16401876 const unsigned int filter_flags)
....@@ -2018,7 +2254,8 @@
20182254 rt2800_bbp_write(rt2x00dev, 3, r3);
20192255 rt2800_bbp_write(rt2x00dev, 1, r1);
20202256
2021
- if (rt2x00_rt(rt2x00dev, RT3593)) {
2257
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
2258
+ rt2x00_rt(rt2x00dev, RT3883)) {
20222259 if (ant->rx_chain_num == 1)
20232260 rt2800_bbp_write(rt2x00dev, 86, 0x00);
20242261 else
....@@ -2040,7 +2277,8 @@
20402277 eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_LNA);
20412278 lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0);
20422279 } else if (libconf->rf.channel <= 128) {
2043
- if (rt2x00_rt(rt2x00dev, RT3593)) {
2280
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
2281
+ rt2x00_rt(rt2x00dev, RT3883)) {
20442282 eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2);
20452283 lna_gain = rt2x00_get_field16(eeprom,
20462284 EEPROM_EXT_LNA2_A1);
....@@ -2050,7 +2288,8 @@
20502288 EEPROM_RSSI_BG2_LNA_A1);
20512289 }
20522290 } else {
2053
- if (rt2x00_rt(rt2x00dev, RT3593)) {
2291
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
2292
+ rt2x00_rt(rt2x00dev, RT3883)) {
20542293 eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2);
20552294 lna_gain = rt2x00_get_field16(eeprom,
20562295 EEPROM_EXT_LNA2_A2);
....@@ -2328,6 +2567,7 @@
23282567 switch (rt2x00dev->default_ant.tx_chain_num) {
23292568 case 1:
23302569 rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
2570
+ fallthrough;
23312571 case 2:
23322572 rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
23332573 break;
....@@ -2336,6 +2576,7 @@
23362576 switch (rt2x00dev->default_ant.rx_chain_num) {
23372577 case 1:
23382578 rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
2579
+ fallthrough;
23392580 case 2:
23402581 rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
23412582 break;
....@@ -2527,10 +2768,10 @@
25272768 switch (rt2x00dev->default_ant.tx_chain_num) {
25282769 case 3:
25292770 rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
2530
- /* fallthrough */
2771
+ fallthrough;
25312772 case 2:
25322773 rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
2533
- /* fallthrough */
2774
+ fallthrough;
25342775 case 1:
25352776 rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
25362777 break;
....@@ -2539,10 +2780,10 @@
25392780 switch (rt2x00dev->default_ant.rx_chain_num) {
25402781 case 3:
25412782 rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
2542
- /* fallthrough */
2783
+ fallthrough;
25432784 case 2:
25442785 rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
2545
- /* fallthrough */
2786
+ fallthrough;
25462787 case 1:
25472788 rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
25482789 break;
....@@ -2716,6 +2957,211 @@
27162957 }
27172958 }
27182959
2960
+static void rt2800_config_channel_rf3853(struct rt2x00_dev *rt2x00dev,
2961
+ struct ieee80211_conf *conf,
2962
+ struct rf_channel *rf,
2963
+ struct channel_info *info)
2964
+{
2965
+ u8 rfcsr;
2966
+ u8 bbp;
2967
+ u8 pwr1, pwr2, pwr3;
2968
+
2969
+ const bool txbf_enabled = false; /* TODO */
2970
+
2971
+ /* TODO: add band selection */
2972
+
2973
+ if (rf->channel <= 14)
2974
+ rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
2975
+ else if (rf->channel < 132)
2976
+ rt2800_rfcsr_write(rt2x00dev, 6, 0x80);
2977
+ else
2978
+ rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
2979
+
2980
+ rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
2981
+ rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3);
2982
+
2983
+ if (rf->channel <= 14)
2984
+ rt2800_rfcsr_write(rt2x00dev, 11, 0x46);
2985
+ else
2986
+ rt2800_rfcsr_write(rt2x00dev, 11, 0x48);
2987
+
2988
+ if (rf->channel <= 14)
2989
+ rt2800_rfcsr_write(rt2x00dev, 12, 0x1a);
2990
+ else
2991
+ rt2800_rfcsr_write(rt2x00dev, 12, 0x52);
2992
+
2993
+ rt2800_rfcsr_write(rt2x00dev, 13, 0x12);
2994
+
2995
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
2996
+ rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
2997
+ rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
2998
+ rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
2999
+ rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
3000
+ rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
3001
+ rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
3002
+ rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
3003
+ rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1);
3004
+
3005
+ switch (rt2x00dev->default_ant.tx_chain_num) {
3006
+ case 3:
3007
+ rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
3008
+ fallthrough;
3009
+ case 2:
3010
+ rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
3011
+ fallthrough;
3012
+ case 1:
3013
+ rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
3014
+ break;
3015
+ }
3016
+
3017
+ switch (rt2x00dev->default_ant.rx_chain_num) {
3018
+ case 3:
3019
+ rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
3020
+ fallthrough;
3021
+ case 2:
3022
+ rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
3023
+ fallthrough;
3024
+ case 1:
3025
+ rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
3026
+ break;
3027
+ }
3028
+ rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
3029
+
3030
+ rt2800_freq_cal_mode1(rt2x00dev);
3031
+
3032
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 30);
3033
+ if (!conf_is_ht40(conf))
3034
+ rfcsr &= ~(0x06);
3035
+ else
3036
+ rfcsr |= 0x06;
3037
+ rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
3038
+
3039
+ if (rf->channel <= 14)
3040
+ rt2800_rfcsr_write(rt2x00dev, 31, 0xa0);
3041
+ else
3042
+ rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
3043
+
3044
+ if (conf_is_ht40(conf))
3045
+ rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
3046
+ else
3047
+ rt2800_rfcsr_write(rt2x00dev, 32, 0xd8);
3048
+
3049
+ if (rf->channel <= 14)
3050
+ rt2800_rfcsr_write(rt2x00dev, 34, 0x3c);
3051
+ else
3052
+ rt2800_rfcsr_write(rt2x00dev, 34, 0x20);
3053
+
3054
+ /* loopback RF_BS */
3055
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 36);
3056
+ if (rf->channel <= 14)
3057
+ rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 1);
3058
+ else
3059
+ rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 0);
3060
+ rt2800_rfcsr_write(rt2x00dev, 36, rfcsr);
3061
+
3062
+ if (rf->channel <= 14)
3063
+ rfcsr = 0x23;
3064
+ else if (rf->channel < 100)
3065
+ rfcsr = 0x36;
3066
+ else if (rf->channel < 132)
3067
+ rfcsr = 0x32;
3068
+ else
3069
+ rfcsr = 0x30;
3070
+
3071
+ if (txbf_enabled)
3072
+ rfcsr |= 0x40;
3073
+
3074
+ rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
3075
+
3076
+ if (rf->channel <= 14)
3077
+ rt2800_rfcsr_write(rt2x00dev, 44, 0x93);
3078
+ else
3079
+ rt2800_rfcsr_write(rt2x00dev, 44, 0x9b);
3080
+
3081
+ if (rf->channel <= 14)
3082
+ rfcsr = 0xbb;
3083
+ else if (rf->channel < 100)
3084
+ rfcsr = 0xeb;
3085
+ else if (rf->channel < 132)
3086
+ rfcsr = 0xb3;
3087
+ else
3088
+ rfcsr = 0x9b;
3089
+ rt2800_rfcsr_write(rt2x00dev, 45, rfcsr);
3090
+
3091
+ if (rf->channel <= 14)
3092
+ rfcsr = 0x8e;
3093
+ else
3094
+ rfcsr = 0x8a;
3095
+
3096
+ if (txbf_enabled)
3097
+ rfcsr |= 0x20;
3098
+
3099
+ rt2800_rfcsr_write(rt2x00dev, 49, rfcsr);
3100
+
3101
+ rt2800_rfcsr_write(rt2x00dev, 50, 0x86);
3102
+
3103
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 51);
3104
+ if (rf->channel <= 14)
3105
+ rt2800_rfcsr_write(rt2x00dev, 51, 0x75);
3106
+ else
3107
+ rt2800_rfcsr_write(rt2x00dev, 51, 0x51);
3108
+
3109
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 52);
3110
+ if (rf->channel <= 14)
3111
+ rt2800_rfcsr_write(rt2x00dev, 52, 0x45);
3112
+ else
3113
+ rt2800_rfcsr_write(rt2x00dev, 52, 0x05);
3114
+
3115
+ if (rf->channel <= 14) {
3116
+ pwr1 = info->default_power1 & 0x1f;
3117
+ pwr2 = info->default_power2 & 0x1f;
3118
+ pwr3 = info->default_power3 & 0x1f;
3119
+ } else {
3120
+ pwr1 = 0x48 | ((info->default_power1 & 0x18) << 1) |
3121
+ (info->default_power1 & 0x7);
3122
+ pwr2 = 0x48 | ((info->default_power2 & 0x18) << 1) |
3123
+ (info->default_power2 & 0x7);
3124
+ pwr3 = 0x48 | ((info->default_power3 & 0x18) << 1) |
3125
+ (info->default_power3 & 0x7);
3126
+ }
3127
+
3128
+ rt2800_rfcsr_write(rt2x00dev, 53, pwr1);
3129
+ rt2800_rfcsr_write(rt2x00dev, 54, pwr2);
3130
+ rt2800_rfcsr_write(rt2x00dev, 55, pwr3);
3131
+
3132
+ rt2x00_dbg(rt2x00dev, "Channel:%d, pwr1:%02x, pwr2:%02x, pwr3:%02x\n",
3133
+ rf->channel, pwr1, pwr2, pwr3);
3134
+
3135
+ bbp = (info->default_power1 >> 5) |
3136
+ ((info->default_power2 & 0xe0) >> 1);
3137
+ rt2800_bbp_write(rt2x00dev, 109, bbp);
3138
+
3139
+ bbp = rt2800_bbp_read(rt2x00dev, 110);
3140
+ bbp &= 0x0f;
3141
+ bbp |= (info->default_power3 & 0xe0) >> 1;
3142
+ rt2800_bbp_write(rt2x00dev, 110, bbp);
3143
+
3144
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 57);
3145
+ if (rf->channel <= 14)
3146
+ rt2800_rfcsr_write(rt2x00dev, 57, 0x6e);
3147
+ else
3148
+ rt2800_rfcsr_write(rt2x00dev, 57, 0x3e);
3149
+
3150
+ /* Enable RF tuning */
3151
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 3);
3152
+ rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
3153
+ rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
3154
+
3155
+ udelay(2000);
3156
+
3157
+ bbp = rt2800_bbp_read(rt2x00dev, 49);
3158
+ /* clear update flag */
3159
+ rt2800_bbp_write(rt2x00dev, 49, bbp & 0xfe);
3160
+ rt2800_bbp_write(rt2x00dev, 49, bbp);
3161
+
3162
+ /* TODO: add calibration for TxBF */
3163
+}
3164
+
27193165 #define POWER_BOUND 0x27
27203166 #define POWER_BOUND_5G 0x2b
27213167
....@@ -2810,6 +3256,7 @@
28103256 struct channel_info *info)
28113257 {
28123258 u8 rfcsr;
3259
+ int idx = rf->channel-1;
28133260
28143261 rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
28153262 rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3);
....@@ -2847,60 +3294,56 @@
28473294
28483295 rt2800_freq_cal_mode1(rt2x00dev);
28493296
2850
- if (rf->channel <= 14) {
2851
- int idx = rf->channel-1;
3297
+ if (rt2x00_has_cap_bt_coexist(rt2x00dev)) {
3298
+ if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
3299
+ /* r55/r59 value array of channel 1~14 */
3300
+ static const char r55_bt_rev[] = {0x83, 0x83,
3301
+ 0x83, 0x73, 0x73, 0x63, 0x53, 0x53,
3302
+ 0x53, 0x43, 0x43, 0x43, 0x43, 0x43};
3303
+ static const char r59_bt_rev[] = {0x0e, 0x0e,
3304
+ 0x0e, 0x0e, 0x0e, 0x0b, 0x0a, 0x09,
3305
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07};
28523306
2853
- if (rt2x00_has_cap_bt_coexist(rt2x00dev)) {
2854
- if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
2855
- /* r55/r59 value array of channel 1~14 */
2856
- static const char r55_bt_rev[] = {0x83, 0x83,
2857
- 0x83, 0x73, 0x73, 0x63, 0x53, 0x53,
2858
- 0x53, 0x43, 0x43, 0x43, 0x43, 0x43};
2859
- static const char r59_bt_rev[] = {0x0e, 0x0e,
2860
- 0x0e, 0x0e, 0x0e, 0x0b, 0x0a, 0x09,
2861
- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07};
2862
-
2863
- rt2800_rfcsr_write(rt2x00dev, 55,
2864
- r55_bt_rev[idx]);
2865
- rt2800_rfcsr_write(rt2x00dev, 59,
2866
- r59_bt_rev[idx]);
2867
- } else {
2868
- static const char r59_bt[] = {0x8b, 0x8b, 0x8b,
2869
- 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x89,
2870
- 0x88, 0x88, 0x86, 0x85, 0x84};
2871
-
2872
- rt2800_rfcsr_write(rt2x00dev, 59, r59_bt[idx]);
2873
- }
3307
+ rt2800_rfcsr_write(rt2x00dev, 55,
3308
+ r55_bt_rev[idx]);
3309
+ rt2800_rfcsr_write(rt2x00dev, 59,
3310
+ r59_bt_rev[idx]);
28743311 } else {
2875
- if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
2876
- static const char r55_nonbt_rev[] = {0x23, 0x23,
2877
- 0x23, 0x23, 0x13, 0x13, 0x03, 0x03,
2878
- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03};
2879
- static const char r59_nonbt_rev[] = {0x07, 0x07,
2880
- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
2881
- 0x07, 0x07, 0x06, 0x05, 0x04, 0x04};
3312
+ static const char r59_bt[] = {0x8b, 0x8b, 0x8b,
3313
+ 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x89,
3314
+ 0x88, 0x88, 0x86, 0x85, 0x84};
28823315
2883
- rt2800_rfcsr_write(rt2x00dev, 55,
2884
- r55_nonbt_rev[idx]);
2885
- rt2800_rfcsr_write(rt2x00dev, 59,
2886
- r59_nonbt_rev[idx]);
2887
- } else if (rt2x00_rt(rt2x00dev, RT5390) ||
2888
- rt2x00_rt(rt2x00dev, RT5392) ||
2889
- rt2x00_rt(rt2x00dev, RT6352)) {
2890
- static const char r59_non_bt[] = {0x8f, 0x8f,
2891
- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
2892
- 0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
3316
+ rt2800_rfcsr_write(rt2x00dev, 59, r59_bt[idx]);
3317
+ }
3318
+ } else {
3319
+ if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
3320
+ static const char r55_nonbt_rev[] = {0x23, 0x23,
3321
+ 0x23, 0x23, 0x13, 0x13, 0x03, 0x03,
3322
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03};
3323
+ static const char r59_nonbt_rev[] = {0x07, 0x07,
3324
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
3325
+ 0x07, 0x07, 0x06, 0x05, 0x04, 0x04};
28933326
2894
- rt2800_rfcsr_write(rt2x00dev, 59,
2895
- r59_non_bt[idx]);
2896
- } else if (rt2x00_rt(rt2x00dev, RT5350)) {
2897
- static const char r59_non_bt[] = {0x0b, 0x0b,
2898
- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a,
2899
- 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06};
3327
+ rt2800_rfcsr_write(rt2x00dev, 55,
3328
+ r55_nonbt_rev[idx]);
3329
+ rt2800_rfcsr_write(rt2x00dev, 59,
3330
+ r59_nonbt_rev[idx]);
3331
+ } else if (rt2x00_rt(rt2x00dev, RT5390) ||
3332
+ rt2x00_rt(rt2x00dev, RT5392) ||
3333
+ rt2x00_rt(rt2x00dev, RT6352)) {
3334
+ static const char r59_non_bt[] = {0x8f, 0x8f,
3335
+ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
3336
+ 0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
29003337
2901
- rt2800_rfcsr_write(rt2x00dev, 59,
2902
- r59_non_bt[idx]);
2903
- }
3338
+ rt2800_rfcsr_write(rt2x00dev, 59,
3339
+ r59_non_bt[idx]);
3340
+ } else if (rt2x00_rt(rt2x00dev, RT5350)) {
3341
+ static const char r59_non_bt[] = {0x0b, 0x0b,
3342
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a,
3343
+ 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06};
3344
+
3345
+ rt2800_rfcsr_write(rt2x00dev, 59,
3346
+ r59_non_bt[idx]);
29043347 }
29053348 }
29063349 }
....@@ -3522,17 +3965,49 @@
35223965 unsigned int channel,
35233966 char txpower)
35243967 {
3525
- if (rt2x00_rt(rt2x00dev, RT3593))
3968
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
3969
+ rt2x00_rt(rt2x00dev, RT3883))
35263970 txpower = rt2x00_get_field8(txpower, EEPROM_TXPOWER_ALC);
35273971
35283972 if (channel <= 14)
35293973 return clamp_t(char, txpower, MIN_G_TXPOWER, MAX_G_TXPOWER);
35303974
3531
- if (rt2x00_rt(rt2x00dev, RT3593))
3975
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
3976
+ rt2x00_rt(rt2x00dev, RT3883))
35323977 return clamp_t(char, txpower, MIN_A_TXPOWER_3593,
35333978 MAX_A_TXPOWER_3593);
35343979 else
35353980 return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER);
3981
+}
3982
+
3983
+static void rt3883_bbp_adjust(struct rt2x00_dev *rt2x00dev,
3984
+ struct rf_channel *rf)
3985
+{
3986
+ u8 bbp;
3987
+
3988
+ bbp = (rf->channel > 14) ? 0x48 : 0x38;
3989
+ rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, bbp);
3990
+
3991
+ rt2800_bbp_write(rt2x00dev, 69, 0x12);
3992
+
3993
+ if (rf->channel <= 14) {
3994
+ rt2800_bbp_write(rt2x00dev, 70, 0x0a);
3995
+ } else {
3996
+ /* Disable CCK packet detection */
3997
+ rt2800_bbp_write(rt2x00dev, 70, 0x00);
3998
+ }
3999
+
4000
+ rt2800_bbp_write(rt2x00dev, 73, 0x10);
4001
+
4002
+ if (rf->channel > 14) {
4003
+ rt2800_bbp_write(rt2x00dev, 62, 0x1d);
4004
+ rt2800_bbp_write(rt2x00dev, 63, 0x1d);
4005
+ rt2800_bbp_write(rt2x00dev, 64, 0x1d);
4006
+ } else {
4007
+ rt2800_bbp_write(rt2x00dev, 62, 0x2d);
4008
+ rt2800_bbp_write(rt2x00dev, 63, 0x2d);
4009
+ rt2800_bbp_write(rt2x00dev, 64, 0x2d);
4010
+ }
35364011 }
35374012
35384013 static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
....@@ -3553,6 +4028,12 @@
35534028 rt2800_txpower_to_dev(rt2x00dev, rf->channel,
35544029 info->default_power3);
35554030
4031
+ switch (rt2x00dev->chip.rt) {
4032
+ case RT3883:
4033
+ rt3883_bbp_adjust(rt2x00dev, rf);
4034
+ break;
4035
+ }
4036
+
35564037 switch (rt2x00dev->chip.rf) {
35574038 case RF2020:
35584039 case RF3020:
....@@ -3572,6 +4053,9 @@
35724053 break;
35734054 case RF3322:
35744055 rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
4056
+ break;
4057
+ case RF3853:
4058
+ rt2800_config_channel_rf3853(rt2x00dev, conf, rf, info);
35754059 break;
35764060 case RF3070:
35774061 case RF5350:
....@@ -3654,11 +4138,23 @@
36544138 rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
36554139 rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
36564140 rt2800_bbp_write(rt2x00dev, 77, 0x98);
4141
+ } else if (rt2x00_rt(rt2x00dev, RT3883)) {
4142
+ rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
4143
+ rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
4144
+ rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
4145
+
4146
+ if (rt2x00dev->default_ant.rx_chain_num > 1)
4147
+ rt2800_bbp_write(rt2x00dev, 86, 0x46);
4148
+ else
4149
+ rt2800_bbp_write(rt2x00dev, 86, 0);
36574150 } else {
36584151 rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
36594152 rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
36604153 rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
3661
- rt2800_bbp_write(rt2x00dev, 86, 0);
4154
+ if (rt2x00_rt(rt2x00dev, RT6352))
4155
+ rt2800_bbp_write(rt2x00dev, 86, 0x38);
4156
+ else
4157
+ rt2800_bbp_write(rt2x00dev, 86, 0);
36624158 }
36634159
36644160 if (rf->channel <= 14) {
....@@ -3666,6 +4162,7 @@
36664162 !rt2x00_rt(rt2x00dev, RT5392) &&
36674163 !rt2x00_rt(rt2x00dev, RT6352)) {
36684164 if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
4165
+ rt2800_bbp_write(rt2x00dev, 82, 0x62);
36694166 rt2800_bbp_write(rt2x00dev, 82, 0x62);
36704167 rt2800_bbp_write(rt2x00dev, 75, 0x46);
36714168 } else {
....@@ -3675,19 +4172,22 @@
36754172 rt2800_bbp_write(rt2x00dev, 82, 0x84);
36764173 rt2800_bbp_write(rt2x00dev, 75, 0x50);
36774174 }
3678
- if (rt2x00_rt(rt2x00dev, RT3593))
4175
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
4176
+ rt2x00_rt(rt2x00dev, RT3883))
36794177 rt2800_bbp_write(rt2x00dev, 83, 0x8a);
36804178 }
36814179
36824180 } else {
36834181 if (rt2x00_rt(rt2x00dev, RT3572))
36844182 rt2800_bbp_write(rt2x00dev, 82, 0x94);
3685
- else if (rt2x00_rt(rt2x00dev, RT3593))
4183
+ else if (rt2x00_rt(rt2x00dev, RT3593) ||
4184
+ rt2x00_rt(rt2x00dev, RT3883))
36864185 rt2800_bbp_write(rt2x00dev, 82, 0x82);
36874186 else if (!rt2x00_rt(rt2x00dev, RT6352))
36884187 rt2800_bbp_write(rt2x00dev, 82, 0xf2);
36894188
3690
- if (rt2x00_rt(rt2x00dev, RT3593))
4189
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
4190
+ rt2x00_rt(rt2x00dev, RT3883))
36914191 rt2800_bbp_write(rt2x00dev, 83, 0x9a);
36924192
36934193 if (rt2x00_has_cap_external_lna_a(rt2x00dev))
....@@ -3705,10 +4205,12 @@
37054205 if (rt2x00_rt(rt2x00dev, RT3572))
37064206 rt2800_rfcsr_write(rt2x00dev, 8, 0);
37074207
3708
- if (rt2x00_rt(rt2x00dev, RT6352))
4208
+ if (rt2x00_rt(rt2x00dev, RT6352)) {
37094209 tx_pin = rt2800_register_read(rt2x00dev, TX_PIN_CFG);
3710
- else
4210
+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFRX_EN, 1);
4211
+ } else {
37114212 tx_pin = 0;
4213
+ }
37124214
37134215 switch (rt2x00dev->default_ant.tx_chain_num) {
37144216 case 3:
....@@ -3717,14 +4219,14 @@
37174219 rf->channel > 14);
37184220 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G2_EN,
37194221 rf->channel <= 14);
3720
- /* fall-through */
4222
+ fallthrough;
37214223 case 2:
37224224 /* Turn on secondary PAs */
37234225 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN,
37244226 rf->channel > 14);
37254227 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN,
37264228 rf->channel <= 14);
3727
- /* fall-through */
4229
+ fallthrough;
37284230 case 1:
37294231 /* Turn on primary PAs */
37304232 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN,
....@@ -3742,12 +4244,12 @@
37424244 /* Turn on tertiary LNAs */
37434245 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A2_EN, 1);
37444246 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G2_EN, 1);
3745
- /* fall-through */
4247
+ fallthrough;
37464248 case 2:
37474249 /* Turn on secondary LNAs */
37484250 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, 1);
37494251 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, 1);
3750
- /* fall-through */
4252
+ fallthrough;
37514253 case 1:
37524254 /* Turn on primary LNAs */
37534255 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN, 1);
....@@ -3757,7 +4259,6 @@
37574259
37584260 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1);
37594261 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1);
3760
- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFRX_EN, 1); /* mt7620 */
37614262
37624263 rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
37634264
....@@ -3816,6 +4317,23 @@
38164317 usleep_range(1000, 1500);
38174318 }
38184319
4320
+ if (rt2x00_rt(rt2x00dev, RT3883)) {
4321
+ if (!conf_is_ht40(conf))
4322
+ rt2800_bbp_write(rt2x00dev, 105, 0x34);
4323
+ else
4324
+ rt2800_bbp_write(rt2x00dev, 105, 0x04);
4325
+
4326
+ /* AGC init */
4327
+ if (rf->channel <= 14)
4328
+ reg = 0x2e + rt2x00dev->lna_gain;
4329
+ else
4330
+ reg = 0x20 + ((rt2x00dev->lna_gain * 5) / 3);
4331
+
4332
+ rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
4333
+
4334
+ usleep_range(1000, 1500);
4335
+ }
4336
+
38194337 if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) {
38204338 reg = 0x10;
38214339 if (!conf_is_ht40(conf)) {
....@@ -3829,16 +4347,16 @@
38294347 rt2800_bbp_write(rt2x00dev, 195, 141);
38304348 rt2800_bbp_write(rt2x00dev, 196, reg);
38314349
3832
- /* AGC init */
3833
- if (rt2x00_rt(rt2x00dev, RT6352))
3834
- reg = 0x04;
3835
- else
3836
- reg = rf->channel <= 14 ? 0x1c : 0x24;
3837
-
3838
- reg += 2 * rt2x00dev->lna_gain;
4350
+ /* AGC init.
4351
+ * Despite the vendor driver using different values here for
4352
+ * RT6352 chip, we use 0x1c for now. This may have to be changed
4353
+ * once TSSI got implemented.
4354
+ */
4355
+ reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2*rt2x00dev->lna_gain;
38394356 rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
38404357
3841
- rt2800_iq_calibrate(rt2x00dev, rf->channel);
4358
+ if (rt2x00_rt(rt2x00dev, RT5592))
4359
+ rt2800_iq_calibrate(rt2x00dev, rf->channel);
38424360 }
38434361
38444362 bbp = rt2800_bbp_read(rt2x00dev, 4);
....@@ -4075,6 +4593,9 @@
40754593
40764594 if (rt2x00_rt(rt2x00dev, RT3593))
40774595 return min_t(u8, txpower, 0xc);
4596
+
4597
+ if (rt2x00_rt(rt2x00dev, RT3883))
4598
+ return min_t(u8, txpower, 0xf);
40784599
40794600 if (rt2x00_has_cap_power_limit(rt2x00dev)) {
40804601 /*
....@@ -4837,7 +5358,8 @@
48375358 struct ieee80211_channel *chan,
48385359 int power_level)
48395360 {
4840
- if (rt2x00_rt(rt2x00dev, RT3593))
5361
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
5362
+ rt2x00_rt(rt2x00dev, RT3883))
48415363 rt2800_config_txpower_rt3593(rt2x00dev, chan, power_level);
48425364 else if (rt2x00_rt(rt2x00dev, RT6352))
48435365 rt2800_config_txpower_rt6352(rt2x00dev, chan, power_level);
....@@ -4884,6 +5406,7 @@
48845406 case RF3053:
48855407 case RF3070:
48865408 case RF3290:
5409
+ case RF3853:
48875410 case RF5350:
48885411 case RF5360:
48895412 case RF5362:
....@@ -4919,10 +5442,10 @@
49195442 switch (rt2x00dev->default_ant.tx_chain_num) {
49205443 case 3:
49215444 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G2_EN, 1);
4922
- /* fall through */
5445
+ fallthrough;
49235446 case 2:
49245447 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, 1);
4925
- /* fall through */
5448
+ fallthrough;
49265449 case 1:
49275450 default:
49285451 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, 1);
....@@ -4932,10 +5455,10 @@
49325455 switch (rt2x00dev->default_ant.tx_chain_num) {
49335456 case 3:
49345457 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A2_EN, 1);
4935
- /* fall through */
5458
+ fallthrough;
49365459 case 2:
49375460 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN, 1);
4938
- /* fall through */
5461
+ fallthrough;
49395462 case 1:
49405463 default:
49415464 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN, 1);
....@@ -5084,7 +5607,8 @@
50845607 else
50855608 vgc = 0x2e + rt2x00dev->lna_gain;
50865609 } else { /* 5GHZ band */
5087
- if (rt2x00_rt(rt2x00dev, RT3593))
5610
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
5611
+ rt2x00_rt(rt2x00dev, RT3883))
50885612 vgc = 0x20 + (rt2x00dev->lna_gain * 5) / 3;
50895613 else if (rt2x00_rt(rt2x00dev, RT5592))
50905614 vgc = 0x24 + (2 * rt2x00dev->lna_gain);
....@@ -5104,7 +5628,9 @@
51045628 {
51055629 if (qual->vgc_level != vgc_level) {
51065630 if (rt2x00_rt(rt2x00dev, RT3572) ||
5107
- rt2x00_rt(rt2x00dev, RT3593)) {
5631
+ rt2x00_rt(rt2x00dev, RT3593) ||
5632
+ rt2x00_rt(rt2x00dev, RT3883) ||
5633
+ rt2x00_rt(rt2x00dev, RT6352)) {
51085634 rt2800_bbp_write_with_rx_chain(rt2x00dev, 66,
51095635 vgc_level);
51105636 } else if (rt2x00_rt(rt2x00dev, RT5592)) {
....@@ -5149,6 +5675,11 @@
51495675 else
51505676 vgc += 0x10;
51515677 }
5678
+ break;
5679
+
5680
+ case RT3883:
5681
+ if (qual->rssi > -65)
5682
+ vgc += 0x10;
51525683 break;
51535684
51545685 case RT5592:
....@@ -5303,9 +5834,14 @@
53035834 rt2800_register_write(rt2x00dev, TX_SW_CFG2,
53045835 0x00000000);
53055836 }
5837
+ } else if (rt2x00_rt(rt2x00dev, RT3883)) {
5838
+ rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000402);
5839
+ rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
5840
+ rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00040000);
5841
+ rt2800_register_write(rt2x00dev, TX_TXBF_CFG_0, 0x8000fc21);
5842
+ rt2800_register_write(rt2x00dev, TX_TXBF_CFG_3, 0x00009c40);
53065843 } else if (rt2x00_rt(rt2x00dev, RT5390) ||
5307
- rt2x00_rt(rt2x00dev, RT5392) ||
5308
- rt2x00_rt(rt2x00dev, RT6352)) {
5844
+ rt2x00_rt(rt2x00dev, RT5392)) {
53095845 rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
53105846 rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
53115847 rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
....@@ -5317,11 +5853,9 @@
53175853 rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
53185854 } else if (rt2x00_rt(rt2x00dev, RT6352)) {
53195855 rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401);
5320
- rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0000);
5856
+ rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0001);
53215857 rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
5322
- rt2800_register_write(rt2x00dev, MIMO_PS_CFG, 0x00000002);
5323
- rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0x00150F0F);
5324
- rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x06060606);
5858
+ rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000);
53255859 rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0);
53265860 rt2800_register_write(rt2x00dev, TX1_BB_GAIN_ATTEN, 0x0);
53275861 rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, 0x6C6C666C);
....@@ -5516,6 +6050,11 @@
55166050 reg = rt2x00_rt(rt2x00dev, RT5592) ? 0x00000082 : 0x00000002;
55176051 rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, reg);
55186052
6053
+ if (rt2x00_rt(rt2x00dev, RT3883)) {
6054
+ rt2800_register_write(rt2x00dev, TX_FBK_CFG_3S_0, 0x12111008);
6055
+ rt2800_register_write(rt2x00dev, TX_FBK_CFG_3S_1, 0x16151413);
6056
+ }
6057
+
55196058 reg = rt2800_register_read(rt2x00dev, TX_RTS_CFG);
55206059 rt2x00_set_field32(&reg, TX_RTS_CFG_AUTO_RTS_RETRY_LIMIT, 7);
55216060 rt2x00_set_field32(&reg, TX_RTS_CFG_RTS_THRES,
....@@ -5546,14 +6085,21 @@
55466085 * ASIC will keep garbage value after boot, clear encryption keys.
55476086 */
55486087 for (i = 0; i < 4; i++)
5549
- rt2800_register_write(rt2x00dev,
5550
- SHARED_KEY_MODE_ENTRY(i), 0);
6088
+ rt2800_register_write(rt2x00dev, SHARED_KEY_MODE_ENTRY(i), 0);
55516089
55526090 for (i = 0; i < 256; i++) {
55536091 rt2800_config_wcid(rt2x00dev, NULL, i);
55546092 rt2800_delete_wcid_attr(rt2x00dev, i);
5555
- rt2800_register_write(rt2x00dev, MAC_IVEIV_ENTRY(i), 0);
55566093 }
6094
+
6095
+ /*
6096
+ * Clear encryption initialization vectors on start, but keep them
6097
+ * for watchdog reset. Otherwise we will have wrong IVs and not be
6098
+ * able to keep connections after reset.
6099
+ */
6100
+ if (!test_bit(DEVICE_STATE_RESET, &rt2x00dev->flags))
6101
+ for (i = 0; i < 256; i++)
6102
+ rt2800_register_write(rt2x00dev, MAC_IVEIV_ENTRY(i), 0);
55576103
55586104 /*
55596105 * Clear all beacons
....@@ -5568,6 +6114,27 @@
55686114 } else if (rt2x00_is_pcie(rt2x00dev)) {
55696115 reg = rt2800_register_read(rt2x00dev, US_CYC_CNT);
55706116 rt2x00_set_field32(&reg, US_CYC_CNT_CLOCK_CYCLE, 125);
6117
+ rt2800_register_write(rt2x00dev, US_CYC_CNT, reg);
6118
+ } else if (rt2x00_is_soc(rt2x00dev)) {
6119
+ struct clk *clk = clk_get_sys("bus", NULL);
6120
+ int rate;
6121
+
6122
+ if (IS_ERR(clk)) {
6123
+ clk = clk_get_sys("cpu", NULL);
6124
+
6125
+ if (IS_ERR(clk)) {
6126
+ rate = 125;
6127
+ } else {
6128
+ rate = clk_get_rate(clk) / 3000000;
6129
+ clk_put(clk);
6130
+ }
6131
+ } else {
6132
+ rate = clk_get_rate(clk) / 1000000;
6133
+ clk_put(clk);
6134
+ }
6135
+
6136
+ reg = rt2800_register_read(rt2x00dev, US_CYC_CNT);
6137
+ rt2x00_set_field32(&reg, US_CYC_CNT_CLOCK_CYCLE, rate);
55716138 rt2800_register_write(rt2x00dev, US_CYC_CNT, reg);
55726139 }
55736140
....@@ -6132,6 +6699,47 @@
61326699 rt2800_bbp_write(rt2x00dev, 103, 0xc0);
61336700 }
61346701
6702
+static void rt2800_init_bbp_3883(struct rt2x00_dev *rt2x00dev)
6703
+{
6704
+ rt2800_init_bbp_early(rt2x00dev);
6705
+
6706
+ rt2800_bbp_write(rt2x00dev, 4, 0x50);
6707
+ rt2800_bbp_write(rt2x00dev, 47, 0x48);
6708
+
6709
+ rt2800_bbp_write(rt2x00dev, 86, 0x46);
6710
+ rt2800_bbp_write(rt2x00dev, 88, 0x90);
6711
+
6712
+ rt2800_bbp_write(rt2x00dev, 92, 0x02);
6713
+
6714
+ rt2800_bbp_write(rt2x00dev, 103, 0xc0);
6715
+ rt2800_bbp_write(rt2x00dev, 104, 0x92);
6716
+ rt2800_bbp_write(rt2x00dev, 105, 0x34);
6717
+ rt2800_bbp_write(rt2x00dev, 106, 0x12);
6718
+ rt2800_bbp_write(rt2x00dev, 120, 0x50);
6719
+ rt2800_bbp_write(rt2x00dev, 137, 0x0f);
6720
+ rt2800_bbp_write(rt2x00dev, 163, 0x9d);
6721
+
6722
+ /* Set ITxBF timeout to 0x9C40=1000msec */
6723
+ rt2800_bbp_write(rt2x00dev, 179, 0x02);
6724
+ rt2800_bbp_write(rt2x00dev, 180, 0x00);
6725
+ rt2800_bbp_write(rt2x00dev, 182, 0x40);
6726
+ rt2800_bbp_write(rt2x00dev, 180, 0x01);
6727
+ rt2800_bbp_write(rt2x00dev, 182, 0x9c);
6728
+
6729
+ rt2800_bbp_write(rt2x00dev, 179, 0x00);
6730
+
6731
+ /* Reprogram the inband interface to put right values in RXWI */
6732
+ rt2800_bbp_write(rt2x00dev, 142, 0x04);
6733
+ rt2800_bbp_write(rt2x00dev, 143, 0x3b);
6734
+ rt2800_bbp_write(rt2x00dev, 142, 0x06);
6735
+ rt2800_bbp_write(rt2x00dev, 143, 0xa0);
6736
+ rt2800_bbp_write(rt2x00dev, 142, 0x07);
6737
+ rt2800_bbp_write(rt2x00dev, 143, 0xa1);
6738
+ rt2800_bbp_write(rt2x00dev, 142, 0x08);
6739
+ rt2800_bbp_write(rt2x00dev, 143, 0xa2);
6740
+ rt2800_bbp_write(rt2x00dev, 148, 0xc8);
6741
+}
6742
+
61356743 static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev)
61366744 {
61376745 int ant, div_mode;
....@@ -6575,6 +7183,9 @@
65757183 break;
65767184 case RT3593:
65777185 rt2800_init_bbp_3593(rt2x00dev);
7186
+ return;
7187
+ case RT3883:
7188
+ rt2800_init_bbp_3883(rt2x00dev);
65787189 return;
65797190 case RT5390:
65807191 case RT5392:
....@@ -7447,6 +8058,144 @@
74478058 rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
74488059 }
74498060
8061
+static void rt2800_init_rfcsr_3883(struct rt2x00_dev *rt2x00dev)
8062
+{
8063
+ u8 rfcsr;
8064
+
8065
+ /* TODO: get the actual ECO value from the SoC */
8066
+ const unsigned int eco = 5;
8067
+
8068
+ rt2800_rf_init_calibration(rt2x00dev, 2);
8069
+
8070
+ rt2800_rfcsr_write(rt2x00dev, 0, 0xe0);
8071
+ rt2800_rfcsr_write(rt2x00dev, 1, 0x03);
8072
+ rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
8073
+ rt2800_rfcsr_write(rt2x00dev, 3, 0x20);
8074
+ rt2800_rfcsr_write(rt2x00dev, 4, 0x00);
8075
+ rt2800_rfcsr_write(rt2x00dev, 5, 0x00);
8076
+ rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
8077
+ rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
8078
+ rt2800_rfcsr_write(rt2x00dev, 8, 0x5b);
8079
+ rt2800_rfcsr_write(rt2x00dev, 9, 0x08);
8080
+ rt2800_rfcsr_write(rt2x00dev, 10, 0xd3);
8081
+ rt2800_rfcsr_write(rt2x00dev, 11, 0x48);
8082
+ rt2800_rfcsr_write(rt2x00dev, 12, 0x1a);
8083
+ rt2800_rfcsr_write(rt2x00dev, 13, 0x12);
8084
+ rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
8085
+ rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
8086
+ rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
8087
+
8088
+ /* RFCSR 17 will be initialized later based on the
8089
+ * frequency offset stored in the EEPROM
8090
+ */
8091
+
8092
+ rt2800_rfcsr_write(rt2x00dev, 18, 0x40);
8093
+ rt2800_rfcsr_write(rt2x00dev, 19, 0x00);
8094
+ rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
8095
+ rt2800_rfcsr_write(rt2x00dev, 21, 0x00);
8096
+ rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
8097
+ rt2800_rfcsr_write(rt2x00dev, 23, 0xc0);
8098
+ rt2800_rfcsr_write(rt2x00dev, 24, 0x00);
8099
+ rt2800_rfcsr_write(rt2x00dev, 25, 0x00);
8100
+ rt2800_rfcsr_write(rt2x00dev, 26, 0x00);
8101
+ rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
8102
+ rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
8103
+ rt2800_rfcsr_write(rt2x00dev, 29, 0x00);
8104
+ rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
8105
+ rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
8106
+ rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
8107
+ rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
8108
+ rt2800_rfcsr_write(rt2x00dev, 34, 0x20);
8109
+ rt2800_rfcsr_write(rt2x00dev, 35, 0x00);
8110
+ rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
8111
+ rt2800_rfcsr_write(rt2x00dev, 37, 0x00);
8112
+ rt2800_rfcsr_write(rt2x00dev, 38, 0x86);
8113
+ rt2800_rfcsr_write(rt2x00dev, 39, 0x23);
8114
+ rt2800_rfcsr_write(rt2x00dev, 40, 0x00);
8115
+ rt2800_rfcsr_write(rt2x00dev, 41, 0x00);
8116
+ rt2800_rfcsr_write(rt2x00dev, 42, 0x00);
8117
+ rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
8118
+ rt2800_rfcsr_write(rt2x00dev, 44, 0x93);
8119
+ rt2800_rfcsr_write(rt2x00dev, 45, 0xbb);
8120
+ rt2800_rfcsr_write(rt2x00dev, 46, 0x60);
8121
+ rt2800_rfcsr_write(rt2x00dev, 47, 0x00);
8122
+ rt2800_rfcsr_write(rt2x00dev, 48, 0x00);
8123
+ rt2800_rfcsr_write(rt2x00dev, 49, 0x8e);
8124
+ rt2800_rfcsr_write(rt2x00dev, 50, 0x86);
8125
+ rt2800_rfcsr_write(rt2x00dev, 51, 0x51);
8126
+ rt2800_rfcsr_write(rt2x00dev, 52, 0x05);
8127
+ rt2800_rfcsr_write(rt2x00dev, 53, 0x76);
8128
+ rt2800_rfcsr_write(rt2x00dev, 54, 0x76);
8129
+ rt2800_rfcsr_write(rt2x00dev, 55, 0x76);
8130
+ rt2800_rfcsr_write(rt2x00dev, 56, 0xdb);
8131
+ rt2800_rfcsr_write(rt2x00dev, 57, 0x3e);
8132
+ rt2800_rfcsr_write(rt2x00dev, 58, 0x00);
8133
+ rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
8134
+ rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
8135
+ rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
8136
+ rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
8137
+ rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
8138
+
8139
+ /* TODO: rx filter calibration? */
8140
+
8141
+ rt2800_bbp_write(rt2x00dev, 137, 0x0f);
8142
+
8143
+ rt2800_bbp_write(rt2x00dev, 163, 0x9d);
8144
+
8145
+ rt2800_bbp_write(rt2x00dev, 105, 0x05);
8146
+
8147
+ rt2800_bbp_write(rt2x00dev, 179, 0x02);
8148
+ rt2800_bbp_write(rt2x00dev, 180, 0x00);
8149
+ rt2800_bbp_write(rt2x00dev, 182, 0x40);
8150
+ rt2800_bbp_write(rt2x00dev, 180, 0x01);
8151
+ rt2800_bbp_write(rt2x00dev, 182, 0x9c);
8152
+
8153
+ rt2800_bbp_write(rt2x00dev, 179, 0x00);
8154
+
8155
+ rt2800_bbp_write(rt2x00dev, 142, 0x04);
8156
+ rt2800_bbp_write(rt2x00dev, 143, 0x3b);
8157
+ rt2800_bbp_write(rt2x00dev, 142, 0x06);
8158
+ rt2800_bbp_write(rt2x00dev, 143, 0xa0);
8159
+ rt2800_bbp_write(rt2x00dev, 142, 0x07);
8160
+ rt2800_bbp_write(rt2x00dev, 143, 0xa1);
8161
+ rt2800_bbp_write(rt2x00dev, 142, 0x08);
8162
+ rt2800_bbp_write(rt2x00dev, 143, 0xa2);
8163
+ rt2800_bbp_write(rt2x00dev, 148, 0xc8);
8164
+
8165
+ if (eco == 5) {
8166
+ rt2800_rfcsr_write(rt2x00dev, 32, 0xd8);
8167
+ rt2800_rfcsr_write(rt2x00dev, 33, 0x32);
8168
+ }
8169
+
8170
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 2);
8171
+ rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_BP, 0);
8172
+ rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
8173
+ rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
8174
+ msleep(1);
8175
+ rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 0);
8176
+ rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
8177
+
8178
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
8179
+ rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
8180
+ rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
8181
+
8182
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 6);
8183
+ rfcsr |= 0xc0;
8184
+ rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
8185
+
8186
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 22);
8187
+ rfcsr |= 0x20;
8188
+ rt2800_rfcsr_write(rt2x00dev, 22, rfcsr);
8189
+
8190
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 46);
8191
+ rfcsr |= 0x20;
8192
+ rt2800_rfcsr_write(rt2x00dev, 46, rfcsr);
8193
+
8194
+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 20);
8195
+ rfcsr &= ~0xee;
8196
+ rt2800_rfcsr_write(rt2x00dev, 20, rfcsr);
8197
+}
8198
+
74508199 static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
74518200 {
74528201 rt2800_rf_init_calibration(rt2x00dev, 2);
....@@ -8289,6 +9038,9 @@
82899038 case RT3390:
82909039 rt2800_init_rfcsr_3390(rt2x00dev);
82919040 break;
9041
+ case RT3883:
9042
+ rt2800_init_rfcsr_3883(rt2x00dev);
9043
+ break;
82929044 case RT3572:
82939045 rt2800_init_rfcsr_3572(rt2x00dev);
82949046 break;
....@@ -8494,7 +9246,8 @@
84949246 {
84959247 u16 word;
84969248
8497
- if (rt2x00_rt(rt2x00dev, RT3593))
9249
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
9250
+ rt2x00_rt(rt2x00dev, RT3883))
84989251 return 0;
84999252
85009253 word = rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG);
....@@ -8508,7 +9261,8 @@
85089261 {
85099262 u16 word;
85109263
8511
- if (rt2x00_rt(rt2x00dev, RT3593))
9264
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
9265
+ rt2x00_rt(rt2x00dev, RT3883))
85129266 return 0;
85139267
85149268 word = rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_A);
....@@ -8614,7 +9368,8 @@
86149368 word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2);
86159369 if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10)
86169370 rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0);
8617
- if (!rt2x00_rt(rt2x00dev, RT3593)) {
9371
+ if (!rt2x00_rt(rt2x00dev, RT3593) &&
9372
+ !rt2x00_rt(rt2x00dev, RT3883)) {
86189373 if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 ||
86199374 rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff)
86209375 rt2x00_set_field16(&word, EEPROM_RSSI_BG2_LNA_A1,
....@@ -8634,7 +9389,8 @@
86349389 word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2);
86359390 if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10)
86369391 rt2x00_set_field16(&word, EEPROM_RSSI_A2_OFFSET2, 0);
8637
- if (!rt2x00_rt(rt2x00dev, RT3593)) {
9392
+ if (!rt2x00_rt(rt2x00dev, RT3593) &&
9393
+ !rt2x00_rt(rt2x00dev, RT3883)) {
86389394 if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 ||
86399395 rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff)
86409396 rt2x00_set_field16(&word, EEPROM_RSSI_A2_LNA_A2,
....@@ -8642,7 +9398,8 @@
86429398 }
86439399 rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word);
86449400
8645
- if (rt2x00_rt(rt2x00dev, RT3593)) {
9401
+ if (rt2x00_rt(rt2x00dev, RT3593) ||
9402
+ rt2x00_rt(rt2x00dev, RT3883)) {
86469403 word = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2);
86479404 if (rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0x00 ||
86489405 rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0xff)
....@@ -8681,6 +9438,8 @@
86819438 rf = rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID);
86829439 else if (rt2x00_rt(rt2x00dev, RT3352))
86839440 rf = RF3322;
9441
+ else if (rt2x00_rt(rt2x00dev, RT3883))
9442
+ rf = RF3853;
86849443 else if (rt2x00_rt(rt2x00dev, RT5350))
86859444 rf = RF5350;
86869445 else
....@@ -8701,6 +9460,7 @@
87019460 case RF3290:
87029461 case RF3320:
87039462 case RF3322:
9463
+ case RF3853:
87049464 case RF5350:
87059465 case RF5360:
87069466 case RF5362:
....@@ -8987,6 +9747,66 @@
89879747 {14, 0xF0, 2, 0x18},
89889748 };
89899749
9750
+static const struct rf_channel rf_vals_3853[] = {
9751
+ {1, 241, 6, 2},
9752
+ {2, 241, 6, 7},
9753
+ {3, 242, 6, 2},
9754
+ {4, 242, 6, 7},
9755
+ {5, 243, 6, 2},
9756
+ {6, 243, 6, 7},
9757
+ {7, 244, 6, 2},
9758
+ {8, 244, 6, 7},
9759
+ {9, 245, 6, 2},
9760
+ {10, 245, 6, 7},
9761
+ {11, 246, 6, 2},
9762
+ {12, 246, 6, 7},
9763
+ {13, 247, 6, 2},
9764
+ {14, 248, 6, 4},
9765
+
9766
+ {36, 0x56, 8, 4},
9767
+ {38, 0x56, 8, 6},
9768
+ {40, 0x56, 8, 8},
9769
+ {44, 0x57, 8, 0},
9770
+ {46, 0x57, 8, 2},
9771
+ {48, 0x57, 8, 4},
9772
+ {52, 0x57, 8, 8},
9773
+ {54, 0x57, 8, 10},
9774
+ {56, 0x58, 8, 0},
9775
+ {60, 0x58, 8, 4},
9776
+ {62, 0x58, 8, 6},
9777
+ {64, 0x58, 8, 8},
9778
+
9779
+ {100, 0x5b, 8, 8},
9780
+ {102, 0x5b, 8, 10},
9781
+ {104, 0x5c, 8, 0},
9782
+ {108, 0x5c, 8, 4},
9783
+ {110, 0x5c, 8, 6},
9784
+ {112, 0x5c, 8, 8},
9785
+ {114, 0x5c, 8, 10},
9786
+ {116, 0x5d, 8, 0},
9787
+ {118, 0x5d, 8, 2},
9788
+ {120, 0x5d, 8, 4},
9789
+ {124, 0x5d, 8, 8},
9790
+ {126, 0x5d, 8, 10},
9791
+ {128, 0x5e, 8, 0},
9792
+ {132, 0x5e, 8, 4},
9793
+ {134, 0x5e, 8, 6},
9794
+ {136, 0x5e, 8, 8},
9795
+ {140, 0x5f, 8, 0},
9796
+
9797
+ {149, 0x5f, 8, 9},
9798
+ {151, 0x5f, 8, 11},
9799
+ {153, 0x60, 8, 1},
9800
+ {157, 0x60, 8, 5},
9801
+ {159, 0x60, 8, 7},
9802
+ {161, 0x60, 8, 9},
9803
+ {165, 0x61, 8, 1},
9804
+ {167, 0x61, 8, 3},
9805
+ {169, 0x61, 8, 5},
9806
+ {171, 0x61, 8, 7},
9807
+ {173, 0x61, 8, 9},
9808
+};
9809
+
89909810 static const struct rf_channel rf_vals_5592_xtal20[] = {
89919811 /* Channel, N, K, mod, R */
89929812 {1, 482, 4, 10, 3},
....@@ -9177,9 +9997,7 @@
91779997 if (!rt2x00_is_usb(rt2x00dev))
91789998 ieee80211_hw_set(rt2x00dev->hw, HOST_BROADCAST_PS_BUFFERING);
91799999
9180
- /* Set MFP if HW crypto is disabled. */
9181
- if (rt2800_hwcrypt_disabled(rt2x00dev))
9182
- ieee80211_hw_set(rt2x00dev->hw, MFP_CAPABLE);
10000
+ ieee80211_hw_set(rt2x00dev->hw, MFP_CAPABLE);
918310001
918410002 SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev);
918510003 SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
....@@ -9250,6 +10068,11 @@
925010068 spec->channels = rf_vals_3x;
925110069 break;
925210070
10071
+ case RF3853:
10072
+ spec->num_channels = ARRAY_SIZE(rf_vals_3853);
10073
+ spec->channels = rf_vals_3853;
10074
+ break;
10075
+
925310076 case RF5592:
925410077 reg = rt2800_register_read(rt2x00dev, MAC_DEBUG_INDEX);
925510078 if (rt2x00_get_field32(reg, MAC_DEBUG_INDEX_XTAL)) {
....@@ -9303,8 +10126,10 @@
930310126 switch (rx_chains) {
930410127 case 3:
930510128 spec->ht.mcs.rx_mask[2] = 0xff;
10129
+ fallthrough;
930610130 case 2:
930710131 spec->ht.mcs.rx_mask[1] = 0xff;
10132
+ fallthrough;
930810133 case 1:
930910134 spec->ht.mcs.rx_mask[0] = 0xff;
931010135 spec->ht.mcs.rx_mask[4] = 0x1; /* MCS32 */
....@@ -9367,6 +10192,7 @@
936710192 case RF3053:
936810193 case RF3070:
936910194 case RF3290:
10195
+ case RF3853:
937010196 case RF5350:
937110197 case RF5360:
937210198 case RF5362:
....@@ -9409,6 +10235,7 @@
940910235 case RT3390:
941010236 case RT3572:
941110237 case RT3593:
10238
+ case RT3883:
941210239 case RT5350:
941310240 case RT5390:
941410241 case RT5392:
....@@ -9487,6 +10314,13 @@
948710314 else {
948810315 __set_bit(REQUIRE_DMA, &rt2x00dev->cap_flags);
948910316 __set_bit(REQUIRE_TASKLET_CONTEXT, &rt2x00dev->cap_flags);
10317
+ }
10318
+
10319
+ if (modparam_watchdog) {
10320
+ __set_bit(CAPABILITY_RESTART_HW, &rt2x00dev->cap_flags);
10321
+ rt2x00dev->link.watchdog_interval = msecs_to_jiffies(100);
10322
+ } else {
10323
+ rt2x00dev->link.watchdog_disabled = true;
949010324 }
949110325
949210326 /*
....@@ -9660,7 +10494,7 @@
966010494 * when the hw reorders frames due to aggregation.
966110495 */
966210496 if (sta_priv->wcid > WCID_END)
9663
- return 1;
10497
+ return -ENOSPC;
966410498
966510499 switch (action) {
966610500 case IEEE80211_AMPDU_RX_START:
....@@ -9673,7 +10507,7 @@
967310507 */
967410508 break;
967510509 case IEEE80211_AMPDU_TX_START:
9676
- ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
10510
+ ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
967710511 break;
967810512 case IEEE80211_AMPDU_TX_STOP_CONT:
967910513 case IEEE80211_AMPDU_TX_STOP_FLUSH: