From 089fd7c9da535a8fb82177264f129bdb70c18103 Mon Sep 17 00:00:00 2001 From: Anish Nataraj Date: Fri, 17 Feb 2017 18:47:19 +0530 Subject: [PATCH] qcacmn: Implement Dynamic serialization rules framework Add dynamic rules registration callbacks which needs to be registered by each component during its initialization phase. These callbacks are used for serialization component to determine whether serialization request can or can't be honored. Change-Id: I02000426527bc7611cb9bb1d0ee26f3c03d9f2d1 --- .../inc/wlan_serialization_api.h | 41 +++++++++++-- .../src/wlan_serialization_api.c | 57 ++++++++++++++++- .../src/wlan_serialization_main.c | 61 +------------------ .../src/wlan_serialization_utils.c | 13 ++++ .../src/wlan_serialization_utils_i.h | 8 +++ 5 files changed, 113 insertions(+), 67 deletions(-) diff --git a/umac/cmn_services/serialization/inc/wlan_serialization_api.h b/umac/cmn_services/serialization/inc/wlan_serialization_api.h index ed7134c7b798..967408fba654 100644 --- a/umac/cmn_services/serialization/inc/wlan_serialization_api.h +++ b/umac/cmn_services/serialization/inc/wlan_serialization_api.h @@ -339,7 +339,7 @@ wlan_serialization_request(struct wlan_serialization_command *cmd); * callback * @psoc: PSOC object information * @comp_id: Component ID - * @cmd_id: Command ID + * @cmd_type: Command Type * @cb: Callback * * This is called from component during its initialization.It initializes @@ -350,15 +350,15 @@ wlan_serialization_request(struct wlan_serialization_command *cmd); QDF_STATUS wlan_serialization_register_comp_info_cb(struct wlan_objmgr_psoc *psoc, enum wlan_umac_comp_id comp_id, - enum wlan_serialization_cmd_type cmd_id, + enum wlan_serialization_cmd_type cmd_type, wlan_serialization_comp_info_cb cb); /** * wlan_serialization_deregister_comp_info_cb() - Deregister component's info - * callback + * callback * @psoc: PSOC object information * @comp_id: Component ID - * @cmd_id: Command ID + * @cmd_type: Command Type * * This routine is called from other component during its de-initialization. * @@ -367,7 +367,38 @@ wlan_serialization_register_comp_info_cb(struct wlan_objmgr_psoc *psoc, QDF_STATUS wlan_serialization_deregister_comp_info_cb(struct wlan_objmgr_psoc *psoc, enum wlan_umac_comp_id comp_id, - enum wlan_serialization_cmd_type cmd_id); + enum wlan_serialization_cmd_type cmd_type); + +/** + * wlan_serialization_register_apply_rules_cb() - Register component's rules + * callback + * @psoc: PSOC object information + * @cmd_type: Command Type + * @cb: Callback + * + * This is called from component during its initialization.It initializes + * callback handler for given cmd_type in a 1-D array. + * + * Return: QDF Status + */ +QDF_STATUS +wlan_serialization_register_apply_rules_cb(struct wlan_objmgr_psoc *psoc, + enum wlan_serialization_cmd_type cmd_type, + wlan_serialization_apply_rules_cb apply_rules_cb); + +/** + * wlan_serialization_deregister_apply_rules_cb() - Deregister component's rules + * callback + * @psoc: PSOC object information + * @cmd_type: Command Type + * + * This routine is called from other component during its de-initialization. + * + * Return: QDF Status + */ +QDF_STATUS +wlan_serialization_deregister_apply_rules_cb(struct wlan_objmgr_psoc *psoc, + enum wlan_serialization_cmd_type cmd_type); /** * @wlan_serialization_init() - Serialization component initialization routine diff --git a/umac/cmn_services/serialization/src/wlan_serialization_api.c b/umac/cmn_services/serialization/src/wlan_serialization_api.c index a4f6c1228345..98fefed8a324 100644 --- a/umac/cmn_services/serialization/src/wlan_serialization_api.c +++ b/umac/cmn_services/serialization/src/wlan_serialization_api.c @@ -51,6 +51,53 @@ bool wlan_serialization_is_cmd_present_in_active_queue( return wlan_serialization_is_cmd_present_queue(cmd, true); } +QDF_STATUS +wlan_serialization_register_apply_rules_cb(struct wlan_objmgr_psoc *psoc, + enum wlan_serialization_cmd_type cmd_type, + wlan_serialization_apply_rules_cb cb) +{ + struct wlan_serialization_psoc_priv_obj *ser_soc_obj; + QDF_STATUS status; + + status = wlan_serialization_validate_cmdtype(cmd_type); + if (status != QDF_STATUS_SUCCESS) { + serialization_err("invalid cmd_type %d", + cmd_type); + return status; + } + ser_soc_obj = wlan_serialization_get_psoc_priv_obj(psoc); + if (!ser_soc_obj) { + serialization_err("invalid ser_soc_obj"); + return QDF_STATUS_E_FAILURE; + } + ser_soc_obj->apply_rules_cb[cmd_type] = cb; + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS +wlan_serialization_deregister_apply_rules_cb(struct wlan_objmgr_psoc *psoc, + enum wlan_serialization_cmd_type cmd_type) +{ + struct wlan_serialization_psoc_priv_obj *ser_soc_obj; + QDF_STATUS status; + + status = wlan_serialization_validate_cmdtype(cmd_type); + if (status != QDF_STATUS_SUCCESS) { + serialization_err("invalid cmd_type %d", + cmd_type); + return status; + } + ser_soc_obj = wlan_serialization_get_psoc_priv_obj(psoc); + if (!ser_soc_obj) { + serialization_err("invalid ser_soc_obj"); + return QDF_STATUS_E_FAILURE; + } + ser_soc_obj->apply_rules_cb[cmd_type] = NULL; + + return QDF_STATUS_SUCCESS; +} + QDF_STATUS wlan_serialization_register_comp_info_cb(struct wlan_objmgr_psoc *psoc, enum wlan_umac_comp_id comp_id, @@ -61,8 +108,11 @@ wlan_serialization_register_comp_info_cb(struct wlan_objmgr_psoc *psoc, QDF_STATUS status; status = wlan_serialization_validate_cmd(comp_id, cmd_type); - if (status != QDF_STATUS_SUCCESS) + if (status != QDF_STATUS_SUCCESS) { + serialization_err("invalid comp_id %d or cmd_type %d", + comp_id, cmd_type); return status; + } ser_soc_obj = wlan_serialization_get_psoc_priv_obj(psoc); if (!ser_soc_obj) { serialization_err("invalid ser_soc_obj"); @@ -82,8 +132,11 @@ wlan_serialization_deregister_comp_info_cb(struct wlan_objmgr_psoc *psoc, QDF_STATUS status; status = wlan_serialization_validate_cmd(comp_id, cmd_type); - if (status != QDF_STATUS_SUCCESS) + if (status != QDF_STATUS_SUCCESS) { + serialization_err("invalid comp_id %d or cmd_type %d", + comp_id, cmd_type); return status; + } ser_soc_obj = wlan_serialization_get_psoc_priv_obj(psoc); if (!ser_soc_obj) { serialization_err("invalid ser_soc_obj"); diff --git a/umac/cmn_services/serialization/src/wlan_serialization_main.c b/umac/cmn_services/serialization/src/wlan_serialization_main.c index 6ac37b9af2b7..1873b293b4ca 100644 --- a/umac/cmn_services/serialization/src/wlan_serialization_main.c +++ b/umac/cmn_services/serialization/src/wlan_serialization_main.c @@ -31,62 +31,6 @@ #include "wlan_serialization_rules_i.h" #include "wlan_serialization_utils_i.h" -/** - * wlan_serialization_apply_rules_cb_init() - Apply rule callback init - * @psoc: PSOC object - * - * Apply rules Command callback registration function is - * called from component during its initialization - * It initializes all cmd callback handler for given CMDIDX in - * 1-D Array - * - * Return: QDF Status - */ -static QDF_STATUS -wlan_serialization_apply_rules_cb_init(struct wlan_objmgr_psoc *psoc) -{ - struct wlan_serialization_psoc_priv_obj *ser_soc_obj = - wlan_serialization_get_psoc_priv_obj(psoc); - - if (ser_soc_obj == NULL) { - serialization_err("invalid ser_soc_obj"); - return QDF_STATUS_E_PERM; - } - ser_soc_obj->apply_rules_cb[WLAN_SER_CMD_SCAN] = - wlan_serialization_apply_scan_rules; - - return QDF_STATUS_SUCCESS; -} - - -/** - * wlan_serialization_apply_rules_cb_deinit() - Apply rule callback deinit - * @psoc: PSOC object - * - * Apply rules Command callback De-registration function - * called from component during its initialization - * It initializes all cmd callback handler for given CMDIDX in - * 1-D Array - * - * Return: QDF Status - */ -static QDF_STATUS -wlan_serialization_apply_rules_cb_deinit(struct wlan_objmgr_psoc *psoc) -{ - struct wlan_serialization_psoc_priv_obj *ser_soc_obj = - wlan_serialization_get_psoc_priv_obj(psoc); - uint8_t i; - - if (ser_soc_obj == NULL) { - serialization_err("invalid ser_soc_obj"); - return QDF_STATUS_E_PERM; - } - for (i = 0; i < WLAN_SER_CMD_MAX; i++) - ser_soc_obj->apply_rules_cb[i] = NULL; - - return QDF_STATUS_SUCCESS; -} - QDF_STATUS wlan_serialization_psoc_close(struct wlan_objmgr_psoc *psoc) { QDF_STATUS status; @@ -105,7 +49,6 @@ QDF_STATUS wlan_serialization_psoc_close(struct wlan_objmgr_psoc *psoc) qdf_mem_free(ser_soc_obj->timers); ser_soc_obj->timers = NULL; ser_soc_obj->max_active_cmds = 0; - status = wlan_serialization_apply_rules_cb_deinit(psoc); return status; } @@ -113,7 +56,6 @@ QDF_STATUS wlan_serialization_psoc_close(struct wlan_objmgr_psoc *psoc) QDF_STATUS wlan_serialization_psoc_open(struct wlan_objmgr_psoc *psoc) { uint8_t pdev_count; - QDF_STATUS status; struct wlan_serialization_psoc_priv_obj *ser_soc_obj = wlan_serialization_get_psoc_priv_obj(psoc); @@ -132,9 +74,8 @@ QDF_STATUS wlan_serialization_psoc_open(struct wlan_objmgr_psoc *psoc) serialization_alert("Mem alloc failed for ser timers"); return QDF_STATUS_E_NOMEM; } - status = wlan_serialization_apply_rules_cb_init(psoc); - return status; + return QDF_STATUS_SUCCESS; } QDF_STATUS wlan_serialization_psoc_obj_create_notification( diff --git a/umac/cmn_services/serialization/src/wlan_serialization_utils.c b/umac/cmn_services/serialization/src/wlan_serialization_utils.c index 5d438aa25047..592ba39c6026 100644 --- a/umac/cmn_services/serialization/src/wlan_serialization_utils.c +++ b/umac/cmn_services/serialization/src/wlan_serialization_utils.c @@ -437,6 +437,19 @@ wlan_serialization_is_active_cmd_allowed(struct wlan_serialization_command *cmd) return wlan_serialization_is_active_nonscan_cmd_allowed(pdev); } +QDF_STATUS wlan_serialization_validate_cmdtype( + enum wlan_serialization_cmd_type cmd_type) +{ + serialization_info("validate cmd_type:%d", cmd_type); + + if (cmd_type < 0 || cmd_type >= WLAN_SER_CMD_MAX) { + serialization_err("Invalid cmd or comp passed"); + return QDF_STATUS_E_INVAL; + } + + return QDF_STATUS_SUCCESS; +} + QDF_STATUS wlan_serialization_validate_cmd( enum wlan_umac_comp_id comp_id, enum wlan_serialization_cmd_type cmd_type) diff --git a/umac/cmn_services/serialization/src/wlan_serialization_utils_i.h b/umac/cmn_services/serialization/src/wlan_serialization_utils_i.h index 3efec8b6e103..8f7cbf07bd7f 100644 --- a/umac/cmn_services/serialization/src/wlan_serialization_utils_i.h +++ b/umac/cmn_services/serialization/src/wlan_serialization_utils_i.h @@ -268,6 +268,14 @@ QDF_STATUS wlan_serialization_validate_cmd( enum wlan_umac_comp_id comp_id, enum wlan_serialization_cmd_type cmd_type); +/** + * wlan_serialization_validate_cmdtype() - Validate the command type + * @cmd_type: Command Type + * + * Return: QDF Status + */ +QDF_STATUS wlan_serialization_validate_cmdtype( + enum wlan_serialization_cmd_type cmd_type); /** * wlan_serialization_release_list_cmds() - Release the list cmds to global pool