Explorar o código

qcacmn: Update scheduler_msg callback type

This fixes a CFI failure in callback assignment.

Currently, the callbacks in scheduler_msg are void function
pointers. Update them to have a defined type as
scheduler_msg_process_fn_t to catch type mismatch during
compilation.

Other changes to conform to this new type include:
	1. Cast callback to qdf_mc_timer_callback_t when
	   referencing, and back when assigning
	2. Cast wlan_serialization_generic_timer_cb to
	   take fit into scheduler_msg
	3. Cast target_if_vdev_mgr_rsp_timer_cb to fit
	   into scheduler_msg

Change-Id: I052bc54826d377ae92f5bcc80ca08afb6f5e01e3
CRs-fixed: 2719975
Lincoln Tran %!s(int64=5) %!d(string=hai) anos
pai
achega
a86b23ee68

+ 6 - 5
scheduler/inc/scheduler_api.h

@@ -55,6 +55,10 @@ typedef enum {
 	SYS_MSG_ID_UMAC_STOP,
 } SYS_MSG_ID;
 
+struct scheduler_msg;
+typedef QDF_STATUS (*scheduler_msg_process_fn_t)(struct scheduler_msg *msg);
+typedef void (*hdd_suspend_callback)(void);
+
 /**
  * struct scheduler_msg: scheduler message structure
  * @type: message type
@@ -82,8 +86,8 @@ struct scheduler_msg {
 	uint16_t reserved;
 	uint32_t bodyval;
 	void *bodyptr;
-	void *callback;
-	void *flush_callback;
+	scheduler_msg_process_fn_t callback;
+	scheduler_msg_process_fn_t flush_callback;
 	qdf_list_node_t node;
 #ifdef WLAN_SCHED_HISTORY_SIZE
 	QDF_MODULE_ID queue_id;
@@ -101,9 +105,6 @@ struct scheduler_msg {
  */
 void sched_history_print(void);
 
-typedef QDF_STATUS (*scheduler_msg_process_fn_t) (struct scheduler_msg  *msg);
-typedef void (*hdd_suspend_callback)(void);
-
 /**
  * scheduler_init() - initialize control path scheduler
  *

+ 5 - 2
scheduler/src/scheduler_api.c

@@ -464,7 +464,10 @@ QDF_STATUS scheduler_timer_q_mq_handler(struct scheduler_msg *msg)
 	if (msg->reserved != SYS_MSG_COOKIE || msg->type != SYS_MSG_ID_MC_TIMER)
 		return sched_ctx->legacy_sys_handler(msg);
 
-	timer_callback = msg->callback;
+	/* scheduler_msg_process_fn_t and qdf_mc_timer_callback_t have
+	 * different parameters and return type
+	 */
+	timer_callback = (qdf_mc_timer_callback_t)msg->callback;
 	QDF_BUG(timer_callback);
 	if (!timer_callback)
 		return QDF_STATUS_E_FAILURE;
@@ -641,7 +644,7 @@ void scheduler_mc_timer_callback(qdf_mc_timer_t *timer)
 	/* serialize to scheduler controller thread */
 	msg.type = SYS_MSG_ID_MC_TIMER;
 	msg.reserved = SYS_MSG_COOKIE;
-	msg.callback = callback;
+	msg.callback = (scheduler_msg_process_fn_t)callback;
 	msg.bodyptr = user_data;
 	msg.bodyval = 0;
 

+ 2 - 2
target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h

@@ -158,10 +158,10 @@ QDF_STATUS target_if_vdev_mgr_wmi_event_unregister(
 
 /**
  * target_if_vdev_mgr_rsp_timer_cb() - function to handle vdev related timeouts
- * @vdev_rsp: pointer to vdev response timer
+ * @arg: pointer to argument
  *
  * Return: none
  */
-void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp);
+void target_if_vdev_mgr_rsp_timer_cb(void *arg);
 
 #endif /* __TARGET_IF_VDEV_MGR_RX_OPS_H__ */

+ 12 - 3
target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c

@@ -47,7 +47,7 @@ void target_if_vdev_mgr_handle_recovery(struct wlan_objmgr_psoc *psoc,
 				wlan_psoc_get_id(psoc), vdev_id);
 }
 
-void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp)
+void target_if_vdev_mgr_rsp_timer_cb(void *arg)
 {
 	struct wlan_objmgr_psoc *psoc;
 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
@@ -55,6 +55,7 @@ void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp)
 	struct vdev_stop_response stop_rsp = {0};
 	struct vdev_delete_response del_rsp = {0};
 	struct peer_delete_all_response peer_del_all_rsp = {0};
+	struct vdev_response_timer *vdev_rsp = arg;
 	enum qdf_hang_reason recovery_reason;
 	uint8_t vdev_id;
 	uint16_t rsp_pos = RESPONSE_BIT_MAX;
@@ -199,8 +200,16 @@ target_if_vdev_mgr_rsp_cb_mc_ctx(void *arg)
 
 	msg.type = SYS_MSG_ID_MC_TIMER;
 	msg.reserved = SYS_MSG_COOKIE;
-	msg.callback = target_if_vdev_mgr_rsp_timer_cb;
-	msg.bodyptr = vdev_rsp;
+
+	/* msg.callback will explicitly cast back to qdf_mc_timer_callback_t
+	 * in scheduler_timer_q_mq_handler.
+	 * but in future we do not want to introduce more this kind of
+	 * typecast by properly using QDF MC timer for MCC from get go in
+	 * common code.
+	 */
+	msg.callback =
+		(scheduler_msg_process_fn_t)target_if_vdev_mgr_rsp_timer_cb;
+	msg.bodyptr = arg;
 	msg.bodyval = 0;
 	msg.flush_callback = target_if_vdev_mgr_rsp_flush_cb;
 

+ 9 - 1
umac/cmn_services/serialization/src/wlan_serialization_internal.c

@@ -586,7 +586,15 @@ wlan_serialization_timer_cb_mc_ctx(void *arg)
 
 	msg.type = SYS_MSG_ID_MC_TIMER;
 	msg.reserved = SYS_MSG_COOKIE;
-	msg.callback = wlan_serialization_generic_timer_cb;
+
+	/* msg.callback will explicitly cast back to qdf_mc_timer_callback_t
+	 * in scheduler_timer_q_mq_handler.
+	 * but in future we do not want to introduce more this kind of
+	 * typecast by properly using QDF MC timer for MCC from get go in
+	 * common code.
+	 */
+	msg.callback =
+		(scheduler_msg_process_fn_t)wlan_serialization_generic_timer_cb;
 	msg.bodyptr = arg;
 	msg.bodyval = 0;
 	msg.flush_callback = wlan_serialization_mc_flush_noop;