From 54518924c366b8cca9ea538d4ec5093d6bd718c2 Mon Sep 17 00:00:00 2001 From: Kiran Kumar Lokere Date: Mon, 6 Mar 2017 12:29:04 -0800 Subject: [PATCH] qcacmn: Add public API to set/reset NOL channels in regulatory Provides the public API to set/reset the NOL channel status in the regulatory current channel list. Change-Id: Ic04b55a88705c94aa2933ac402ba9c538147aecd CRs-Fixed: 2002892 --- umac/regulatory/core/src/reg_priv.h | 3 +- umac/regulatory/core/src/reg_services.c | 95 +++++++++++++++++++ umac/regulatory/core/src/reg_services.h | 6 ++ .../dispatcher/inc/wlan_reg_services_api.h | 2 + .../dispatcher/src/wlan_reg_services_api.c | 15 +++ 5 files changed, 119 insertions(+), 2 deletions(-) diff --git a/umac/regulatory/core/src/reg_priv.h b/umac/regulatory/core/src/reg_priv.h index fea3c21830..483b8c9f3a 100644 --- a/umac/regulatory/core/src/reg_priv.h +++ b/umac/regulatory/core/src/reg_priv.h @@ -48,7 +48,7 @@ struct wlan_regulatory_psoc_priv_obj { struct regulatory_channel mas_chan_list[NUM_CHANNELS]; bool offload_enabled; - enum channel_enum nol_list[NUM_CHANNELS]; + bool nol_chan[NUM_CHANNELS]; char default_country[REG_ALPHA2_LEN + 1]; char current_country[REG_ALPHA2_LEN + 1]; struct wlan_objmgr_psoc *psoc_ptr; @@ -66,7 +66,6 @@ struct wlan_regulatory_psoc_priv_obj { struct wlan_regulatory_pdev_priv_obj { struct regulatory_channel cur_chan_list[NUM_CHANNELS]; - enum channel_enum nol_list[NUM_CHANNELS]; struct wlan_objmgr_pdev *pdev_ptr; bool dfs_disabled; bool set_fcc_channel; diff --git a/umac/regulatory/core/src/reg_services.c b/umac/regulatory/core/src/reg_services.c index 0d2390bf15..74928639cb 100644 --- a/umac/regulatory/core/src/reg_services.c +++ b/umac/regulatory/core/src/reg_services.c @@ -1292,6 +1292,8 @@ QDF_STATUS wlan_regulatory_psoc_obj_created_notification( REGULATORY_CHAN_DISABLED; mas_chan_list[chan_enum].state = CHANNEL_STATE_DISABLE; + mas_chan_list[chan_enum].nol_chan = false; + soc_reg_obj->nol_chan[chan_enum] = false; } status = wlan_objmgr_psoc_component_obj_attach(psoc, @@ -1426,6 +1428,23 @@ modify_chan_list_for_fcc_channel(struct regulatory_channel } } +static void +modify_chan_list_for_nol_list(struct regulatory_channel + *chan_list) +{ + enum channel_enum chan_enum; + + for (chan_enum = 0; chan_enum < NUM_CHANNELS; + chan_enum++) { + if (chan_list[chan_enum].nol_chan) { + chan_list[chan_enum].state = + CHANNEL_STATE_DISABLE; + chan_list[chan_enum].chan_flags |= + REGULATORY_CHAN_DISABLED; + } + } +} + static void modify_chan_list_for_freq_range(struct regulatory_channel *chan_list, @@ -1505,6 +1524,7 @@ QDF_STATUS wlan_regulatory_pdev_obj_created_notification( uint32_t range_2g_low, range_2g_high, range_5g_low, range_5g_high; QDF_STATUS status; + enum channel_enum chan_enum; pdev_priv_obj = qdf_mem_malloc(sizeof(*pdev_priv_obj)); if (NULL == pdev_priv_obj) { @@ -1537,6 +1557,10 @@ QDF_STATUS wlan_regulatory_pdev_obj_created_notification( psoc_priv_obj->mas_chan_list, NUM_CHANNELS * sizeof(struct regulatory_channel)); + for (chan_enum = 0; chan_enum < NUM_CHANNELS; chan_enum++) + pdev_priv_obj->cur_chan_list[chan_enum].nol_chan = + psoc_priv_obj->nol_chan[chan_enum]; + modify_chan_list_for_dfs_channels(pdev_priv_obj->cur_chan_list, pdev_priv_obj->dfs_disabled); @@ -1546,6 +1570,8 @@ QDF_STATUS wlan_regulatory_pdev_obj_created_notification( modify_chan_list_for_band(pdev_priv_obj->cur_chan_list, pdev_priv_obj->band_capability); + modify_chan_list_for_nol_list(pdev_priv_obj->cur_chan_list); + modify_chan_list_for_fcc_channel(pdev_priv_obj->cur_chan_list, pdev_priv_obj->set_fcc_channel); @@ -1634,4 +1660,73 @@ QDF_STATUS reg_get_current_chan_list(struct wlan_objmgr_pdev *pdev, return QDF_STATUS_SUCCESS; } +/** + * reg_update_nol_ch () - Updates NOL channels in current channel list + * @pdev: pointer to pdev object + * @ch_list: pointer to NOL channel list + * @num_ch: No.of channels in list + * @update_nol: set/reset the NOL status + * + * Return: None + */ +void reg_update_nol_ch(struct wlan_objmgr_pdev *pdev, uint8_t *ch_list, + uint8_t num_ch, bool nol_ch) +{ + enum channel_enum chan_enum; + struct wlan_regulatory_pdev_priv_obj *pdev_priv_obj; + struct regulatory_channel *reg_channels; + enum channel_state ch_state; + uint8_t i; + struct wlan_objmgr_psoc *psoc; + struct wlan_regulatory_psoc_priv_obj *psoc_priv_obj; + uint32_t reg_ch_flags; + if (!num_ch || !ch_list) { + reg_err("chan_list or num_ch is NULL"); + return; + } + + psoc = wlan_pdev_get_psoc(pdev); + + wlan_psoc_obj_lock(psoc); + psoc_priv_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc, + WLAN_UMAC_COMP_REGULATORY); + wlan_psoc_obj_unlock(psoc); + + if (NULL == psoc_priv_obj) { + reg_err("reg psoc private obj is NULL"); + return; + } + + wlan_pdev_obj_lock(pdev); + pdev_priv_obj = (struct wlan_regulatory_pdev_priv_obj *) + wlan_objmgr_pdev_get_comp_private_obj(pdev, + WLAN_UMAC_COMP_REGULATORY); + wlan_pdev_obj_unlock(pdev); + + if (NULL == pdev_priv_obj) { + reg_err("pdev piv obj is NULL"); + return; + } + if (nol_ch) { + ch_state = CHANNEL_STATE_DISABLE; + reg_ch_flags = REGULATORY_CHAN_DISABLED; + } else { + ch_state = CHANNEL_STATE_DFS; + reg_ch_flags = REGULATORY_CHAN_RADAR; + } + + reg_channels = &pdev_priv_obj->cur_chan_list[0]; + for (i = 0; i < num_ch; i++) { + chan_enum = reg_get_chan_enum(ch_list[i]); + if (chan_enum == INVALID_CHANNEL) { + reg_err("Invalid ch in update nol request, ch %d", + ch_list[i]); + continue; + } + reg_channels[chan_enum].state = ch_state; + reg_channels[chan_enum].nol_chan = nol_ch; + reg_channels[chan_enum].chan_flags |= reg_ch_flags; + psoc_priv_obj->nol_chan[chan_enum] = nol_ch; + } +} diff --git a/umac/regulatory/core/src/reg_services.h b/umac/regulatory/core/src/reg_services.h index eaeb75a798..42f4b65629 100644 --- a/umac/regulatory/core/src/reg_services.h +++ b/umac/regulatory/core/src/reg_services.h @@ -126,6 +126,9 @@ struct ch_params { * @state: channel state * @chan_flags: channel flags * @tx_power: TX powers + * @min_bw: min bandwidth + * @max_bw: max bandwidth + * @nol_chan: whether channel is nol */ struct regulatory_channel { uint32_t center_freq; @@ -135,6 +138,7 @@ struct regulatory_channel { uint32_t tx_power; uint16_t min_bw; uint16_t max_bw; + bool nol_chan; }; /** @@ -482,4 +486,6 @@ QDF_STATUS reg_get_current_chan_list(struct wlan_objmgr_pdev *pdev, struct regulatory_channel *chan_list); +void reg_update_nol_ch(struct wlan_objmgr_pdev *pdev, uint8_t *ch_list, + uint8_t num_ch, bool nol_ch); #endif diff --git a/umac/regulatory/dispatcher/inc/wlan_reg_services_api.h b/umac/regulatory/dispatcher/inc/wlan_reg_services_api.h index be4e55610d..f827de8ba6 100644 --- a/umac/regulatory/dispatcher/inc/wlan_reg_services_api.h +++ b/umac/regulatory/dispatcher/inc/wlan_reg_services_api.h @@ -298,4 +298,6 @@ QDF_STATUS wlan_reg_get_current_chan_list(struct wlan_objmgr_pdev *pdev, struct regulatory_channel *chan_list); +void wlan_reg_update_nol_ch(struct wlan_objmgr_pdev *pdev, uint8_t *ch_list, + uint8_t num_ch, bool nol_ch); #endif diff --git a/umac/regulatory/dispatcher/src/wlan_reg_services_api.c b/umac/regulatory/dispatcher/src/wlan_reg_services_api.c index 180a77f65c..7efa4120d9 100644 --- a/umac/regulatory/dispatcher/src/wlan_reg_services_api.c +++ b/umac/regulatory/dispatcher/src/wlan_reg_services_api.c @@ -405,3 +405,18 @@ QDF_STATUS wlan_reg_get_current_chan_list(struct wlan_objmgr_pdev { return reg_get_current_chan_list(pdev, chan_list); } + +/** + * wlan_reg_update_nol_ch () - Updates NOL channels in current channel list + * @pdev: pointer to pdev object + * @ch_list: pointer to NOL channel list + * @num_ch: No.of channels in list + * @nol_ch: set/reset the NOL status + * + * Return: None + */ +void wlan_reg_update_nol_ch(struct wlan_objmgr_pdev *pdev, uint8_t *ch_list, + uint8_t num_ch, bool nol_ch) +{ + reg_update_nol_ch(pdev, ch_list, num_ch, nol_ch); +}