diff --git a/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_ap.h b/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_ap.h index e6bde2bab4..314be67115 100644 --- a/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_ap.h +++ b/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_ap.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2020-2021, The Linux Foundation. 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 above @@ -81,4 +81,175 @@ QDF_STATUS if_mgr_ap_stop_bss_complete(struct wlan_objmgr_vdev *vdev, struct if_mgr_event_data *event_data); -#endif +#if defined WLAN_MBSS +/** + * if_mgr_ap_start_acs() - ACS start event handler + * @vdev: vdev object + * @event_data: Interface mgr event data + * + * This function handles the ACS start event for interface + * manager + * + * Context: It can run in process/tasklet context + * + * Return: QDF_STATUS + */ +QDF_STATUS if_mgr_ap_start_acs(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data); + +/** + * if_mgr_ap_stop_acs() - ACS stop event handler + * @vdev: vdev object + * @event_data: Interface mgr event data + * + * This function handles the ACS stop event for interface + * manager + * + * Context: It can run in process/tasklet context + * + * Return: QDF_STATUS + */ +QDF_STATUS if_mgr_ap_stop_acs(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data); + +/** + * if_mgr_ap_done_acs() - ACS done event handler + * @vdev: vdev object + * @event_data: Interface mgr event data + * + * This function handles the ACS stop event for interface + * manager + * + * Context: It can run in process/tasklet context + * + * Return: QDF_STATUS + */ +QDF_STATUS if_mgr_ap_done_acs(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data); + +/** + * if_mgr_ap_cancel_acs() - ACS cancel event handler + * @vdev: vdev object + * @event_data: Interface mgr event data + * + * This function handles the ACS cancel event for interface + * manager + * + * Context: It can run in process/tasklet context + * + * Return: QDF_STATUS + */ +QDF_STATUS if_mgr_ap_cancel_acs(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data); + +/** + * if_mgr_ap_start_ht40() - HT40 scan start event handler + * @vdev: vdev object + * @event_data: Interface mgr event data + * + * This function handles the HT40 scan start event for interface + * manager + * + * Context: It can run in process/tasklet context + * + * Return: QDF_STATUS + */ +QDF_STATUS if_mgr_ap_start_ht40(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data); + +/** + * if_mgr_ap_stop_ht40() - HT40 scan stop event handler + * @vdev: vdev object + * @event_data: Interface mgr event data + * + * This function handles the HT40 scan stop event for interface + * manager + * + * Context: It can run in process/tasklet context + * + * Return: QDF_STATUS + */ +QDF_STATUS if_mgr_ap_stop_ht40(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data); + +/** + * if_mgr_ap_done_ht40() - HT40 scan done event handler + * @vdev: vdev object + * @event_data: Interface mgr event data + * + * This function handles the HT40 scan done event for interface + * manager + * + * Context: It can run in process/tasklet context + * + * Return: QDF_STATUS + */ +QDF_STATUS if_mgr_ap_done_ht40(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data); + +/** + * if_mgr_ap_cancel_ht40() - HT40 scan cancel event handler + * @vdev: vdev object + * @event_data: Interface mgr event data + * + * This function handles the HT40 scan cancel event for interface + * manager + * + * Context: It can run in process/tasklet context + * + * Return: QDF_STATUS + */ +QDF_STATUS if_mgr_ap_cancel_ht40(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data); +#else +static inline QDF_STATUS +if_mgr_ap_start_acs(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data) +{ + return QDF_STATUS_SUCCESS; +} + +static inline QDF_STATUS +if_mgr_ap_stop_acs(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data) +{ + return QDF_STATUS_SUCCESS; +} + +static inline QDF_STATUS +if_mgr_ap_cancel_acs(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data) +{ + return QDF_STATUS_SUCCESS; +} + +static inline QDF_STATUS +if_mgr_ap_start_ht40(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data) +{ + return QDF_STATUS_SUCCESS; +} + +static inline QDF_STATUS +if_mgr_ap_stop_ht40(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data) +{ + return QDF_STATUS_SUCCESS; +} + +static inline QDF_STATUS +if_mgr_ap_done_ht40(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data) +{ + return QDF_STATUS_SUCCESS; +} + +static inline QDF_STATUS +if_mgr_ap_cancel_ht40(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data) +{ + return QDF_STATUS_SUCCESS; +} +#endif /* WLAN_MBSS */ +#endif /* _WLAN_IF_MGR_AP_H_ */ + diff --git a/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_api.h b/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_api.h index 32363fda2c..9cda0b3633 100644 --- a/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_api.h +++ b/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_api.h @@ -38,14 +38,39 @@ QDF_STATUS if_mgr_deliver_event(struct wlan_objmgr_vdev *vdev, enum wlan_if_mgr_evt event, struct if_mgr_event_data *event_data); +/** + * if_mgr_get_event_str() - get event string + * @event: interface manager event + * + * Return: Interface event string + */ +const char *if_mgr_get_event_str(enum wlan_if_mgr_evt event); + +/** + * if_mgr_deliver_mbss_event() - interface mgr MBSS event handler + * @vdev: vdev object + * @event: interface mangaer event + * @event_data: Interface mgr event data + * + * Return: QDF_STATUS + */ +QDF_STATUS if_mgr_deliver_mbss_event(struct wlan_objmgr_vdev *vdev, + enum wlan_if_mgr_evt event, + struct if_mgr_event_data *event_data); + #else static inline QDF_STATUS if_mgr_deliver_event(struct wlan_objmgr_vdev *vdev, enum wlan_if_mgr_evt event, struct if_mgr_event_data *event_data) { - return QDF_STATUS_SUCCESS; } -#endif + +static inline const char *if_mgr_get_event_str(enum wlan_if_mgr_evt event) +{ + return ""; +} + +#endif /* WLAN_FEATURE_INTERFACE_MGR */ #endif diff --git a/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_public_struct.h b/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_public_struct.h index a7761c0ad6..6ac5b70bac 100644 --- a/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_public_struct.h +++ b/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_public_struct.h @@ -39,6 +39,14 @@ * @WLAN_IF_MGR_EV_AP_START_BSS_COMPLETE:Event to handle start bss complete * @WLAN_IF_MGR_EV_AP_STOP_BSS:Event to handle stop bss request * @WLAN_IF_MGR_EV_AP_STOP_BSS_COMPLETE:Event to stop bss complete + * WLAN_IF_MGR_EV_AP_START_ACS: Event to handle ACS start + * WLAN_IF_MGR_EV_AP_STOP_ACS: Event to handle ACS stop + * WLAN_IF_MGR_EV_AP_DONE_ACS: Event to handle ACS completion + * WLAN_IF_MGR_EV_AP_CANCEL_ACS: Event to handle ACS cancel + * WLAN_IF_MGR_EV_AP_START_HT40: Event to handle HT40 scan start + * WLAN_IF_MGR_EV_AP_STOP_HT40: Event to handle HT40 scan stop + * WLAN_IF_MGR_EV_AP_DONE_HT40: Event to handle HT40 scan completion + * WLAN_IF_MGR_EV_AP_CANCEL_HT40: Event to handle HT40 scan cancel */ enum wlan_if_mgr_evt { WLAN_IF_MGR_EV_CONNECT_START = 0, @@ -50,7 +58,15 @@ enum wlan_if_mgr_evt { WLAN_IF_MGR_EV_AP_START_BSS_COMPLETE = 6, WLAN_IF_MGR_EV_AP_STOP_BSS = 7, WLAN_IF_MGR_EV_AP_STOP_BSS_COMPLETE = 8, - WLAN_IF_MGR_EV_MAX = 9, + WLAN_IF_MGR_EV_AP_START_ACS = 9, + WLAN_IF_MGR_EV_AP_STOP_ACS = 10, + WLAN_IF_MGR_EV_AP_DONE_ACS = 11, + WLAN_IF_MGR_EV_AP_CANCEL_ACS = 12, + WLAN_IF_MGR_EV_AP_START_HT40 = 13, + WLAN_IF_MGR_EV_AP_STOP_HT40 = 14, + WLAN_IF_MGR_EV_AP_DONE_HT40 = 15, + WLAN_IF_MGR_EV_AP_CANCEL_HT40 = 16, + WLAN_IF_MGR_EV_MAX = 17, }; /** @@ -70,10 +86,12 @@ struct validate_bss_data { * @status: qdf status used to indicate if connect,disconnect, * start bss,stop bss event is success/failure. * @validate_bss_info: struct to hold the validate candidate information + * @data: event data */ struct if_mgr_event_data { QDF_STATUS status; struct validate_bss_data validate_bss_info; + void *data; }; #endif diff --git a/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_sta.h b/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_sta.h index c03aa1c358..e4f2a87ff7 100644 --- a/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_sta.h +++ b/umac/cmn_services/interface_mgr/inc/wlan_if_mgr_sta.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2020-2021, The Linux Foundation. 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 above @@ -78,4 +78,19 @@ QDF_STATUS if_mgr_disconnect_start(struct wlan_objmgr_vdev *vdev, QDF_STATUS if_mgr_disconnect_complete(struct wlan_objmgr_vdev *vdev, struct if_mgr_event_data *event_data); +/** + * if_mgr_validate_candidate() - Validate the selected candidate + * @vdev: vdev object + * @event_data: Interface mgr event data + * + * This function handles candidate validation as part of connection + * manager + * + * Context: It should run in thread context + * + * Return: QDF_STATUS + */ +QDF_STATUS if_mgr_validate_candidate(struct wlan_objmgr_vdev *vdev, + struct if_mgr_event_data *event_data); + #endif diff --git a/umac/cmn_services/interface_mgr/src/wlan_if_mgr_core.c b/umac/cmn_services/interface_mgr/src/wlan_if_mgr_core.c index 2825dfb5ae..1870035cb1 100644 --- a/umac/cmn_services/interface_mgr/src/wlan_if_mgr_core.c +++ b/umac/cmn_services/interface_mgr/src/wlan_if_mgr_core.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2020-2021, The Linux Foundation. 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 above @@ -22,7 +22,94 @@ #include "wlan_if_mgr_sta.h" #include "wlan_if_mgr_ap.h" #include "wlan_if_mgr_main.h" +#if !defined WLAN_MBSS #include "wlan_if_mgr_roam.h" +#endif + +const char *if_mgr_get_event_str(enum wlan_if_mgr_evt event) +{ + if (event > WLAN_IF_MGR_EV_MAX) + return ""; + + switch (event) { + CASE_RETURN_STRING(WLAN_IF_MGR_EV_CONNECT_START); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_CONNECT_COMPLETE); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_DISCONNECT_START); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_DISCONNECT_COMPLETE); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_VALIDATE_CANDIDATE); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_BSS); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_BSS_COMPLETE); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_BSS); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_BSS_COMPLETE); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_ACS); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_ACS); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_DONE_ACS); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_CANCEL_ACS); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_HT40); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_HT40); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_DONE_HT40); + CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_CANCEL_HT40); + default: + return "Unknown"; + } +} + +#if defined WLAN_MBSS +QDF_STATUS if_mgr_deliver_mbss_event(struct wlan_objmgr_vdev *vdev, + enum wlan_if_mgr_evt event, + struct if_mgr_event_data *event_data) +{ + QDF_STATUS status; + + switch (event) { + case WLAN_IF_MGR_EV_AP_START_ACS: + status = if_mgr_ap_start_acs(vdev, event_data); + break; + case WLAN_IF_MGR_EV_AP_STOP_ACS: + status = if_mgr_ap_stop_acs(vdev, event_data); + break; + case WLAN_IF_MGR_EV_AP_CANCEL_ACS: + status = if_mgr_ap_cancel_acs(vdev, event_data); + break; + case WLAN_IF_MGR_EV_AP_DONE_ACS: + status = if_mgr_ap_done_acs(vdev, event_data); + break; + case WLAN_IF_MGR_EV_AP_START_HT40: + status = if_mgr_ap_start_ht40(vdev, event_data); + break; + case WLAN_IF_MGR_EV_AP_STOP_HT40: + status = if_mgr_ap_stop_ht40(vdev, event_data); + break; + case WLAN_IF_MGR_EV_AP_DONE_HT40: + status = if_mgr_ap_done_ht40(vdev, event_data); + break; + case WLAN_IF_MGR_EV_AP_CANCEL_HT40: + status = if_mgr_ap_cancel_ht40(vdev, event_data); + break; + default: + status = QDF_STATUS_E_INVAL; + ifmgr_err("Invalid event"); + break; + } + return status; +} +#else +QDF_STATUS if_mgr_deliver_mbss_event(struct wlan_objmgr_vdev *vdev, + enum wlan_if_mgr_evt event, + struct if_mgr_event_data *event_data) +{ + QDF_STATUS status; + + switch (event) { + default: + status = QDF_STATUS_E_INVAL; + ifmgr_err("Invalid event"); + break; + } + + return status; +} +#endif QDF_STATUS if_mgr_deliver_event(struct wlan_objmgr_vdev *vdev, enum wlan_if_mgr_evt event, @@ -35,7 +122,8 @@ QDF_STATUS if_mgr_deliver_event(struct wlan_objmgr_vdev *vdev, if (!psoc) return QDF_STATUS_E_FAILURE; - ifmgr_debug("IF MGR event received: %d", event); + ifmgr_debug("IF MGR event received: %s(%d)", + if_mgr_get_event_str(event), event); switch (event) { case WLAN_IF_MGR_EV_CONNECT_START: @@ -66,9 +154,7 @@ QDF_STATUS if_mgr_deliver_event(struct wlan_objmgr_vdev *vdev, status = if_mgr_validate_candidate(vdev, event_data); break; default: - status = QDF_STATUS_E_INVAL; - ifmgr_err("Invalid event"); - break; + status = if_mgr_deliver_mbss_event(vdev, event, event_data); } return status;