forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/net/wireless/marvell/mwifiex/cmdevt.c
....@@ -1,10 +1,10 @@
11 /*
2
- * Marvell Wireless LAN device driver: commands and events
2
+ * NXP Wireless LAN device driver: commands and events
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,10 +39,11 @@
3939 static void
4040 mwifiex_init_cmd_node(struct mwifiex_private *priv,
4141 struct cmd_ctrl_node *cmd_node,
42
- u32 cmd_oid, void *data_buf, bool sync)
42
+ u32 cmd_no, void *data_buf, bool sync)
4343 {
4444 cmd_node->priv = priv;
45
- cmd_node->cmd_oid = cmd_oid;
45
+ cmd_node->cmd_no = cmd_no;
46
+
4647 if (sync) {
4748 cmd_node->wait_q_enabled = true;
4849 cmd_node->cmd_wait_q_woken = false;
....@@ -60,19 +61,18 @@
6061 mwifiex_get_cmd_node(struct mwifiex_adapter *adapter)
6162 {
6263 struct cmd_ctrl_node *cmd_node;
63
- unsigned long flags;
6464
65
- spin_lock_irqsave(&adapter->cmd_free_q_lock, flags);
65
+ spin_lock_bh(&adapter->cmd_free_q_lock);
6666 if (list_empty(&adapter->cmd_free_q)) {
6767 mwifiex_dbg(adapter, ERROR,
6868 "GET_CMD_NODE: cmd node not available\n");
69
- spin_unlock_irqrestore(&adapter->cmd_free_q_lock, flags);
69
+ spin_unlock_bh(&adapter->cmd_free_q_lock);
7070 return NULL;
7171 }
7272 cmd_node = list_first_entry(&adapter->cmd_free_q,
7373 struct cmd_ctrl_node, list);
7474 list_del(&cmd_node->list);
75
- spin_unlock_irqrestore(&adapter->cmd_free_q_lock, flags);
75
+ spin_unlock_bh(&adapter->cmd_free_q_lock);
7676
7777 return cmd_node;
7878 }
....@@ -92,7 +92,7 @@
9292 mwifiex_clean_cmd_node(struct mwifiex_adapter *adapter,
9393 struct cmd_ctrl_node *cmd_node)
9494 {
95
- cmd_node->cmd_oid = 0;
95
+ cmd_node->cmd_no = 0;
9696 cmd_node->cmd_flag = 0;
9797 cmd_node->data_buf = NULL;
9898 cmd_node->wait_q_enabled = false;
....@@ -116,8 +116,6 @@
116116 mwifiex_insert_cmd_to_free_q(struct mwifiex_adapter *adapter,
117117 struct cmd_ctrl_node *cmd_node)
118118 {
119
- unsigned long flags;
120
-
121119 if (!cmd_node)
122120 return;
123121
....@@ -127,9 +125,9 @@
127125 mwifiex_clean_cmd_node(adapter, cmd_node);
128126
129127 /* Insert node into cmd_free_q */
130
- spin_lock_irqsave(&adapter->cmd_free_q_lock, flags);
128
+ spin_lock_bh(&adapter->cmd_free_q_lock);
131129 list_add_tail(&cmd_node->list, &adapter->cmd_free_q);
132
- spin_unlock_irqrestore(&adapter->cmd_free_q_lock, flags);
130
+ spin_unlock_bh(&adapter->cmd_free_q_lock);
133131 }
134132
135133 /* This function reuses a command node. */
....@@ -182,7 +180,6 @@
182180 struct host_cmd_ds_command *host_cmd;
183181 uint16_t cmd_code;
184182 uint16_t cmd_size;
185
- unsigned long flags;
186183
187184 if (!adapter || !cmd_node)
188185 return -1;
....@@ -201,6 +198,7 @@
201198 }
202199
203200 cmd_code = le16_to_cpu(host_cmd->command);
201
+ cmd_node->cmd_no = cmd_code;
204202 cmd_size = le16_to_cpu(host_cmd->size);
205203
206204 if (adapter->hw_status == MWIFIEX_HW_STATUS_RESET &&
....@@ -221,9 +219,9 @@
221219 cmd_node->priv->bss_num,
222220 cmd_node->priv->bss_type));
223221
224
- spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags);
222
+ spin_lock_bh(&adapter->mwifiex_cmd_lock);
225223 adapter->curr_cmd = cmd_node;
226
- spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags);
224
+ spin_unlock_bh(&adapter->mwifiex_cmd_lock);
227225
228226 /* Adjust skb length */
229227 if (cmd_node->cmd_skb->len > cmd_size)
....@@ -274,9 +272,9 @@
274272 adapter->cmd_wait_q.status = -1;
275273 mwifiex_recycle_cmd_node(adapter, adapter->curr_cmd);
276274
277
- spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags);
275
+ spin_lock_bh(&adapter->mwifiex_cmd_lock);
278276 adapter->curr_cmd = NULL;
279
- spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags);
277
+ spin_unlock_bh(&adapter->mwifiex_cmd_lock);
280278
281279 adapter->dbg.num_cmd_host_to_card_failure++;
282280 return -1;
....@@ -341,6 +339,12 @@
341339 sleep_cfm_tmp =
342340 dev_alloc_skb(sizeof(struct mwifiex_opt_sleep_confirm)
343341 + MWIFIEX_TYPE_LEN);
342
+ if (!sleep_cfm_tmp) {
343
+ mwifiex_dbg(adapter, ERROR,
344
+ "SLEEP_CFM: dev_alloc_skb failed\n");
345
+ return -ENOMEM;
346
+ }
347
+
344348 skb_put(sleep_cfm_tmp, sizeof(struct mwifiex_opt_sleep_confirm)
345349 + MWIFIEX_TYPE_LEN);
346350 put_unaligned_le32(MWIFIEX_USB_TYPE_CMD, sleep_cfm_tmp->data);
....@@ -615,7 +619,7 @@
615619 }
616620
617621 /* Initialize the command node */
618
- mwifiex_init_cmd_node(priv, cmd_node, cmd_oid, data_buf, sync);
622
+ mwifiex_init_cmd_node(priv, cmd_node, cmd_no, data_buf, sync);
619623
620624 if (!cmd_node->cmd_skb) {
621625 mwifiex_dbg(adapter, ERROR,
....@@ -689,7 +693,6 @@
689693 {
690694 struct host_cmd_ds_command *host_cmd = NULL;
691695 u16 command;
692
- unsigned long flags;
693696 bool add_tail = true;
694697
695698 host_cmd = (struct host_cmd_ds_command *) (cmd_node->cmd_skb->data);
....@@ -711,12 +714,12 @@
711714 }
712715 }
713716
714
- spin_lock_irqsave(&adapter->cmd_pending_q_lock, flags);
717
+ spin_lock_bh(&adapter->cmd_pending_q_lock);
715718 if (add_tail)
716719 list_add_tail(&cmd_node->list, &adapter->cmd_pending_q);
717720 else
718721 list_add(&cmd_node->list, &adapter->cmd_pending_q);
719
- spin_unlock_irqrestore(&adapter->cmd_pending_q_lock, flags);
722
+ spin_unlock_bh(&adapter->cmd_pending_q_lock);
720723
721724 atomic_inc(&adapter->cmd_pending);
722725 mwifiex_dbg(adapter, CMD,
....@@ -741,8 +744,6 @@
741744 struct cmd_ctrl_node *cmd_node;
742745 int ret = 0;
743746 struct host_cmd_ds_command *host_cmd;
744
- unsigned long cmd_flags;
745
- unsigned long cmd_pending_q_flags;
746747
747748 /* Check if already in processing */
748749 if (adapter->curr_cmd) {
....@@ -751,13 +752,12 @@
751752 return -1;
752753 }
753754
754
- spin_lock_irqsave(&adapter->mwifiex_cmd_lock, cmd_flags);
755
+ spin_lock_bh(&adapter->mwifiex_cmd_lock);
755756 /* Check if any command is pending */
756
- spin_lock_irqsave(&adapter->cmd_pending_q_lock, cmd_pending_q_flags);
757
+ spin_lock_bh(&adapter->cmd_pending_q_lock);
757758 if (list_empty(&adapter->cmd_pending_q)) {
758
- spin_unlock_irqrestore(&adapter->cmd_pending_q_lock,
759
- cmd_pending_q_flags);
760
- spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags);
759
+ spin_unlock_bh(&adapter->cmd_pending_q_lock);
760
+ spin_unlock_bh(&adapter->mwifiex_cmd_lock);
761761 return 0;
762762 }
763763 cmd_node = list_first_entry(&adapter->cmd_pending_q,
....@@ -770,17 +770,15 @@
770770 mwifiex_dbg(adapter, ERROR,
771771 "%s: cannot send cmd in sleep state,\t"
772772 "this should not happen\n", __func__);
773
- spin_unlock_irqrestore(&adapter->cmd_pending_q_lock,
774
- cmd_pending_q_flags);
775
- spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags);
773
+ spin_unlock_bh(&adapter->cmd_pending_q_lock);
774
+ spin_unlock_bh(&adapter->mwifiex_cmd_lock);
776775 return ret;
777776 }
778777
779778 list_del(&cmd_node->list);
780
- spin_unlock_irqrestore(&adapter->cmd_pending_q_lock,
781
- cmd_pending_q_flags);
779
+ spin_unlock_bh(&adapter->cmd_pending_q_lock);
782780
783
- spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags);
781
+ spin_unlock_bh(&adapter->mwifiex_cmd_lock);
784782 ret = mwifiex_dnld_cmd_to_fw(priv, cmd_node);
785783 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
786784 /* Any command sent to the firmware when host is in sleep
....@@ -814,10 +812,6 @@
814812 uint16_t orig_cmdresp_no;
815813 uint16_t cmdresp_no;
816814 uint16_t cmdresp_result;
817
- unsigned long flags;
818
-
819
- /* Now we got response from FW, cancel the command timer */
820
- del_timer_sync(&adapter->cmd_timer);
821815
822816 if (!adapter->curr_cmd || !adapter->curr_cmd->resp_skb) {
823817 resp = (struct host_cmd_ds_command *) adapter->upld_buf;
....@@ -827,9 +821,20 @@
827821 return -1;
828822 }
829823
824
+ resp = (struct host_cmd_ds_command *)adapter->curr_cmd->resp_skb->data;
825
+ orig_cmdresp_no = le16_to_cpu(resp->command);
826
+ cmdresp_no = (orig_cmdresp_no & HostCmd_CMD_ID_MASK);
827
+
828
+ if (adapter->curr_cmd->cmd_no != cmdresp_no) {
829
+ mwifiex_dbg(adapter, ERROR,
830
+ "cmdresp error: cmd=0x%x cmd_resp=0x%x\n",
831
+ adapter->curr_cmd->cmd_no, cmdresp_no);
832
+ return -1;
833
+ }
834
+ /* Now we got response from FW, cancel the command timer */
835
+ del_timer_sync(&adapter->cmd_timer);
830836 clear_bit(MWIFIEX_IS_CMD_TIMEDOUT, &adapter->work_flags);
831837
832
- resp = (struct host_cmd_ds_command *) adapter->curr_cmd->resp_skb->data;
833838 if (adapter->curr_cmd->cmd_flag & CMD_F_HOSTCMD) {
834839 /* Copy original response back to response buffer */
835840 struct mwifiex_ds_misc_cmd *hostcmd;
....@@ -843,7 +848,6 @@
843848 memcpy(hostcmd->cmd, resp, size);
844849 }
845850 }
846
- orig_cmdresp_no = le16_to_cpu(resp->command);
847851
848852 /* Get BSS number and corresponding priv */
849853 priv = mwifiex_get_priv_by_id(adapter,
....@@ -876,9 +880,9 @@
876880 adapter->cmd_wait_q.status = -1;
877881
878882 mwifiex_recycle_cmd_node(adapter, adapter->curr_cmd);
879
- spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags);
883
+ spin_lock_bh(&adapter->mwifiex_cmd_lock);
880884 adapter->curr_cmd = NULL;
881
- spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags);
885
+ spin_unlock_bh(&adapter->mwifiex_cmd_lock);
882886 return -1;
883887 }
884888
....@@ -910,9 +914,9 @@
910914
911915 mwifiex_recycle_cmd_node(adapter, adapter->curr_cmd);
912916
913
- spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags);
917
+ spin_lock_bh(&adapter->mwifiex_cmd_lock);
914918 adapter->curr_cmd = NULL;
915
- spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags);
919
+ spin_unlock_bh(&adapter->mwifiex_cmd_lock);
916920 }
917921
918922 return ret;
....@@ -1018,17 +1022,16 @@
10181022 mwifiex_cancel_pending_scan_cmd(struct mwifiex_adapter *adapter)
10191023 {
10201024 struct cmd_ctrl_node *cmd_node = NULL, *tmp_node;
1021
- unsigned long flags;
10221025
10231026 /* Cancel all pending scan command */
1024
- spin_lock_irqsave(&adapter->scan_pending_q_lock, flags);
1027
+ spin_lock_bh(&adapter->scan_pending_q_lock);
10251028 list_for_each_entry_safe(cmd_node, tmp_node,
10261029 &adapter->scan_pending_q, list) {
10271030 list_del(&cmd_node->list);
10281031 cmd_node->wait_q_enabled = false;
10291032 mwifiex_insert_cmd_to_free_q(adapter, cmd_node);
10301033 }
1031
- spin_unlock_irqrestore(&adapter->scan_pending_q_lock, flags);
1034
+ spin_unlock_bh(&adapter->scan_pending_q_lock);
10321035 }
10331036
10341037 /*
....@@ -1042,9 +1045,8 @@
10421045 mwifiex_cancel_all_pending_cmd(struct mwifiex_adapter *adapter)
10431046 {
10441047 struct cmd_ctrl_node *cmd_node = NULL, *tmp_node;
1045
- unsigned long flags, cmd_flags;
10461048
1047
- spin_lock_irqsave(&adapter->mwifiex_cmd_lock, cmd_flags);
1049
+ spin_lock_bh(&adapter->mwifiex_cmd_lock);
10481050 /* Cancel current cmd */
10491051 if ((adapter->curr_cmd) && (adapter->curr_cmd->wait_q_enabled)) {
10501052 adapter->cmd_wait_q.status = -1;
....@@ -1053,7 +1055,7 @@
10531055 /* no recycle probably wait for response */
10541056 }
10551057 /* Cancel all pending command */
1056
- spin_lock_irqsave(&adapter->cmd_pending_q_lock, flags);
1058
+ spin_lock_bh(&adapter->cmd_pending_q_lock);
10571059 list_for_each_entry_safe(cmd_node, tmp_node,
10581060 &adapter->cmd_pending_q, list) {
10591061 list_del(&cmd_node->list);
....@@ -1062,8 +1064,8 @@
10621064 adapter->cmd_wait_q.status = -1;
10631065 mwifiex_recycle_cmd_node(adapter, cmd_node);
10641066 }
1065
- spin_unlock_irqrestore(&adapter->cmd_pending_q_lock, flags);
1066
- spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags);
1067
+ spin_unlock_bh(&adapter->cmd_pending_q_lock);
1068
+ spin_unlock_bh(&adapter->mwifiex_cmd_lock);
10671069
10681070 mwifiex_cancel_scan(adapter);
10691071 }
....@@ -1082,11 +1084,10 @@
10821084 mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter)
10831085 {
10841086 struct cmd_ctrl_node *cmd_node = NULL;
1085
- unsigned long cmd_flags;
10861087
10871088 if ((adapter->curr_cmd) &&
10881089 (adapter->curr_cmd->wait_q_enabled)) {
1089
- spin_lock_irqsave(&adapter->mwifiex_cmd_lock, cmd_flags);
1090
+ spin_lock_bh(&adapter->mwifiex_cmd_lock);
10901091 cmd_node = adapter->curr_cmd;
10911092 /* setting curr_cmd to NULL is quite dangerous, because
10921093 * mwifiex_process_cmdresp checks curr_cmd to be != NULL
....@@ -1097,7 +1098,7 @@
10971098 * at that point
10981099 */
10991100 adapter->curr_cmd = NULL;
1100
- spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags);
1101
+ spin_unlock_bh(&adapter->mwifiex_cmd_lock);
11011102
11021103 mwifiex_recycle_cmd_node(adapter, cmd_node);
11031104 }
....@@ -1494,6 +1495,7 @@
14941495 struct mwifiex_adapter *adapter = priv->adapter;
14951496 struct mwifiex_ie_types_header *tlv;
14961497 struct hw_spec_api_rev *api_rev;
1498
+ struct hw_spec_max_conn *max_conn;
14971499 u16 resp_size, api_id;
14981500 int i, left_len, parsed_len = 0;
14991501
....@@ -1580,8 +1582,21 @@
15801582 adapter->fw_api_ver =
15811583 api_rev->major_ver;
15821584 mwifiex_dbg(adapter, INFO,
1583
- "Firmware api version %d\n",
1584
- adapter->fw_api_ver);
1585
+ "Firmware api version %d.%d\n",
1586
+ adapter->fw_api_ver,
1587
+ api_rev->minor_ver);
1588
+ break;
1589
+ case UAP_FW_API_VER_ID:
1590
+ mwifiex_dbg(adapter, INFO,
1591
+ "uAP api version %d.%d\n",
1592
+ api_rev->major_ver,
1593
+ api_rev->minor_ver);
1594
+ break;
1595
+ case CHANRPT_API_VER_ID:
1596
+ mwifiex_dbg(adapter, INFO,
1597
+ "channel report api version %d.%d\n",
1598
+ api_rev->major_ver,
1599
+ api_rev->minor_ver);
15851600 break;
15861601 default:
15871602 mwifiex_dbg(adapter, FATAL,
....@@ -1590,6 +1605,17 @@
15901605 break;
15911606 }
15921607 break;
1608
+ case TLV_TYPE_MAX_CONN:
1609
+ max_conn = (struct hw_spec_max_conn *)tlv;
1610
+ adapter->max_p2p_conn = max_conn->max_p2p_conn;
1611
+ adapter->max_sta_conn = max_conn->max_sta_conn;
1612
+ mwifiex_dbg(adapter, INFO,
1613
+ "max p2p connections: %u\n",
1614
+ adapter->max_p2p_conn);
1615
+ mwifiex_dbg(adapter, INFO,
1616
+ "max sta connections: %u\n",
1617
+ adapter->max_sta_conn);
1618
+ break;
15931619 default:
15941620 mwifiex_dbg(adapter, FATAL,
15951621 "Unknown GET_HW_SPEC TLV type: %#x\n",