Lines Matching +full:non +full:- +full:secure +full:- +full:otp
1 // SPDX-License-Identifier: ISC
3 * Copyright (c) 2012-2017 Qualcomm Atheros, Inc.
4 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
24 " 0 - use default; < 0 - don't auto-establish");
29 " 60G device led enablement. Set the led ID (0-2) to enable");
35 * DOC: WMI event receiving - theory of operations
42 * event list @wil->pending_wmi_ev. Then, work queue @wil->wmi_wq wakes up
47 * if WMI event handling involves another WMI command flow, this 2-nd flow
52 * DOC: Addressing - theory of operations
57 * - MAC CPU (ucode)
58 * - User CPU (firmware)
59 * - AHB (host)
96 /* UCODE areas - accessible by debugfs blobs but not by
105 /* sparrow_d0_mac_rgf_ext - mac_rgf_ext section for Sparrow D0
139 /* OTP 4k */
140 {0x8a0000, 0x8a1000, 0x8a0000, "otp", true, false},
145 /* UCODE areas - accessible by debugfs blobs but not by
154 /* talyn_mb_fw_mapping provides memory remapping table for Talyn-MB
187 /* OTP 4k */
188 {0x8a0000, 0x8a1000, 0x8a0000, "otp", true, false},
199 /* UCODE areas - accessible by debugfs blobs but not by
227 * wmi_addr_remap - return AHB address for given firmware internal (linker) address
238 return x + fw_mapping[i].host - fw_mapping[i].from; in wmi_addr_remap()
245 * wil_find_fw_mapping - find fw_mapping entry by section name
263 * wmi_buffer_block - Check address validity for WMI buffer; remap if needed
266 * @size: if non zero, validate the block does not
287 if (off > wil->bar_size - 4) in wmi_buffer_block()
289 if (size && ((off + size > wil->bar_size) || (off + size < off))) in wmi_buffer_block()
292 return wil->csr + off; in wmi_buffer_block()
312 if (off > wil->bar_size - 4) in wmi_addr()
315 return wil->csr + off; in wmi_addr()
324 return -EINVAL; in wmi_read_hdr()
650 struct wil6210_mbox_ring *r = &wil->mbox_ctl.tx; in __wmi_send()
654 void __iomem *head = wmi_addr(wil, r->head); in __wmi_send()
658 if (len > r->entry_size - sizeof(cmd)) { in __wmi_send()
660 (int)(sizeof(cmd) + len), r->entry_size); in __wmi_send()
661 return -ERANGE; in __wmi_send()
666 if (!test_bit(wil_status_fwready, wil->status)) { in __wmi_send()
668 return -EAGAIN; in __wmi_send()
672 if ((test_bit(wil_status_suspending, wil->status) || in __wmi_send()
673 test_bit(wil_status_suspended, wil->status) || in __wmi_send()
674 test_bit(wil_status_resuming, wil->status)) && in __wmi_send()
678 return -EINVAL; in __wmi_send()
682 wil_err(wil, "WMI head is garbage: 0x%08x\n", r->head); in __wmi_send()
683 return -EINVAL; in __wmi_send()
689 for (retry = 5; retry > 0; retry--) { in __wmi_send()
697 rc = -EBUSY; in __wmi_send()
701 next_head = r->base + ((r->head - r->base + sizeof(d_head)) % r->size); in __wmi_send()
702 wil_dbg_wmi(wil, "Head 0x%08x -> 0x%08x\n", r->head, next_head); in __wmi_send()
704 for (retry = 5; retry > 0; retry--) { in __wmi_send()
705 if (!test_bit(wil_status_fwready, wil->status)) { in __wmi_send()
707 rc = -EAGAIN; in __wmi_send()
710 r->tail = wil_r(wil, RGF_MBOX + in __wmi_send()
712 if (next_head != r->tail) in __wmi_send()
716 if (next_head == r->tail) { in __wmi_send()
718 rc = -EBUSY; in __wmi_send()
725 rc = -EAGAIN; in __wmi_send()
728 cmd.hdr.seq = cpu_to_le16(++wil->wmi_seq); in __wmi_send()
739 wil_w(wil, r->head + offsetof(struct wil6210_mbox_ring_desc, sync), 1); in __wmi_send()
742 r->head = next_head); in __wmi_send()
759 mutex_lock(&wil->wmi_mutex); in wmi_send()
761 mutex_unlock(&wil->wmi_mutex); in wmi_send()
775 wil->fw_version, le32_to_cpu(evt->sw_version), in wmi_evt_ready()
776 evt->mac, evt->numof_additional_mids); in wmi_evt_ready()
777 if (evt->numof_additional_mids + 1 < wil->max_vifs) { in wmi_evt_ready()
779 wil->max_vifs - 1); in wmi_evt_ready()
783 strscpy(wiphy->fw_version, wil->fw_version, sizeof(wiphy->fw_version)); in wmi_evt_ready()
787 evt->rfc_read_calib_result); in wmi_evt_ready()
788 wil->fw_calib_result = evt->rfc_read_calib_result; in wmi_evt_ready()
793 evt->max_assoc_sta > 0) { in wmi_evt_ready()
794 fw_max_assoc_sta = evt->max_assoc_sta; in wmi_evt_ready()
806 wil->max_assoc_sta = min_t(uint, max_assoc_sta, fw_max_assoc_sta); in wmi_evt_ready()
807 wil_dbg_wmi(wil, "setting max assoc sta to %d\n", wil->max_assoc_sta); in wmi_evt_ready()
810 set_bit(wil_status_fwready, wil->status); in wmi_evt_ready()
812 complete(&wil->wmi_ready); in wmi_evt_ready()
821 (struct ieee80211_mgmt *)data->payload; in wmi_evt_rx_mgmt()
822 int flen = len - offsetof(struct wmi_rx_mgmt_packet_event, payload); in wmi_evt_rx_mgmt()
836 d_len = le32_to_cpu(data->info.len); in wmi_evt_rx_mgmt()
844 ch_no = data->info.channel + 1; in wmi_evt_rx_mgmt()
847 if (test_bit(WMI_FW_CAPABILITY_RSSI_REPORTING, wil->fw_capabilities)) in wmi_evt_rx_mgmt()
848 signal = 100 * data->info.rssi; in wmi_evt_rx_mgmt()
850 signal = data->info.sqi; in wmi_evt_rx_mgmt()
851 d_status = le16_to_cpu(data->info.status); in wmi_evt_rx_mgmt()
852 fc = rx_mgmt_frame->frame_control; in wmi_evt_rx_mgmt()
855 data->info.channel, WIL_EXTENDED_MCS_CHECK(data->info.mcs), in wmi_evt_rx_mgmt()
856 data->info.rssi, data->info.sqi); in wmi_evt_rx_mgmt()
860 data->info.qid, data->info.mid, data->info.cid); in wmi_evt_rx_mgmt()
876 u64 tsf = le64_to_cpu(rx_mgmt_frame->u.beacon.timestamp); in wmi_evt_rx_mgmt()
877 u16 cap = le16_to_cpu(rx_mgmt_frame->u.beacon.capab_info); in wmi_evt_rx_mgmt()
878 u16 bi = le16_to_cpu(rx_mgmt_frame->u.beacon.beacon_int); in wmi_evt_rx_mgmt()
879 const u8 *ie_buf = rx_mgmt_frame->u.beacon.variable; in wmi_evt_rx_mgmt()
880 size_t ie_len = d_len - offsetof(struct ieee80211_mgmt, in wmi_evt_rx_mgmt()
895 rx_mgmt_frame->bssid); in wmi_evt_rx_mgmt()
901 mutex_lock(&wil->vif_mutex); in wmi_evt_rx_mgmt()
904 mutex_unlock(&wil->vif_mutex); in wmi_evt_rx_mgmt()
912 (struct ieee80211_mgmt *)data->payload; in wmi_evt_tx_mgmt()
913 int flen = len - offsetof(struct wmi_tx_mgmt_packet_event, payload); in wmi_evt_tx_mgmt()
924 mutex_lock(&wil->vif_mutex); in wmi_evt_scan_complete()
925 if (vif->scan_request) { in wmi_evt_scan_complete()
927 int status = le32_to_cpu(data->status); in wmi_evt_scan_complete()
935 vif->scan_request, info.aborted); in wmi_evt_scan_complete()
936 timer_delete_sync(&vif->scan_timer); in wmi_evt_scan_complete()
937 cfg80211_scan_done(vif->scan_request, &info); in wmi_evt_scan_complete()
938 if (vif->mid == 0) in wmi_evt_scan_complete()
939 wil->radio_wdev = wil->main_ndev->ieee80211_ptr; in wmi_evt_scan_complete()
940 vif->scan_request = NULL; in wmi_evt_scan_complete()
941 wake_up_interruptible(&wil->wq); in wmi_evt_scan_complete()
942 if (vif->p2p.pending_listen_wdev) { in wmi_evt_scan_complete()
944 schedule_work(&vif->p2p.delayed_listen_work); in wmi_evt_scan_complete()
949 mutex_unlock(&wil->vif_mutex); in wmi_evt_scan_complete()
972 if (len != sizeof(*evt) + evt->beacon_ie_len + evt->assoc_req_len + in wmi_evt_connect()
973 evt->assoc_resp_len) { in wmi_evt_connect()
976 len, (int)sizeof(*evt), evt->beacon_ie_len, in wmi_evt_connect()
977 evt->assoc_req_len, evt->assoc_resp_len); in wmi_evt_connect()
980 if (evt->cid >= wil->max_assoc_sta) { in wmi_evt_connect()
981 wil_err(wil, "Connect CID invalid : %d\n", evt->cid); in wmi_evt_connect()
985 ch = evt->channel + 1; in wmi_evt_connect()
987 evt->bssid, ch, evt->cid, evt->aid); in wmi_evt_connect()
989 evt->assoc_info, len - sizeof(*evt), true); in wmi_evt_connect()
992 assoc_req_ie = &evt->assoc_info[evt->beacon_ie_len + in wmi_evt_connect()
994 assoc_req_ielen = evt->assoc_req_len - assoc_req_ie_offset; in wmi_evt_connect()
995 if (evt->assoc_req_len <= assoc_req_ie_offset) { in wmi_evt_connect()
1000 assoc_resp_ie = &evt->assoc_info[evt->beacon_ie_len + in wmi_evt_connect()
1001 evt->assoc_req_len + in wmi_evt_connect()
1003 assoc_resp_ielen = evt->assoc_resp_len - assoc_resp_ie_offset; in wmi_evt_connect()
1004 if (evt->assoc_resp_len <= assoc_resp_ie_offset) { in wmi_evt_connect()
1009 if (test_bit(wil_status_resetting, wil->status) || in wmi_evt_connect()
1010 !test_bit(wil_status_fwready, wil->status)) { in wmi_evt_connect()
1012 evt->cid); in wmi_evt_connect()
1017 mutex_lock(&wil->mutex); in wmi_evt_connect()
1019 if ((wdev->iftype == NL80211_IFTYPE_STATION) || in wmi_evt_connect()
1020 (wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)) { in wmi_evt_connect()
1021 if (!test_bit(wil_vif_fwconnecting, vif->status)) { in wmi_evt_connect()
1023 mutex_unlock(&wil->mutex); in wmi_evt_connect()
1026 timer_delete_sync(&vif->connect_timer); in wmi_evt_connect()
1027 } else if ((wdev->iftype == NL80211_IFTYPE_AP) || in wmi_evt_connect()
1028 (wdev->iftype == NL80211_IFTYPE_P2P_GO)) { in wmi_evt_connect()
1029 if (wil->sta[evt->cid].status != wil_sta_unused) { in wmi_evt_connect()
1031 wil->sta[evt->cid].status, evt->cid); in wmi_evt_connect()
1032 mutex_unlock(&wil->mutex); in wmi_evt_connect()
1037 ether_addr_copy(wil->sta[evt->cid].addr, evt->bssid); in wmi_evt_connect()
1038 wil->sta[evt->cid].mid = vif->mid; in wmi_evt_connect()
1039 wil->sta[evt->cid].status = wil_sta_conn_pending; in wmi_evt_connect()
1041 rc = wil_ring_init_tx(vif, evt->cid); in wmi_evt_connect()
1044 evt->cid, rc); in wmi_evt_connect()
1045 wmi_disconnect_sta(vif, wil->sta[evt->cid].addr, in wmi_evt_connect()
1048 wil_info(wil, "successful connection to CID %d\n", evt->cid); in wmi_evt_connect()
1051 if ((wdev->iftype == NL80211_IFTYPE_STATION) || in wmi_evt_connect()
1052 (wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)) { in wmi_evt_connect()
1057 cfg80211_connect_result(ndev, evt->bssid, NULL, 0, in wmi_evt_connect()
1065 cfg80211_ref_bss(wiphy, vif->bss); in wmi_evt_connect()
1066 cfg80211_connect_bss(ndev, evt->bssid, vif->bss, in wmi_evt_connect()
1072 vif->bss = NULL; in wmi_evt_connect()
1073 } else if ((wdev->iftype == NL80211_IFTYPE_AP) || in wmi_evt_connect()
1074 (wdev->iftype == NL80211_IFTYPE_P2P_GO)) { in wmi_evt_connect()
1079 cfg80211_del_sta(ndev, evt->bssid, GFP_KERNEL); in wmi_evt_connect()
1085 rc = -ENOMEM; in wmi_evt_connect()
1089 sinfo->generation = wil->sinfo_gen++; in wmi_evt_connect()
1092 sinfo->assoc_req_ies = assoc_req_ie; in wmi_evt_connect()
1093 sinfo->assoc_req_ies_len = assoc_req_ielen; in wmi_evt_connect()
1096 cfg80211_new_sta(ndev, evt->bssid, sinfo, GFP_KERNEL); in wmi_evt_connect()
1100 wil_err(wil, "unhandled iftype %d for CID %d\n", wdev->iftype, in wmi_evt_connect()
1101 evt->cid); in wmi_evt_connect()
1105 wil->sta[evt->cid].status = wil_sta_connected; in wmi_evt_connect()
1106 wil->sta[evt->cid].aid = evt->aid; in wmi_evt_connect()
1107 if (!test_and_set_bit(wil_vif_fwconnected, vif->status)) in wmi_evt_connect()
1108 atomic_inc(&wil->connected_vifs); in wmi_evt_connect()
1113 wil->sta[evt->cid].status = wil_sta_unused; in wmi_evt_connect()
1114 wil->sta[evt->cid].mid = U8_MAX; in wmi_evt_connect()
1116 clear_bit(wil_vif_fwconnecting, vif->status); in wmi_evt_connect()
1117 mutex_unlock(&wil->mutex); in wmi_evt_connect()
1125 u16 reason_code = le16_to_cpu(evt->protocol_reason_status); in wmi_evt_disconnect()
1128 evt->bssid, reason_code, evt->disconnect_reason); in wmi_evt_disconnect()
1130 wil->sinfo_gen++; in wmi_evt_disconnect()
1132 if (test_bit(wil_status_resetting, wil->status) || in wmi_evt_disconnect()
1133 !test_bit(wil_status_fwready, wil->status)) { in wmi_evt_disconnect()
1139 mutex_lock(&wil->mutex); in wmi_evt_disconnect()
1140 wil6210_disconnect_complete(vif, evt->bssid, reason_code); in wmi_evt_disconnect()
1146 switch (wdev->iftype) { in wmi_evt_disconnect()
1147 /* AP-like interface */ in wmi_evt_disconnect()
1151 cfg80211_cqm_pktloss_notify(ndev, evt->bssid, 0, in wmi_evt_disconnect()
1158 mutex_unlock(&wil->mutex); in wmi_evt_disconnect()
1170 u16 eapol_len = le16_to_cpu(evt->eapol_len); in wmi_evt_eapol_rx()
1178 evt->src_mac, vif->mid); in wmi_evt_eapol_rx()
1180 cid = wil_find_cid(wil, vif->mid, evt->src_mac); in wmi_evt_eapol_rx()
1182 stats = &wil->sta[cid].stats; in wmi_evt_eapol_rx()
1196 ether_addr_copy(eth->h_dest, ndev->dev_addr); in wmi_evt_eapol_rx()
1197 ether_addr_copy(eth->h_source, evt->src_mac); in wmi_evt_eapol_rx()
1198 eth->h_proto = cpu_to_be16(ETH_P_PAE); in wmi_evt_eapol_rx()
1199 skb_put_data(skb, evt->eapol, eapol_len); in wmi_evt_eapol_rx()
1200 skb->protocol = eth_type_trans(skb, ndev); in wmi_evt_eapol_rx()
1202 ndev->stats.rx_packets++; in wmi_evt_eapol_rx()
1203 ndev->stats.rx_bytes += sz; in wmi_evt_eapol_rx()
1205 stats->rx_packets++; in wmi_evt_eapol_rx()
1206 stats->rx_bytes += sz; in wmi_evt_eapol_rx()
1209 ndev->stats.rx_dropped++; in wmi_evt_eapol_rx()
1211 stats->rx_dropped++; in wmi_evt_eapol_rx()
1219 u8 vri = evt->ring_index; in wmi_evt_ring_en()
1225 wil_dbg_wmi(wil, "Enable vring %d MID %d\n", vri, vif->mid); in wmi_evt_ring_en()
1227 if (vri >= ARRAY_SIZE(wil->ring_tx)) { in wmi_evt_ring_en()
1232 if (wdev->iftype != NL80211_IFTYPE_AP || !disable_ap_sme || in wmi_evt_ring_en()
1233 test_bit(wil_vif_ft_roam, vif->status)) in wmi_evt_ring_en()
1237 wil->ring_tx_data[vri].dot1x_open = true; in wmi_evt_ring_en()
1238 if (vri == vif->bcast_ring) /* no BA for bcast */ in wmi_evt_ring_en()
1241 cid = wil->ring2cid_tid[vri][0]; in wmi_evt_ring_en()
1251 sta = &wil->sta[cid]; in wmi_evt_ring_en()
1252 if (test_bit(wil_vif_ft_roam, vif->status)) { in wmi_evt_ring_en()
1255 if (wdev->iftype != NL80211_IFTYPE_AP) in wmi_evt_ring_en()
1256 clear_bit(wil_vif_ft_roam, vif->status); in wmi_evt_ring_en()
1271 evt->ringid, in wmi_evt_ba_status()
1272 evt->status == WMI_BA_AGREED ? "OK" : "N/A", in wmi_evt_ba_status()
1273 evt->agg_wsize, __le16_to_cpu(evt->ba_timeout), in wmi_evt_ba_status()
1274 evt->amsdu ? "+" : "-"); in wmi_evt_ba_status()
1276 if (evt->ringid >= WIL6210_MAX_TX_RINGS) { in wmi_evt_ba_status()
1277 wil_err(wil, "invalid ring id %d\n", evt->ringid); in wmi_evt_ba_status()
1281 if (evt->status != WMI_BA_AGREED) { in wmi_evt_ba_status()
1282 evt->ba_timeout = 0; in wmi_evt_ba_status()
1283 evt->agg_wsize = 0; in wmi_evt_ba_status()
1284 evt->amsdu = 0; in wmi_evt_ba_status()
1287 txdata = &wil->ring_tx_data[evt->ringid]; in wmi_evt_ba_status()
1289 txdata->agg_timeout = le16_to_cpu(evt->ba_timeout); in wmi_evt_ba_status()
1290 txdata->agg_wsize = evt->agg_wsize; in wmi_evt_ba_status()
1291 txdata->agg_amsdu = evt->amsdu; in wmi_evt_ba_status()
1292 txdata->addba_in_progress = false; in wmi_evt_ba_status()
1302 if (evt->cidxtid != CIDXTID_EXTENDED_CID_TID) { in wmi_evt_addba_rx_req()
1303 parse_cidxtid(evt->cidxtid, &cid, &tid); in wmi_evt_addba_rx_req()
1305 cid = evt->cid; in wmi_evt_addba_rx_req()
1306 tid = evt->tid; in wmi_evt_addba_rx_req()
1308 wil_addba_rx_request(wil, vif->mid, cid, tid, evt->dialog_token, in wmi_evt_addba_rx_req()
1309 evt->ba_param_set, evt->ba_timeout, in wmi_evt_addba_rx_req()
1310 evt->ba_seq_ctrl); in wmi_evt_addba_rx_req()
1314 __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock) in wmi_evt_delba()
1319 u16 reason = __le16_to_cpu(evt->reason); in wmi_evt_delba()
1325 if (evt->cidxtid != CIDXTID_EXTENDED_CID_TID) { in wmi_evt_delba()
1326 parse_cidxtid(evt->cidxtid, &cid, &tid); in wmi_evt_delba()
1328 cid = evt->cid; in wmi_evt_delba()
1329 tid = evt->tid; in wmi_evt_delba()
1338 vif->mid, cid, tid, in wmi_evt_delba()
1339 evt->from_initiator ? "originator" : "recipient", in wmi_evt_delba()
1341 if (!evt->from_initiator) { in wmi_evt_delba()
1344 for (i = 0; i < ARRAY_SIZE(wil->ring2cid_tid); i++) { in wmi_evt_delba()
1345 if (wil->ring2cid_tid[i][0] == cid && in wmi_evt_delba()
1346 wil->ring2cid_tid[i][1] == tid) { in wmi_evt_delba()
1348 &wil->ring_tx_data[i]; in wmi_evt_delba()
1351 txdata->agg_timeout = 0; in wmi_evt_delba()
1352 txdata->agg_wsize = 0; in wmi_evt_delba()
1353 txdata->addba_in_progress = false; in wmi_evt_delba()
1358 if (i >= ARRAY_SIZE(wil->ring2cid_tid)) in wmi_evt_delba()
1363 sta = &wil->sta[cid]; in wmi_evt_delba()
1365 spin_lock_bh(&sta->tid_rx_lock); in wmi_evt_delba()
1367 r = sta->tid_rx[tid]; in wmi_evt_delba()
1368 sta->tid_rx[tid] = NULL; in wmi_evt_delba()
1371 spin_unlock_bh(&sta->tid_rx_lock); in wmi_evt_delba()
1381 (struct ieee80211_mgmt *)data->payload; in wmi_evt_sched_scan_result()
1382 int flen = len - offsetof(struct wmi_sched_scan_result_event, payload); in wmi_evt_sched_scan_result()
1400 d_len = le32_to_cpu(data->info.len); in wmi_evt_sched_scan_result()
1408 fc = rx_mgmt_frame->frame_control; in wmi_evt_sched_scan_result()
1415 ch_no = data->info.channel + 1; in wmi_evt_sched_scan_result()
1418 if (test_bit(WMI_FW_CAPABILITY_RSSI_REPORTING, wil->fw_capabilities)) in wmi_evt_sched_scan_result()
1419 signal = 100 * data->info.rssi; in wmi_evt_sched_scan_result()
1421 signal = data->info.sqi; in wmi_evt_sched_scan_result()
1424 data->info.channel, WIL_EXTENDED_MCS_CHECK(data->info.mcs), in wmi_evt_sched_scan_result()
1425 data->info.rssi); in wmi_evt_sched_scan_result()
1427 d_len, data->info.qid, data->info.mid, data->info.cid); in wmi_evt_sched_scan_result()
1441 wil_dbg_wmi(wil, "Added BSS %pM\n", rx_mgmt_frame->bssid); in wmi_evt_sched_scan_result()
1454 u8 cid = basic->cid; in wil_link_stats_store_basic()
1457 if (cid >= wil->max_assoc_sta) { in wil_link_stats_store_basic()
1462 sta = &wil->sta[cid]; in wil_link_stats_store_basic()
1463 sta->fw_stats_basic = *basic; in wil_link_stats_store_basic()
1471 wil->fw_stats_global.stats = *global; in wil_link_stats_store_global()
1490 stats_size = le16_to_cpu(hdr->record_size); in wmi_link_stats_parse()
1499 switch (hdr->record_type_id) { in wmi_link_stats_parse()
1507 if (vif->fw_stats_ready) { in wmi_link_stats_parse()
1509 vif->fw_stats_tsf = 0; in wmi_link_stats_parse()
1510 vif->fw_stats_ready = false; in wmi_link_stats_parse()
1516 vif->fw_stats_tsf = tsf; in wmi_link_stats_parse()
1517 vif->fw_stats_ready = true; in wmi_link_stats_parse()
1529 if (wil->fw_stats_global.ready) { in wmi_link_stats_parse()
1531 wil->fw_stats_global.tsf = 0; in wmi_link_stats_parse()
1532 wil->fw_stats_global.ready = false; in wmi_link_stats_parse()
1538 wil->fw_stats_global.tsf = tsf; in wmi_link_stats_parse()
1539 wil->fw_stats_global.ready = true; in wmi_link_stats_parse()
1549 payload_size -= record_size; in wmi_link_stats_parse()
1564 payload_size = le16_to_cpu(evt->payload_size); in wmi_evt_link_stats()
1570 wmi_link_stats_parse(vif, le64_to_cpu(evt->tsf), evt->has_next, in wmi_evt_link_stats()
1571 evt->payload, payload_size); in wmi_evt_link_stats()
1589 if (!(vif->wdev.iftype == NL80211_IFTYPE_STATION || in wil_find_cid_ringid_sta()
1590 vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT)) { in wil_find_cid_ringid_sta()
1591 wil_err(wil, "invalid interface type %d\n", vif->wdev.iftype); in wil_find_cid_ringid_sta()
1592 return -EINVAL; in wil_find_cid_ringid_sta()
1600 ring = &wil->ring_tx[i]; in wil_find_cid_ringid_sta()
1601 txdata = &wil->ring_tx_data[i]; in wil_find_cid_ringid_sta()
1602 if (!ring->va || !txdata->enabled || txdata->mid != vif->mid) in wil_find_cid_ringid_sta()
1605 lcid = wil->ring2cid_tid[i][0]; in wil_find_cid_ringid_sta()
1606 if (lcid >= wil->max_assoc_sta) /* skip BCAST */ in wil_find_cid_ringid_sta()
1609 wil_dbg_wmi(wil, "find sta -> ringid %d cid %d\n", i, lcid); in wil_find_cid_ringid_sta()
1617 return -ENOENT; in wil_find_cid_ringid_sta()
1626 int ie_len = len - offsetof(struct wmi_ft_auth_status_event, ie_info); in wmi_evt_auth_status()
1632 struct auth_no_hdr *auth = (struct auth_no_hdr *)data->ie_info; in wmi_evt_auth_status()
1635 if (ie_len >= 0 && data->status != WMI_FW_STATUS_SUCCESS) { in wmi_evt_auth_status()
1636 wil_err(wil, "FT: auth failed. status %d\n", data->status); in wmi_evt_auth_status()
1645 d_len = le16_to_cpu(data->ie_len); in wmi_evt_auth_status()
1653 if (!test_bit(wil_vif_ft_roam, wil->status)) { in wmi_evt_auth_status()
1658 if (le16_to_cpu(auth->auth_transaction) != 2) { in wmi_evt_auth_status()
1660 le16_to_cpu(auth->auth_transaction)); in wmi_evt_auth_status()
1664 if (le16_to_cpu(auth->auth_alg) != WLAN_AUTH_FT) { in wmi_evt_auth_status()
1666 le16_to_cpu(auth->auth_alg)); in wmi_evt_auth_status()
1670 wil_dbg_wmi(wil, "FT: Auth to %pM successfully\n", data->mac_addr); in wmi_evt_auth_status()
1672 data->ie_info, d_len, true); in wmi_evt_auth_status()
1681 if (vif->privacy) { in wmi_evt_auth_status()
1682 /* For secure assoc, remove old keys */ in wmi_evt_auth_status()
1683 rc = wmi_del_cipher_key(vif, 0, wil->sta[cid].addr, in wmi_evt_auth_status()
1689 rc = wmi_del_cipher_key(vif, 0, wil->sta[cid].addr, in wmi_evt_auth_status()
1698 ft.ies = data->ie_info + auth_ie_offset; in wmi_evt_auth_status()
1699 ft.ies_len = d_len - auth_ie_offset; in wmi_evt_auth_status()
1700 ft.target_ap = data->mac_addr; in wmi_evt_auth_status()
1716 int ies_len = len - offsetof(struct wmi_ft_reassoc_status_event, in wmi_evt_reassoc_status()
1718 int rc = -ENOENT, cid = 0, ringid = 0; in wmi_evt_reassoc_status()
1736 data->status, data->aid); in wmi_evt_reassoc_status()
1738 data->mac_addr, data->beacon_ie_len); in wmi_evt_reassoc_status()
1740 le16_to_cpu(data->reassoc_req_ie_len), in wmi_evt_reassoc_status()
1741 le16_to_cpu(data->reassoc_resp_ie_len)); in wmi_evt_reassoc_status()
1743 d_len = le16_to_cpu(data->beacon_ie_len) + in wmi_evt_reassoc_status()
1744 le16_to_cpu(data->reassoc_req_ie_len) + in wmi_evt_reassoc_status()
1745 le16_to_cpu(data->reassoc_resp_ie_len); in wmi_evt_reassoc_status()
1754 if (data->status != WMI_FW_STATUS_SUCCESS) { in wmi_evt_reassoc_status()
1755 wil_err(wil, "ft reassoc failed. status %d\n", data->status); in wmi_evt_reassoc_status()
1766 ch = data->channel + 1; in wmi_evt_reassoc_status()
1768 data->mac_addr, ch, cid, data->aid); in wmi_evt_reassoc_status()
1771 data->ie_info, len - sizeof(*data), true); in wmi_evt_reassoc_status()
1774 if (le16_to_cpu(data->reassoc_req_ie_len) > assoc_req_ie_offset) { in wmi_evt_reassoc_status()
1775 assoc_req_ie = &data->ie_info[assoc_req_ie_offset]; in wmi_evt_reassoc_status()
1776 assoc_req_ie_len = le16_to_cpu(data->reassoc_req_ie_len) - in wmi_evt_reassoc_status()
1779 if (le16_to_cpu(data->reassoc_resp_ie_len) <= assoc_resp_ie_offset) { in wmi_evt_reassoc_status()
1781 le16_to_cpu(data->reassoc_resp_ie_len)); in wmi_evt_reassoc_status()
1785 assoc_resp_ie = &data->ie_info[le16_to_cpu(data->reassoc_req_ie_len) + in wmi_evt_reassoc_status()
1787 assoc_resp_ie_len = le16_to_cpu(data->reassoc_resp_ie_len) - in wmi_evt_reassoc_status()
1790 if (test_bit(wil_status_resetting, wil->status) || in wmi_evt_reassoc_status()
1791 !test_bit(wil_status_fwready, wil->status)) { in wmi_evt_reassoc_status()
1797 mutex_lock(&wil->mutex); in wmi_evt_reassoc_status()
1804 rc = wil->txrx_ops.tx_ring_modify(vif, ringid, cid, 0); in wmi_evt_reassoc_status()
1807 cid, vif->mid, ringid, rc); in wmi_evt_reassoc_status()
1808 mutex_unlock(&wil->mutex); in wmi_evt_reassoc_status()
1813 wil->sta[cid].aid = data->aid; in wmi_evt_reassoc_status()
1814 wil->sta[cid].stats.ft_roams++; in wmi_evt_reassoc_status()
1815 ether_addr_copy(wil->sta[cid].addr, vif->bss->bssid); in wmi_evt_reassoc_status()
1816 mutex_unlock(&wil->mutex); in wmi_evt_reassoc_status()
1817 timer_delete_sync(&vif->connect_timer); in wmi_evt_reassoc_status()
1819 cfg80211_ref_bss(wiphy, vif->bss); in wmi_evt_reassoc_status()
1824 info.links[0].bss = vif->bss; in wmi_evt_reassoc_status()
1830 vif->bss = NULL; in wmi_evt_reassoc_status()
1852 evt->type, evt->rssi_level, wil->cqm_rssi_thold); in wmi_evt_link_monitor()
1854 if (evt->type != WMI_LINK_MONITOR_NOTIF_RSSI_THRESHOLD_EVT) in wmi_evt_link_monitor()
1858 event_type = (evt->rssi_level > wil->cqm_rssi_thold ? in wmi_evt_link_monitor()
1861 cfg80211_cqm_rssi_notify(ndev, event_type, evt->rssi_level, GFP_KERNEL); in wmi_evt_link_monitor()
1901 * Extract WMI command from mailbox. Queue it to the @wil->pending_wmi_ev
1909 struct wil6210_mbox_ring *r = &wil->mbox_ctl.rx; in wmi_recv_cmd()
1917 if (!test_bit(wil_status_mbox_ready, wil->status)) { in wmi_recv_cmd()
1922 if (test_bit(wil_status_suspended, wil->status)) { in wmi_recv_cmd()
1932 r->head = wil_r(wil, RGF_MBOX + in wmi_recv_cmd()
1934 if (r->tail == r->head) in wmi_recv_cmd()
1938 r->head, r->tail); in wmi_recv_cmd()
1940 wil_memcpy_fromio_32(&d_tail, wil->csr + HOSTADDR(r->tail), in wmi_recv_cmd()
1967 evt->event.hdr = hdr; in wmi_recv_cmd()
1968 cmd = (void *)&evt->event.wmi; in wmi_recv_cmd()
1971 wil_w(wil, r->tail + in wmi_recv_cmd()
1976 struct wmi_cmd_hdr *wmi = &evt->event.wmi; in wmi_recv_cmd()
1977 u16 id = le16_to_cpu(wmi->command_id); in wmi_recv_cmd()
1978 u8 mid = wmi->mid; in wmi_recv_cmd()
1979 u32 tstamp = le32_to_cpu(wmi->fw_timestamp); in wmi_recv_cmd()
1980 if (test_bit(wil_status_resuming, wil->status)) { in wmi_recv_cmd()
1983 wil->status); in wmi_recv_cmd()
1989 spin_lock_irqsave(&wil->wmi_ev_lock, flags); in wmi_recv_cmd()
1990 if (wil->reply_id && wil->reply_id == id && in wmi_recv_cmd()
1991 wil->reply_mid == mid) { in wmi_recv_cmd()
1992 if (wil->reply_buf) { in wmi_recv_cmd()
1993 memcpy(wil->reply_buf, wmi, in wmi_recv_cmd()
1994 min(len, wil->reply_size)); in wmi_recv_cmd()
2000 wil->suspend_resp_rcvd = true; in wmi_recv_cmd()
2003 spin_unlock_irqrestore(&wil->wmi_ev_lock, flags); in wmi_recv_cmd()
2006 eventid2name(id), id, wmi->mid, tstamp); in wmi_recv_cmd()
2008 len - sizeof(*wmi)); in wmi_recv_cmd()
2011 &evt->event.hdr, sizeof(hdr) + len, true); in wmi_recv_cmd()
2014 r->tail = r->base + ((r->tail - r->base + in wmi_recv_cmd()
2015 sizeof(struct wil6210_mbox_ring_desc)) % r->size); in wmi_recv_cmd()
2017 offsetof(struct wil6210_mbox_ctl, rx.tail), r->tail); in wmi_recv_cmd()
2021 wil->reply_id); in wmi_recv_cmd()
2024 complete(&wil->wmi_call); in wmi_recv_cmd()
2027 spin_lock_irqsave(&wil->wmi_ev_lock, flags); in wmi_recv_cmd()
2028 list_add_tail(&evt->list, &wil->pending_wmi_ev); in wmi_recv_cmd()
2029 spin_unlock_irqrestore(&wil->wmi_ev_lock, flags); in wmi_recv_cmd()
2030 q = queue_work(wil->wmi_wq, &wil->wmi_event_worker); in wmi_recv_cmd()
2031 wil_dbg_wmi(wil, "queue_work -> %d\n", q); in wmi_recv_cmd()
2035 wil_dbg_wmi(wil, "recv_cmd: -> %d events queued, %d completed\n", in wmi_recv_cmd()
2036 n - num_immed_reply, num_immed_reply); in wmi_recv_cmd()
2046 mutex_lock(&wil->wmi_mutex); in wmi_call()
2048 spin_lock_irqsave(&wil->wmi_ev_lock, flags); in wmi_call()
2049 wil->reply_id = reply_id; in wmi_call()
2050 wil->reply_mid = mid; in wmi_call()
2051 wil->reply_buf = reply; in wmi_call()
2052 wil->reply_size = reply_size; in wmi_call()
2053 reinit_completion(&wil->wmi_call); in wmi_call()
2054 spin_unlock_irqrestore(&wil->wmi_ev_lock, flags); in wmi_call()
2060 remain = wait_for_completion_timeout(&wil->wmi_call, in wmi_call()
2063 wil_err(wil, "wmi_call(0x%04x->0x%04x) timeout %d msec\n", in wmi_call()
2065 rc = -ETIME; in wmi_call()
2068 "wmi_call(0x%04x->0x%04x) completed in %d msec\n", in wmi_call()
2070 to_msec - jiffies_to_msecs(remain)); in wmi_call()
2074 spin_lock_irqsave(&wil->wmi_ev_lock, flags); in wmi_call()
2075 wil->reply_id = 0; in wmi_call()
2076 wil->reply_mid = U8_MAX; in wmi_call()
2077 wil->reply_buf = NULL; in wmi_call()
2078 wil->reply_size = 0; in wmi_call()
2079 spin_unlock_irqrestore(&wil->wmi_ev_lock, flags); in wmi_call()
2081 mutex_unlock(&wil->wmi_mutex); in wmi_call()
2088 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_echo()
2093 return wmi_call(wil, WMI_ECHO_CMDID, vif->mid, &cmd, sizeof(cmd), in wmi_echo()
2100 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_set_mac_address()
2107 return wmi_send(wil, WMI_SET_MAC_ADDRESS_CMDID, vif->mid, in wmi_set_mac_address()
2113 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_led_cfg()
2144 rc = -EINVAL; in wmi_led_cfg()
2152 rc = wmi_call(wil, WMI_LED_CFG_CMDID, vif->mid, &cmd, sizeof(cmd), in wmi_led_cfg()
2161 rc = -EINVAL; in wmi_led_cfg()
2170 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_rbufcap_cfg()
2184 rc = wmi_call(wil, WMI_RBUFCAP_CFG_CMDID, vif->mid, &cmd, sizeof(cmd), in wmi_rbufcap_cfg()
2193 rc = -EINVAL; in wmi_rbufcap_cfg()
2209 .channel = chan - 1, in wmi_pcp_start()
2211 .pcp_max_assoc_sta = wil->max_assoc_sta, in wmi_pcp_start()
2217 .abft_len = wil->abft_len, in wmi_pcp_start()
2226 if (!vif->privacy) in wmi_pcp_start()
2233 return -EOPNOTSUPP; in wmi_pcp_start()
2238 wil->fw_capabilities)) { in wmi_pcp_start()
2240 return -EOPNOTSUPP; in wmi_pcp_start()
2244 * Processing time may be huge, in case of secure AP it takes about in wmi_pcp_start()
2247 rc = wmi_call(wil, WMI_PCP_START_CMDID, vif->mid, &cmd, sizeof(cmd), in wmi_pcp_start()
2253 rc = -EINVAL; in wmi_pcp_start()
2271 return wmi_call(wil, WMI_PCP_STOP_CMDID, vif->mid, NULL, 0, in wmi_pcp_stop()
2284 return -EINVAL; in wmi_set_ssid()
2288 return wmi_send(wil, WMI_SET_SSID_CMDID, vif->mid, &cmd, sizeof(cmd)); in wmi_set_ssid()
2303 rc = wmi_call(wil, WMI_GET_SSID_CMDID, vif->mid, NULL, 0, in wmi_get_ssid()
2311 return -EINVAL; in wmi_get_ssid()
2321 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_set_channel()
2323 .channel = channel - 1, in wmi_set_channel()
2326 return wmi_send(wil, WMI_SET_PCP_CHANNEL_CMDID, vif->mid, in wmi_set_channel()
2332 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_get_channel()
2341 rc = wmi_call(wil, WMI_GET_PCP_CHANNEL_CMDID, vif->mid, NULL, 0, in wmi_get_channel()
2348 return -EINVAL; in wmi_get_channel()
2362 .channel = channel - 1, in wmi_p2p_cfg()
2373 rc = wmi_call(wil, WMI_P2P_CFG_CMDID, vif->mid, &cmd, sizeof(cmd), in wmi_p2p_cfg()
2377 rc = -EINVAL; in wmi_p2p_cfg()
2396 rc = wmi_call(wil, WMI_START_LISTEN_CMDID, vif->mid, NULL, 0, in wmi_start_listen()
2401 rc = -EINVAL; in wmi_start_listen()
2420 rc = wmi_call(wil, WMI_START_SEARCH_CMDID, vif->mid, NULL, 0, in wmi_start_search()
2425 rc = -EINVAL; in wmi_start_search()
2438 rc = wmi_call(wil, WMI_DISCOVERY_STOP_CMDID, vif->mid, NULL, 0, in wmi_stop_discovery()
2459 return wmi_send(wil, WMI_DELETE_CIPHER_KEY_CMDID, vif->mid, in wmi_del_cipher_key()
2475 return -EINVAL; in wmi_add_cipher_key()
2480 return -EINVAL; in wmi_add_cipher_key()
2488 return wmi_send(wil, WMI_ADD_CIPHER_KEY_CMDID, vif->mid, in wmi_add_cipher_key()
2507 rc = -EINVAL; in wmi_set_ie()
2513 rc = -ENOMEM; in wmi_set_ie()
2519 cmd->mgmt_frm_type = type; in wmi_set_ie()
2521 cmd->ie_len = cpu_to_le16(ie_len); in wmi_set_ie()
2523 memcpy(cmd->ie_info, ie, ie_len); in wmi_set_ie()
2524 rc = wmi_send(wil, WMI_SET_APPIE_CMDID, vif->mid, cmd, len); in wmi_set_ie()
2549 return -EINVAL; in wmi_update_ft_ies()
2554 rc = -ENOMEM; in wmi_update_ft_ies()
2558 cmd->ie_len = cpu_to_le16(ie_len); in wmi_update_ft_ies()
2560 memcpy(cmd->ie_info, ie, ie_len); in wmi_update_ft_ies()
2561 rc = wmi_send(wil, WMI_UPDATE_FT_IES_CMDID, vif->mid, cmd, len); in wmi_update_ft_ies()
2572 * wmi_rxon - turn radio on/off
2577 * No timeout for rxon - radio turned on forever unless some other call
2582 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_rxon()
2594 rc = wmi_call(wil, WMI_START_LISTEN_CMDID, vif->mid, NULL, 0, in wmi_rxon()
2599 rc = -EINVAL; in wmi_rxon()
2601 rc = wmi_call(wil, WMI_DISCOVERY_STOP_CMDID, vif->mid, NULL, 0, in wmi_rxon()
2611 struct net_device *ndev = wil->main_ndev; in wmi_rx_chain_add()
2612 struct wireless_dev *wdev = ndev->ieee80211_ptr; in wmi_rx_chain_add()
2618 wil_mtu2macbuf(wil->rx_buf_len)), in wmi_rx_chain_add()
2619 .ring_mem_base = cpu_to_le64(vring->pa), in wmi_rx_chain_add()
2620 .ring_size = cpu_to_le16(vring->size), in wmi_rx_chain_add()
2622 .mid = 0, /* TODO - what is it? */ in wmi_rx_chain_add()
2635 if (wdev->iftype == NL80211_IFTYPE_MONITOR) { in wmi_rx_chain_add()
2636 struct ieee80211_channel *ch = wil->monitor_chandef.chan; in wmi_rx_chain_add()
2640 cmd.sniffer_cfg.channel = ch->hw_value - 1; in wmi_rx_chain_add()
2644 cpu_to_le32((wil->monitor_flags & MONITOR_FLAG_CONTROL) in wmi_rx_chain_add()
2647 /* Initialize offload (in non-sniffer mode). in wmi_rx_chain_add()
2658 /* typical time for secure PCP is 840ms */ in wmi_rx_chain_add()
2659 rc = wmi_call(wil, WMI_CFG_RX_CHAIN_CMDID, vif->mid, &cmd, sizeof(cmd), in wmi_rx_chain_add()
2665 rc = -EINVAL; in wmi_rx_chain_add()
2667 vring->hwtail = le32_to_cpu(evt.evt.rx_ring_tail_ptr); in wmi_rx_chain_add()
2670 le32_to_cpu(evt.evt.status), vring->hwtail); in wmi_rx_chain_add()
2677 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_get_temperature()
2691 rc = wmi_call(wil, WMI_TEMP_SENSE_CMDID, vif->mid, &cmd, sizeof(cmd), in wmi_get_temperature()
2709 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_get_all_temperatures()
2723 return -EINVAL; in wmi_get_all_temperatures()
2728 rc = wmi_call(wil, WMI_TEMP_SENSE_ALL_CMDID, vif->mid, &cmd, in wmi_get_all_temperatures()
2736 return -EINVAL; in wmi_get_all_temperatures()
2762 vif->locally_generated_disc = true; in wmi_disconnect_sta()
2765 rc = wmi_call(wil, WMI_DEL_STA_CMDID, vif->mid, &del_sta_cmd, in wmi_disconnect_sta()
2770 rc = wmi_call(wil, WMI_DISCONNECT_STA_CMDID, vif->mid, in wmi_disconnect_sta()
2780 wil->sinfo_gen++; in wmi_disconnect_sta()
2788 u8 amsdu = wil->use_enhanced_dma_hw && wil->use_rx_hw_reordering && in wmi_addba()
2789 test_bit(WMI_FW_CAPABILITY_AMSDU, wil->fw_capabilities) && in wmi_addba()
2790 wil->amsdu_en; in wmi_addba()
2844 /* bit 0: A-MSDU supported in wmi_addba_rx_resp()
2871 timeout, status, amsdu ? "+" : "-"); in wmi_addba_rx_resp()
2882 rc = -EINVAL; in wmi_addba_rx_resp()
2898 /* bit 0: A-MSDU supported in wmi_addba_rx_resp_edma()
2918 cid, tid, agg_wsize, timeout, status, amsdu ? "+" : "-", in wmi_addba_rx_resp_edma()
2930 rc = -EINVAL; in wmi_addba_rx_resp_edma()
2939 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_ps_dev_profile_cfg()
2954 rc = wmi_call(wil, WMI_PS_DEV_PROFILE_CFG_CMDID, vif->mid, in wmi_ps_dev_profile_cfg()
2966 rc = -EINVAL; in wmi_ps_dev_profile_cfg()
2974 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_set_mgmt_retry()
2988 if (!test_bit(WMI_FW_CAPABILITY_MGMT_RETRY_LIMIT, wil->fw_capabilities)) in wmi_set_mgmt_retry()
2989 return -ENOTSUPP; in wmi_set_mgmt_retry()
2991 rc = wmi_call(wil, WMI_SET_MGMT_RETRY_LIMIT_CMDID, vif->mid, in wmi_set_mgmt_retry()
3001 rc = -EINVAL; in wmi_set_mgmt_retry()
3009 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_get_mgmt_retry()
3018 if (!test_bit(WMI_FW_CAPABILITY_MGMT_RETRY_LIMIT, wil->fw_capabilities)) in wmi_get_mgmt_retry()
3019 return -ENOTSUPP; in wmi_get_mgmt_retry()
3022 rc = wmi_call(wil, WMI_GET_MGMT_RETRY_LIMIT_CMDID, vif->mid, NULL, 0, in wmi_get_mgmt_retry()
3041 rc = wmi_send(wil, WMI_ABORT_SCAN_CMDID, vif->mid, NULL, 0); in wmi_abort_scan()
3060 rc = wmi_send(wil, WMI_NEW_STA_CMDID, vif->mid, &cmd, sizeof(cmd)); in wmi_new_sta()
3074 spin_lock_irqsave(&wil->wmi_ev_lock, flags); in wmi_event_flush()
3076 list_for_each_entry_safe(evt, t, &wil->pending_wmi_ev, list) { in wmi_event_flush()
3077 list_del(&evt->list); in wmi_event_flush()
3081 spin_unlock_irqrestore(&wil->wmi_ev_lock, flags); in wmi_event_flush()
3100 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_suspend()
3103 .wakeup_trigger = wil->wakeup_trigger, in wmi_suspend()
3114 wil->suspend_resp_rcvd = false; in wmi_suspend()
3115 wil->suspend_resp_comp = false; in wmi_suspend()
3117 rc = wmi_call(wil, WMI_TRAFFIC_SUSPEND_CMDID, vif->mid, in wmi_suspend()
3123 if (rc == -ETIME) in wmi_suspend()
3125 wil->suspend_stats.rejected_by_device++; in wmi_suspend()
3127 wil->suspend_stats.rejected_by_host++; in wmi_suspend()
3133 rc = wait_event_interruptible_timeout(wil->wq, in wmi_suspend()
3134 wil->suspend_resp_comp, in wmi_suspend()
3138 if (wil->suspend_resp_rcvd) in wmi_suspend()
3140 wil->suspend_stats.rejected_by_host++; in wmi_suspend()
3142 wil->suspend_stats.rejected_by_device++; in wmi_suspend()
3143 rc = -EBUSY; in wmi_suspend()
3151 wil->suspend_stats.rejected_by_device++; in wmi_suspend()
3156 wil->suspend_resp_rcvd = false; in wmi_suspend()
3157 wil->suspend_resp_comp = false; in wmi_suspend()
3189 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_resume()
3201 rc = wmi_call(wil, WMI_TRAFFIC_RESUME_CMDID, vif->mid, NULL, 0, in wmi_resume()
3249 return -EINVAL; in wmi_port_allocate()
3263 return -EINVAL; in wmi_port_allocate()
3295 return -EINVAL; in wmi_port_delete()
3319 u16 len = le16_to_cpu(hdr->len); in wmi_event_handle()
3322 if ((hdr->type == WIL_MBOX_HDR_TYPE_WMI) && in wmi_event_handle()
3326 u16 id = le16_to_cpu(wmi->command_id); in wmi_event_handle()
3327 u8 mid = wmi->mid; in wmi_event_handle()
3330 eventid2name(id), id, wil->reply_id, in wmi_event_handle()
3331 wil->reply_mid); in wmi_event_handle()
3340 vif = wil->vifs[mid]; in wmi_event_handle()
3348 if (wil->reply_id && wil->reply_id == id && in wmi_event_handle()
3349 wil->reply_mid == mid) { in wmi_event_handle()
3350 if (wil->reply_buf) { in wmi_event_handle()
3364 len - sizeof(*wmi)); in wmi_event_handle()
3367 complete(&wil->wmi_call); in wmi_event_handle()
3373 len - sizeof(*wmi))) { in wmi_event_handle()
3391 spin_lock_irqsave(&wil->wmi_ev_lock, flags); in next_wmi_ev()
3393 if (!list_empty(&wil->pending_wmi_ev)) { in next_wmi_ev()
3394 ret = wil->pending_wmi_ev.next; in next_wmi_ev()
3398 spin_unlock_irqrestore(&wil->wmi_ev_lock, flags); in next_wmi_ev()
3416 wmi_event_handle(wil, &evt->event.hdr); in wmi_event_worker()
3425 struct wil6210_mbox_ring *r = &wil->mbox_ctl.rx; in wil_is_wmi_idle()
3428 spin_lock_irqsave(&wil->wmi_ev_lock, flags); in wil_is_wmi_idle()
3431 if (!list_empty(&wil->pending_wmi_ev)) { in wil_is_wmi_idle()
3437 if (wil->reply_id) { in wil_is_wmi_idle()
3443 r->head = wil_r(wil, RGF_MBOX + in wil_is_wmi_idle()
3445 if (r->tail != r->head) in wil_is_wmi_idle()
3451 spin_unlock_irqrestore(&wil->wmi_ev_lock, flags); in wil_is_wmi_idle()
3469 cmd->num_of_ssids = n_match_sets; in wmi_sched_scan_set_ssids()
3473 &cmd->ssid_for_match[i]; in wmi_sched_scan_set_ssids()
3477 wmi_match->ssid_len = cfg_match->ssid.ssid_len; in wmi_sched_scan_set_ssids()
3478 memcpy(wmi_match->ssid, cfg_match->ssid.ssid, in wmi_sched_scan_set_ssids()
3479 min_t(u8, wmi_match->ssid_len, WMI_MAX_SSID_LEN)); in wmi_sched_scan_set_ssids()
3480 wmi_match->rssi_threshold = S8_MIN; in wmi_sched_scan_set_ssids()
3481 if (cfg_match->rssi_thold >= S8_MIN && in wmi_sched_scan_set_ssids()
3482 cfg_match->rssi_thold <= S8_MAX) in wmi_sched_scan_set_ssids()
3483 wmi_match->rssi_threshold = cfg_match->rssi_thold; in wmi_sched_scan_set_ssids()
3486 if (wmi_match->ssid_len == ssids[j].ssid_len && in wmi_sched_scan_set_ssids()
3487 memcmp(wmi_match->ssid, ssids[j].ssid, in wmi_sched_scan_set_ssids()
3488 wmi_match->ssid_len) == 0) in wmi_sched_scan_set_ssids()
3489 wmi_match->add_ssid_to_probe = true; in wmi_sched_scan_set_ssids()
3506 cmd->num_of_channels = n_channels; in wmi_sched_scan_set_channels()
3511 cmd->channel_list[i] = cfg_chan->hw_value - 1; in wmi_sched_scan_set_channels()
3532 cmd->scan_plans[i].interval_sec = in wmi_sched_scan_set_plans()
3533 cpu_to_le16(cfg_plan->interval); in wmi_sched_scan_set_plans()
3534 cmd->scan_plans[i].num_of_iterations = in wmi_sched_scan_set_plans()
3535 cpu_to_le16(cfg_plan->iterations); in wmi_sched_scan_set_plans()
3542 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_start_sched_scan()
3546 .initial_delay_sec = cpu_to_le16(request->delay), in wmi_start_sched_scan()
3555 if (!test_bit(WMI_FW_CAPABILITY_PNO, wil->fw_capabilities)) in wmi_start_sched_scan()
3556 return -ENOTSUPP; in wmi_start_sched_scan()
3558 if (request->min_rssi_thold >= S8_MIN && in wmi_start_sched_scan()
3559 request->min_rssi_thold <= S8_MAX) in wmi_start_sched_scan()
3560 cmd.min_rssi_threshold = request->min_rssi_thold; in wmi_start_sched_scan()
3562 wmi_sched_scan_set_ssids(wil, &cmd, request->ssids, request->n_ssids, in wmi_start_sched_scan()
3563 request->match_sets, request->n_match_sets); in wmi_start_sched_scan()
3565 request->n_channels, request->channels); in wmi_start_sched_scan()
3567 request->scan_plans, request->n_scan_plans); in wmi_start_sched_scan()
3569 rc = wmi_call(wil, WMI_START_SCHED_SCAN_CMDID, vif->mid, in wmi_start_sched_scan()
3579 return -EINVAL; in wmi_start_sched_scan()
3587 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wmi_stop_sched_scan()
3596 if (!test_bit(WMI_FW_CAPABILITY_PNO, wil->fw_capabilities)) in wmi_stop_sched_scan()
3597 return -ENOTSUPP; in wmi_stop_sched_scan()
3599 rc = wmi_call(wil, WMI_STOP_SCHED_SCAN_CMDID, vif->mid, NULL, 0, in wmi_stop_sched_scan()
3608 return -EINVAL; in wmi_stop_sched_scan()
3628 wil_dbg_misc(wil, "mgmt_tx mid %d\n", vif->mid); in wmi_mgmt_tx()
3633 return -EINVAL; in wmi_mgmt_tx()
3638 return -EINVAL; in wmi_mgmt_tx()
3643 return -ENOMEM; in wmi_mgmt_tx()
3645 memcpy(cmd->dst_mac, mgmt_frame->da, WMI_MAC_LEN); in wmi_mgmt_tx()
3646 cmd->len = cpu_to_le16(len); in wmi_mgmt_tx()
3647 memcpy(cmd->payload, buf, len); in wmi_mgmt_tx()
3649 rc = wmi_call(wil, WMI_SW_TX_REQ_CMDID, vif->mid, cmd, total, in wmi_mgmt_tx()
3654 rc = -EAGAIN; in wmi_mgmt_tx()
3678 vif->mid, channel, duration_ms); in wmi_mgmt_tx_ext()
3684 return -EINVAL; in wmi_mgmt_tx_ext()
3690 return -EINVAL; in wmi_mgmt_tx_ext()
3695 return -ENOMEM; in wmi_mgmt_tx_ext()
3697 memcpy(cmd->dst_mac, mgmt_frame->da, WMI_MAC_LEN); in wmi_mgmt_tx_ext()
3698 cmd->len = cpu_to_le16(len); in wmi_mgmt_tx_ext()
3699 memcpy(cmd->payload, buf, len); in wmi_mgmt_tx_ext()
3700 cmd->channel = channel - 1; in wmi_mgmt_tx_ext()
3701 cmd->duration_ms = cpu_to_le16(duration_ms); in wmi_mgmt_tx_ext()
3703 rc = wmi_call(wil, WMI_SW_TX_REQ_EXT_CMDID, vif->mid, cmd, total, in wmi_mgmt_tx_ext()
3708 rc = -EAGAIN; in wmi_mgmt_tx_ext()
3719 struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev); in wil_wmi_tx_sring_cfg()
3720 struct wil_status_ring *sring = &wil->srings[ring_id]; in wil_wmi_tx_sring_cfg()
3723 .ring_size = cpu_to_le16(sring->size), in wil_wmi_tx_sring_cfg()
3736 cmd.ring_cfg.ring_mem_base = cpu_to_le64(sring->pa); in wil_wmi_tx_sring_cfg()
3737 rc = wmi_call(wil, WMI_TX_STATUS_RING_ADD_CMDID, vif->mid, &cmd, in wil_wmi_tx_sring_cfg()
3748 return -EINVAL; in wil_wmi_tx_sring_cfg()
3751 sring->hwtail = le32_to_cpu(reply.evt.ring_tail_ptr); in wil_wmi_tx_sring_cfg()
3758 struct net_device *ndev = wil->main_ndev; in wil_wmi_cfg_def_rx_offload()
3775 rc = wmi_call(wil, WMI_CFG_DEF_RX_OFFLOAD_CMDID, vif->mid, &cmd, in wil_wmi_cfg_def_rx_offload()
3786 return -EINVAL; in wil_wmi_cfg_def_rx_offload()
3794 struct net_device *ndev = wil->main_ndev; in wil_wmi_rx_sring_add()
3796 struct wil_status_ring *sring = &wil->srings[ring_id]; in wil_wmi_rx_sring_add()
3800 .ring_size = cpu_to_le16(sring->size), in wil_wmi_rx_sring_add()
3803 .rx_msg_type = wil->use_compressed_rx_status ? in wil_wmi_rx_sring_add()
3815 cmd.ring_cfg.ring_mem_base = cpu_to_le64(sring->pa); in wil_wmi_rx_sring_add()
3816 rc = wmi_call(wil, WMI_RX_STATUS_RING_ADD_CMDID, vif->mid, &cmd, in wil_wmi_rx_sring_add()
3827 return -EINVAL; in wil_wmi_rx_sring_add()
3830 sring->hwtail = le32_to_cpu(reply.evt.ring_tail_ptr); in wil_wmi_rx_sring_add()
3837 struct net_device *ndev = wil->main_ndev; in wil_wmi_rx_desc_ring_add()
3839 struct wil_ring *ring = &wil->ring_rx; in wil_wmi_rx_desc_ring_add()
3843 .ring_size = cpu_to_le16(ring->size), in wil_wmi_rx_desc_ring_add()
3856 cmd.ring_cfg.ring_mem_base = cpu_to_le64(ring->pa); in wil_wmi_rx_desc_ring_add()
3857 cmd.sw_tail_host_addr = cpu_to_le64(ring->edma_rx_swtail.pa); in wil_wmi_rx_desc_ring_add()
3858 rc = wmi_call(wil, WMI_RX_DESC_RING_ADD_CMDID, vif->mid, &cmd, in wil_wmi_rx_desc_ring_add()
3869 return -EINVAL; in wil_wmi_rx_desc_ring_add()
3872 ring->hwtail = le32_to_cpu(reply.evt.ring_tail_ptr); in wil_wmi_rx_desc_ring_add()
3881 int sring_id = wil->tx_sring_idx; /* there is only one TX sring */ in wil_wmi_tx_desc_ring_add()
3883 struct wil_ring *ring = &wil->ring_tx[ring_id]; in wil_wmi_tx_desc_ring_add()
3884 struct wil_ring_tx_data *txdata = &wil->ring_tx_data[ring_id]; in wil_wmi_tx_desc_ring_add()
3887 .ring_size = cpu_to_le16(ring->size), in wil_wmi_tx_desc_ring_add()
3907 cmd.ring_cfg.ring_mem_base = cpu_to_le64(ring->pa); in wil_wmi_tx_desc_ring_add()
3908 rc = wmi_call(wil, WMI_TX_DESC_RING_ADD_CMDID, vif->mid, &cmd, in wil_wmi_tx_desc_ring_add()
3919 return -EINVAL; in wil_wmi_tx_desc_ring_add()
3922 spin_lock_bh(&txdata->lock); in wil_wmi_tx_desc_ring_add()
3923 ring->hwtail = le32_to_cpu(reply.evt.ring_tail_ptr); in wil_wmi_tx_desc_ring_add()
3924 txdata->mid = vif->mid; in wil_wmi_tx_desc_ring_add()
3925 txdata->enabled = 1; in wil_wmi_tx_desc_ring_add()
3926 spin_unlock_bh(&txdata->lock); in wil_wmi_tx_desc_ring_add()
3934 struct wil_ring *ring = &wil->ring_tx[ring_id]; in wil_wmi_bcast_desc_ring_add()
3938 .ring_size = cpu_to_le16(ring->size), in wil_wmi_bcast_desc_ring_add()
3942 .status_ring_id = wil->tx_sring_idx, in wil_wmi_bcast_desc_ring_add()
3951 struct wil_ring_tx_data *txdata = &wil->ring_tx_data[ring_id]; in wil_wmi_bcast_desc_ring_add()
3953 cmd.ring_cfg.ring_mem_base = cpu_to_le64(ring->pa); in wil_wmi_bcast_desc_ring_add()
3954 rc = wmi_call(wil, WMI_BCAST_DESC_RING_ADD_CMDID, vif->mid, &cmd, in wil_wmi_bcast_desc_ring_add()
3965 return -EINVAL; in wil_wmi_bcast_desc_ring_add()
3968 spin_lock_bh(&txdata->lock); in wil_wmi_bcast_desc_ring_add()
3969 ring->hwtail = le32_to_cpu(reply.evt.ring_tail_ptr); in wil_wmi_bcast_desc_ring_add()
3970 txdata->mid = vif->mid; in wil_wmi_bcast_desc_ring_add()
3971 txdata->enabled = 1; in wil_wmi_bcast_desc_ring_add()
3972 spin_unlock_bh(&txdata->lock); in wil_wmi_bcast_desc_ring_add()
3994 rc = wmi_call(wil, WMI_LINK_STATS_CMDID, vif->mid, &cmd, sizeof(cmd), in wmi_link_stats_cfg()
4005 return -EINVAL; in wmi_link_stats_cfg()
4014 struct net_device *ndev = wil->main_ndev; in wmi_set_cqm_rssi_config()
4026 cmd->rssi_hyst = rssi_hyst; in wmi_set_cqm_rssi_config()
4027 cmd->rssi_thresholds_list[0] = rssi_thold; in wmi_set_cqm_rssi_config()
4030 return -EINVAL; in wmi_set_cqm_rssi_config()
4032 rc = wmi_call(wil, WMI_SET_LINK_MONITOR_CMDID, vif->mid, cmd, in wmi_set_cqm_rssi_config()
4043 return -EINVAL; in wmi_set_cqm_rssi_config()