@@ -1986,6 +1986,147 @@ void nrf_wifi_supp_event_proc_get_conn_info(void *if_priv,
19861986 k_sem_give (& wait_for_event_sem );
19871987}
19881988
1989+ void nrf_wifi_supp_event_remain_on_channel (void * if_priv ,
1990+ struct nrf_wifi_event_remain_on_channel * roc_complete ,
1991+ unsigned int event_len )
1992+ {
1993+ struct nrf_wifi_vif_ctx_zep * vif_ctx_zep = NULL ;
1994+
1995+ if (!if_priv ) {
1996+ LOG_ERR ("%s: Missing interface context" , __func__ );
1997+ return ;
1998+ }
1999+
2000+ vif_ctx_zep = if_priv ;
2001+
2002+ if (!roc_complete ) {
2003+ LOG_ERR ("%s: Missing ROC complete event data" , __func__ );
2004+ return ;
2005+ }
2006+
2007+ LOG_DBG ("%s: ROC complete on freq %d, dur %d, vif_idx %d" ,
2008+ __func__ , roc_complete -> frequency ,
2009+ roc_complete -> dur , vif_ctx_zep -> vif_idx );
2010+
2011+ if (vif_ctx_zep -> supp_drv_if_ctx && vif_ctx_zep -> supp_callbk_fns .roc_complete ) {
2012+ vif_ctx_zep -> supp_callbk_fns .roc_complete (vif_ctx_zep -> supp_drv_if_ctx ,
2013+ roc_complete -> frequency ,
2014+ roc_complete -> dur );
2015+ }
2016+ }
2017+
2018+ void nrf_wifi_supp_event_roc_cancel_complete (void * if_priv ,
2019+ struct nrf_wifi_event_remain_on_channel
2020+ * roc_cancel_complete ,
2021+ unsigned int event_len )
2022+ {
2023+ struct nrf_wifi_vif_ctx_zep * vif_ctx_zep = NULL ;
2024+
2025+ if (!if_priv ) {
2026+ LOG_ERR ("%s: Missing interface context" , __func__ );
2027+ return ;
2028+ }
2029+
2030+ vif_ctx_zep = if_priv ;
2031+
2032+ if (!roc_cancel_complete ) {
2033+ LOG_ERR ("%s: Missing ROC cancel complete event data" , __func__ );
2034+ return ;
2035+ }
2036+
2037+ LOG_DBG ("%s: ROC cancel complete on freq %d, vif_idx %d" ,
2038+ __func__ , roc_cancel_complete -> frequency ,
2039+ vif_ctx_zep -> vif_idx );
2040+
2041+ if (vif_ctx_zep -> supp_drv_if_ctx && vif_ctx_zep -> supp_callbk_fns .roc_cancel_complete ) {
2042+ vif_ctx_zep -> supp_callbk_fns .roc_cancel_complete (vif_ctx_zep -> supp_drv_if_ctx ,
2043+ roc_cancel_complete -> frequency );
2044+ }
2045+ }
2046+
2047+ int nrf_wifi_supp_remain_on_channel (void * if_priv , unsigned int freq ,
2048+ unsigned int duration )
2049+ {
2050+ enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL ;
2051+ #ifdef NRF70_P2P_MODE
2052+ struct nrf_wifi_vif_ctx_zep * vif_ctx_zep = NULL ;
2053+ struct nrf_wifi_ctx_zep * rpu_ctx_zep = NULL ;
2054+ struct remain_on_channel_info roc_info ;
2055+
2056+ if (!if_priv ) {
2057+ LOG_ERR ("%s: Invalid params" , __func__ );
2058+ return -1 ;
2059+ }
2060+
2061+ vif_ctx_zep = if_priv ;
2062+ rpu_ctx_zep = vif_ctx_zep -> rpu_ctx_zep ;
2063+ if (!rpu_ctx_zep ) {
2064+ LOG_ERR ("%s: rpu_ctx_zep is NULL" , __func__ );
2065+ return -1 ;
2066+ }
2067+
2068+ k_mutex_lock (& vif_ctx_zep -> vif_lock , K_FOREVER );
2069+ if (!rpu_ctx_zep -> rpu_ctx ) {
2070+ LOG_DBG ("%s: RPU context not initialized" , __func__ );
2071+ goto out ;
2072+ }
2073+
2074+ memset (& roc_info , 0 , sizeof (roc_info ));
2075+ roc_info .nrf_wifi_freq_params .frequency = freq ;
2076+ roc_info .nrf_wifi_freq_params .channel_width = NRF_WIFI_CHAN_WIDTH_20 ;
2077+ roc_info .nrf_wifi_freq_params .center_frequency1 = freq ;
2078+ roc_info .nrf_wifi_freq_params .center_frequency2 = 0 ;
2079+ roc_info .nrf_wifi_freq_params .channel_type = NRF_WIFI_CHAN_HT20 ;
2080+ roc_info .dur = duration ;
2081+
2082+ status = nrf_wifi_sys_fmac_p2p_roc_start (rpu_ctx_zep -> rpu_ctx , vif_ctx_zep -> vif_idx ,
2083+ & roc_info );
2084+ if (status != NRF_WIFI_STATUS_SUCCESS ) {
2085+ LOG_ERR ("%s: nrf_wifi_fmac_remain_on_channel failed" , __func__ );
2086+ goto out ;
2087+ }
2088+ out :
2089+ k_mutex_unlock (& vif_ctx_zep -> vif_lock );
2090+ #endif /* NRF70_P2P_MODE */
2091+ return status ;
2092+ }
2093+
2094+ int nrf_wifi_supp_cancel_remain_on_channel (void * if_priv )
2095+ {
2096+ enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL ;
2097+ #ifdef NRF70_P2P_MODE
2098+ struct nrf_wifi_vif_ctx_zep * vif_ctx_zep = NULL ;
2099+ struct nrf_wifi_ctx_zep * rpu_ctx_zep = NULL ;
2100+
2101+ if (!if_priv ) {
2102+ LOG_ERR ("%s: Invalid params" , __func__ );
2103+ return -1 ;
2104+ }
2105+
2106+ vif_ctx_zep = if_priv ;
2107+ rpu_ctx_zep = vif_ctx_zep -> rpu_ctx_zep ;
2108+ if (!rpu_ctx_zep ) {
2109+ LOG_ERR ("%s: rpu_ctx_zep is NULL" , __func__ );
2110+ return -1 ;
2111+ }
2112+
2113+ k_mutex_lock (& vif_ctx_zep -> vif_lock , K_FOREVER );
2114+ if (!rpu_ctx_zep -> rpu_ctx ) {
2115+ LOG_DBG ("%s: RPU context not initialized" , __func__ );
2116+ goto out ;
2117+ }
2118+
2119+ status = nrf_wifi_sys_fmac_p2p_roc_stop (rpu_ctx_zep -> rpu_ctx , vif_ctx_zep -> vif_idx , 0 );
2120+ if (status != NRF_WIFI_STATUS_SUCCESS ) {
2121+ LOG_ERR ("%s: nrf_wifi_fmac_cancel_remain_on_channel failed" , __func__ );
2122+ goto out ;
2123+ }
2124+ out :
2125+ k_mutex_unlock (& vif_ctx_zep -> vif_lock );
2126+ #endif /* NRF70_P2P_MODE */
2127+ return status ;
2128+ }
2129+
19892130#ifdef CONFIG_NRF70_AP_MODE
19902131static int nrf_wifi_vif_state_change (struct nrf_wifi_vif_ctx_zep * vif_ctx_zep ,
19912132 enum nrf_wifi_fmac_if_op_state state )
0 commit comments