forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/net/wireless/marvell/mwifiex/wmm.c
....@@ -1,10 +1,10 @@
11 /*
2
- * Marvell Wireless LAN device driver: WMM
2
+ * NXP Wireless LAN device driver: WMM
33 *
4
- * Copyright (C) 2011-2014, Marvell International Ltd.
4
+ * Copyright 2011-2020 NXP
55 *
6
- * This software file (the "File") is distributed by Marvell International
7
- * Ltd. under the terms of the GNU General Public License Version 2, June 1991
6
+ * This software file (the "File") is distributed by NXP
7
+ * under the terms of the GNU General Public License Version 2, June 1991
88 * (the "License"). You may use, redistribute and/or modify this File in
99 * accordance with the terms and conditions of the License, a copy of which
1010 * is available by writing to the Free Software Foundation, Inc.,
....@@ -39,6 +39,21 @@
3939
4040 static bool disable_tx_amsdu;
4141 module_param(disable_tx_amsdu, bool, 0644);
42
+
43
+/* This table inverses the tos_to_tid operation to get a priority
44
+ * which is in sequential order, and can be compared.
45
+ * Use this to compare the priority of two different TIDs.
46
+ */
47
+const u8 tos_to_tid_inv[] = {
48
+ 0x02, /* from tos_to_tid[2] = 0 */
49
+ 0x00, /* from tos_to_tid[0] = 1 */
50
+ 0x01, /* from tos_to_tid[1] = 2 */
51
+ 0x03,
52
+ 0x04,
53
+ 0x05,
54
+ 0x06,
55
+ 0x07
56
+};
4257
4358 /* WMM information IE */
4459 static const u8 wmm_info_ie[] = { WLAN_EID_VENDOR_SPECIFIC, 0x07,
....@@ -138,7 +153,6 @@
138153 struct mwifiex_ra_list_tbl *ra_list;
139154 struct mwifiex_adapter *adapter = priv->adapter;
140155 struct mwifiex_sta_node *node;
141
- unsigned long flags;
142156
143157
144158 for (i = 0; i < MAX_NUM_TID; ++i) {
....@@ -163,7 +177,7 @@
163177 ra_list->is_11n_enabled = IS_11N_ENABLED(priv);
164178 }
165179 } else {
166
- spin_lock_irqsave(&priv->sta_list_spinlock, flags);
180
+ spin_lock_bh(&priv->sta_list_spinlock);
167181 node = mwifiex_get_sta_entry(priv, ra);
168182 if (node)
169183 ra_list->tx_paused = node->tx_pause;
....@@ -171,7 +185,7 @@
171185 mwifiex_is_sta_11n_enabled(priv, node);
172186 if (ra_list->is_11n_enabled)
173187 ra_list->max_amsdu = node->max_amsdu;
174
- spin_unlock_irqrestore(&priv->sta_list_spinlock, flags);
188
+ spin_unlock_bh(&priv->sta_list_spinlock);
175189 }
176190
177191 mwifiex_dbg(adapter, DATA, "data: ralist %p: is_11n_enabled=%d\n",
....@@ -583,11 +597,10 @@
583597 void
584598 mwifiex_clean_txrx(struct mwifiex_private *priv)
585599 {
586
- unsigned long flags;
587600 struct sk_buff *skb, *tmp;
588601
589602 mwifiex_11n_cleanup_reorder_tbl(priv);
590
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock, flags);
603
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
591604
592605 mwifiex_wmm_cleanup_queues(priv);
593606 mwifiex_11n_delete_all_tx_ba_stream_tbl(priv);
....@@ -601,7 +614,7 @@
601614 if (priv->adapter->if_ops.clean_pcie_ring &&
602615 !test_bit(MWIFIEX_SURPRISE_REMOVED, &priv->adapter->work_flags))
603616 priv->adapter->if_ops.clean_pcie_ring(priv->adapter);
604
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags);
617
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
605618
606619 skb_queue_walk_safe(&priv->tdls_txq, skb, tmp) {
607620 skb_unlink(skb, &priv->tdls_txq);
....@@ -642,10 +655,9 @@
642655 {
643656 struct mwifiex_ra_list_tbl *ra_list;
644657 u32 pkt_cnt = 0, tx_pkts_queued;
645
- unsigned long flags;
646658 int i;
647659
648
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock, flags);
660
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
649661
650662 for (i = 0; i < MAX_NUM_TID; ++i) {
651663 ra_list = mwifiex_wmm_get_ralist_node(priv, i, mac);
....@@ -671,7 +683,7 @@
671683 atomic_set(&priv->wmm.tx_pkts_queued, tx_pkts_queued);
672684 atomic_set(&priv->wmm.highest_queued_prio, HIGH_PRIO_TID);
673685 }
674
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags);
686
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
675687 }
676688
677689 /* This function updates non-tdls peer ralist tx_pause while
....@@ -682,10 +694,9 @@
682694 {
683695 struct mwifiex_ra_list_tbl *ra_list;
684696 u32 pkt_cnt = 0, tx_pkts_queued;
685
- unsigned long flags;
686697 int i;
687698
688
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock, flags);
699
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
689700
690701 for (i = 0; i < MAX_NUM_TID; ++i) {
691702 list_for_each_entry(ra_list, &priv->wmm.tid_tbl_ptr[i].ra_list,
....@@ -716,7 +727,7 @@
716727 atomic_set(&priv->wmm.tx_pkts_queued, tx_pkts_queued);
717728 atomic_set(&priv->wmm.highest_queued_prio, HIGH_PRIO_TID);
718729 }
719
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags);
730
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
720731 }
721732
722733 /*
....@@ -748,10 +759,9 @@
748759 mwifiex_wmm_del_peer_ra_list(struct mwifiex_private *priv, const u8 *ra_addr)
749760 {
750761 struct mwifiex_ra_list_tbl *ra_list;
751
- unsigned long flags;
752762 int i;
753763
754
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock, flags);
764
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
755765
756766 for (i = 0; i < MAX_NUM_TID; ++i) {
757767 ra_list = mwifiex_wmm_get_ralist_node(priv, i, ra_addr);
....@@ -767,7 +777,7 @@
767777 list_del(&ra_list->list);
768778 kfree(ra_list);
769779 }
770
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags);
780
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
771781 }
772782
773783 /*
....@@ -818,7 +828,6 @@
818828 u32 tid;
819829 struct mwifiex_ra_list_tbl *ra_list;
820830 u8 ra[ETH_ALEN], tid_down;
821
- unsigned long flags;
822831 struct list_head list_head;
823832 int tdls_status = TDLS_NOT_SETUP;
824833 struct ethhdr *eth_hdr = (struct ethhdr *)skb->data;
....@@ -844,7 +853,7 @@
844853
845854 tid = skb->priority;
846855
847
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock, flags);
856
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
848857
849858 tid_down = mwifiex_wmm_downgrade_tid(priv, tid);
850859
....@@ -864,8 +873,7 @@
864873 break;
865874 case TDLS_SETUP_INPROGRESS:
866875 skb_queue_tail(&priv->tdls_txq, skb);
867
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
868
- flags);
876
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
869877 return;
870878 default:
871879 list_head = priv->wmm.tid_tbl_ptr[tid_down].ra_list;
....@@ -881,7 +889,7 @@
881889 }
882890
883891 if (!ra_list) {
884
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags);
892
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
885893 mwifiex_write_data_complete(adapter, skb, 0, -1);
886894 return;
887895 }
....@@ -901,7 +909,7 @@
901909 else
902910 atomic_inc(&priv->wmm.tx_pkts_queued);
903911
904
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags);
912
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
905913 }
906914
907915 /*
....@@ -1096,7 +1104,6 @@
10961104 struct mwifiex_ra_list_tbl *ptr;
10971105 struct mwifiex_tid_tbl *tid_ptr;
10981106 atomic_t *hqp;
1099
- unsigned long flags_ra;
11001107 int i, j;
11011108
11021109 /* check the BSS with highest priority first */
....@@ -1122,8 +1129,7 @@
11221129 hqp = &priv_tmp->wmm.highest_queued_prio;
11231130 for (i = atomic_read(hqp); i >= LOW_PRIO_TID; --i) {
11241131
1125
- spin_lock_irqsave(&priv_tmp->wmm.
1126
- ra_list_spinlock, flags_ra);
1132
+ spin_lock_bh(&priv_tmp->wmm.ra_list_spinlock);
11271133
11281134 tid_ptr = &(priv_tmp)->wmm.
11291135 tid_tbl_ptr[tos_to_tid[i]];
....@@ -1138,9 +1144,7 @@
11381144 goto found;
11391145 }
11401146
1141
- spin_unlock_irqrestore(&priv_tmp->wmm.
1142
- ra_list_spinlock,
1143
- flags_ra);
1147
+ spin_unlock_bh(&priv_tmp->wmm.ra_list_spinlock);
11441148 }
11451149
11461150 if (atomic_read(&priv_tmp->wmm.tx_pkts_queued) != 0) {
....@@ -1162,7 +1166,7 @@
11621166 /* holds ra_list_spinlock */
11631167 if (atomic_read(hqp) > i)
11641168 atomic_set(hqp, i);
1165
- spin_unlock_irqrestore(&priv_tmp->wmm.ra_list_spinlock, flags_ra);
1169
+ spin_unlock_bh(&priv_tmp->wmm.ra_list_spinlock);
11661170
11671171 *priv = priv_tmp;
11681172 *tid = tos_to_tid[i];
....@@ -1186,24 +1190,23 @@
11861190 struct mwifiex_adapter *adapter = priv->adapter;
11871191 struct mwifiex_bss_prio_tbl *tbl = adapter->bss_prio_tbl;
11881192 struct mwifiex_tid_tbl *tid_ptr = &priv->wmm.tid_tbl_ptr[tid];
1189
- unsigned long flags;
11901193
1191
- spin_lock_irqsave(&tbl[priv->bss_priority].bss_prio_lock, flags);
1194
+ spin_lock_bh(&tbl[priv->bss_priority].bss_prio_lock);
11921195 /*
11931196 * dirty trick: we remove 'head' temporarily and reinsert it after
11941197 * curr bss node. imagine list to stay fixed while head is moved
11951198 */
11961199 list_move(&tbl[priv->bss_priority].bss_prio_head,
11971200 &tbl[priv->bss_priority].bss_prio_cur->list);
1198
- spin_unlock_irqrestore(&tbl[priv->bss_priority].bss_prio_lock, flags);
1201
+ spin_unlock_bh(&tbl[priv->bss_priority].bss_prio_lock);
11991202
1200
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock, flags);
1203
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
12011204 if (mwifiex_is_ralist_valid(priv, ra, tid)) {
12021205 priv->wmm.packets_out[tid]++;
12031206 /* same as above */
12041207 list_move(&tid_ptr->ra_list, &ra->list);
12051208 }
1206
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags);
1209
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
12071210 }
12081211
12091212 /*
....@@ -1240,8 +1243,7 @@
12401243 */
12411244 static void
12421245 mwifiex_send_single_packet(struct mwifiex_private *priv,
1243
- struct mwifiex_ra_list_tbl *ptr, int ptr_index,
1244
- unsigned long ra_list_flags)
1246
+ struct mwifiex_ra_list_tbl *ptr, int ptr_index)
12451247 __releases(&priv->wmm.ra_list_spinlock)
12461248 {
12471249 struct sk_buff *skb, *skb_next;
....@@ -1250,8 +1252,7 @@
12501252 struct mwifiex_txinfo *tx_info;
12511253
12521254 if (skb_queue_empty(&ptr->skb_head)) {
1253
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
1254
- ra_list_flags);
1255
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
12551256 mwifiex_dbg(adapter, DATA, "data: nothing to send\n");
12561257 return;
12571258 }
....@@ -1269,18 +1270,17 @@
12691270 else
12701271 skb_next = NULL;
12711272
1272
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, ra_list_flags);
1273
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
12731274
12741275 tx_param.next_pkt_len = ((skb_next) ? skb_next->len +
12751276 sizeof(struct txpd) : 0);
12761277
12771278 if (mwifiex_process_tx(priv, skb, &tx_param) == -EBUSY) {
12781279 /* Queue the packet back at the head */
1279
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock, ra_list_flags);
1280
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
12801281
12811282 if (!mwifiex_is_ralist_valid(priv, ptr, ptr_index)) {
1282
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
1283
- ra_list_flags);
1283
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
12841284 mwifiex_write_data_complete(adapter, skb, 0, -1);
12851285 return;
12861286 }
....@@ -1290,8 +1290,7 @@
12901290 ptr->total_pkt_count++;
12911291 ptr->ba_pkt_count++;
12921292 tx_info->flags |= MWIFIEX_BUF_FLAG_REQUEUED_PKT;
1293
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
1294
- ra_list_flags);
1293
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
12951294 } else {
12961295 mwifiex_rotate_priolists(priv, ptr, ptr_index);
12971296 atomic_dec(&priv->wmm.tx_pkts_queued);
....@@ -1327,8 +1326,7 @@
13271326 */
13281327 static void
13291328 mwifiex_send_processed_packet(struct mwifiex_private *priv,
1330
- struct mwifiex_ra_list_tbl *ptr, int ptr_index,
1331
- unsigned long ra_list_flags)
1329
+ struct mwifiex_ra_list_tbl *ptr, int ptr_index)
13321330 __releases(&priv->wmm.ra_list_spinlock)
13331331 {
13341332 struct mwifiex_tx_param tx_param;
....@@ -1338,8 +1336,7 @@
13381336 struct mwifiex_txinfo *tx_info;
13391337
13401338 if (skb_queue_empty(&ptr->skb_head)) {
1341
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
1342
- ra_list_flags);
1339
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
13431340 return;
13441341 }
13451342
....@@ -1347,8 +1344,7 @@
13471344
13481345 if (adapter->data_sent || adapter->tx_lock_flag) {
13491346 ptr->total_pkt_count--;
1350
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
1351
- ra_list_flags);
1347
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
13521348 skb_queue_tail(&adapter->tx_data_q, skb);
13531349 atomic_dec(&priv->wmm.tx_pkts_queued);
13541350 atomic_inc(&adapter->tx_queued);
....@@ -1362,7 +1358,7 @@
13621358
13631359 tx_info = MWIFIEX_SKB_TXCB(skb);
13641360
1365
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, ra_list_flags);
1361
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
13661362
13671363 tx_param.next_pkt_len =
13681364 ((skb_next) ? skb_next->len +
....@@ -1378,11 +1374,10 @@
13781374 switch (ret) {
13791375 case -EBUSY:
13801376 mwifiex_dbg(adapter, ERROR, "data: -EBUSY is returned\n");
1381
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock, ra_list_flags);
1377
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
13821378
13831379 if (!mwifiex_is_ralist_valid(priv, ptr, ptr_index)) {
1384
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
1385
- ra_list_flags);
1380
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
13861381 mwifiex_write_data_complete(adapter, skb, 0, -1);
13871382 return;
13881383 }
....@@ -1390,8 +1385,7 @@
13901385 skb_queue_tail(&ptr->skb_head, skb);
13911386
13921387 tx_info->flags |= MWIFIEX_BUF_FLAG_REQUEUED_PKT;
1393
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
1394
- ra_list_flags);
1388
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
13951389 break;
13961390 case -1:
13971391 mwifiex_dbg(adapter, ERROR, "host_to_card failed: %#x\n", ret);
....@@ -1408,10 +1402,9 @@
14081402 if (ret != -EBUSY) {
14091403 mwifiex_rotate_priolists(priv, ptr, ptr_index);
14101404 atomic_dec(&priv->wmm.tx_pkts_queued);
1411
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock, ra_list_flags);
1405
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
14121406 ptr->total_pkt_count--;
1413
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
1414
- ra_list_flags);
1407
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
14151408 }
14161409 }
14171410
....@@ -1427,7 +1420,6 @@
14271420 int ptr_index = 0;
14281421 u8 ra[ETH_ALEN];
14291422 int tid_del = 0, tid = 0;
1430
- unsigned long flags;
14311423
14321424 ptr = mwifiex_wmm_get_highest_priolist_ptr(adapter, &priv, &ptr_index);
14331425 if (!ptr)
....@@ -1437,14 +1429,14 @@
14371429
14381430 mwifiex_dbg(adapter, DATA, "data: tid=%d\n", tid);
14391431
1440
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock, flags);
1432
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
14411433 if (!mwifiex_is_ralist_valid(priv, ptr, ptr_index)) {
1442
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags);
1434
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
14431435 return -1;
14441436 }
14451437
14461438 if (mwifiex_is_ptr_processed(priv, ptr)) {
1447
- mwifiex_send_processed_packet(priv, ptr, ptr_index, flags);
1439
+ mwifiex_send_processed_packet(priv, ptr, ptr_index);
14481440 /* ra_list_spinlock has been freed in
14491441 mwifiex_send_processed_packet() */
14501442 return 0;
....@@ -1459,12 +1451,12 @@
14591451 mwifiex_is_amsdu_allowed(priv, tid) &&
14601452 mwifiex_is_11n_aggragation_possible(priv, ptr,
14611453 adapter->tx_buf_size))
1462
- mwifiex_11n_aggregate_pkt(priv, ptr, ptr_index, flags);
1454
+ mwifiex_11n_aggregate_pkt(priv, ptr, ptr_index);
14631455 /* ra_list_spinlock has been freed in
14641456 * mwifiex_11n_aggregate_pkt()
14651457 */
14661458 else
1467
- mwifiex_send_single_packet(priv, ptr, ptr_index, flags);
1459
+ mwifiex_send_single_packet(priv, ptr, ptr_index);
14681460 /* ra_list_spinlock has been freed in
14691461 * mwifiex_send_single_packet()
14701462 */
....@@ -1485,11 +1477,11 @@
14851477 if (mwifiex_is_amsdu_allowed(priv, tid) &&
14861478 mwifiex_is_11n_aggragation_possible(priv, ptr,
14871479 adapter->tx_buf_size))
1488
- mwifiex_11n_aggregate_pkt(priv, ptr, ptr_index, flags);
1480
+ mwifiex_11n_aggregate_pkt(priv, ptr, ptr_index);
14891481 /* ra_list_spinlock has been freed in
14901482 mwifiex_11n_aggregate_pkt() */
14911483 else
1492
- mwifiex_send_single_packet(priv, ptr, ptr_index, flags);
1484
+ mwifiex_send_single_packet(priv, ptr, ptr_index);
14931485 /* ra_list_spinlock has been freed in
14941486 mwifiex_send_single_packet() */
14951487 }