forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/net/wireless/marvell/mwifiex/tdls.c
....@@ -1,9 +1,10 @@
1
-/* Marvell Wireless LAN device driver: TDLS handling
1
+/*
2
+ * NXP Wireless LAN device driver: TDLS handling
23 *
3
- * Copyright (C) 2014, Marvell International Ltd.
4
+ * Copyright 2011-2020 NXP
45 *
5
- * This software file (the "File") is distributed by Marvell International
6
- * 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
78 * (the "License"). You may use, redistribute and/or modify this File in
89 * accordance with the terms and conditions of the License, a copy of which
910 * is available on the worldwide web at
....@@ -33,12 +34,11 @@
3334 struct list_head *tid_list;
3435 struct sk_buff *skb, *tmp;
3536 struct mwifiex_txinfo *tx_info;
36
- unsigned long flags;
3737 u32 tid;
3838 u8 tid_down;
3939
4040 mwifiex_dbg(priv->adapter, DATA, "%s: %pM\n", __func__, mac);
41
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock, flags);
41
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
4242
4343 skb_queue_walk_safe(&priv->tdls_txq, skb, tmp) {
4444 if (!ether_addr_equal(mac, skb->data))
....@@ -78,7 +78,7 @@
7878 atomic_inc(&priv->wmm.tx_pkts_queued);
7979 }
8080
81
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags);
81
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
8282 return;
8383 }
8484
....@@ -88,11 +88,10 @@
8888 struct mwifiex_ra_list_tbl *ra_list;
8989 struct list_head *ra_list_head;
9090 struct sk_buff *skb, *tmp;
91
- unsigned long flags;
9291 int i;
9392
9493 mwifiex_dbg(priv->adapter, DATA, "%s: %pM\n", __func__, mac);
95
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock, flags);
94
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
9695
9796 for (i = 0; i < MAX_NUM_TID; i++) {
9897 if (!list_empty(&priv->wmm.tid_tbl_ptr[i].ra_list)) {
....@@ -111,7 +110,7 @@
111110 }
112111 }
113112
114
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags);
113
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
115114 return;
116115 }
117116
....@@ -733,10 +732,10 @@
733732 u16 status_code, struct sk_buff *skb)
734733 {
735734 struct ieee80211_mgmt *mgmt;
736
- u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
737735 int ret;
738736 u16 capab;
739737 struct ieee80211_ht_cap *ht_cap;
738
+ unsigned int extra;
740739 u8 radio, *pos;
741740
742741 capab = priv->curr_bss_params.bss_descriptor.cap_info_bitmap;
....@@ -755,7 +754,10 @@
755754
756755 switch (action_code) {
757756 case WLAN_PUB_ACTION_TDLS_DISCOVER_RES:
758
- skb_put(skb, sizeof(mgmt->u.action.u.tdls_discover_resp) + 1);
757
+ /* See the layout of 'struct ieee80211_mgmt'. */
758
+ extra = sizeof(mgmt->u.action.u.tdls_discover_resp) +
759
+ sizeof(mgmt->u.action.category);
760
+ skb_put(skb, extra);
759761 mgmt->u.action.category = WLAN_CATEGORY_PUBLIC;
760762 mgmt->u.action.u.tdls_discover_resp.action_code =
761763 WLAN_PUB_ACTION_TDLS_DISCOVER_RES;
....@@ -764,10 +766,9 @@
764766 mgmt->u.action.u.tdls_discover_resp.capability =
765767 cpu_to_le16(capab);
766768 /* move back for addr4 */
767
- memmove(pos + ETH_ALEN, &mgmt->u.action.category,
768
- sizeof(mgmt->u.action.u.tdls_discover_resp));
769
+ memmove(pos + ETH_ALEN, &mgmt->u.action, extra);
769770 /* init address 4 */
770
- memcpy(pos, bc_addr, ETH_ALEN);
771
+ eth_broadcast_addr(pos);
771772
772773 ret = mwifiex_tdls_append_rates_ie(priv, skb);
773774 if (ret) {
....@@ -1109,7 +1110,6 @@
11091110 {
11101111 struct mwifiex_sta_node *sta_ptr;
11111112 struct mwifiex_ds_tdls_oper tdls_oper;
1112
- unsigned long flags;
11131113
11141114 memset(&tdls_oper, 0, sizeof(struct mwifiex_ds_tdls_oper));
11151115 sta_ptr = mwifiex_get_sta_entry(priv, peer);
....@@ -1117,11 +1117,9 @@
11171117 if (sta_ptr) {
11181118 if (sta_ptr->is_11n_enabled) {
11191119 mwifiex_11n_cleanup_reorder_tbl(priv);
1120
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock,
1121
- flags);
1120
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
11221121 mwifiex_11n_delete_all_tx_ba_stream_tbl(priv);
1123
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
1124
- flags);
1122
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
11251123 }
11261124 mwifiex_del_sta_entry(priv, peer);
11271125 }
....@@ -1139,7 +1137,6 @@
11391137 {
11401138 struct mwifiex_sta_node *sta_ptr;
11411139 struct ieee80211_mcs_info mcs;
1142
- unsigned long flags;
11431140 int i;
11441141
11451142 sta_ptr = mwifiex_get_sta_entry(priv, peer);
....@@ -1184,11 +1181,9 @@
11841181 "tdls: enable link %pM failed\n", peer);
11851182 if (sta_ptr) {
11861183 mwifiex_11n_cleanup_reorder_tbl(priv);
1187
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock,
1188
- flags);
1184
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
11891185 mwifiex_11n_delete_all_tx_ba_stream_tbl(priv);
1190
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
1191
- flags);
1186
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
11921187 mwifiex_del_sta_entry(priv, peer);
11931188 }
11941189 mwifiex_restore_tdls_packets(priv, peer, TDLS_LINK_TEARDOWN);
....@@ -1233,7 +1228,6 @@
12331228 struct mwifiex_sta_node *sta_ptr;
12341229 struct tdls_peer_info *peer = buf;
12351230 int count = 0;
1236
- unsigned long flags;
12371231
12381232 if (!ISSUPP_TDLS_ENABLED(priv->adapter->fw_cap_info))
12391233 return 0;
....@@ -1242,7 +1236,7 @@
12421236 if (!(priv->bss_type == MWIFIEX_BSS_TYPE_STA && priv->media_connected))
12431237 return 0;
12441238
1245
- spin_lock_irqsave(&priv->sta_list_spinlock, flags);
1239
+ spin_lock_bh(&priv->sta_list_spinlock);
12461240 list_for_each_entry(sta_ptr, &priv->sta_list, list) {
12471241 if (mwifiex_is_tdls_link_setup(sta_ptr->tdls_status)) {
12481242 ether_addr_copy(peer->peer_addr, sta_ptr->mac_addr);
....@@ -1252,7 +1246,7 @@
12521246 break;
12531247 }
12541248 }
1255
- spin_unlock_irqrestore(&priv->sta_list_spinlock, flags);
1249
+ spin_unlock_bh(&priv->sta_list_spinlock);
12561250
12571251 return count;
12581252 }
....@@ -1261,7 +1255,6 @@
12611255 {
12621256 struct mwifiex_sta_node *sta_ptr;
12631257 struct mwifiex_ds_tdls_oper tdls_oper;
1264
- unsigned long flags;
12651258
12661259 if (list_empty(&priv->sta_list))
12671260 return;
....@@ -1271,11 +1264,9 @@
12711264
12721265 if (sta_ptr->is_11n_enabled) {
12731266 mwifiex_11n_cleanup_reorder_tbl(priv);
1274
- spin_lock_irqsave(&priv->wmm.ra_list_spinlock,
1275
- flags);
1267
+ spin_lock_bh(&priv->wmm.ra_list_spinlock);
12761268 mwifiex_11n_delete_all_tx_ba_stream_tbl(priv);
1277
- spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
1278
- flags);
1269
+ spin_unlock_bh(&priv->wmm.ra_list_spinlock);
12791270 }
12801271
12811272 mwifiex_restore_tdls_packets(priv, sta_ptr->mac_addr,
....@@ -1295,12 +1286,11 @@
12951286 int mwifiex_tdls_check_tx(struct mwifiex_private *priv, struct sk_buff *skb)
12961287 {
12971288 struct mwifiex_auto_tdls_peer *peer;
1298
- unsigned long flags;
12991289 u8 mac[ETH_ALEN];
13001290
13011291 ether_addr_copy(mac, skb->data);
13021292
1303
- spin_lock_irqsave(&priv->auto_tdls_lock, flags);
1293
+ spin_lock_bh(&priv->auto_tdls_lock);
13041294 list_for_each_entry(peer, &priv->auto_tdls_list, list) {
13051295 if (!memcmp(mac, peer->mac_addr, ETH_ALEN)) {
13061296 if (peer->rssi <= MWIFIEX_TDLS_RSSI_HIGH &&
....@@ -1329,7 +1319,7 @@
13291319 }
13301320 }
13311321 }
1332
- spin_unlock_irqrestore(&priv->auto_tdls_lock, flags);
1322
+ spin_unlock_bh(&priv->auto_tdls_lock);
13331323
13341324 return 0;
13351325 }
....@@ -1337,33 +1327,31 @@
13371327 void mwifiex_flush_auto_tdls_list(struct mwifiex_private *priv)
13381328 {
13391329 struct mwifiex_auto_tdls_peer *peer, *tmp_node;
1340
- unsigned long flags;
13411330
1342
- spin_lock_irqsave(&priv->auto_tdls_lock, flags);
1331
+ spin_lock_bh(&priv->auto_tdls_lock);
13431332 list_for_each_entry_safe(peer, tmp_node, &priv->auto_tdls_list, list) {
13441333 list_del(&peer->list);
13451334 kfree(peer);
13461335 }
13471336
13481337 INIT_LIST_HEAD(&priv->auto_tdls_list);
1349
- spin_unlock_irqrestore(&priv->auto_tdls_lock, flags);
1338
+ spin_unlock_bh(&priv->auto_tdls_lock);
13501339 priv->check_tdls_tx = false;
13511340 }
13521341
13531342 void mwifiex_add_auto_tdls_peer(struct mwifiex_private *priv, const u8 *mac)
13541343 {
13551344 struct mwifiex_auto_tdls_peer *tdls_peer;
1356
- unsigned long flags;
13571345
13581346 if (!priv->adapter->auto_tdls)
13591347 return;
13601348
1361
- spin_lock_irqsave(&priv->auto_tdls_lock, flags);
1349
+ spin_lock_bh(&priv->auto_tdls_lock);
13621350 list_for_each_entry(tdls_peer, &priv->auto_tdls_list, list) {
13631351 if (!memcmp(tdls_peer->mac_addr, mac, ETH_ALEN)) {
13641352 tdls_peer->tdls_status = TDLS_SETUP_INPROGRESS;
13651353 tdls_peer->rssi_jiffies = jiffies;
1366
- spin_unlock_irqrestore(&priv->auto_tdls_lock, flags);
1354
+ spin_unlock_bh(&priv->auto_tdls_lock);
13671355 return;
13681356 }
13691357 }
....@@ -1380,19 +1368,18 @@
13801368 "Add auto TDLS peer= %pM to list\n", mac);
13811369 }
13821370
1383
- spin_unlock_irqrestore(&priv->auto_tdls_lock, flags);
1371
+ spin_unlock_bh(&priv->auto_tdls_lock);
13841372 }
13851373
13861374 void mwifiex_auto_tdls_update_peer_status(struct mwifiex_private *priv,
13871375 const u8 *mac, u8 link_status)
13881376 {
13891377 struct mwifiex_auto_tdls_peer *peer;
1390
- unsigned long flags;
13911378
13921379 if (!priv->adapter->auto_tdls)
13931380 return;
13941381
1395
- spin_lock_irqsave(&priv->auto_tdls_lock, flags);
1382
+ spin_lock_bh(&priv->auto_tdls_lock);
13961383 list_for_each_entry(peer, &priv->auto_tdls_list, list) {
13971384 if (!memcmp(peer->mac_addr, mac, ETH_ALEN)) {
13981385 if ((link_status == TDLS_NOT_SETUP) &&
....@@ -1405,19 +1392,18 @@
14051392 break;
14061393 }
14071394 }
1408
- spin_unlock_irqrestore(&priv->auto_tdls_lock, flags);
1395
+ spin_unlock_bh(&priv->auto_tdls_lock);
14091396 }
14101397
14111398 void mwifiex_auto_tdls_update_peer_signal(struct mwifiex_private *priv,
14121399 u8 *mac, s8 snr, s8 nflr)
14131400 {
14141401 struct mwifiex_auto_tdls_peer *peer;
1415
- unsigned long flags;
14161402
14171403 if (!priv->adapter->auto_tdls)
14181404 return;
14191405
1420
- spin_lock_irqsave(&priv->auto_tdls_lock, flags);
1406
+ spin_lock_bh(&priv->auto_tdls_lock);
14211407 list_for_each_entry(peer, &priv->auto_tdls_list, list) {
14221408 if (!memcmp(peer->mac_addr, mac, ETH_ALEN)) {
14231409 peer->rssi = nflr - snr;
....@@ -1425,14 +1411,13 @@
14251411 break;
14261412 }
14271413 }
1428
- spin_unlock_irqrestore(&priv->auto_tdls_lock, flags);
1414
+ spin_unlock_bh(&priv->auto_tdls_lock);
14291415 }
14301416
14311417 void mwifiex_check_auto_tdls(struct timer_list *t)
14321418 {
14331419 struct mwifiex_private *priv = from_timer(priv, t, auto_tdls_timer);
14341420 struct mwifiex_auto_tdls_peer *tdls_peer;
1435
- unsigned long flags;
14361421 u16 reason = WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED;
14371422
14381423 if (WARN_ON_ONCE(!priv || !priv->adapter)) {
....@@ -1452,7 +1437,7 @@
14521437
14531438 priv->check_tdls_tx = false;
14541439
1455
- spin_lock_irqsave(&priv->auto_tdls_lock, flags);
1440
+ spin_lock_bh(&priv->auto_tdls_lock);
14561441 list_for_each_entry(tdls_peer, &priv->auto_tdls_list, list) {
14571442 if ((jiffies - tdls_peer->rssi_jiffies) >
14581443 (MWIFIEX_AUTO_TDLS_IDLE_TIME * HZ)) {
....@@ -1487,7 +1472,7 @@
14871472 tdls_peer->rssi);
14881473 }
14891474 }
1490
- spin_unlock_irqrestore(&priv->auto_tdls_lock, flags);
1475
+ spin_unlock_bh(&priv->auto_tdls_lock);
14911476
14921477 mod_timer(&priv->auto_tdls_timer,
14931478 jiffies + msecs_to_jiffies(MWIFIEX_TIMER_10S));