From afcd0f12891d173728683d15b9311de3ac33b2cd Mon Sep 17 00:00:00 2001 From: Pranita Solanke Date: Wed, 29 Aug 2018 22:49:23 +0530 Subject: [PATCH 1/3] qcacmn: Add Video/all TID Counters framework for both tx/rx Add struct in cdp required to display VoW stats for hawkeye and akronite Change-Id: Ibd3a3b5e5933841cc28c9ce1b36d69615234720a --- dp/inc/cdp_txrx_cmn.h | 31 +++++++++++++++ dp/inc/cdp_txrx_cmn_struct.h | 48 ++++++++++++++++++++++- dp/inc/cdp_txrx_ops.h | 4 +- dp/inc/cdp_txrx_stats_struct.h | 69 ++++++++++++++++++++++++++++++++++ qdf/inc/qdf_nbuf.h | 2 + qdf/inc/qdf_net_types.h | 5 ++- 6 files changed, 155 insertions(+), 4 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index b29cbffea95b..deec56a07d14 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/dp/inc/cdp_txrx_cmn.h @@ -1738,6 +1738,37 @@ cdp_pdev_set_ctrl_pdev(ol_txrx_soc_handle soc, struct cdp_pdev *dp_pdev, ctrl_pdev); } +/* cdp_txrx_classify_and_update() - To classify the packet and update stats + * @soc: opaque soc handle + * @vdev: opaque dp vdev handle + * @skb: data + * @dir: rx or tx packet + * @nbuf_classify: packet classification object + * + * Return: 1 on success else return 0 + */ +static inline int +cdp_txrx_classify_and_update(ol_txrx_soc_handle soc, + struct cdp_vdev *vdev, qdf_nbuf_t skb, + enum txrx_direction dir, + struct ol_txrx_nbuf_classify *nbuf_class) +{ + if (!soc || !soc->ops) { + QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, + "%s: Invalid Instance", __func__); + QDF_BUG(0); + return 0; + } + + if (!soc->ops->cmn_drv_ops || + !soc->ops->cmn_drv_ops->txrx_classify_update) + return 0; + + return soc->ops->cmn_drv_ops->txrx_classify_update(vdev, + skb, + dir, nbuf_class); +} + #ifdef RECEIVE_OFFLOAD /** * cdp_register_rx_offld_flush_cb() - register LRO/GRO flush cb function pointer diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index e1e8982cc66f..5e5e6811830b 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -360,6 +360,52 @@ typedef struct cdp_soc_t *ol_txrx_soc_handle; */ typedef void (*ol_txrx_vdev_delete_cb)(void *context); +/** + * ol_txrx_pkt_direction - Packet Direction + * @rx_direction: rx path packet + * @tx_direction: tx path packet + */ +enum txrx_direction { + rx_direction = 1, + tx_direction = 0, +}; + +/** + * ol_txrx_nbuf_classify - Packet classification object + * @peer_id: unique peer identifier from fw + * @tid: traffic identifier(could be overridden) + * @pkt_tid: traffic identifier(cannot be overridden) + * @pkt_tos: ip header tos value + * @pkt_dscp: ip header dscp value + * @tos: index value in map + * @dscp: DSCP_TID map index + * @is_mcast: multicast pkt check + * @is_eap: eapol pkt check + * @is_arp: arp pkt check + * @is_tcp: tcp pkt check + * @is_dhcp: dhcp pkt check + * @is_igmp: igmp pkt check + * @is_ipv4: ip version 4 pkt check + * @is_ipv6: ip version 6 pkt check + */ +struct ol_txrx_nbuf_classify { + uint16_t peer_id; + uint8_t tid; + uint8_t pkt_tid; + uint8_t pkt_tos; + uint8_t pkt_dscp; + uint8_t tos; + uint8_t dscp; + uint8_t is_mcast; + uint8_t is_eap; + uint8_t is_arp; + uint8_t is_tcp; + uint8_t is_dhcp; + uint8_t is_igmp; + uint8_t is_ipv4; + uint8_t is_ipv6; +}; + /** * ol_osif_vdev_handle - paque handle for OS shim virtual device * object @@ -625,7 +671,6 @@ struct ol_txrx_ops { ol_txrx_stats_rx_fp stats_rx; ol_txrx_rsim_rx_decap_fp rsim_rx_decap; } rx; - /* proxy arp function pointer - specified by OS shim, stored by txrx */ ol_txrx_proxy_arp_fp proxy_arp; ol_txrx_mcast_me_fp me_convert; @@ -758,7 +803,6 @@ enum cdp_vdev_param_type { #define PER_RADIO_FW_STATS_REQUEST 0 #define PER_VDEV_FW_STATS_REQUEST 1 - /** * enum data_stall_log_event_indicator - Module triggering data stall * @DATA_STALL_LOG_INDICATOR_UNUSED: Unused diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 5c1d0271999a..ada8d7cceebb 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -337,7 +337,6 @@ struct cdp_cmn_ops { struct cdp_ctrl_objmgr_pdev *ctrl_pdev); ol_txrx_tx_fp tx_send; - /** * txrx_get_os_rx_handles_from_vdev() - Return function, osif vdev * to deliver pkt to stack. @@ -349,6 +348,9 @@ struct cdp_cmn_ops { (struct cdp_vdev *vdev, ol_txrx_rx_fp *stack_fn, ol_osif_vdev_handle *osif_vdev); + int (*txrx_classify_update) + (struct cdp_vdev *vdev, qdf_nbuf_t skb, + enum txrx_direction, struct ol_txrx_nbuf_classify *nbuf_class); }; struct cdp_ctrl_ops { diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index 127cc925fa48..5816a5562aff 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -62,6 +62,31 @@ #define CDP_MAX_RX_RINGS 4 +/* TID level VoW stats macros + * to add and get stats + */ +#define PFLOW_TXRX_TIDQ_STATS_ADD(_peer, _tid, _var, _val) \ + (((_peer)->tidq_stats[_tid]).stats[_var]) += _val +#define PFLOW_TXRX_TIDQ_STATS_GET(_peer, _tid, _var, _val) \ + ((_peer)->tidq_stats[_tid].stats[_var]) +/* + * Video only stats + */ +#define PFLOW_CTRL_PDEV_VIDEO_STATS_SET(_pdev, _var, _val) \ + (((_pdev)->vow.vistats[_var]).value) = _val +#define PFLOW_CTRL_PDEV_VIDEO_STATS_GET(_pdev, _var) \ + ((_pdev)->vow.vistats[_var].value) +#define PFLOW_CTRL_PDEV_VIDEO_STATS_ADD(_pdev, _var, _val) \ + (((_pdev)->vow.vistats[_var]).value) += _val +/* + * video delay stats + */ +#define PFLOW_CTRL_PDEV_DELAY_VIDEO_STATS_SET(_pdev, _var, _val) \ + (((_pdev)->vow.delaystats[_var]).value) = _val +#define PFLOW_CTRL_PDEV_DELAY_VIDEO_STATS_GET(_pdev, _var) \ + ((_pdev)->vow.delaystats[_var].value) +#define PFLOW_CTRL_PDEV_DELAY_VIDEO_STATS_ADD(_pdev, _var, _val) \ + (((_pdev)->vow.delaystats[_var]).value) += _val /* * Number of TLVs sent by FW. Needs to reflect * HTT_PPDU_STATS_MAX_TAG declared in FW @@ -78,6 +103,47 @@ enum cdp_packet_type { DOT11_MAX = 5, }; +/* TID level Tx/Rx stats + * + */ +enum cdp_txrx_tidq_stats { + /* Tx Counters */ + TX_MSDU_TOTAL_LINUX_SUBSYSTEM, + TX_MSDU_TOTAL_FROM_OSIF, + TX_MSDU_TX_COMP_PKT_CNT, + /* Rx Counters */ + RX_MSDU_TOTAL_FROM_FW, + RX_MSDU_MCAST_FROM_FW, + RX_TID_MISMATCH_FROM_FW, + RX_MSDU_MISC_PKTS, + RX_MSDU_IS_ARP, + RX_MSDU_IS_EAP, + RX_MSDU_IS_DHCP, + RX_AGGREGATE_10, + RX_AGGREGATE_20, + RX_AGGREGATE_30, + RX_AGGREGATE_40, + RX_AGGREGATE_50, + RX_AGGREGATE_60, + RX_AGGREGATE_MORE, + RX_AMSDU_1, + RX_AMSDU_2, + RX_AMSDU_3, + RX_AMSDU_4, + RX_AMSDU_MORE, + RX_MSDU_CHAINED_FROM_FW, + RX_MSDU_REORDER_FAILED_FROM_FW, + RX_MSDU_REORDER_FLUSHED_FROM_FW, + RX_MSDU_DISCARD_FROM_FW, + RX_MSDU_DUPLICATE_FROM_FW, + RX_MSDU_DELIVERED_TO_STACK, + TIDQ_STATS_MAX, +}; + +struct cdp_tidq_stats { + uint32_t stats[TIDQ_STATS_MAX]; +}; + /* struct cdp_pkt_info - packet info * @num: no of packets * @bytes: total no of bytes @@ -1433,6 +1499,9 @@ enum _ol_ath_param_t { OL_ATH_PARAM_CHAN_AP_TX_UTIL = 391, OL_ATH_PARAM_CHAN_OBSS_RX_UTIL = 392, OL_ATH_PARAM_CHAN_NON_WIFI = 393, +#if PEER_FLOW_CONTROL + OL_ATH_PARAM_VIDEO_STATS_FC = 394, +#endif }; /* Enumeration of PDEV Configuration parameter */ diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index 5eb2d38381e0..534d63b58e4d 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -51,6 +51,8 @@ #define QDF_NBUF_TRAC_EAPOL_ETH_TYPE 0x888E #define QDF_NBUF_TRAC_WAPI_ETH_TYPE 0x88b4 #define QDF_NBUF_TRAC_ARP_ETH_TYPE 0x0806 +#define QDF_NBUF_PKT_IPV4_DSCP_MASK 0xFC +#define QDF_NBUF_PKT_IPV4_DSCP_SHIFT 0x02 #define QDF_NBUF_TRAC_TDLS_ETH_TYPE 0x890D #define QDF_NBUF_TRAC_IPV4_ETH_TYPE 0x0800 #define QDF_NBUF_TRAC_IPV6_ETH_TYPE 0x86dd diff --git a/qdf/inc/qdf_net_types.h b/qdf/inc/qdf_net_types.h index 7acde8aa2197..bbce5f036f9a 100644 --- a/qdf/inc/qdf_net_types.h +++ b/qdf/inc/qdf_net_types.h @@ -51,7 +51,10 @@ typedef __in6_addr_t in6_addr_t; #define QDF_NET_ETH_LEN QDF_NET_MAC_ADDR_MAX_LEN #define QDF_NET_MAX_MCAST_ADDR 64 #define QDF_NET_IPV4_LEN 4 - +#define QDF_TID_VI 5 +#define QDF_TID_VO 6 +#define QDF_TID_BE 0 +#define QDF_TID_BK 1 /* Extended Traffic ID passed to target if the TID is unknown */ #define QDF_NBUF_TX_EXT_TID_INVALID 0x1f From f318f04a8390f5df1f71686d985ad7b3db974202 Mon Sep 17 00:00:00 2001 From: Amar Singhal Date: Wed, 1 Aug 2018 13:41:46 -0700 Subject: [PATCH 2/3] qcacmn: Enable 11d in WORLD mode In WORLD mode, there can be urgency to discover the current country since WORLD mode restricts the channel and TX power availability. Therefore, enhance 11d state machine to enable 11d in world mode. Use INI configuration parameter enable_11d_in_world_mode to decide whether to enable 11d in world mode automatically. CRs-Fixed: 2289358 Change-Id: I8a4e1f6c74acb5ac1faec8f98840bf66c3d9a3f7 --- umac/regulatory/core/src/reg_priv.h | 1 + umac/regulatory/core/src/reg_services.c | 20 +++++++++++++++---- .../inc/reg_services_public_struct.h | 2 ++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/umac/regulatory/core/src/reg_priv.h b/umac/regulatory/core/src/reg_priv.h index 89f6dbb2f9f4..5966fcce30b0 100644 --- a/umac/regulatory/core/src/reg_priv.h +++ b/umac/regulatory/core/src/reg_priv.h @@ -88,6 +88,7 @@ struct wlan_regulatory_psoc_priv_obj { reg_cap[PSOC_MAX_PHY_REG_CAP]; bool force_ssc_disable_indoor_channel; bool enable_srd_chan_in_master_mode; + bool enable_11d_in_world_mode; qdf_spinlock_t cbk_list_lock; }; diff --git a/umac/regulatory/core/src/reg_services.c b/umac/regulatory/core/src/reg_services.c index 1afa81ea1d24..26b3b9dcec32 100644 --- a/umac/regulatory/core/src/reg_services.c +++ b/umac/regulatory/core/src/reg_services.c @@ -2962,6 +2962,7 @@ static void reg_run_11d_state_machine(struct wlan_objmgr_psoc *psoc) { bool temp_11d_support; struct wlan_regulatory_psoc_priv_obj *psoc_priv_obj; + bool world_mode; psoc_priv_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc, WLAN_UMAC_COMP_REGULATORY); @@ -2970,10 +2971,14 @@ static void reg_run_11d_state_machine(struct wlan_objmgr_psoc *psoc) return; } + world_mode = reg_is_world_alpha2(psoc_priv_obj->cur_country); + temp_11d_support = psoc_priv_obj->enable_11d_supp; - if (((psoc_priv_obj->user_ctry_set) && - (psoc_priv_obj->user_ctry_priority)) || - (psoc_priv_obj->master_vdev_cnt)) + if ((psoc_priv_obj->enable_11d_in_world_mode) && (world_mode)) + psoc_priv_obj->enable_11d_supp = true; + else if (((psoc_priv_obj->user_ctry_set) && + (psoc_priv_obj->user_ctry_priority)) || + (psoc_priv_obj->master_vdev_cnt)) psoc_priv_obj->enable_11d_supp = false; else psoc_priv_obj->enable_11d_supp = @@ -3142,15 +3147,19 @@ QDF_STATUS reg_process_master_chan_list(struct cur_regulatory_info soc_reg->new_11d_ctry_pending = false; soc_reg->cc_src = SOURCE_11D; soc_reg->user_ctry_set = false; + reg_run_11d_state_machine(psoc); } else if (soc_reg->world_country_pending == true) { soc_reg->world_country_pending = false; soc_reg->cc_src = SOURCE_CORE; soc_reg->user_ctry_set = false; + reg_run_11d_state_machine(psoc); } else { soc_reg->cc_src = SOURCE_DRIVER; - if (reg_is_world_alpha2(regulat_info->alpha2)) + if (reg_is_world_alpha2(regulat_info->alpha2)) { soc_reg->cc_src = SOURCE_CORE; + reg_run_11d_state_machine(psoc); + } qdf_mem_copy(soc_reg->mas_chan_params[phy_id].default_country, regulat_info->alpha2, @@ -3216,6 +3225,7 @@ QDF_STATUS wlan_regulatory_psoc_obj_created_notification( soc_reg_obj->vdev_cnt_11d = 0; soc_reg_obj->restart_beaconing = CH_AVOID_RULE_RESTART; soc_reg_obj->enable_srd_chan_in_master_mode = false; + soc_reg_obj->enable_11d_in_world_mode = true; for (i = 0; i < MAX_STA_VDEV_CNT; i++) soc_reg_obj->vdev_ids_11d[i] = INVALID_VDEV_ID; @@ -3954,6 +3964,8 @@ QDF_STATUS reg_set_config_vars(struct wlan_objmgr_psoc *psoc, psoc_priv_obj->restart_beaconing = config_vars.restart_beaconing; psoc_priv_obj->enable_srd_chan_in_master_mode = config_vars.enable_srd_chan_in_master_mode; + psoc_priv_obj->enable_11d_in_world_mode = + config_vars.enable_11d_in_world_mode; status = wlan_objmgr_psoc_try_get_ref(psoc, WLAN_REGULATORY_SB_ID); if (QDF_IS_STATUS_ERROR(status)) { diff --git a/umac/regulatory/dispatcher/inc/reg_services_public_struct.h b/umac/regulatory/dispatcher/inc/reg_services_public_struct.h index 69d55350cf31..86f653929847 100644 --- a/umac/regulatory/dispatcher/inc/reg_services_public_struct.h +++ b/umac/regulatory/dispatcher/inc/reg_services_public_struct.h @@ -857,6 +857,7 @@ enum restart_beaconing_on_ch_avoid_rule { * @restart_beaconing: control the beaconing entity to move * away from active LTE channels * @enable_srd_chan_in_master_mode: SRD channel support in master mode + * @enable_11d_in_world_mode: enable 11d in world mode */ struct reg_config_vars { uint32_t enable_11d_support; @@ -868,6 +869,7 @@ struct reg_config_vars { uint32_t force_ssc_disable_indoor_channel; enum restart_beaconing_on_ch_avoid_rule restart_beaconing; bool enable_srd_chan_in_master_mode; + bool enable_11d_in_world_mode; }; /** From b8de937cc40c6c747f35323bcc57d72258a32d16 Mon Sep 17 00:00:00 2001 From: Manoj Ekbote Date: Wed, 6 Jun 2018 16:52:39 -0700 Subject: [PATCH 3/3] qcacmn: Initial support for 11ax MBSSID IE 1. Service ready ext includes a parameter for max BSSID indicator. 2. Beacon template includes MBSSID IE offset. 3. Vdev create and up cmds include more parameters. Change-Id: I71214eacdaa886725b7ea8f61db3a743ba6597e9 CRs-Fixed: 2306638 --- qdf/inc/qdf_types.h | 2 ++ qdf/linux/src/qdf_trace.c | 2 ++ .../init_deinit/inc/service_ready_param.h | 2 ++ .../init_deinit/src/init_event_handler.c | 2 ++ .../obj_mgr/inc/wlan_objmgr_psoc_obj.h | 2 ++ wmi/inc/wmi_unified_param.h | 22 +++++++++++++++++++ wmi/src/wmi_unified_tlv.c | 9 +++++++- 7 files changed, 40 insertions(+), 1 deletion(-) diff --git a/qdf/inc/qdf_types.h b/qdf/inc/qdf_types.h index ab1fc4b412b6..ffbe03f8f9b4 100644 --- a/qdf/inc/qdf_types.h +++ b/qdf/inc/qdf_types.h @@ -358,6 +358,7 @@ typedef void (*qdf_timer_func_t)(void *); * @QDF_MODULE_ID_CP_STATS: Control Plane Statistics ID * @QDF_MODULE_ID_ACTION_OUI: ACTION OUI module ID * @QDF_MODULE_ID_TARGET: Target module ID + * @QDF_MODULE_ID_MBSSIE: MBSS IE ID * @QDF_MODULE_ID_ANY: anything * @QDF_MODULE_ID_MAX: Max place holder module ID */ @@ -463,6 +464,7 @@ typedef enum { QDF_MODULE_ID_CP_STATS, QDF_MODULE_ID_ACTION_OUI, QDF_MODULE_ID_TARGET, + QDF_MODULE_ID_MBSSIE, QDF_MODULE_ID_ANY, QDF_MODULE_ID_MAX, } QDF_MODULE_ID; diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index 0f492f0d6797..bf66e6235802 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -2832,6 +2832,7 @@ struct category_name_info g_qdf_category_name[MAX_SUPPORTED_CATEGORY] = { [QDF_MODULE_ID_CP_STATS] = {"CP_STATS"}, [QDF_MODULE_ID_ACTION_OUI] = {"action_oui"}, [QDF_MODULE_ID_TARGET] = {"TARGET"}, + [QDF_MODULE_ID_MBSSIE] = {"MBSSIE"}, [QDF_MODULE_ID_ANY] = {"ANY"}, }; qdf_export_symbol(g_qdf_category_name); @@ -3279,6 +3280,7 @@ static void set_default_trace_levels(struct category_info *cinfo) [QDF_MODULE_ID_IPA] = QDF_TRACE_LEVEL_NONE, [QDF_MODULE_ID_ACTION_OUI] = QDF_TRACE_LEVEL_NONE, [QDF_MODULE_ID_CP_STATS] = QDF_TRACE_LEVEL_ERROR, + [QDF_MODULE_ID_MBSSIE] = QDF_TRACE_LEVEL_INFO, [QDF_MODULE_ID_ANY] = QDF_TRACE_LEVEL_INFO, }; diff --git a/target_if/init_deinit/inc/service_ready_param.h b/target_if/init_deinit/inc/service_ready_param.h index 4687cd5c4fee..2f4f032e9980 100644 --- a/target_if/init_deinit/inc/service_ready_param.h +++ b/target_if/init_deinit/inc/service_ready_param.h @@ -279,6 +279,7 @@ struct wlan_psoc_host_chainmask_table { * @num_phy: Number of Phy mode. * @num_chainmask_tables: Number of chain mask tables. * @num_dbr_ring_caps: Number of direct buf rx ring capabilities + * @max_bssid_indicator: Maximum number of VAPs in MBSS IE * @chainmask_table: Available chain mask tables. * @sar_version: SAR version info */ @@ -294,6 +295,7 @@ struct wlan_psoc_host_service_ext_param { uint32_t num_phy; uint32_t num_chainmask_tables; uint32_t num_dbr_ring_caps; + uint32_t max_bssid_indicator; struct wlan_psoc_host_chainmask_table chainmask_table[PSOC_MAX_CHAINMASK_TABLES]; uint32_t sar_version; diff --git a/target_if/init_deinit/src/init_event_handler.c b/target_if/init_deinit/src/init_event_handler.c index 024413c824d0..3d2786eacd80 100644 --- a/target_if/init_deinit/src/init_event_handler.c +++ b/target_if/init_deinit/src/init_event_handler.c @@ -254,6 +254,8 @@ static int init_deinit_service_ext_ready_event_handler(ol_scn_t scn_handle, info->wlan_res_cfg.beacon_tx_offload_max_vdev = (target_psoc_get_num_radios(tgt_hdl) * info->wlan_res_cfg.beacon_tx_offload_max_vdev); + info->wlan_res_cfg.max_bssid_indicator = + info->service_ext_param.max_bssid_indicator; info->wmi_service_ready = TRUE; diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h index 6ca96efa8e80..58271b1b795a 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h @@ -177,6 +177,8 @@ #define WLAN_SOC_F_BTCOEX_SUPPORT 0x00200000 /* HOST 80211 enable*/ #define WLAN_SOC_F_HOST_80211_ENABLE 0x00400000 + /* MBSS IE enable */ +#define WLAN_SOC_F_MBSS_IE_ENABLE 0x00800000 /* PSOC op flags */ diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 4bd8a37aafef..432af09fc420 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -613,6 +613,8 @@ typedef enum { * @nss_2g: NSS for 2G * @nss_5g: NSS for 5G * @pdev_id: pdev id on pdev for this vdev + * @mbssid-flags: MBSS IE flags indicating vdev type + * @vdevid_trans: id of transmitting vdev for MBSS IE */ struct vdev_create_params { uint8_t if_id; @@ -621,6 +623,8 @@ struct vdev_create_params { uint8_t nss_2g; uint8_t nss_5g; uint32_t pdev_id; + uint32_t mbssid_flags; + uint8_t vdevid_trans; }; /** @@ -689,10 +693,18 @@ struct vdev_stop_params { * struct vdev_up_params - vdev up cmd parameter * @vdev_id: vdev id * @assoc_id: association id + * @profile_idx: profile index of the connected non-trans ap (mbssid case). + * 0 means invalid. + * @profile_num: the total profile numbers of non-trans aps (mbssid case). + * 0 means non-MBSS AP. + * @trans_bssid: bssid of transmitted AP (MBSS IE case) */ struct vdev_up_params { uint8_t vdev_id; uint16_t assoc_id; + uint32_t profile_idx; + uint32_t profile_num; + uint8_t trans_bssid[IEEE80211_ADDR_LEN]; }; /** @@ -1046,6 +1058,7 @@ struct pdev_params { * struct beacon_tmpl_params - beacon template cmd parameter * @vdev_id: vdev id * @tim_ie_offset: tim ie offset + * @mbssid_ie_offset: mbssid ie offset * @tmpl_len: beacon template length * @tmpl_len_aligned: beacon template alignment * @csa_switch_count_offset: CSA swith count offset in beacon frame @@ -1056,6 +1069,7 @@ struct pdev_params { struct beacon_tmpl_params { uint8_t vdev_id; uint32_t tim_ie_offset; + uint32_t mbssid_ie_offset; uint32_t tmpl_len; uint32_t tmpl_len_aligned; uint32_t csa_switch_count_offset; @@ -6041,6 +6055,7 @@ typedef enum { #ifdef OL_ATH_SMART_LOGGING wmi_service_smart_logging_support, #endif + wmi_service_infra_mbssid, wmi_services_max, } wmi_conv_service_ids; #define WMI_SERVICE_UNAVAILABLE 0xFFFF @@ -6158,6 +6173,7 @@ struct wmi_host_fw_abi_ver { * @twt_ap_pdev_count: Number of MAC on which AP TWT feature is supported * @twt_ap_sta_count: Max no of STA with which TWT sessions can be formed * by the AP + * @max_bssid_indicator: max number of MBSS VAPs */ typedef struct { uint32_t num_vdevs; @@ -6232,6 +6248,7 @@ typedef struct { bool cce_disable; uint32_t twt_ap_pdev_count; uint32_t twt_ap_sta_count; + uint32_t max_bssid_indicator; } target_resource_config; /** @@ -8722,4 +8739,9 @@ struct wmi_apf_read_memory_resp_event_params { }; #endif /* FEATURE_WLAN_APF */ +/* vdev control flags (per bits) */ +#define WMI_HOST_VDEV_FLAGS_NON_MBSSID_AP 0x00000001 +#define WMI_HOST_VDEV_FLAGS_TRANSMIT_AP 0x00000002 +#define WMI_HOST_VDEV_FLAGS_NON_TRANSMIT_AP 0x00000004 + #endif /* _WMI_UNIFIED_PARAM_H_ */ diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 8472ee023056..3295568eedbb 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -177,6 +177,8 @@ static QDF_STATUS send_vdev_create_cmd_tlv(wmi_unified_t wmi_handle, cmd->vdev_id = param->if_id; cmd->vdev_type = param->type; cmd->vdev_subtype = param->subtype; + cmd->flags = param->mbssid_flags; + cmd->vdevid_trans = param->vdevid_trans; cmd->num_cfg_txrx_streams = num_bands; copy_vdev_create_pdev_id(wmi_handle, cmd, param); WMI_CHAR_ARRAY_TO_MAC_ADDR(macaddr, &cmd->vdev_macaddr); @@ -852,6 +854,9 @@ static QDF_STATUS send_vdev_up_cmd_tlv(wmi_unified_t wmi, WMITLV_GET_STRUCT_TLVLEN(wmi_vdev_up_cmd_fixed_param)); cmd->vdev_id = params->vdev_id; cmd->vdev_assoc_id = params->assoc_id; + cmd->profile_idx = params->profile_idx; + cmd->profile_num = params->profile_num; + WMI_CHAR_ARRAY_TO_MAC_ADDR(params->trans_bssid, &cmd->trans_bssid); WMI_CHAR_ARRAY_TO_MAC_ADDR(bssid, &cmd->vdev_bssid); if (wmi_unified_cmd_send(wmi, buf, len, WMI_VDEV_UP_CMDID)) { WMI_LOGP("%s: Failed to send vdev up command", __func__); @@ -2195,6 +2200,7 @@ static QDF_STATUS send_beacon_tmpl_send_cmd_tlv(wmi_unified_t wmi_handle, WMITLV_GET_STRUCT_TLVLEN(wmi_bcn_tmpl_cmd_fixed_param)); cmd->vdev_id = param->vdev_id; cmd->tim_ie_offset = param->tim_ie_offset; + cmd->mbssid_ie_offset = param->mbssid_ie_offset; cmd->csa_switch_count_offset = param->csa_switch_count_offset; cmd->ext_csa_switch_count_offset = param->ext_csa_switch_count_offset; cmd->esp_ie_offset = param->esp_ie_offset; @@ -12676,7 +12682,7 @@ void wmi_copy_resource_config(wmi_resource_config *resource_cfg, resource_cfg->sched_params = tgt_res_cfg->scheduler_params; resource_cfg->num_packet_filters = tgt_res_cfg->num_packet_filters; resource_cfg->num_max_sta_vdevs = tgt_res_cfg->num_max_sta_vdevs; - + resource_cfg->max_bssid_indicator = tgt_res_cfg->max_bssid_indicator; if (tgt_res_cfg->atf_config) WMI_RSRC_CFG_FLAG_ATF_CONFIG_ENABLE_SET(resource_cfg->flag1, 1); if (tgt_res_cfg->mgmt_comp_evt_bundle_support) @@ -19318,6 +19324,7 @@ static QDF_STATUS extract_service_ready_ext_tlv(wmi_unified_t wmi_handle, param->max_bssid_rx_filters = ev->max_bssid_rx_filters; param->fw_build_vers_ext = ev->fw_build_vers_ext; param->num_dbr_ring_caps = param_buf->num_dma_ring_caps; + param->max_bssid_indicator = ev->max_bssid_indicator; qdf_mem_copy(¶m->ppet, &ev->ppet, sizeof(param->ppet)); hw_caps = param_buf->soc_hw_mode_caps;