Forráskód Böngészése

qcacld-3.0: Differentiate pattern id for legacy firmware

The Wow pattern id should be identified unique for different vdevs of
legacy firmware, and latest firmware accept same Wow pattern id on
different vdevs.

This change is to differentiate this behavior using
WMI_SERVICE_UNIFIED_WOW_CAPABILITY flag, and supply a set of APIs to
manipulate pattern id.

Change-Id: I5fe7623a309a0c3baa14fb7312107c057e994462
CRs-Fixed: 2103017
Will Huang 7 éve
szülő
commit
fe649175aa

+ 45 - 15
components/pmo/core/inc/wlan_pmo_wow.h

@@ -118,9 +118,15 @@ static inline uint8_t pmo_get_and_increment_wow_default_ptrn(
 {
 	uint8_t count;
 
-	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
-	count = vdev_ctx->num_wow_default_patterns++;
-	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+	if (vdev_ctx->pmo_psoc_ctx->psoc_cfg.ptrn_id_per_vdev) {
+		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+		count = vdev_ctx->num_wow_default_patterns++;
+		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+	} else {
+		qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
+		count = vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_def++;
+		qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
+	}
 
 	return count;
 }
@@ -136,9 +142,15 @@ static inline uint8_t pmo_get_and_increment_wow_default_ptrn(
 static inline void pmo_increment_wow_default_ptrn(
 		struct pmo_vdev_priv_obj *vdev_ctx)
 {
-	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
-	vdev_ctx->num_wow_default_patterns++;
-	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+	if (vdev_ctx->pmo_psoc_ctx->psoc_cfg.ptrn_id_per_vdev) {
+		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+		vdev_ctx->num_wow_default_patterns++;
+		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+	} else {
+		qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
+		vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_def++;
+		qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
+	}
 }
 
 /**
@@ -152,9 +164,15 @@ static inline void pmo_increment_wow_default_ptrn(
 static inline void pmo_decrement_wow_default_ptrn(
 		struct pmo_vdev_priv_obj *vdev_ctx)
 {
-	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
-	vdev_ctx->num_wow_default_patterns--;
-	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+	if (vdev_ctx->pmo_psoc_ctx->psoc_cfg.ptrn_id_per_vdev) {
+		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+		vdev_ctx->num_wow_default_patterns--;
+		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+	} else {
+		qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
+		vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_def--;
+		qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
+	}
 }
 
 /**
@@ -168,9 +186,15 @@ static inline void pmo_decrement_wow_default_ptrn(
 static inline void pmo_increment_wow_user_ptrn(
 		struct pmo_vdev_priv_obj *vdev_ctx)
 {
-	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
-	vdev_ctx->num_wow_user_patterns++;
-	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+	if (vdev_ctx->pmo_psoc_ctx->psoc_cfg.ptrn_id_per_vdev) {
+		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+		vdev_ctx->num_wow_user_patterns++;
+		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+	} else {
+		qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
+		vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_usr++;
+		qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
+	}
 }
 
 /**
@@ -184,9 +208,15 @@ static inline void pmo_increment_wow_user_ptrn(
 static inline void pmo_decrement_wow_user_ptrn(
 		struct pmo_vdev_priv_obj *vdev_ctx)
 {
-	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
-	vdev_ctx->num_wow_user_patterns--;
-	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+	if (vdev_ctx->pmo_psoc_ctx->psoc_cfg.ptrn_id_per_vdev) {
+		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+		vdev_ctx->num_wow_user_patterns--;
+		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+	} else {
+		qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
+		vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_usr--;
+		qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
+	}
 }
 
 void pmo_dump_wow_ptrn(struct pmo_wow_add_pattern *ptrn);

+ 2 - 0
components/pmo/dispatcher/inc/wlan_pmo_common_public_struct.h

@@ -242,6 +242,7 @@ enum pmo_offload_trigger {
 /**
  * struct pmo_psoc_cfg - user configuration required for pmo
  * @ptrn_match_enable_all_vdev: true when pattern match is enable for all vdev
+ * @ptrn_id_per_vdev: true when pattern id can be same for different vdev
  * @bpf_enable: true if psoc supports bpf else false
  * @arp_offload_enable: true if arp offload is supported for psoc else false
  * @hw_filter_mode: which mode the hardware filter should use during DTIM
@@ -269,6 +270,7 @@ enum pmo_offload_trigger {
  */
 struct pmo_psoc_cfg {
 	bool ptrn_match_enable_all_vdev;
+	bool ptrn_id_per_vdev;
 	bool bpf_enable;
 	bool arp_offload_enable;
 	enum pmo_hw_filter_mode hw_filter_mode;

+ 5 - 0
components/pmo/dispatcher/inc/wlan_pmo_wow_public_struct.h

@@ -185,6 +185,8 @@ enum pmo_wow_action_wakeup_opertion {
  * @lphb_cb_ctx: callback context for lphb, kept as void* as
  *                        osif structures are opaque to pmo.
  * @pmo_lphb_callback: registered os if calllback function
+ * @ptrn_id_def: default pattern id counter for legacy firmware
+ * @ptrn_id_usr: user pattern id counter for legacy firmware
  *
  * This structure stores wow patterns and
  * wow related parameters in host.
@@ -205,6 +207,9 @@ struct pmo_wow {
 	struct pmo_lphb_req lphb_cache[2];
 	void *lphb_cb_ctx;
 	pmo_lphb_callback lphb_cb;
+
+	uint8_t ptrn_id_def;
+	uint8_t ptrn_id_usr;
 };
 
 /* WOW related structures */

+ 2 - 0
core/hdd/src/wlan_hdd_main.c

@@ -11912,6 +11912,8 @@ static int hdd_update_pmo_config(struct hdd_context *hdd_ctx)
 		(hdd_ctx->config->wowEnable & 0x01) ? true : false;
 	psoc_cfg.ptrn_match_enable_all_vdev =
 		(hdd_ctx->config->wowEnable & 0x02) ? true : false;
+	psoc_cfg.ptrn_id_per_vdev = wma_is_service_enabled(
+		WMI_SERVICE_UNIFIED_WOW_CAPABILITY);
 	psoc_cfg.bpf_enable =
 		hdd_ctx->config->bpf_packet_filter_enable;
 	psoc_cfg.arp_offload_enable = hdd_ctx->config->fhostArpOffload;