diff --git a/umac/cmn_services/serialization/inc/wlan_serialization_api.h b/umac/cmn_services/serialization/inc/wlan_serialization_api.h index 4d592e03af..90c5d5ee28 100644 --- a/umac/cmn_services/serialization/inc/wlan_serialization_api.h +++ b/umac/cmn_services/serialization/inc/wlan_serialization_api.h @@ -588,6 +588,16 @@ wlan_serialization_get_vdev_active_cmd_type(struct wlan_objmgr_vdev *vdev); QDF_STATUS wlan_ser_get_cmd_activation_status(struct wlan_objmgr_vdev *vdev); +/** + * wlan_ser_is_vdev_queue_enabled() - Return vdev queue status + * @vdev: vdev object + * + * This API return vdev queue enable status + * + * Return: true if vdev queue is enabled + */ +bool wlan_ser_is_vdev_queue_enabled(struct wlan_objmgr_vdev *vdev); + /** * wlan_ser_validate_umac_cmd() - validate umac cmd data * @vdev: objmgr vdev pointer diff --git a/umac/cmn_services/serialization/src/wlan_serialization_api.c b/umac/cmn_services/serialization/src/wlan_serialization_api.c index 77481da255..6c3e72ee74 100644 --- a/umac/cmn_services/serialization/src/wlan_serialization_api.c +++ b/umac/cmn_services/serialization/src/wlan_serialization_api.c @@ -676,6 +676,25 @@ error: return cmd_type; } +bool wlan_ser_is_vdev_queue_enabled(struct wlan_objmgr_vdev *vdev) +{ + struct wlan_ser_vdev_obj *ser_vdev_obj; + struct wlan_serialization_vdev_queue *vdev_queue; + + ser_vdev_obj = wlan_serialization_get_vdev_obj(vdev); + if (!ser_vdev_obj) { + ser_err("invalid ser_vdev_obj"); + return false; + } + + vdev_queue = wlan_serialization_get_vdev_queue_obj( + ser_vdev_obj, WLAN_SER_CMD_NONSCAN); + if (vdev_queue->queue_disable) + return false; + else + return true; +} + QDF_STATUS wlan_ser_get_cmd_activation_status(struct wlan_objmgr_vdev *vdev) { diff --git a/umac/mlme/mlme_utils/wlan_vdev_mlme_ser_if.c b/umac/mlme/mlme_utils/wlan_vdev_mlme_ser_if.c index 3e9a443511..cf98779893 100644 --- a/umac/mlme/mlme_utils/wlan_vdev_mlme_ser_if.c +++ b/umac/mlme/mlme_utils/wlan_vdev_mlme_ser_if.c @@ -41,6 +41,8 @@ wlan_vdev_mlme_ser_start_bss(struct wlan_serialization_command *cmd) return WLAN_SER_CMD_DENIED_UNSPECIFIED; } + if (!wlan_ser_is_vdev_queue_enabled(cmd->vdev)) + return WLAN_SER_CMD_QUEUE_DISABLED; /* * Serialization command filtering logic * a. Cancel any existing start bss cmd in the pending queue @@ -77,6 +79,9 @@ wlan_vdev_mlme_ser_stop_bss(struct wlan_serialization_command *cmd) mlme_err("Null input"); return WLAN_SER_CMD_DENIED_UNSPECIFIED; } + + if (!wlan_ser_is_vdev_queue_enabled(cmd->vdev)) + return WLAN_SER_CMD_QUEUE_DISABLED; /* * Serialization command filtering logic * a. Cancel any existing start/stop/restart command in the pending @@ -112,6 +117,9 @@ wlan_vdev_mlme_ser_restart_bss(struct wlan_serialization_command *cmd) mlme_err("Null input"); return WLAN_SER_CMD_DENIED_UNSPECIFIED; } + + if (!wlan_ser_is_vdev_queue_enabled(cmd->vdev)) + return WLAN_SER_CMD_QUEUE_DISABLED; /* * Serialization command filtering logic * a. Cancel any existing RESTART cmd in the pending queue @@ -133,6 +141,9 @@ wlan_vdev_mlme_ser_connect(struct wlan_serialization_command *cmd) mlme_err("Null input"); return WLAN_SER_CMD_DENIED_UNSPECIFIED; } + + if (!wlan_ser_is_vdev_queue_enabled(cmd->vdev)) + return WLAN_SER_CMD_QUEUE_DISABLED; /* * Serialization command filtering logic * a. Cancel any existing CONNECT cmd in the pending queue @@ -165,6 +176,9 @@ wlan_vdev_mlme_ser_disconnect(struct wlan_serialization_command *cmd) mlme_err("Null input"); return WLAN_SER_CMD_DENIED_UNSPECIFIED; } + + if (!wlan_ser_is_vdev_queue_enabled(cmd->vdev)) + return WLAN_SER_CMD_QUEUE_DISABLED; /* * Serialization command filtering logic * a.Cancel any existing CONNECT/DISCONNECT/RESTART command in the