diff --git a/os_if/linux/tdls/inc/wlan_cfg80211_tdls.h b/os_if/linux/tdls/inc/wlan_cfg80211_tdls.h index 812c8bccfc9c..9dc2da3bfc02 100644 --- a/os_if/linux/tdls/inc/wlan_cfg80211_tdls.h +++ b/os_if/linux/tdls/inc/wlan_cfg80211_tdls.h @@ -193,6 +193,16 @@ void wlan_cfg80211_tdls_event_callback(void *userdata, void wlan_cfg80211_tdls_rx_callback(void *user_data, struct tdls_rx_mgmt_frame *rx_frame); +/** + * hdd_notify_tdls_reset_adapter() - notify reset adapter to TDLS + * @vdev: vdev object manager + * + * Notify hdd reset adapter to TDLS component + * + * Return: None + */ +void hdd_notify_tdls_reset_adapter(struct wlan_objmgr_vdev *vdev); + /** * hdd_notify_sta_connect() - notify sta connect to TDLS * @session_id: pointer to soc object @@ -236,6 +246,11 @@ void hdd_notify_sta_disconnect(uint8_t session_id, void hdd_notify_teardown_tdls_links(struct wlan_objmgr_vdev *vdev); #else +static inline void +hdd_notify_tdls_reset_adapter(struct wlan_objmgr_vdev *vdev) +{ +} + static inline void hdd_notify_sta_connect(uint8_t session_id, bool tdls_chan_swit_prohibited, diff --git a/os_if/linux/tdls/src/wlan_cfg80211_tdls.c b/os_if/linux/tdls/src/wlan_cfg80211_tdls.c index 7aa155afcbc6..27803c75ea6e 100644 --- a/os_if/linux/tdls/src/wlan_cfg80211_tdls.c +++ b/os_if/linux/tdls/src/wlan_cfg80211_tdls.c @@ -104,6 +104,11 @@ void hdd_notify_teardown_tdls_links(struct wlan_objmgr_vdev *vdev) cfg80211_info("TDLS teardown completion status %ld ", rc); } +void hdd_notify_tdls_reset_adapter(struct wlan_objmgr_vdev *vdev) +{ + ucfg_tdls_notify_reset_adapter(vdev); +} + void hdd_notify_sta_connect(uint8_t session_id, bool tdls_chan_swit_prohibited, diff --git a/umac/tdls/core/src/wlan_tdls_main.c b/umac/tdls/core/src/wlan_tdls_main.c index 5ce0596f0e3c..b894ba7d0d97 100644 --- a/umac/tdls/core/src/wlan_tdls_main.c +++ b/umac/tdls/core/src/wlan_tdls_main.c @@ -290,6 +290,9 @@ QDF_STATUS tdls_process_cmd(struct scheduler_msg *msg) case TDLS_CMD_TEARDOWN_LINKS: tdls_teardown_connections(msg->bodyptr); break; + case TDLS_NOTIFY_RESET_ADAPTERS: + tdls_notify_reset_adapter(msg->bodyptr); + break; default: break; } @@ -982,6 +985,31 @@ QDF_STATUS tdls_notify_sta_disconnect(struct tdls_sta_notify_params *notify) return status; } +static void tdls_process_reset_adapter(struct wlan_objmgr_vdev *vdev) +{ + struct tdls_vdev_priv_obj *tdls_vdev; + + tdls_vdev = wlan_vdev_get_tdls_vdev_obj(vdev); + if (!tdls_vdev) + return; + tdls_timers_stop(tdls_vdev); +} + +void tdls_notify_reset_adapter(struct wlan_objmgr_vdev *vdev) +{ + if (!vdev) { + QDF_ASSERT(0); + return; + } + + if (QDF_STATUS_SUCCESS != wlan_objmgr_vdev_try_get_ref(vdev, + WLAN_TDLS_NB_ID)) + return; + + tdls_process_reset_adapter(vdev); + wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID); +} + void tdls_peers_deleted_notification(struct wlan_objmgr_vdev *vdev, uint32_t session_id) { diff --git a/umac/tdls/core/src/wlan_tdls_main.h b/umac/tdls/core/src/wlan_tdls_main.h index f9f657a6055d..58aa9cd2eb1c 100644 --- a/umac/tdls/core/src/wlan_tdls_main.h +++ b/umac/tdls/core/src/wlan_tdls_main.h @@ -575,6 +575,16 @@ QDF_STATUS tdls_notify_sta_connect(struct tdls_sta_notify_params *notify); */ QDF_STATUS tdls_notify_sta_disconnect(struct tdls_sta_notify_params *notify); +/** + * tdls_notify_reset_adapter() - notify reset adapter + * @vdev: vdev object manager + * + * Notify TDLS about the adapter reset + * + * Return: None + */ +void tdls_notify_reset_adapter(struct wlan_objmgr_vdev *vdev); + /** * tdls_peers_deleted_notification() - peer delete notification * @vdev: vdev object diff --git a/umac/tdls/dispatcher/inc/wlan_tdls_public_structs.h b/umac/tdls/dispatcher/inc/wlan_tdls_public_structs.h index 974fca313b81..4691869ffacd 100644 --- a/umac/tdls/dispatcher/inc/wlan_tdls_public_structs.h +++ b/umac/tdls/dispatcher/inc/wlan_tdls_public_structs.h @@ -172,6 +172,15 @@ enum tdls_feature_mode { * @TDLS_CMD_REMOVE_FORCE_PEER: remove external peer * @TDLS_CMD_STATS_UPDATE: update tdls stats * @TDLS_CMD_CONFIG_UPDATE: config tdls + * @TDLS_CMD_SCAN_DONE: scon done event + * @TDLS_CMD_SET_RESPONDER: responder event + * @TDLS_NOTIFY_STA_CONNECTION: notify sta connection + * @TDLS_NOTIFY_STA_DISCONNECTION: notify sta disconnection + * @TDLS_CMD_SET_TDLS_MODE: set the tdls mode + * @TDLS_CMD_SESSION_INCREMENT: notify session increment + * @TDLS_CMD_SESSION_DECREMENT: notify session decrement + * @TDLS_CMD_TEARDOWN_LINKS: notify teardown + * @TDLS_NOTIFY_RESET_ADAPTERS: notify adapater reset */ enum tdls_command_type { TDLS_CMD_TX_ACTION = 1, @@ -191,6 +200,7 @@ enum tdls_command_type { TDLS_CMD_SESSION_INCREMENT, TDLS_CMD_SESSION_DECREMENT, TDLS_CMD_TEARDOWN_LINKS, + TDLS_NOTIFY_RESET_ADAPTERS, }; /** diff --git a/umac/tdls/dispatcher/inc/wlan_tdls_ucfg_api.h b/umac/tdls/dispatcher/inc/wlan_tdls_ucfg_api.h index 5d99669740ab..0a06658fe8b7 100644 --- a/umac/tdls/dispatcher/inc/wlan_tdls_ucfg_api.h +++ b/umac/tdls/dispatcher/inc/wlan_tdls_ucfg_api.h @@ -146,6 +146,14 @@ QDF_STATUS ucfg_tdls_responder(struct tdls_set_responder_req *msg_req); */ QDF_STATUS ucfg_tdls_teardown_links(struct wlan_objmgr_vdev *vdev); +/** + * ucfg_tdls_notify_reset_adapter() - notify reset adapter + * @vdev: vdev object manager + * + * Return: QDF_STATUS + */ +QDF_STATUS ucfg_tdls_notify_reset_adapter(struct wlan_objmgr_vdev *vdev); + /** * ucfg_tdls_notify_sta_connect() - notify sta connect * @notify_info: sta notification info diff --git a/umac/tdls/dispatcher/src/wlan_tdls_ucfg_api.c b/umac/tdls/dispatcher/src/wlan_tdls_ucfg_api.c index 9bb85352bcea..67517aabc3aa 100644 --- a/umac/tdls/dispatcher/src/wlan_tdls_ucfg_api.c +++ b/umac/tdls/dispatcher/src/wlan_tdls_ucfg_api.c @@ -569,6 +569,23 @@ QDF_STATUS ucfg_tdls_teardown_links(struct wlan_objmgr_vdev *vdev) return status; } +QDF_STATUS ucfg_tdls_notify_reset_adapter(struct wlan_objmgr_vdev *vdev) +{ + QDF_STATUS status; + struct scheduler_msg msg = {0, }; + + if (!vdev) { + tdls_err("vdev is NULL "); + return QDF_STATUS_E_NULL_VALUE; + } + tdls_debug("Enter "); + msg.bodyptr = vdev; + msg.callback = tdls_process_cmd; + msg.type = TDLS_NOTIFY_RESET_ADAPTERS; + status = scheduler_post_msg(QDF_MODULE_ID_OS_IF, &msg); + return status; +} + QDF_STATUS ucfg_tdls_notify_sta_connect( struct tdls_sta_notify_params *notify_info) {