diff --git a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h index 429b34486e40..d902f7ee4327 100644 --- a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h +++ b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h @@ -1967,6 +1967,14 @@ QDF_STATUS policy_mgr_wait_for_connection_update( */ QDF_STATUS policy_mgr_reset_connection_update(struct wlan_objmgr_psoc *psoc); +/** + * policy_mgr_reset_hw_mode_change() - Reset the hw mode change. + * @psoc: Pointer to PSOC object + * + * Return: none + */ +void policy_mgr_reset_hw_mode_change(struct wlan_objmgr_psoc *psoc); + /** * policy_mgr_set_connection_update() - Set connection update * event diff --git a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c index 8bddabd08af7..671ae3c3b3a2 100644 --- a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c +++ b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c @@ -2609,6 +2609,14 @@ QDF_STATUS policy_mgr_reset_connection_update(struct wlan_objmgr_psoc *psoc) return QDF_STATUS_SUCCESS; } +void policy_mgr_reset_hw_mode_change(struct wlan_objmgr_psoc *psoc) +{ + policy_mgr_err("Clear hw mode change and connection update evt"); + policy_mgr_set_hw_mode_change_in_progress( + psoc, POLICY_MGR_HW_MODE_NOT_IN_PROGRESS); + policy_mgr_reset_connection_update(psoc); +} + QDF_STATUS policy_mgr_set_connection_update(struct wlan_objmgr_psoc *psoc) { QDF_STATUS status; diff --git a/components/nan/core/inc/nan_public_structs.h b/components/nan/core/inc/nan_public_structs.h index f4ca28fb5ee9..71e0940ac5f1 100644 --- a/components/nan/core/inc/nan_public_structs.h +++ b/components/nan/core/inc/nan_public_structs.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -788,6 +789,7 @@ struct nan_datapath_host_event { * @delete_peers_by_addr: LIM callback for deleting peer by MAC address * @update_ndi_conn: WMA callback to update NDI's connection info * @nan_concurrency_update: Callback to handle nan concurrency + * @set_mc_list: HDD callback to set multicast peer list */ struct nan_callbacks { /* callback to os_if layer from umac */ @@ -813,6 +815,7 @@ struct nan_callbacks { struct nan_datapath_channel_info *chan_info); void (*nan_concurrency_update)(void); + void (*set_mc_list)(struct wlan_objmgr_vdev *vdev); }; /** diff --git a/components/nan/dispatcher/src/nan_ucfg_api.c b/components/nan/dispatcher/src/nan_ucfg_api.c index f32734f19919..cc5c74ddcea2 100644 --- a/components/nan/dispatcher/src/nan_ucfg_api.c +++ b/components/nan/dispatcher/src/nan_ucfg_api.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -186,6 +186,37 @@ inline QDF_STATUS ucfg_nan_set_active_peers(struct wlan_objmgr_vdev *vdev, return QDF_STATUS_SUCCESS; } +/** + * ucfg_nan_update_mc_list() - update the multicast list + * @vdev: Pointer to VDEV Object + * + * This function will update the multicast list for NDP peer + */ +static void ucfg_nan_update_mc_list(struct wlan_objmgr_vdev *vdev) +{ + struct nan_callbacks cb_obj; + QDF_STATUS status; + struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev); + + if (!psoc) { + nan_err("psoc is null"); + return; + } + + status = ucfg_nan_get_callbacks(psoc, &cb_obj); + if (QDF_IS_STATUS_ERROR(status)) { + nan_err("Couldn't get callback object"); + return; + } + + if (!cb_obj.set_mc_list) { + nan_err("set_mc_list callback not registered"); + return; + } + + cb_obj.set_mc_list(vdev); +} + inline void ucfg_nan_set_peer_mc_list(struct wlan_objmgr_vdev *vdev, struct qdf_mac_addr peer_mac_addr) { @@ -215,7 +246,7 @@ inline void ucfg_nan_set_peer_mc_list(struct wlan_objmgr_vdev *vdev, } if (list_idx == max_ndp_sessions) { nan_err("Peer multicast address list is full"); - goto end; + qdf_spin_unlock_bh(&priv_obj->lock); } /* Derive peer multicast addr */ peer_mac_addr.bytes[0] = 0x33; @@ -223,8 +254,9 @@ inline void ucfg_nan_set_peer_mc_list(struct wlan_objmgr_vdev *vdev, peer_mac_addr.bytes[2] = 0xff; priv_obj->peer_mc_addr_list[list_idx] = peer_mac_addr; -end: qdf_spin_unlock_bh(&priv_obj->lock); + + ucfg_nan_update_mc_list(vdev); } inline void ucfg_nan_get_peer_mc_list( @@ -269,7 +301,10 @@ inline void ucfg_nan_clear_peer_mc_list(struct wlan_objmgr_psoc *psoc, break; } } + qdf_spin_unlock_bh(&priv_obj->lock); + + ucfg_nan_update_mc_list(vdev); } inline uint32_t ucfg_nan_get_active_peers(struct wlan_objmgr_vdev *vdev) @@ -623,6 +658,7 @@ int ucfg_nan_register_hdd_callbacks(struct wlan_objmgr_psoc *psoc, ucfg_nan_request_process_cb; psoc_obj->cb_obj.nan_concurrency_update = cb_obj->nan_concurrency_update; + psoc_obj->cb_obj.set_mc_list = cb_obj->set_mc_list; return 0; } diff --git a/components/pkt_capture/core/inc/wlan_pkt_capture_data_txrx.h b/components/pkt_capture/core/inc/wlan_pkt_capture_data_txrx.h index e933c47ce78e..c56ff2787944 100644 --- a/components/pkt_capture/core/inc/wlan_pkt_capture_data_txrx.h +++ b/components/pkt_capture/core/inc/wlan_pkt_capture_data_txrx.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2021, 2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -42,6 +43,8 @@ #define IEEE80211_RADIOTAP_HE_DATA1_STBC_KNOWN 0x0200 #endif +#define HAL_TX_PKT_TYPE_11B 1 + /** * pkt_capture_data_process_type - data pkt types to process * for packet capture mode diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c b/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c index 6cebfe5481b9..e8c8682737c3 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_data_txrx.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -115,6 +115,7 @@ static unsigned char pkt_capture_get_tx_rate( case 0x0: ret = 0x16; *preamble = LONG_PREAMBLE; + break; case 0x1: ret = 0xB; *preamble = LONG_PREAMBLE; @@ -179,12 +180,14 @@ static void pkt_capture_tx_get_phy_info( mcs = 8 + pktcapture_hdr->mcs; else mcs = pktcapture_hdr->mcs; + + tx_status->ht_mcs = mcs; break; case 0x3: tx_status->vht_flags = 1; mcs = pktcapture_hdr->mcs; tx_status->vht_flag_values3[0] = - mcs << 0x4 | (pktcapture_hdr->nss + 1); + mcs << 0x4 | (pktcapture_hdr->nss); tx_status->vht_flag_values2 = pktcapture_hdr->bw; break; case 0x4: @@ -205,9 +208,9 @@ static void pkt_capture_tx_get_phy_info( break; } - if (preamble == 0) + if (preamble_type != HAL_TX_PKT_TYPE_11B) tx_status->ofdm_flag = 1; - else if (preamble == 1) + else tx_status->cck_flag = 1; tx_status->mcs = mcs; @@ -727,9 +730,9 @@ static void pkt_capture_rx_get_phy_info(void *context, void *psoc, break; } - if (preamble == 0) + if (preamble_type != HAL_RX_PKT_TYPE_11B) rx_status->ofdm_flag = 1; - else if (preamble == 1) + else rx_status->cck_flag = 1; rx_status->bw = bw; diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_main.c b/components/pkt_capture/core/src/wlan_pkt_capture_main.c index 27081aa1c9a6..d4009775dd07 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_main.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_main.c @@ -292,8 +292,8 @@ pkt_capture_process_tx_data(void *soc, void *log_data, u_int16_t vdev_id, /* nss not available */ pktcapture_hdr.nss = 0; pktcapture_hdr.rssi_comb = tx_comp_status.ack_frame_rssi; - /* rate not available */ - pktcapture_hdr.rate = 0; + /* update rate from available mcs */ + pktcapture_hdr.rate = tx_comp_status.mcs; pktcapture_hdr.stbc = tx_comp_status.stbc; pktcapture_hdr.sgi = tx_comp_status.sgi; pktcapture_hdr.ldpc = tx_comp_status.ldpc; diff --git a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c index d185bb943250..b2cfe1332536 100644 --- a/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c +++ b/components/pkt_capture/core/src/wlan_pkt_capture_mgmt_txrx.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, 2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -362,6 +362,7 @@ pkt_capture_process_mgmt_tx_data(struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_psoc *psoc; tpSirMacFrameCtl pfc = (tpSirMacFrameCtl)(qdf_nbuf_data(nbuf)); struct ieee80211_frame *wh; + uint16_t rate; psoc = wlan_pdev_get_psoc(pdev); if (!psoc) { @@ -388,8 +389,6 @@ pkt_capture_process_mgmt_tx_data(struct wlan_objmgr_pdev *pdev, txrx_status.tsft = (u_int64_t)params->tsf_l32; txrx_status.chan_num = wlan_freq_to_chan(params->chan_freq); txrx_status.chan_freq = params->chan_freq; - /* params->rate is in Kbps, convert into Mbps */ - txrx_status.rate = (params->rate_kbps / 1000); if (params->rssi == INVALID_RSSI_FOR_TX) /* RSSI -128 is invalid rssi for TX, make it 0 here, * will be normalized during radiotap updation @@ -400,15 +399,18 @@ pkt_capture_process_mgmt_tx_data(struct wlan_objmgr_pdev *pdev, txrx_status.rssi_comb = txrx_status.ant_signal_db; txrx_status.nr_ant = 1; - txrx_status.rtap_flags |= - ((txrx_status.rate == 6 /* Mbps */) ? BIT(1) : 0); + rate = params->rate_kbps * 2; + /* params->rate is in Kbps, convert into Mbps */ + txrx_status.rate = (uint8_t)(rate / 1000); - if (txrx_status.rate == 6) + txrx_status.rtap_flags |= + ((txrx_status.rate == 12 /* Mbps */) ? BIT(1) : 0); + + if (txrx_status.rate == 12) txrx_status.ofdm_flag = 1; else txrx_status.cck_flag = 1; - txrx_status.rate = ((txrx_status.rate == 6 /* Mbps */) ? 0x0c : 0x02); txrx_status.tx_status = status; txrx_status.tx_retry_cnt = params->tx_retry_cnt; txrx_status.add_rtap_ext = true; diff --git a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h index 946d812f4eaf..f4e637ca1994 100644 --- a/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h +++ b/components/pkt_capture/dispatcher/inc/wlan_pkt_capture_public_structs.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021, 2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -73,7 +73,7 @@ enum pkt_capture_config { struct mgmt_offload_event_params { uint32_t tsf_l32; uint32_t chan_freq; - uint32_t rate_kbps; + uint16_t rate_kbps; uint32_t rssi; uint32_t buf_len; uint32_t tx_status; diff --git a/core/dp/txrx3.0/dp_fisa_rx.c b/core/dp/txrx3.0/dp_fisa_rx.c index 35e359914b88..690962cb3d7d 100644 --- a/core/dp/txrx3.0/dp_fisa_rx.c +++ b/core/dp/txrx3.0/dp_fisa_rx.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -1608,6 +1608,10 @@ static bool dp_fisa_aggregation_should_stop( uint32_t cumulative_ip_len_delta = hal_cumulative_ip_len - fisa_flow->hal_cumultive_ip_len; /** + * kernel network panic if UDP data length < 12 bytes get aggregated, + * no solid conclusion currently, as a SW WAR, only allow UDP + * aggregation if UDP data length >= 16 bytes. + * * current cumulative ip length should > last cumulative_ip_len * and <= last cumulative_ip_len + 1478, also current aggregate * count should be equal to last aggregate count + 1, @@ -1616,6 +1620,7 @@ static bool dp_fisa_aggregation_should_stop( * otherwise, current fisa flow aggregation should be stopped. */ if (fisa_flow->do_not_aggregate || + msdu_len < (l4_hdr_offset + FISA_MIN_L4_AND_DATA_LEN) || hal_cumulative_ip_len <= fisa_flow->hal_cumultive_ip_len || cumulative_ip_len_delta > FISA_MAX_SINGLE_CUMULATIVE_IP_LEN || (fisa_flow->last_hal_aggr_count + 1) != hal_aggr_count || diff --git a/core/dp/txrx3.0/dp_fisa_rx.h b/core/dp/txrx3.0/dp_fisa_rx.h index e660fdc030fa..1ded3f38d820 100644 --- a/core/dp/txrx3.0/dp_fisa_rx.h +++ b/core/dp/txrx3.0/dp_fisa_rx.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -37,6 +38,12 @@ #define FISA_FLOW_MAX_CUMULATIVE_IP_LEN \ (FISA_MAX_SINGLE_CUMULATIVE_IP_LEN * FISA_FLOW_MAX_AGGR_COUNT) +/* minimal pure UDP data length required for FISA */ +#define FISA_MIN_UDP_DATA_LEN 16 +/* minimal length without L2/L3 header required for FISA */ +#define FISA_MIN_L4_AND_DATA_LEN \ + (FISA_UDP_HDR_LEN + FISA_MIN_UDP_DATA_LEN) + #define IPSEC_PORT 500 #define IPSEC_NAT_PORT 4500 diff --git a/core/dp/txrx3.0/dp_txrx.h b/core/dp/txrx3.0/dp_txrx.h index de2a3cf30feb..065b6c170d05 100644 --- a/core/dp/txrx3.0/dp_txrx.h +++ b/core/dp/txrx3.0/dp_txrx.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -202,6 +203,8 @@ static inline QDF_STATUS dp_txrx_resume(ol_txrx_soc_handle soc) goto ret; } + cdp_set_tx_pause(soc, false); + refill_thread = &dp_ext_hdl->refill_thread; if (refill_thread->enabled) { qdf_status = dp_rx_refill_thread_resume(refill_thread); @@ -248,6 +251,7 @@ static inline QDF_STATUS dp_txrx_suspend(ol_txrx_soc_handle soc) if (QDF_IS_STATUS_ERROR(qdf_status) && refill_thread->enabled) dp_rx_refill_thread_resume(refill_thread); + cdp_set_tx_pause(soc, true); ret: return qdf_status; } diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index 5d74543caefc..9934f6c2fb0d 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1223,6 +1223,8 @@ enum qdisc_filter_status { * @cache_sta_count: number of currently cached stations * @acs_complete_event: acs complete event * @latency_level: 0 - normal, 1 - moderate, 2 - low, 3 - ultralow + * @mc_addr_list: multicast address list + * @mc_list_lock: spin lock for multicast list * @last_disconnect_reason: Last disconnected internal reason code * as per enum qca_disconnect_reason_codes * @connect_req_status: Last disconnected internal status code @@ -1408,6 +1410,7 @@ struct hdd_adapter { #endif struct hdd_multicast_addr_list mc_addr_list; + qdf_spinlock_t mc_list_lock; uint8_t addr_filter_pattern; struct hdd_scan_info scan_info; @@ -1934,6 +1937,7 @@ struct hdd_context { bool is_ol_rx_thread_suspended; #endif + bool hdd_wlan_suspend_in_progress; bool hdd_wlan_suspended; bool suspended; /* flag to start pktlog after SSR/PDR if previously enabled */ @@ -5030,4 +5034,13 @@ void wlan_hdd_set_pm_qos_request(struct hdd_context *hdd_ctx, { } #endif + +/** + * hdd_update_multicast_list() - update the multicast list + * @vdev: pointer to VDEV object + * + * Return: none + */ +void hdd_update_multicast_list(struct wlan_objmgr_vdev *vdev); + #endif /* end #if !defined(WLAN_HDD_MAIN_H) */ diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index e7ec3a87528c..3c5cd5e6ad03 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -16742,8 +16742,7 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = { .info.vendor_id = QCA_NL80211_VENDOR_ID, .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_USABLE_CHANNELS, .flags = WIPHY_VENDOR_CMD_NEED_WDEV | - WIPHY_VENDOR_CMD_NEED_NETDEV | - WIPHY_VENDOR_CMD_NEED_RUNNING, + WIPHY_VENDOR_CMD_NEED_NETDEV, .doit = wlan_hdd_cfg80211_get_usable_channel, vendor_command_policy(get_usable_channel_policy, QCA_WLAN_VENDOR_ATTR_MAX) diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 68cdfec4e54a..b7f2353b28e8 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -3589,6 +3589,7 @@ static void hdd_nan_register_callbacks(struct hdd_context *hdd_ctx) cb_obj.peer_departed_ind = hdd_ndp_peer_departed_handler; cb_obj.nan_concurrency_update = hdd_nan_concurrency_update; + cb_obj.set_mc_list = hdd_update_multicast_list; os_if_nan_register_hdd_callbacks(hdd_ctx->psoc, &cb_obj); } @@ -4163,7 +4164,7 @@ int hdd_wlan_start_modules(struct hdd_context *hdd_ctx, bool reinit) goto deregister_cb; /* - * NAN compoenet requires certian operations like, open adapter, + * NAN component requires certain operations like, open adapter, * close adapter, etc. to be initiated by HDD, for those * register HDD callbacks with UMAC's NAN componenet. */ @@ -4949,8 +4950,7 @@ hdd_set_derived_multicast_list(struct wlan_objmgr_psoc *psoc, /** * __hdd_set_multicast_list() - set the multicast address list - * @dev: Pointer to the WLAN device. - * @skb: Pointer to OS packet (sk_buff). + * @dev: Pointer to the WLAN device. * * This funciton sets the multicast address list. * @@ -4992,6 +4992,7 @@ static void __hdd_set_multicast_list(struct net_device *dev) if (!mc_list_request) return; + qdf_spin_lock_bh(&adapter->mc_list_lock); /* Delete already configured multicast address list */ if (adapter->mc_addr_list.mc_cnt > 0) hdd_disable_and_flush_mc_addr_list(adapter, @@ -5044,6 +5045,7 @@ static void __hdd_set_multicast_list(struct net_device *dev) hdd_enable_mc_addr_filtering(adapter, pmo_mc_list_change_notify); free_req: + qdf_spin_unlock_bh(&adapter->mc_list_lock); qdf_mem_free(mc_list_request); } @@ -5065,6 +5067,33 @@ static void hdd_set_multicast_list(struct net_device *net_dev) osif_vdev_sync_op_stop(vdev_sync); } +void hdd_update_multicast_list(struct wlan_objmgr_vdev *vdev) +{ + struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); + struct hdd_adapter *adapter; + uint8_t vdev_id = wlan_vdev_get_id(vdev); + struct net_device *net_dev; + + if (!hdd_ctx) { + hdd_err("hdd_ctx is null"); + return; + } + + adapter = hdd_get_adapter_by_vdev(hdd_ctx, vdev_id); + if (!adapter) { + hdd_err("adapter is null for vdev_id %d", vdev_id); + return; + } + + net_dev = adapter->dev; + if (!net_dev) { + hdd_err("netdev is null"); + return; + } + + __hdd_set_multicast_list(net_dev); +} + #ifdef WLAN_FEATURE_TSF_PTP static const struct ethtool_ops wlan_ethtool_ops = { .get_ts_info = wlan_get_ts_info, @@ -6169,6 +6198,7 @@ static void hdd_cleanup_adapter(struct hdd_context *hdd_ctx, hdd_periodic_sta_stats_mutex_destroy(adapter); hdd_apf_context_destroy(adapter); qdf_spinlock_destroy(&adapter->vdev_lock); + qdf_spinlock_destroy(&adapter->mc_list_lock); hdd_sta_info_deinit(&adapter->sta_info_list); hdd_sta_info_deinit(&adapter->cache_sta_info_list); @@ -6996,6 +7026,7 @@ struct hdd_adapter *hdd_open_adapter(struct hdd_context *hdd_ctx, uint8_t sessio qdf_list_create(&adapter->blocked_scan_request_q, WLAN_MAX_SCAN_COUNT); qdf_mutex_create(&adapter->blocked_scan_request_q_lock); qdf_event_create(&adapter->acs_complete_event); + qdf_spinlock_create(&adapter->mc_list_lock); qdf_event_create(&adapter->peer_cleanup_done); hdd_sta_info_init(&adapter->sta_info_list); hdd_sta_info_init(&adapter->cache_sta_info_list); diff --git a/core/hdd/src/wlan_hdd_nan_datapath.c b/core/hdd/src/wlan_hdd_nan_datapath.c index 9e4d8d0b288e..4dde13d19221 100644 --- a/core/hdd/src/wlan_hdd_nan_datapath.c +++ b/core/hdd/src/wlan_hdd_nan_datapath.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1148,10 +1148,11 @@ void hdd_ndp_peer_departed_handler(uint8_t vdev_id, uint16_t sta_id, hdd_delete_peer(sta_ctx, peer_mac_addr); + ucfg_nan_clear_peer_mc_list(hdd_ctx->psoc, adapter->vdev, + peer_mac_addr); + if (last_peer) { hdd_debug("No more ndp peers."); - ucfg_nan_clear_peer_mc_list(hdd_ctx->psoc, adapter->vdev, - peer_mac_addr); hdd_cleanup_ndi(hdd_ctx, adapter); qdf_event_set(&adapter->peer_cleanup_done); /* diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c index df9f54dc88d2..7099e39b2498 100644 --- a/core/hdd/src/wlan_hdd_power.c +++ b/core/hdd/src/wlan_hdd_power.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1496,12 +1496,17 @@ hdd_suspend_wlan(void) hdd_adapter_dev_put_debug(adapter, NET_DEV_HOLD_SUSPEND_WLAN); } + hdd_ctx->hdd_wlan_suspend_in_progress = true; + status = ucfg_pmo_psoc_user_space_suspend_req(hdd_ctx->psoc, QDF_SYSTEM_SUSPEND); - if (status != QDF_STATUS_SUCCESS) + if (status != QDF_STATUS_SUCCESS) { + hdd_ctx->hdd_wlan_suspend_in_progress = false; return -EAGAIN; + } hdd_ctx->hdd_wlan_suspended = true; + hdd_ctx->hdd_wlan_suspend_in_progress = false; hdd_configure_sar_sleep_index(hdd_ctx); diff --git a/core/hdd/src/wlan_hdd_softap_tx_rx.c b/core/hdd/src/wlan_hdd_softap_tx_rx.c index 4bdd7cae9fdb..71ea18963386 100644 --- a/core/hdd/src/wlan_hdd_softap_tx_rx.c +++ b/core/hdd/src/wlan_hdd_softap_tx_rx.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -551,7 +551,8 @@ static void __hdd_softap_hard_start_xmit(struct sk_buff *skb, goto drop_pkt; } - if (hdd_ctx->hdd_wlan_suspended) { + if (qdf_unlikely(hdd_ctx->hdd_wlan_suspended || + hdd_ctx->hdd_wlan_suspend_in_progress)) { hdd_err_rl("Device is system suspended, drop pkt"); goto drop_pkt; } diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c index f4ffa2002ce9..39de8384548a 100644 --- a/core/hdd/src/wlan_hdd_tx_rx.c +++ b/core/hdd/src/wlan_hdd_tx_rx.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1029,7 +1029,8 @@ static void __hdd_hard_start_xmit(struct sk_buff *skb, if (wlan_hdd_validate_context(hdd_ctx)) goto drop_pkt; - if (hdd_ctx->hdd_wlan_suspended) { + if (qdf_unlikely(!hdd_ctx || hdd_ctx->hdd_wlan_suspended || + hdd_ctx->hdd_wlan_suspend_in_progress)) { hdd_err_rl("Device is system suspended, drop pkt"); goto drop_pkt; } diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h index a22196838e55..8f7b64080e47 100644 --- a/core/mac/inc/qwlan_version.h +++ b/core/mac/inc/qwlan_version.h @@ -32,9 +32,9 @@ #define QWLAN_VERSION_MAJOR 2 #define QWLAN_VERSION_MINOR 0 #define QWLAN_VERSION_PATCH 8 -#define QWLAN_VERSION_EXTRA "B" +#define QWLAN_VERSION_EXTRA "M" #define QWLAN_VERSION_BUILD 33 -#define QWLAN_VERSIONSTR "2.0.8.33B" +#define QWLAN_VERSIONSTR "2.0.8.33M" #endif /* QWLAN_VERSION_H */ diff --git a/core/mac/src/pe/lim/lim_ft.c b/core/mac/src/pe/lim/lim_ft.c index 0017167ac437..45303ef60fc2 100644 --- a/core/mac/src/pe/lim/lim_ft.c +++ b/core/mac/src/pe/lim/lim_ft.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -516,7 +516,7 @@ void lim_fill_ft_session(struct mac_context *mac, tSchBeaconStruct *pBeaconStruct; ePhyChanBondState cbEnabledMode; struct vdev_mlme_obj *mlme_obj; - bool is_pwr_constraint; + bool is_pwr_constraint = false; pBeaconStruct = qdf_mem_malloc(sizeof(tSchBeaconStruct)); if (!pBeaconStruct) @@ -697,6 +697,8 @@ void lim_fill_ft_session(struct mac_context *mac, if (is_pwr_constraint) localPowerConstraint = regMax - localPowerConstraint; + mlme_obj->reg_tpc_obj.is_power_constraint_abs = !is_pwr_constraint; + ft_session->limReassocBssQosCaps = ft_session->limCurrentBssQosCaps; diff --git a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c index 0028143b26ca..a468c70e49b3 100644 --- a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c +++ b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -2325,8 +2325,7 @@ void lim_handle_add_bss_rsp(struct mac_context *mac_ctx, } tx_ops = wlan_reg_get_tx_ops(mac_ctx->psoc); - lim_calculate_tpc(mac_ctx, session_entry, false, 0, - false); + lim_calculate_tpc(mac_ctx, session_entry, 0, false); if (tx_ops->set_tpc_power) tx_ops->set_tpc_power(mac_ctx->psoc, @@ -2811,7 +2810,7 @@ static void lim_process_switch_channel_join_req( goto error; } - lim_calculate_tpc(mac_ctx, session_entry, false, 0, false); + lim_calculate_tpc(mac_ctx, session_entry, 0, false); if (tx_ops->set_tpc_power) tx_ops->set_tpc_power(mac_ctx->psoc, diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c index 1fec33b2ddbd..b535912d9f3b 100644 --- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c @@ -1222,7 +1222,7 @@ __lim_process_sme_join_req(struct mac_context *mac_ctx, void *msg_buf) uint8_t vdev_id = 0; int8_t local_power_constraint = 0; struct vdev_mlme_obj *mlme_obj; - bool is_pwr_constraint; + bool is_pwr_constraint = false; uint16_t ie_len; const uint8_t *vendor_ie; struct bss_description *bss_desc; @@ -1614,6 +1614,9 @@ __lim_process_sme_join_req(struct mac_context *mac_ctx, void *msg_buf) &session->gLimCurrentBssUapsd, &local_power_constraint, session, &is_pwr_constraint); + mlme_obj->reg_tpc_obj.is_power_constraint_abs = + !is_pwr_constraint; + if (wlan_reg_is_ext_tpc_supported(mac_ctx->psoc)) { mlme_obj->reg_tpc_obj.ap_constraint_power = local_power_constraint; @@ -2017,7 +2020,6 @@ uint8_t lim_get_max_tx_power(struct mac_context *mac, void lim_calculate_tpc(struct mac_context *mac, struct pe_session *session, - bool is_pwr_constraint_absolute, uint8_t ap_pwr_type, bool ctry_code_match) { @@ -2140,8 +2142,9 @@ void lim_calculate_tpc(struct mac_context *mac, mlme_obj->reg_tpc_obj.ap_constraint_power; pe_debug("local constraint: %d" "power constraint absolute: %d", - local_constraint, is_pwr_constraint_absolute); - if (is_pwr_constraint_absolute) + local_constraint, + mlme_obj->reg_tpc_obj.is_power_constraint_abs); + if (mlme_obj->reg_tpc_obj.is_power_constraint_abs) max_tx_power = QDF_MIN(reg_max, local_constraint); else diff --git a/core/mac/src/pe/lim/lim_utils.h b/core/mac/src/pe/lim/lim_utils.h index eaa7d7585adc..b97bb75871da 100644 --- a/core/mac/src/pe/lim/lim_utils.h +++ b/core/mac/src/pe/lim/lim_utils.h @@ -188,8 +188,6 @@ uint8_t lim_get_max_tx_power(struct mac_context *mac, * lim_calculate_tpc() - Utility to get maximum tx power * @mac: mac handle * @session: PE Session Entry - * @is_pwr_constraint_absolute: If local power constraint is an absolute - * value or an offset value. * @ap_pwr_type: Ap power type for 6G * @ctry_code_match: check for country IE and sta programmed ctry match * @@ -200,7 +198,6 @@ uint8_t lim_get_max_tx_power(struct mac_context *mac, */ void lim_calculate_tpc(struct mac_context *mac, struct pe_session *session, - bool is_pwr_constraint_absolute, uint8_t ap_pwr_type, bool ctry_code_match); diff --git a/core/mac/src/pe/rrm/rrm_api.c b/core/mac/src/pe/rrm/rrm_api.c index f9e9670fe4e2..3e020cef811b 100644 --- a/core/mac/src/pe/rrm/rrm_api.c +++ b/core/mac/src/pe/rrm/rrm_api.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -270,7 +271,9 @@ rrm_process_link_measurement_request(struct mac_context *mac, ap_pwr_constraint = mlme_obj->reg_tpc_obj.ap_constraint_power; mlme_obj->reg_tpc_obj.ap_constraint_power = pLinkReq->MaxTxPower.maxTxPower; - lim_calculate_tpc(mac, pe_session, true, 0, false); + /* Set is_power_constraint_abs to true to calculate tpc power */ + mlme_obj->reg_tpc_obj.is_power_constraint_abs = true; + lim_calculate_tpc(mac, pe_session, 0, false); LinkReport.txPower = mlme_obj->reg_tpc_obj.chan_power_info[0].tx_power; diff --git a/core/mac/src/pe/sch/sch_beacon_process.c b/core/mac/src/pe/sch/sch_beacon_process.c index bb6f30baf728..fc0dffe910e5 100644 --- a/core/mac/src/pe/sch/sch_beacon_process.c +++ b/core/mac/src/pe/sch/sch_beacon_process.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -688,15 +688,19 @@ sch_bcn_process_sta_opmode(struct mac_context *mac_ctx, #ifdef FEATURE_WLAN_ESE static void get_local_power_constraint_beacon( tpSchBeaconStruct bcn, - int8_t *local_constraint) + int8_t *local_constraint, + bool *is_power_constraint_abs) { - if (bcn->eseTxPwr.present) + if (bcn->eseTxPwr.present) { *local_constraint = bcn->eseTxPwr.power_limit; + *is_power_constraint_abs = true; + } } #else static void get_local_power_constraint_beacon( tpSchBeaconStruct bcn, - int8_t *local_constraint) + int8_t *local_constraint, + bool *is_power_constraint_abs) { } @@ -721,6 +725,7 @@ static void __sch_beacon_process_for_session(struct mac_context *mac_ctx, uint8_t programmed_country[REG_ALPHA2_LEN + 1]; enum reg_6g_ap_type pwr_type_6g = REG_INDOOR_AP; bool ctry_code_match = false; + bool is_power_constraint_abs = false; qdf_mem_zero(&beaconParams, sizeof(tUpdateBeaconParams)); beaconParams.paramChangeBitmap = 0; @@ -777,25 +782,30 @@ static void __sch_beacon_process_for_session(struct mac_context *mac_ctx, &tpe_change); if (mac_ctx->mlme_cfg->sta.allow_tpc_from_ap) { - get_local_power_constraint_beacon(bcn, - &local_constraint); + get_local_power_constraint_beacon( + bcn, &local_constraint, + &is_power_constraint_abs); if (mac_ctx->rrm.rrmPEContext.rrmEnable && - bcn->powerConstraintPresent) + bcn->powerConstraintPresent) { local_constraint = bcn->localPowerConstraint.localPowerConstraints; + is_power_constraint_abs = false; + } } if (local_constraint != mlme_obj->reg_tpc_obj.ap_constraint_power) { mlme_obj->reg_tpc_obj.ap_constraint_power = local_constraint; + mlme_obj->reg_tpc_obj.is_power_constraint_abs = + is_power_constraint_abs; ap_constraint_change = true; } if ((ap_constraint_change && local_constraint) || (tpe_change && !skip_tpe)) { - lim_calculate_tpc(mac_ctx, session, false, pwr_type_6g, + lim_calculate_tpc(mac_ctx, session, pwr_type_6g, ctry_code_match); if (tx_ops->set_tpc_power) @@ -810,16 +820,21 @@ static void __sch_beacon_process_for_session(struct mac_context *mac_ctx, local_constraint = regMax; if (mac_ctx->mlme_cfg->sta.allow_tpc_from_ap) { - get_local_power_constraint_beacon(bcn, - &local_constraint); + get_local_power_constraint_beacon( + bcn, &local_constraint, + &is_power_constraint_abs); if (mac_ctx->rrm.rrmPEContext.rrmEnable && bcn->powerConstraintPresent) { local_constraint = regMax; local_constraint -= bcn->localPowerConstraint.localPowerConstraints; + is_power_constraint_abs = false; + } } + mlme_obj->reg_tpc_obj.is_power_constraint_abs = + is_power_constraint_abs; mlme_obj->reg_tpc_obj.reg_max[0] = regMax; mlme_obj->reg_tpc_obj.ap_constraint_power = local_constraint; mlme_obj->reg_tpc_obj.frequency[0] = session->curr_op_freq; diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 67e2e9c67def..c6e3757eec5f 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -615,6 +615,8 @@ QDF_STATUS sme_ser_cmd_callback(struct wlan_serialization_command *cmd, status = sme_ser_handle_active_cmd(cmd); break; case WLAN_SER_CB_CANCEL_CMD: + if (cmd->cmd_type == WLAN_SER_CMD_SET_HW_MODE) + policy_mgr_reset_hw_mode_change(mac_ctx->psoc); break; case WLAN_SER_CB_RELEASE_MEM_CMD: if (cmd->vdev) @@ -629,6 +631,9 @@ QDF_STATUS sme_ser_cmd_callback(struct wlan_serialization_command *cmd, sme_cmd->command == eSmeCommandWmStatusChange)) qdf_trigger_self_recovery(mac_ctx->psoc, QDF_ACTIVE_LIST_TIMEOUT); + + if (cmd->cmd_type == WLAN_SER_CMD_SET_HW_MODE) + policy_mgr_reset_hw_mode_change(mac_ctx->psoc); break; default: sme_debug("unknown reason code"); diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index d09e2611c8ea..9aa6882b0864 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -21306,10 +21306,19 @@ csr_process_roam_sync_callback(struct mac_context *mac_ctx, * the candidate was not successful. * Connection to the previous AP is still valid in this * case. So move to RSO_ENABLED state. + * + * Switch to RSO enabled state only if the current state is + * WLAN_ROAMING_IN_PROG or WLAN_ROAM_SYNCH_IN_PROG. + * This API can be called in internal roam aborts also when + * RSO state is deinit and cause RSO start to be sent in + * disconnected state. */ - csr_post_roam_state_change(mac_ctx, session_id, - WLAN_ROAM_RSO_ENABLED, - REASON_ROAM_ABORT); + if (MLME_IS_ROAMING_IN_PROG(mac_ctx->psoc, session_id) || + MLME_IS_ROAM_SYNCH_IN_PROGRESS(mac_ctx->psoc, session_id)) + csr_post_roam_state_change(mac_ctx, session_id, + WLAN_ROAM_RSO_ENABLED, + REASON_ROAM_ABORT); + csr_roam_roaming_offload_timer_action(mac_ctx, 0, session_id, ROAMING_OFFLOAD_TIMER_STOP); csr_roam_call_callback(mac_ctx, session_id, NULL, 0, diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 409c88336202..702063ef6170 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -1398,16 +1398,6 @@ int wma_mlme_roam_synch_event_handler_cb(void *handle, uint8_t *event, wma_roam_update_vdev(wma, roam_synch_ind_ptr); - if (QDF_IS_STATUS_ERROR(wma->csr_roam_synch_cb(wma->mac_context, - roam_synch_ind_ptr, - bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION))) { - wma_err("CSR roam synch propagation failed, abort roam"); - status = -EINVAL; - goto cleanup_label; - } - - wma_process_roam_synch_complete(wma, synch_event->vdev_id); - /* update freq and channel width */ wma->interfaces[synch_event->vdev_id].ch_freq = roam_synch_ind_ptr->chan_freq; @@ -1426,6 +1416,16 @@ int wma_mlme_roam_synch_event_handler_cb(void *handle, uint8_t *event, param_buf->chan, &wma->interfaces[synch_event->vdev_id]); + if (QDF_IS_STATUS_ERROR(wma->csr_roam_synch_cb(wma->mac_context, + roam_synch_ind_ptr, + bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION))) { + wma_err("CSR roam synch propagation failed, abort roam"); + status = -EINVAL; + goto cleanup_label; + } + + wma_process_roam_synch_complete(wma, synch_event->vdev_id); + wma->csr_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_COMPLETE); wma->interfaces[synch_event->vdev_id].roam_synch_delay =