Răsfoiți Sursa

qcacmn: Add reg APIs to update tx power on ctry code change

Add a new regulatory callback registration API and a
regulatory API to update tx power whenever the country code
changes without change in operating channel OR if fcc
constraint is set. This MCC-specific regulatory API is
called from HDD and invokes the TPC calculation logic via a
callback during the above-mentioned cases.

Change-Id: I7d3db83129d169b7e0421c20c061de356f32cfa2
CRs-Fixed: 3311432
Gururaj Pandurangi 2 ani în urmă
părinte
comite
880d85269f

+ 33 - 0
umac/regulatory/core/src/reg_callbacks.c

@@ -418,6 +418,23 @@ void reg_register_chan_change_callback(struct wlan_objmgr_psoc *psoc,
 		reg_err("callback list is full");
 }
 
+void reg_register_ctry_change_callback(struct wlan_objmgr_psoc *psoc,
+				       reg_ctry_change_callback cbk)
+{
+	struct wlan_regulatory_psoc_priv_obj *psoc_priv_obj;
+
+	psoc_priv_obj = reg_get_psoc_obj(psoc);
+	if (!psoc_priv_obj) {
+		reg_err("reg psoc private obj is NULL");
+		return;
+	}
+
+	qdf_spin_lock_bh(&psoc_priv_obj->cbk_list_lock);
+	if (!psoc_priv_obj->cc_cbk.cbk)
+		psoc_priv_obj->cc_cbk.cbk = cbk;
+	qdf_spin_unlock_bh(&psoc_priv_obj->cbk_list_lock);
+}
+
 void reg_unregister_chan_change_callback(struct wlan_objmgr_psoc *psoc,
 					 reg_chan_change_callback cbk)
 {
@@ -443,3 +460,19 @@ void reg_unregister_chan_change_callback(struct wlan_objmgr_psoc *psoc,
 		reg_err("callback not found in the list");
 }
 
+void reg_unregister_ctry_change_callback(struct wlan_objmgr_psoc *psoc,
+					 reg_ctry_change_callback cbk)
+{
+	struct wlan_regulatory_psoc_priv_obj *psoc_priv_obj;
+
+	psoc_priv_obj = reg_get_psoc_obj(psoc);
+	if (!psoc_priv_obj) {
+		reg_err("reg psoc private obj is NULL");
+		return;
+	}
+
+	qdf_spin_lock_bh(&psoc_priv_obj->cbk_list_lock);
+	if (psoc_priv_obj->cc_cbk.cbk == cbk)
+		psoc_priv_obj->cc_cbk.cbk = NULL;
+	qdf_spin_unlock_bh(&psoc_priv_obj->cbk_list_lock);
+}

+ 27 - 1
umac/regulatory/core/src/reg_callbacks.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
- *
+ * Copyright (c) 2022 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
@@ -43,6 +43,22 @@ void reg_register_chan_change_callback(struct wlan_objmgr_psoc *psoc,
 void reg_unregister_chan_change_callback(struct wlan_objmgr_psoc *psoc,
 					 reg_chan_change_callback cbk);
 
+/**
+ * reg_register_ctry_change_callback() - Register country change callbacks
+ * @psoc: Pointer to psoc
+ * @cbk: Pointer to callback function
+ */
+void reg_register_ctry_change_callback(struct wlan_objmgr_psoc *psoc,
+				       reg_ctry_change_callback cbk);
+
+/**
+ * reg_unregister_ctry_change_callback() - Unregister country change callbacks
+ * @psoc: Pointer to psoc
+ * @cbk: Pointer to callback function
+ */
+void reg_unregister_ctry_change_callback(struct wlan_objmgr_psoc *psoc,
+					 reg_ctry_change_callback cbk);
+
 /**
  * reg_notify_sap_event() - Notify regulatory domain for sap event
  * @pdev: The physical dev to set the band for
@@ -83,6 +99,16 @@ static inline void reg_unregister_chan_change_callback(
 {
 }
 
+static inline void reg_register_ctry_change_callback(
+		struct wlan_objmgr_psoc *psoc, reg_ctry_change_callback cbk)
+{
+}
+
+static inline void reg_unregister_ctry_change_callback(
+		struct wlan_objmgr_psoc *psoc, reg_ctry_change_callback cbk)
+{
+}
+
 static inline QDF_STATUS reg_send_scheduler_msg_sb(
 		struct wlan_objmgr_psoc *psoc, struct wlan_objmgr_pdev *pdev)
 {

+ 17 - 0
umac/regulatory/core/src/reg_priv_objs.h

@@ -84,6 +84,22 @@ struct chan_change_cbk_entry {
 	void *arg;
 };
 
+/**
+ * typedef reg_ctry_change_callback() - Regulatory country change callback
+ * @mac_ctx: Pointer to mac context
+ * @vdev_id: vdev ID
+ */
+typedef void (*reg_ctry_change_callback)(
+		uint8_t vdev_id);
+
+/**
+ * struct ctry_change_cbk_entry - Country change callback entry
+ * @cbk: Callback
+ */
+struct ctry_change_cbk_entry {
+	reg_ctry_change_callback cbk;
+};
+
 /**
  * struct wlan_regulatory_psoc_priv_obj - wlan regulatory psoc private object
  * @mas_chan_params: master channel parameters list
@@ -164,6 +180,7 @@ struct wlan_regulatory_psoc_priv_obj {
 	bool user_ctry_set;
 	struct chan_change_cbk_entry cbk_list[REG_MAX_CHAN_CHANGE_CBKS];
 	uint8_t num_chan_change_cbks;
+	struct ctry_change_cbk_entry cc_cbk;
 	uint8_t ch_avoid_ind;
 	struct unsafe_ch_list unsafe_chan_list;
 	struct ch_avoid_ind_type avoid_freq_list;

+ 25 - 0
umac/regulatory/core/src/reg_services_common.c

@@ -6564,6 +6564,31 @@ enum band_info reg_band_bitmap_to_band_info(uint32_t band_bitmap)
 	else
 		return BAND_UNKNOWN;
 }
+
+QDF_STATUS
+reg_update_tx_power_on_ctry_change(struct wlan_objmgr_pdev *pdev,
+				   uint8_t vdev_id)
+{
+	struct wlan_objmgr_psoc *psoc;
+	struct wlan_regulatory_psoc_priv_obj *psoc_priv_obj;
+	reg_ctry_change_callback callback = NULL;
+
+	psoc = wlan_pdev_get_psoc(pdev);
+	psoc_priv_obj = reg_get_psoc_obj(psoc);
+	if (!psoc_priv_obj) {
+		reg_err("reg psoc private obj is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	qdf_spin_lock_bh(&psoc_priv_obj->cbk_list_lock);
+	if (psoc_priv_obj->cc_cbk.cbk)
+		callback = psoc_priv_obj->cc_cbk.cbk;
+	qdf_spin_unlock_bh(&psoc_priv_obj->cbk_list_lock);
+	if (callback)
+		callback(vdev_id);
+
+	return QDF_STATUS_SUCCESS;
+}
 #endif
 
 #if defined(CONFIG_BAND_6GHZ)

+ 4 - 0
umac/regulatory/core/src/reg_services_common.h

@@ -1537,6 +1537,10 @@ reg_get_max_phymode(struct wlan_objmgr_pdev *pdev,
  *	BAND_5G if 5G is enabled but 2G isn't
  */
 enum band_info reg_band_bitmap_to_band_info(uint32_t band_bitmap);
+
+QDF_STATUS
+reg_update_tx_power_on_ctry_change(struct wlan_objmgr_pdev *pdev,
+				   uint8_t vdev_id);
 #endif
 
 #if defined(CONFIG_BAND_6GHZ)

+ 32 - 0
umac/regulatory/dispatcher/inc/wlan_reg_services_api.h

@@ -1205,6 +1205,26 @@ void wlan_reg_register_chan_change_callback(struct wlan_objmgr_psoc *psoc,
 void wlan_reg_unregister_chan_change_callback(struct wlan_objmgr_psoc *psoc,
 					      void *cbk);
 
+/**
+ * wlan_reg_register_ctry_change_callback () - add country change cbk
+ * @psoc: psoc ptr
+ * @cbk: callback
+ *
+ * Return: None
+ */
+void wlan_reg_register_ctry_change_callback(struct wlan_objmgr_psoc *psoc,
+					    void *cbk);
+
+/**
+ * wlan_reg_unregister_ctry_change_callback () - remove country change cbk
+ * @psoc: psoc ptr
+ * @cbk:callback
+ *
+ * Return: None
+ */
+void wlan_reg_unregister_ctry_change_callback(struct wlan_objmgr_psoc *psoc,
+					      void *cbk);
+
 /**
  * wlan_reg_is_11d_offloaded() - 11d offloaded supported
  * @psoc: psoc ptr
@@ -2072,6 +2092,18 @@ wlan_reg_get_max_phymode(struct wlan_objmgr_pdev *pdev,
  *	BAND_5G if 5G is enabled but 2G isn't
  */
 enum band_info wlan_reg_band_bitmap_to_band_info(uint32_t band_bitmap);
+
+/**
+ * wlan_reg_update_tx_power_on_ctry_change() - Update tx power during
+ * country code change (without channel change) OR if fcc constraint is set
+ * @pdev: Pointer to pdev
+ * @vdev_id: vdev ID
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+wlan_reg_update_tx_power_on_ctry_change(struct wlan_objmgr_pdev *pdev,
+					uint8_t vdev_id);
 #endif
 
 #if defined(CONFIG_BAND_6GHZ)

+ 20 - 0
umac/regulatory/dispatcher/src/wlan_reg_services_api.c

@@ -701,6 +701,19 @@ void wlan_reg_unregister_chan_change_callback(struct wlan_objmgr_psoc *psoc,
 					    (reg_chan_change_callback)cbk);
 }
 
+void wlan_reg_register_ctry_change_callback(struct wlan_objmgr_psoc *psoc,
+					    void *cbk)
+{
+	reg_register_ctry_change_callback(psoc, (reg_ctry_change_callback)cbk);
+}
+
+void wlan_reg_unregister_ctry_change_callback(struct wlan_objmgr_psoc *psoc,
+					      void *cbk)
+{
+	reg_unregister_ctry_change_callback(psoc,
+					    (reg_ctry_change_callback)cbk);
+}
+
 bool wlan_reg_is_11d_offloaded(struct wlan_objmgr_psoc *psoc)
 {
 	return reg_is_11d_offloaded(psoc);
@@ -1632,6 +1645,13 @@ enum band_info wlan_reg_band_bitmap_to_band_info(uint32_t band_bitmap)
 {
 	return reg_band_bitmap_to_band_info(band_bitmap);
 }
+
+QDF_STATUS
+wlan_reg_update_tx_power_on_ctry_change(struct wlan_objmgr_pdev *pdev,
+					uint8_t vdev_id)
+{
+	return reg_update_tx_power_on_ctry_change(pdev, vdev_id);
+}
 #endif
 
 #if defined(CONFIG_BAND_6GHZ)