qcacmn: Add support to enable or disable channel 144
By default channel 144 is enabled. Support added to disable
channel 144 through iwpriv command.
Change-Id: I0a193571c2ca36e0cedcac19851459448fc141cf
CRs-Fixed: 2076792
diff --git a/umac/regulatory/core/src/reg_priv.h b/umac/regulatory/core/src/reg_priv.h
index 00e0ac1..cb7ed06 100644
--- a/umac/regulatory/core/src/reg_priv.h
+++ b/umac/regulatory/core/src/reg_priv.h
@@ -90,6 +90,7 @@
bool set_fcc_channel;
enum band_info band_capability;
bool indoor_chan_enabled;
+ bool en_chan_144;
uint32_t wireless_modes;
};
diff --git a/umac/regulatory/core/src/reg_services.c b/umac/regulatory/core/src/reg_services.c
index cd5c9a5..bb36e47 100644
--- a/umac/regulatory/core/src/reg_services.c
+++ b/umac/regulatory/core/src/reg_services.c
@@ -39,6 +39,7 @@
#define MAX_PWR_FCC_CHAN_12 8
#define CHAN_13_CENT_FREQ 2472
#define MAX_PWR_FCC_CHAN_13 2
+#define CHAN_144_CENT_FREQ 5720
#define SCAN_11D_PERIOD_MS 360000
#define IS_VALID_PSOC_REG_OBJ(psoc_priv_obj) (NULL != psoc_priv_obj)
@@ -1861,7 +1862,7 @@
}
static void reg_modify_chan_list_for_band(struct regulatory_channel *chan_list,
- enum band_info band_val)
+ enum band_info band_val)
{
enum channel_enum chan_enum;
@@ -1887,8 +1888,8 @@
}
static void reg_modify_chan_list_for_fcc_channel(struct regulatory_channel
- *chan_list,
- bool set_fcc_channel)
+ *chan_list,
+ bool set_fcc_channel)
{
enum channel_enum chan_enum;
@@ -1906,6 +1907,25 @@
}
}
+static void reg_modify_chan_list_for_chan_144(struct regulatory_channel
+ *chan_list,
+ bool en_chan_144)
+{
+ enum channel_enum chan_enum;
+
+ if (en_chan_144)
+ return;
+
+ for (chan_enum = 0; chan_enum < NUM_CHANNELS; chan_enum++) {
+ if (chan_list[chan_enum].center_freq == CHAN_144_CENT_FREQ) {
+ chan_list[chan_enum].chan_flags |=
+ REGULATORY_CHAN_DISABLED;
+ chan_list[chan_enum].state =
+ CHANNEL_STATE_DISABLE;
+ }
+ }
+}
+
static void
reg_modify_chan_list_for_nol_list(struct regulatory_channel *chan_list)
{
@@ -2014,31 +2034,34 @@
static void reg_compute_pdev_current_chan_list(struct wlan_regulatory_pdev_priv_obj
- *pdev_priv_obj)
+ *pdev_priv_obj)
{
qdf_mem_copy(pdev_priv_obj->cur_chan_list,
pdev_priv_obj->mas_chan_list,
NUM_CHANNELS * sizeof(struct regulatory_channel));
reg_modify_chan_list_for_freq_range(pdev_priv_obj->cur_chan_list,
- pdev_priv_obj->range_2g_low,
- pdev_priv_obj->range_2g_high,
- pdev_priv_obj->range_5g_low,
- pdev_priv_obj->range_5g_high);
+ pdev_priv_obj->range_2g_low,
+ pdev_priv_obj->range_2g_high,
+ pdev_priv_obj->range_5g_low,
+ pdev_priv_obj->range_5g_high);
reg_modify_chan_list_for_band(pdev_priv_obj->cur_chan_list,
- pdev_priv_obj->band_capability);
+ pdev_priv_obj->band_capability);
reg_modify_chan_list_for_dfs_channels(pdev_priv_obj->cur_chan_list,
- pdev_priv_obj->dfs_enabled);
+ pdev_priv_obj->dfs_enabled);
reg_modify_chan_list_for_nol_list(pdev_priv_obj->cur_chan_list);
reg_modify_chan_list_for_indoor_channels(pdev_priv_obj->cur_chan_list,
- pdev_priv_obj->indoor_chan_enabled);
+ pdev_priv_obj->indoor_chan_enabled);
reg_modify_chan_list_for_fcc_channel(pdev_priv_obj->cur_chan_list,
- pdev_priv_obj->set_fcc_channel);
+ pdev_priv_obj->set_fcc_channel);
+
+ reg_modify_chan_list_for_chan_144(pdev_priv_obj->cur_chan_list,
+ pdev_priv_obj->en_chan_144);
}
static void reg_call_chan_change_cbks(struct wlan_objmgr_psoc *psoc,
@@ -2346,7 +2369,7 @@
reg_compute_pdev_current_chan_list(pdev_priv_obj);
reg_tx_ops = reg_get_psoc_tx_ops(psoc);
- if(reg_tx_ops->fill_umac_legacy_chanlist)
+ if (reg_tx_ops->fill_umac_legacy_chanlist)
reg_tx_ops->fill_umac_legacy_chanlist(pdev,
pdev_priv_obj->cur_chan_list);
@@ -2838,6 +2861,7 @@
pdev_priv_obj->band_capability = psoc_priv_obj->band_capability;
pdev_priv_obj->indoor_chan_enabled =
psoc_priv_obj->indoor_chan_enabled;
+ pdev_priv_obj->en_chan_144 = true;
reg_cap_ptr = parent_psoc->ext_service_param.reg_cap;
@@ -3671,3 +3695,60 @@
return QDF_STATUS_SUCCESS;
}
+
+QDF_STATUS reg_modify_chan_144(struct wlan_objmgr_pdev *pdev,
+ bool enable_ch_144)
+{
+ struct wlan_regulatory_psoc_priv_obj *psoc_priv_obj;
+ struct wlan_regulatory_pdev_priv_obj *pdev_priv_obj;
+ struct wlan_objmgr_psoc *psoc;
+ struct wlan_lmac_if_reg_tx_ops *reg_tx_ops;
+ QDF_STATUS status;
+
+ pdev_priv_obj = reg_get_pdev_obj(pdev);
+
+ if (!IS_VALID_PDEV_REG_OBJ(pdev_priv_obj)) {
+ reg_err("pdev reg component is NULL");
+ return QDF_STATUS_E_INVAL;
+ }
+
+ if (pdev_priv_obj->en_chan_144 == enable_ch_144) {
+ reg_info("chan 144 is already %d", enable_ch_144);
+ return QDF_STATUS_SUCCESS;
+ }
+
+ psoc = wlan_pdev_get_psoc(pdev);
+ if (!psoc) {
+ reg_err("psoc is NULL");
+ return QDF_STATUS_E_INVAL;
+ }
+
+ psoc_priv_obj = reg_get_psoc_obj(psoc);
+ if (!IS_VALID_PSOC_REG_OBJ(psoc_priv_obj)) {
+ reg_err("psoc reg component is NULL");
+ return QDF_STATUS_E_INVAL;
+ }
+
+ reg_debug("setting chan 144: %d", enable_ch_144);
+ pdev_priv_obj->en_chan_144 = enable_ch_144;
+
+ reg_compute_pdev_current_chan_list(pdev_priv_obj);
+
+ reg_tx_ops = reg_get_psoc_tx_ops(psoc);
+ if (reg_tx_ops->fill_umac_legacy_chanlist)
+ reg_tx_ops->fill_umac_legacy_chanlist(pdev,
+ pdev_priv_obj->cur_chan_list);
+
+ status = reg_send_scheduler_msg_sb(psoc, pdev);
+
+ return status;
+
+}
+
+bool reg_get_en_chan_144(struct wlan_objmgr_pdev *pdev)
+{
+ struct wlan_regulatory_pdev_priv_obj *pdev_priv_obj;
+
+ pdev_priv_obj = reg_get_pdev_obj(pdev);
+ return pdev_priv_obj->en_chan_144;
+}
diff --git a/umac/regulatory/core/src/reg_services.h b/umac/regulatory/core/src/reg_services.h
index ad91a66..32ad7c8 100644
--- a/umac/regulatory/core/src/reg_services.h
+++ b/umac/regulatory/core/src/reg_services.h
@@ -372,5 +372,23 @@
* Return: QDF status
*/
QDF_STATUS reg_get_curr_regdomain(struct wlan_objmgr_pdev *pdev,
- struct cur_regdmn_info *cur_regdmn);
+ struct cur_regdmn_info *cur_regdmn);
+
+/**
+ * reg_modify_chan_144() - Enable/Disable channel 144
+ * @pdev: pdev pointer
+ * @enable_chan_144: flag to disable/enable channel 144
+ *
+ * Return: Success or Failure
+ */
+QDF_STATUS reg_modify_chan_144(struct wlan_objmgr_pdev *pdev,
+ bool en_chan_144);
+
+/**
+ * reg_get_en_chan_144() - get en_chan_144 flag value
+ * @pdev: pdev pointer
+ *
+ * Return: en_chan_144 flag value
+ */
+bool reg_get_en_chan_144(struct wlan_objmgr_pdev *pdev);
#endif
diff --git a/umac/regulatory/dispatcher/inc/wlan_reg_ucfg_api.h b/umac/regulatory/dispatcher/inc/wlan_reg_ucfg_api.h
index 071c7a6..e889fa8 100644
--- a/umac/regulatory/dispatcher/inc/wlan_reg_ucfg_api.h
+++ b/umac/regulatory/dispatcher/inc/wlan_reg_ucfg_api.h
@@ -153,6 +153,24 @@
struct regulatory_channel *chan_list);
/**
+ * ucfg_reg_modify_chan_144() - Enable/Disable channel 144
+ * @pdev: pdev pointer
+ * @enable_chan_144: flag to disable/enable channel 144
+ *
+ * Return: Success or Failure
+ */
+QDF_STATUS ucfg_reg_modify_chan_144(struct wlan_objmgr_pdev *pdev,
+ bool enable_ch_144);
+
+/**
+ * ucfg_reg_get_en_chan_144() - get en_chan_144 flag value
+ * @pdev: pdev pointer
+ *
+ * Return: en_chan_144 flag value
+ */
+bool ucfg_reg_get_en_chan_144(struct wlan_objmgr_pdev *pdev);
+
+/**
* ucfg_reg_is_regdb_offloaded () - is regulatory database offloaded
* @psoc: psoc ptr
*
diff --git a/umac/regulatory/dispatcher/src/wlan_reg_ucfg_api.c b/umac/regulatory/dispatcher/src/wlan_reg_ucfg_api.c
index 0757a41..e250ca0 100644
--- a/umac/regulatory/dispatcher/src/wlan_reg_ucfg_api.c
+++ b/umac/regulatory/dispatcher/src/wlan_reg_ucfg_api.c
@@ -51,6 +51,17 @@
return reg_get_current_chan_list(pdev, chan_list);
}
+QDF_STATUS ucfg_reg_modify_chan_144(struct wlan_objmgr_pdev *pdev,
+ bool enable_ch_144)
+{
+ return reg_modify_chan_144(pdev, enable_ch_144);
+}
+
+bool ucfg_reg_get_en_chan_144(struct wlan_objmgr_pdev *pdev)
+{
+ return reg_get_en_chan_144(pdev);
+}
+
QDF_STATUS ucfg_reg_set_config_vars(struct wlan_objmgr_psoc *psoc,
struct reg_config_vars config_vars)
{